diff --git a/src/singeli/src/avx.singeli b/src/singeli/src/avx.singeli index dcd735d3..dfbc59da 100644 --- a/src/singeli/src/avx.singeli +++ b/src/singeli/src/avx.singeli @@ -121,8 +121,8 @@ def andIsZero{x:T, y:T & w256i{T}} = emit{u1, '_mm256_testz_si256', x, y} def getmask{x:T & w256{T, 32}} = emit{u8, '_mm256_movemask_ps', v2f{x}} def getmask{x:T & w256{T, 64}} = emit{u8, '_mm256_movemask_pd', v2d{x}} -def mskAny{x:T & w256i{T} & elwidth{T}>=32} = getmask{[8]u32 ~~ x} != 0 -def mskAll{x:T & w256i{T} & elwidth{T}>=32} = getmask{[8]u32 ~~ x} == 0xff +def homAny{x:T & w256i{T} & elwidth{T}>=32} = getmask{[8]u32 ~~ x} != 0 +def homAll{x:T & w256i{T} & elwidth{T}>=32} = getmask{[8]u32 ~~ x} == 0xff -def negAny{x:T & w256i{T} & elwidth{T}>=32} = getmask{x} != 0 -def negAll{x:T & w256i{T} & elwidth{T}>=32} = getmask{x} == (1<=32} = getmask{x} != 0 +def topAll{x:T & w256i{T} & elwidth{T}>=32} = getmask{x} == (1<>8) } -def mskAny{x:T & w256i{T}} = getmask{[32]u8 ~~ x} != 0 -def mskAll{x:T & w256i{T}} = getmask{[32]u8 ~~ x} == 0xffff_ffff +def homAny{x:T & w256i{T}} = getmask{[32]u8 ~~ x} != 0 +def homAll{x:T & w256i{T}} = getmask{[32]u8 ~~ x} == 0xffff_ffff -def negAny{x:T & w256i{T}} = getmask{x} != 0 -def negAll{x:T & w256i{T}} = getmask{x} == (1< [16]i16 ~~ ((v<<8)>>8 != v), rp} if (M{0}) { # masked check - tup{packQ{rp}, mskAny{M{packQ{bad}}}} + tup{packQ{rp}, homAny{M{packQ{bad}}}} } else { # unmasked check; can do check in a simpler way - tup{packQ{rp}, mskAny{tupsel{0,bad}|tupsel{1,bad}}} + tup{packQ{rp}, homAny{tupsel{0,bad}|tupsel{1,bad}}} } } def arithChk2{F, M, w:T, x:T & match{F,__mul} & isvec{T} & i16==eltype{T}} = { @@ -55,7 +55,7 @@ def arithChk2{F, M, w:T, x:T & match{F,__mul} & isvec{T} & i32==eltype{T}} = { max:= [8]f32 ~~ [8]u32**0x4efffffe def cf32{x} = emit{[8]f32, '_mm256_cvtepi32_ps', x} f32mul:= cf32{w} * cf32{x} - tup{w*x, mskAny{M{abs{f32mul} >= max}}} + tup{w*x, homAny{M{abs{f32mul} >= max}}} # TODO fallback to the below if the above fails # TODO don't do this, but instead shuffle one half, do math, unshuffle that half # def wp = unpackQ{w, T**0} @@ -65,7 +65,7 @@ def arithChk2{F, M, w:T, x:T & match{F,__mul} & isvec{T} & i32==eltype{T}} = { # def bad = each{{v} => { # ((T2~~v + T2**0x80000000) ^ T2**(cast{i64,1}<<63)) > T2**cast_i{i64, (cast{u64,1}<<63) | 0xFFFFFFFF} # }, rp} - # tup{packQQ{each{{v} => v & T2**0xFFFFFFFF, rp}}, mskAny{tupsel{0,bad}|tupsel{1,bad}}} this doesn't use M + # tup{packQQ{each{{v} => v & T2**0xFFFFFFFF, rp}}, homAny{tupsel{0,bad}|tupsel{1,bad}}} this doesn't use M } @@ -95,7 +95,7 @@ def runner{u, R, F} = { def run{F, OO, M, w:VW, x:VX & c & R==u32 & (match{F,__add} | match{F,__sub})} = { # 'a'+1, 'a'-1 r:= F{ty_u{w}, ty_u{x}} - if (mskAny{M{r > type{r}**1114111}}) OO{} + if (homAny{M{r > type{r}**1114111}}) OO{} to_el{R, VW}~~r } run diff --git a/src/singeli/src/mask.singeli b/src/singeli/src/mask.singeli index 9dd487f2..0c4bb7d6 100644 --- a/src/singeli/src/mask.singeli +++ b/src/singeli/src/mask.singeli @@ -13,8 +13,8 @@ local def maskOfImpl{T, n, w} = load{*ty_u{T} ~~ (*u8~~mask256 + 32 - n*(elwidth def maskOf{T,n & w256{T}} = maskOfImpl{T, n, 256} def maskOf{T,n & w128{T}} = maskOfImpl{T, n, 128} -def anyne{x:T, y:T, M & M{0}==0 & isvec{T}} = ~mskAll{x==y} -def anyne{x:T, y:T, M & M{0}==1 & isvec{T}} = mskAny{M{x!=y}} +def anyne{x:T, y:T, M & M{0}==0 & isvec{T}} = ~homAll{x==y} +def anyne{x:T, y:T, M & M{0}==1 & isvec{T}} = homAny{M{x!=y}} def anyne{x:T, y:T, M & M{0}==0 & anyInt{x}} = x!=y def anyne{x:T, y:T, M & M{0}==1 & anyInt{x}} = M{x^y} != 0 def anyneBit{x:T, y:T, M} = ~M{x^y, 'all bits zeroes'} diff --git a/src/singeli/src/neon.singeli b/src/singeli/src/neon.singeli index b658b77f..371cfa3c 100644 --- a/src/singeli/src/neon.singeli +++ b/src/singeli/src/neon.singeli @@ -70,10 +70,10 @@ def fold_max {a:T & nvec{T}} = emit{eltype{T}, ntyp{'vmaxv', T}, a} def bitAny{x:T} = fold_max{to_el{u32, x}}!=0 def bitAll{x:T} = fold_min{to_el{u32, x}}==0xffff_ffff -def negAny{x:T & nvec{T}} = fold_min{ty_s{x}}<0 -def negAll{x:T & nvec{T}} = fold_max{ty_s{x}}<0 -def mskAny{x:T & nvec{T}} = bitAny{x} -def mskAll{x:T & nvec{T}} = bitAll{x} +def topAny{x:T & nvec{T}} = fold_min{ty_s{x}}<0 +def topAll{x:T & nvec{T}} = fold_max{ty_s{x}}<0 +def homAny{x:T & nvec{T}} = bitAny{x} +def homAll{x:T & nvec{T}} = bitAll{x} def broadcast{T, x & nvec{T}} = emit{T, ntyp{'vdup', '_n', T}, x} diff --git a/src/singeli/src/select.singeli b/src/singeli/src/select.singeli index a83a90ea..358dc135 100644 --- a/src/singeli/src/select.singeli +++ b/src/singeli/src/select.singeli @@ -23,7 +23,7 @@ def gather{def:T, b:B, idx:[4]i32, M & w256{T,64}} = { def wrapChk{cw0, VI,xlf, M} = { cw:= cw0 + (xlf & VI~~(cw0= ty_u{xlf}}}) return{0} + if (homAny{M{ty_u{cw} >= ty_u{xlf}}}) return{0} cw } diff --git a/src/singeli/src/squeeze.singeli b/src/singeli/src/squeeze.singeli index 9c714b38..1cbc74b0 100644 --- a/src/singeli/src/squeeze.singeli +++ b/src/singeli/src/squeeze.singeli @@ -67,7 +67,7 @@ squeeze{vw, X, CHR, B}(x0:*void, len:Size) : u32 = { c:= EV~~loadBatch{xp, i, XV} if (X!=u16) r1|= M{c} # for u64, just accept the garbage top 32 bits and deal with them at the end if (B) { - if (mskAny{M{~q_chr{c}}}) return{3} + if (homAny{M{~q_chr{c}}}) return{3} } else { if (anynePositive{EV**((1< { def XU = [bulk]u64 v:= XU ~~ loadBatch{xp, i, XV} - if (mskAny{M{isSNaN{v}}}) return{0xffff_fffe} # not even a number + if (homAny{M{isSNaN{v}}}) return{0xffff_fffe} # not even a number }} return{0xffff_ffff} # float }} diff --git a/src/singeli/src/sse3.singeli b/src/singeli/src/sse3.singeli index f74ab71e..26563121 100644 --- a/src/singeli/src/sse3.singeli +++ b/src/singeli/src/sse3.singeli @@ -115,13 +115,13 @@ def getmask{x:T & w128{T, 16}} = getmask{emit{[16]u8, '_mm_packs_epi16', x, [8]u def getmask{x:T & w128{T, 32}} = emit{u8, '_mm_movemask_ps', v2f{x}} def getmask{x:T & w128{T, 64}} = emit{u8, '_mm_movemask_pd', v2d{x}} -def mskAny{x:T & w128i{T}} = getmask{[16]u8 ~~ x} != 0 -def mskAll{x:T & w128i{T}} = getmask{[16]u8 ~~ x} == 0xffff +def homAny{x:T & w128i{T}} = getmask{[16]u8 ~~ x} != 0 +def homAll{x:T & w128i{T}} = getmask{[16]u8 ~~ x} == 0xffff -def negAny{x:T & w128i{T}} = getmask{x} != 0 -def negAll{x:T & w128i{T}} = getmask{x} == (1<