aarch64 bittab

This commit is contained in:
dzaima 2024-06-16 13:58:50 +03:00
parent 6dbe76727f
commit a671ec9462
3 changed files with 29 additions and 3 deletions

View File

@ -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}}}
}

View File

@ -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}}
}

View File

@ -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))