aarch64 bittab
This commit is contained in:
parent
6dbe76727f
commit
a671ec9462
@ -86,6 +86,11 @@ def trn1{x:T, y:T if nvec{T}} = emit{T, ntyp{'vtrn1', T}, x, y}
|
||||
def trn2{x:T, y:T if nvec{T}} = emit{T, ntyp{'vtrn2', T}, x, y}
|
||||
|
||||
def sel{L, x:T, i:I if lvec{L,16,8} and w128{T} and nvec{I, 8}} = re_el{eltype{T}, emit{I, ntyp{'vqtbl1',I}, re_el{eltype{I},x}, ty_u{i}}}
|
||||
def sel{{x0:T}, i:I} = sel{T, x0, i}
|
||||
def sel{{...xs}, i:I if length{xs}>=2 and length{xs}<=4 and allSame{each{type,xs}} and lvec{oneType{xs},16,8} and nvec{I, 8}} = {
|
||||
def T = oneType{xs}
|
||||
re_el{eltype{T}, emit{I, ntyp{merge{'unpacked_vqtbl',fmtnat{length{xs}}}, I}, ...each{reinterpret{[16]u8,.}, xs}, ty_u{i}}}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@ include './base'
|
||||
include './mask'
|
||||
include './vecfold'
|
||||
include './hashtab'
|
||||
include 'util/tup'
|
||||
|
||||
def findFirst{C, M, F, ...v1} = {
|
||||
def exit = makelabel{}
|
||||
@ -74,7 +75,7 @@ fn copyOrdered{}(r:*f64, x:*f64, len:u64) : u1 = {
|
||||
def arch_vec{T} = [arch_defvw/width{T}]T
|
||||
def TI = i8 # Table values
|
||||
def VI = arch_vec{TI}
|
||||
def simd_bittab = hasarch{'SSSE3'}
|
||||
def simd_bittab = hasarch{'SSSE3'} or hasarch{'AARCH64'}
|
||||
|
||||
def bittab_init{tab, z} = {
|
||||
@for (t in *TI~~tab over 256) t = z
|
||||
@ -90,12 +91,20 @@ def bittab_selector{loadtab} = {
|
||||
low:= VI**7
|
||||
hi4:= VI**(-(1<<4))
|
||||
b := VI~~make{[nv]u8, 1 << (iota{nv} & 7)}
|
||||
def selector{x} = {
|
||||
|
||||
def selector{x if hasarch{'X86_64'}} = {
|
||||
top := hi4 + VI~~((arch_vec{u32}~~(x&~low))>>3)
|
||||
byte:= sel{[16]i8, t0, hi4^top} | sel{[16]i8, t1, top}
|
||||
mask:= sel{[16]i8, b, x & low}
|
||||
homMask{(mask & byte) == mask}
|
||||
}
|
||||
|
||||
def selector{x:([16]i8) if hasarch{'AARCH64'}} = {
|
||||
byte:= [16]u8~~sel{tup{t0,t1}, ty_u{x}>>3}
|
||||
mask:= [16]u8**1 << ty_u{x & low}
|
||||
res:= homMask{(mask & byte) == mask}
|
||||
}
|
||||
|
||||
def reload{} = { tup{t0,t1} = loadtab{} }
|
||||
tup{selector, reload}
|
||||
}
|
||||
@ -104,9 +113,13 @@ def readbytes{vtab}{} = {
|
||||
def [k]_ = VI; def l = 128/k
|
||||
def side{i} = {
|
||||
def U = arch_vec{ty_u{k}}
|
||||
def m = @collect (vtab over _ from i to i+l) homMask{vtab}
|
||||
def m = @collect (vtab over _ from i to i+l) homMask{vtab} # TODO multi-value homMask
|
||||
VI~~make{U, if (vcount{U}>l) merge{m,m} else m}
|
||||
}
|
||||
def side{i if hasarch{'AARCH64'}} = {
|
||||
def m = each{homMask, split{4, @collect (vtab over _ from i to i+l) vtab}}
|
||||
VI~~make{[2]u64, m}
|
||||
}
|
||||
each{side, l*iota{2}}
|
||||
}
|
||||
|
||||
|
||||
@ -15,6 +15,14 @@
|
||||
#define _mm256_zextsi128_si256(X) _mm256_setr_m128i(X, _mm_setzero_si128())
|
||||
#endif
|
||||
#endif
|
||||
#if defined(__aarch64__)
|
||||
#define unpacked_vqtbl2q_s8(A,B,I) vqtbl2q_s8((int8x16x2_t){A,B}, I)
|
||||
#define unpacked_vqtbl3q_s8(A,B,C,I) vqtbl3q_s8((int8x16x3_t){A,B,C}, I)
|
||||
#define unpacked_vqtbl4q_s8(A,B,C,D,I) vqtbl4q_s8((int8x16x4_t){A,B,C,D}, I)
|
||||
#define unpacked_vqtbl2q_u8(A,B,I) vqtbl2q_u8((uint8x16x2_t){A,B}, I)
|
||||
#define unpacked_vqtbl3q_u8(A,B,C,I) vqtbl3q_u8((uint8x16x3_t){A,B,C}, I)
|
||||
#define unpacked_vqtbl4q_u8(A,B,C,D,I) vqtbl4q_u8((uint8x16x4_t){A,B,C,D}, I)
|
||||
#endif
|
||||
|
||||
|
||||
#define BCALL(N, X) N(b(X))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user