From 490285f1ca50d16532d39a027c662f360d2add8e Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 1 Feb 2025 22:21:37 +0200 Subject: [PATCH] =?UTF-8?q?andAllZero=20=E2=86=92=20and=5Fbit=5Fnone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/singeli/README.md | 2 +- src/singeli/src/avx.singeli | 2 +- src/singeli/src/base.singeli | 2 +- src/singeli/src/dyarith.singeli | 14 +++++++------- src/singeli/src/equal.singeli | 2 +- src/singeli/src/mask.singeli | 4 ++-- src/singeli/src/neon.singeli | 2 +- src/singeli/src/squeeze.singeli | 4 ++-- src/singeli/src/sse.singeli | 4 ++-- src/singeli/src/sse2.singeli | 2 +- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/singeli/README.md b/src/singeli/README.md index 794d5824..ab92d8ec 100644 --- a/src/singeli/README.md +++ b/src/singeli/README.md @@ -131,7 +131,7 @@ Some may also support one scalar argument or arguments with different widths. - `shr{U, a:V, n}` - shift vector elements within blocks of `U` - `unord{a:VF, b:VF} : mt{VI}` - `(a==NaN) | (b==NaN)` -- `andAllZero{a:VI, b:VI} : u1` - whether `a&b` is all zeroes +- `and_bit_none{a:VI, b:VI} : u1` - `~any_bit{a & b}` ## Structural operations diff --git a/src/singeli/src/avx.singeli b/src/singeli/src/avx.singeli index f432bdf6..2b68ccdd 100644 --- a/src/singeli/src/avx.singeli +++ b/src/singeli/src/avx.singeli @@ -47,7 +47,7 @@ def shufInd{a:T, b:T=[8]E, {...is} if width{E}==32 and length{is}==8 and ({l,h} def shufInd{a:T, b:T=[4]E, {...is} if width{E}==64 and length{is}==4} = T~~shufInd{re_el{u32,a}, re_el{u32,b}, merge{...each{{i} => tup{i*2, i*2+1}, is}}} # mask stuff -def andAllZero{x:T, y:T if w256i{T}} = emit{u1, '_mm256_testz_si256', x, y} +def and_bit_none{x:T, y:T if w256i{T}} = emit{u1, '_mm256_testz_si256', x, y} def top_to_int{x:T if w256{T, 32}} = emit{u8, '_mm256_movemask_ps', v2f{x}} def top_to_int{x:T if w256{T, 64}} = emit{u8, '_mm256_movemask_pd', v2d{x}} diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index 5258f2e8..c2818e99 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -171,7 +171,7 @@ def lvec = match { {[n]T, n, (width{T})} => 1; {T, n, w} => 0 } # base cases def { - absu,andAllZero,andnz,b_getBatch,blend,blend_units,clmul,cvt,extract,fold_addw,half, + absu,and_bit_none,andnz,b_getBatch,blend,blend_units,clmul,cvt,extract,fold_addw,half, all_bit,any_bit,blend_bit, all_hom,any_hom,blend_hom,hom_to_int,store_masked_hom,store_blended_hom, all_top,any_top,blend_top,top_to_int,store_masked_top,store_blended_top, diff --git a/src/singeli/src/dyarith.singeli b/src/singeli/src/dyarith.singeli index 1b4e9b17..7e2a3591 100644 --- a/src/singeli/src/dyarith.singeli +++ b/src/singeli/src/dyarith.singeli @@ -41,7 +41,7 @@ def arithChk2{F=(__mul), M, w:T=[_](i8), x:T if hasarch{'X86_64'}} = { } else { # unmasked check; can do check in a simpler way def bad = each{{v} => ty_s{v ^ (v>>15)}, rp} def RU = re_el{u16,T} - tup{packQ{rp}, tup{'~andAllZero', RU~~tree_fold{|, bad}, RU**0xff80}} + tup{packQ{rp}, tup{'and_some', RU~~tree_fold{|, bad}, RU**0xff80}} } } def arithChk2{F=(__mul), M, w:T=[_](i16), x:T if hasarch{'X86_64'}} = { @@ -102,13 +102,13 @@ def runner{u, R, F} = { run } -# any_hom, any_top already give masked vals; anyne doesn't, and ~andAllZero assumes no masking +# any_hom, any_top already give masked vals; anyne doesn't, and and_some assumes no masking def runChecks_any{F, vals} = { F{tree_fold{|, each{select{.,1}, vals}}} } -def runChecks{'any_hom', vals, M} = runChecks_any{any_hom, vals} -def runChecks{'any_top', vals, M} = runChecks_any{any_top, vals} -def runChecks{'none', vals, M} = 0 -def runChecks{'~andAllZero', vals, M if ~M{0}} = ~tree_fold{&, each{andAllZero, ...slice{flip{vals}, 1}}} -def runChecks{'anyne', vals, M} = { +def runChecks{'any_hom', vals, M} = runChecks_any{any_hom, vals} +def runChecks{'any_top', vals, M} = runChecks_any{any_top, vals} +def runChecks{'none', vals, M} = 0 +def runChecks{'and_some', vals, M if ~M{0}} = ~tree_fold{&, each{and_bit_none, ...slice{flip{vals}, 1}}} +def runChecks{'anyne', vals, M} = { def i{vals} = { def {_,xs,ys} = flip{vals} assert{M{0} == 0} diff --git a/src/singeli/src/equal.singeli b/src/singeli/src/equal.singeli index 27b2d568..9acc85c0 100644 --- a/src/singeli/src/equal.singeli +++ b/src/singeli/src/equal.singeli @@ -47,7 +47,7 @@ fn equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = { # TODO compare with doing the comparison in vector registers badBits:= T ** ~(X~~1) @maskedLoop{bulk}(cw in tup{'b',w}, x in *T~~x, M in 'm' over i to l) { - if (~andAllZero{M{x}, badBits}) return{0} + if (~and_bit_none{M{x}, badBits}) return{0} if (anyne{promote{u64,mask{sh{x}}}, promote{u64,cw}, M}) return{0} } 1 diff --git a/src/singeli/src/mask.singeli b/src/singeli/src/mask.singeli index 9cbcfb36..f1333be1 100644 --- a/src/singeli/src/mask.singeli +++ b/src/singeli/src/mask.singeli @@ -28,9 +28,9 @@ def anynePositive{x:T, y:T, M if M{0}==1 and isvec{T}} = { } def maskNone{x} = x -def maskNone{x, 'all bits zeroes'} = andAllZero{x, x} +def maskNone{x, 'all bits zeroes'} = and_bit_none{x, x} def maskAfter{n} = { - def mask{x:X, 'all bits zeroes'} = andAllZero{x, X~~maskOfBit{X,n}} + def mask{x:X, 'all bits zeroes'} = and_bit_none{x, X~~maskOfBit{X,n}} def mask{X, 'to sign bits'} = maskOf{X,n} def mask{X, 'to homogeneous bits'} = maskOf{X,n} def mask{'count'} = n diff --git a/src/singeli/src/neon.singeli b/src/singeli/src/neon.singeli index 852b4472..5d4be026 100644 --- a/src/singeli/src/neon.singeli +++ b/src/singeli/src/neon.singeli @@ -167,7 +167,7 @@ def hom_to_int{a:V,b:V=[k]E if nvecu{V} and k*2<=width{E}} = { truncBits{k*2, fold_add{shrm{a,width{E}-k,b} & make{V, (1<