diff --git a/src/singeli/src/equal.singeli b/src/singeli/src/equal.singeli index f82182d2..a3a1043e 100644 --- a/src/singeli/src/equal.singeli +++ b/src/singeli/src/equal.singeli @@ -34,7 +34,7 @@ fn equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = { def TU = [vw/64]u64 f0:= TF**0.0 f1:= TF**1.0 - maskedLoopPositive{bulk, l, {i, M} => { + @maskedLoopPositive{bulk}(M in 'm' over i to l) { wu:= (if (hasarch{'AVX2'}) { cw:= b_getBatchLo{bulk, *u64~~w, i} topBlend{f0, f1, TU**cw << make{TU,63-iota{vcount{TU}}}} @@ -44,7 +44,7 @@ fn equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = { }) cx:= load{*TF ~~ x, i} if (anynePositive{wu, cx, M}) return{0} - }} + } } else { # bitarr ≡ i8/i16/i32arr def T = [bulk]X def sh{c} = c << (width{X}-1) @@ -65,11 +65,11 @@ fn equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = { def R = [bulk]X - maskedLoopPositive{bulk, l, {i, M} => { + @maskedLoopPositive{bulk}(M in 'm' over i to l) { cw:= loadBatch{*W~~w, i, R} cx:= loadBatch{*X~~x, i, R} if (anynePositive{cw,cx,M}) return{0} - }} + } } 1 } diff --git a/src/singeli/src/mask.singeli b/src/singeli/src/mask.singeli index f37abe42..ad47420c 100644 --- a/src/singeli/src/mask.singeli +++ b/src/singeli/src/mask.singeli @@ -68,16 +68,6 @@ def storeBatch{ptr:P, ns, xs, M & istup{ns}} = each{{n,x} => storeBatch{ptr, n, -def maskedLoopPositive{bulk, l:L, step} = { - i:L = 0 - while(i < (l-1)/bulk) { - step{i, maskNone} - ++i - } - step{i, maskAfter{l - i*bulk}} -} - - # "harmless" pointer cast that'll only cast void* def hCast{T,p} = assert{show{'expected pointer with element',T,'or void but got ',p}} def hCast{T,p:P & match{T,eltype{P}}} = p @@ -120,6 +110,16 @@ def maskedLoop{bulk, i0}{vars,begin==0,end,iter} = { def maskedLoop{bulk} = maskedLoop{bulk,0} +def maskedLoopPositive{bulk}{vars,begin==0,end:L,iter} = { + i:L = 0 + while(i < (end-1)/bulk) { + mlExec{i, iter, vars, bulk, maskNone} + ++i + } + mlExec{i, iter, vars, bulk, maskAfter{end - i*bulk}} +} + + # masked unrolled loop # bulk: vector count