From a671ec9462f39cc5ee35897d04a1cf9f46fe5b50 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 16 Jun 2024 13:58:50 +0300 Subject: [PATCH] aarch64 bittab --- src/singeli/src/neon.singeli | 5 +++++ src/singeli/src/search.singeli | 19 ++++++++++++++++--- src/utils/includeSingeli.h | 8 ++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/singeli/src/neon.singeli b/src/singeli/src/neon.singeli index 6516f955..9df9b845 100644 --- a/src/singeli/src/neon.singeli +++ b/src/singeli/src/neon.singeli @@ -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}}} +} diff --git a/src/singeli/src/search.singeli b/src/singeli/src/search.singeli index 2716a63b..2e424657 100644 --- a/src/singeli/src/search.singeli +++ b/src/singeli/src/search.singeli @@ -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}} } diff --git a/src/utils/includeSingeli.h b/src/utils/includeSingeli.h index 5f706518..ec98eb9b 100644 --- a/src/utils/includeSingeli.h +++ b/src/utils/includeSingeli.h @@ -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))