move last bit of equal.singeli to loadBatch

This commit is contained in:
dzaima 2022-12-18 01:28:27 +02:00
parent 40f36fa366
commit 9768526ddc

View File

@ -12,13 +12,15 @@ def swap{w,x} = {
x = t
}
# width{W} ≤ width{X}
equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = {
def bulk = 256 / width{X}
def vw = 256
def bulk = vw / width{X}
if (W!=X) if (d!=0) swap{w,x}
if (W==u1) {
if (X==u1) { # bitarr ≡ bitarr
maskedLoop{256, l, {i, M} => {
maskedLoop{vw, l, {i, M} => {
cw:= load{*[32]u8 ~~ w, i}
cx:= load{*[32]u8 ~~ x, i}
if (anyneBit{cw,cx,M}) return{0}
@ -35,7 +37,7 @@ equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = {
if (anynePositive{wu, cx, M}) return{0}
}}
} else { # bitarr ≡ i8/i16/i32arr
def T = [256/width{X}]X
def T = [vw/width{X}]X
def sh{c} = c << (width{X}-1)
def sh{c & X==u8} = T ~~ (to_el{u16,c}<<7)
@ -49,17 +51,15 @@ equal{W, X}(w:*void, x:*void, l:u64, d:u64) : u1 = {
}}
1
}
} else { # everything not involving bitarrs
} else { # everything not involving bitarrs (i.e. floats/ints, and chars)
if (W==i8 and X==i8) l<<= d
def ww{gw, E} = [gw/width{E}]E
def fac = width{X}/width{W}
def R = [bulk]X
maskedLoopPositive{bulk, l, {i, M} => {
# TODO update this to modern mask stuff
cw:= load{*ww{tern{fac==1, 256, 128}, W} ~~ (w + i*32/fac)}
cx:= load{*ww{256, X} ~~ x, i}
cwc:= widen{ww{256, X}, to_el{W, cw}}
if (anynePositive{cwc,cx,M}) return{0}
cw:= loadBatch{*W~~w, i, R}
cx:= loadBatch{*X~~x, i, R}
if (anynePositive{cw,cx,M}) return{0}
}}
}
1