move length zero check outside singeli
This commit is contained in:
parent
4e17e28d4a
commit
798f6e9e17
@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
static NOINLINE void fillBits(u64* dst, u64 sz, bool v) {
|
static NOINLINE void fillBits(u64* dst, u64 sz, bool v) {
|
||||||
u64 x = 0-(u64)v;
|
u64 x = 0-(u64)v;
|
||||||
for (usz i = 0; i < (sz+63)/64; i++) dst[i] = x;
|
u64 am = (sz+63)/64; assert(am>0);
|
||||||
|
for (usz i = 0; i < am; i++) dst[i] = x;
|
||||||
}
|
}
|
||||||
static NORETURN void cmp_err() { thrM("Invalid comparison"); }
|
static NORETURN void cmp_err() { thrM("Invalid comparison"); }
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ static void* tyany_ptr(B x) {
|
|||||||
return IS_SLICE(t)? c(TySlice,x)->a : c(TyArr,x)->a;
|
return IS_SLICE(t)? c(TySlice,x)->a : c(TyArr,x)->a;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define AL(X) u64* rp; B r = m_bitarrc(&rp, X); usz ria=a(r)->ia;
|
#define AL(X) u64* rp; B r = m_bitarrc(&rp, X); usz ria=a(r)->ia
|
||||||
#define CMP_IMPL(CHR, NAME, RNAME, PNAME, L, R, OP, FC, CF, BX) \
|
#define CMP_IMPL(CHR, NAME, RNAME, PNAME, L, R, OP, FC, CF, BX) \
|
||||||
if (isF64(w)&isF64(x)) return m_i32(w.f OP x.f); \
|
if (isF64(w)&isF64(x)) return m_i32(w.f OP x.f); \
|
||||||
if (isC32(w)&isC32(x)) return m_i32(w.u OP x.u); \
|
if (isC32(w)&isC32(x)) return m_i32(w.u OP x.u); \
|
||||||
@ -48,15 +49,17 @@ static void* tyany_ptr(B x) {
|
|||||||
if (we==el_MAX) goto end; \
|
if (we==el_MAX) goto end; \
|
||||||
w=tw; x=tx; \
|
w=tw; x=tx; \
|
||||||
} \
|
} \
|
||||||
AL(x) \
|
AL(x); \
|
||||||
lut_avx2_##PNAME##AA[we](rp, (u8*)tyany_ptr(L), (u8*)tyany_ptr(R), ria); \
|
if (ria) lut_avx2_##PNAME##AA[we](rp, (u8*)tyany_ptr(L), (u8*)tyany_ptr(R), ria); \
|
||||||
dec(w);dec(x); return r; \
|
dec(w);dec(x); return r; \
|
||||||
} \
|
} else goto end; \
|
||||||
} else { \
|
|
||||||
AL(w) lut_avx2_##NAME##AS[we](rp, (u8*)tyany_ptr(w), x.u, ria); dec(w); return r; \
|
|
||||||
} \
|
} \
|
||||||
} else if (isArr(x)) { u8 xe = TI(x,elType); if (xe==el_B) goto end; \
|
AL(w); \
|
||||||
AL(x) lut_avx2_##RNAME##AS[xe](rp, (u8*)tyany_ptr(x), w.u, ria); dec(x); return r; \
|
if (ria) lut_avx2_##NAME##AS [we](rp, (u8*)tyany_ptr(w), x.u, ria); \
|
||||||
|
dec(w); return r; \
|
||||||
|
} else if (isArr(x)) { u8 xe = TI(x,elType); if (xe==el_B) goto end; AL(x); \
|
||||||
|
if (ria) lut_avx2_##RNAME##AS[xe](rp, (u8*)tyany_ptr(x), w.u, ria); \
|
||||||
|
dec(x); return r; \
|
||||||
} \
|
} \
|
||||||
if (isF64(w)&isC32(x)) return m_i32(FC); \
|
if (isF64(w)&isC32(x)) return m_i32(FC); \
|
||||||
if (isC32(w)&isF64(x)) return m_i32(CF); \
|
if (isC32(w)&isF64(x)) return m_i32(CF); \
|
||||||
|
|||||||
@ -73,9 +73,9 @@ def any2bit{VT, unr, op, wS, wV, xS, xV, dst:*u64, len:(Size)} = {
|
|||||||
xi:Size = 0
|
xi:Size = 0
|
||||||
ri:Size = 0
|
ri:Size = 0
|
||||||
def bam = vcount{VT}*unr
|
def bam = vcount{VT}*unr
|
||||||
len:Size = cdiv{len,bam}
|
am:Size = cdiv{len,bam}
|
||||||
assert{len!=0}
|
assert{am>0}
|
||||||
while (ri < len) {
|
while (ri < am) {
|
||||||
r:u64 = 0
|
r:u64 = 0
|
||||||
@unroll (j from 0 to unr) r = r | (cast_i{u64, getmask{op{wV{xi+j}, xV{xi+j}}}} << (j*vcount{VT}))
|
@unroll (j from 0 to unr) r = r | (cast_i{u64, getmask{op{wV{xi+j}, xV{xi+j}}}} << (j*vcount{VT}))
|
||||||
b_set{bam, dst, ri, r}
|
b_set{bam, dst, ri, r}
|
||||||
@ -84,14 +84,12 @@ def any2bit{VT, unr, op, wS, wV, xS, xV, dst:*u64, len:(Size)} = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
aa2bit{VT, unr, op}(dst:*u64, wr:*u8, xr:*u8, len:Size) : void = {
|
aa2bit{VT, unr, op}(dst:*u64, wr:*u8, xr:*u8, len:Size) : void = {
|
||||||
if (len==0) return{}
|
|
||||||
wv:= cast_vp{VT, wr}; ws:= cast_p{*eltype{VT}, wr}
|
wv:= cast_vp{VT, wr}; ws:= cast_p{*eltype{VT}, wr}
|
||||||
xv:= cast_vp{VT, xr}; xs:= cast_p{*eltype{VT}, xr}
|
xv:= cast_vp{VT, xr}; xs:= cast_p{*eltype{VT}, xr}
|
||||||
any2bit{VT, unr, op, {i}=>load{ws,i}, {i}=>vload{wv,i}, {i}=>load{xs,i}, {i}=>vload{xv,i}, dst, len}
|
any2bit{VT, unr, op, {i}=>load{ws,i}, {i}=>vload{wv,i}, {i}=>load{xs,i}, {i}=>vload{xv,i}, dst, len}
|
||||||
}
|
}
|
||||||
|
|
||||||
as2bit{VT, unr, op}(dst:*u64, wr:*u8, x:u64, len:Size) : void = { show{VT,unr,fmt{op}}
|
as2bit{VT, unr, op}(dst:*u64, wr:*u8, x:u64, len:Size) : void = { show{VT,unr,fmt{op}}
|
||||||
if (len==0) return{}
|
|
||||||
wv:= cast_vp{VT, wr}; ws:= cast_p{*eltype{VT}, wr}
|
wv:= cast_vp{VT, wr}; ws:= cast_p{*eltype{VT}, wr}
|
||||||
xv:= broadcast{VT, pathAS{dst, len, eltype{VT}, op, x}}
|
xv:= broadcast{VT, pathAS{dst, len, eltype{VT}, op, x}}
|
||||||
any2bit{VT, unr, op, {i}=>load{ws,i}, {i}=>vload{wv,i}, {i}=>x, {i}=>xv, dst, len}
|
any2bit{VT, unr, op, {i}=>load{ws,i}, {i}=>vload{wv,i}, {i}=>x, {i}=>xv, dst, len}
|
||||||
@ -103,11 +101,10 @@ bitAA{bitop}(dst:*u64, wr:*u8, xr:*u8, len:Size) : void = {
|
|||||||
@for (dst,ws,xs over _ from 0 to cdiv{len,64}) dst = bitop{ws,xs}
|
@for (dst,ws,xs over _ from 0 to cdiv{len,64}) dst = bitop{ws,xs}
|
||||||
}
|
}
|
||||||
|
|
||||||
not(dst:*u64, x:*u64, len:Size) : void = { @for (dst,x over _ from 0 to cdiv{len,64}) dst = ~x }
|
not(dst:*u64, x:*u64, len:Size) : void = { am:=cdiv{len,64}; assert{am>0}; @for (dst,x over _ from 0 to am) dst = ~x }
|
||||||
cpy(dst:*u64, x:*u64, len:Size) : void = { @for (dst,x over _ from 0 to cdiv{len,64}) dst = x }
|
cpy(dst:*u64, x:*u64, len:Size) : void = { am:=cdiv{len,64}; assert{am>0}; @for (dst,x over _ from 0 to am) dst = x }
|
||||||
|
|
||||||
bitAS{op}(dst:*u64, wr:*u8, x:u64, len:Size) : void = { show{'bitAS'}
|
bitAS{op}(dst:*u64, wr:*u8, x:u64, len:Size) : void = { show{'bitAS'}
|
||||||
if (len==0) return{}
|
|
||||||
xf:f64 = interp_f64{x}
|
xf:f64 = interp_f64{x}
|
||||||
r0:u1 = op{0,xf}
|
r0:u1 = op{0,xf}
|
||||||
r1:u1 = op{1,xf}
|
r1:u1 = op{1,xf}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user