lazy singeli bit comparison fns
This commit is contained in:
parent
71c454235c
commit
5d76148c51
@ -5,11 +5,11 @@
|
||||
SLOWIF((!isArr(w) || TI(w,elType)!=el_B) && (!isArr(x) || TI(x,elType)!=el_B)) SLOW2("cmp " #N, w, x); \
|
||||
return arith_recd(N##_c2, w, x); \
|
||||
}}
|
||||
#define AL(X) u64* rp; B r = m_bitarrc(&rp, X); usz ria=a(r)->ia; usz bia = BIT_N(ria);
|
||||
|
||||
#if SINGELI
|
||||
#include "../singeli/builtins/cmp.c"
|
||||
#else
|
||||
#define AL(X) u64* rp; B r = m_bitarrc(&rp, X); usz ria=a(r)->ia; usz bia = BIT_N(ria);
|
||||
#define CMP_IMPL(CHR, NAME, RNAME, OP, FC, CF, BX) \
|
||||
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); \
|
||||
|
||||
@ -16,6 +16,8 @@
|
||||
#define avx2_neAS_u16(d,w,x,l) avx2_neAS_i16(d,(i16*)(w),x,l)
|
||||
#define avx2_neAS_u32(d,w,x,l) avx2_neAS_i32(d,(i32*)(w),x,l)
|
||||
|
||||
#define avx2_ltAA_u1(d,w,x,l) avx2_gtAA_u1(d,x,w,l)
|
||||
#define avx2_leAA_u1(d,w,x,l) avx2_geAA_u1(d,x,w,l)
|
||||
#define avx2_ltAA_i8(d,w,x,l) avx2_gtAA_i8(d,x,w,l)
|
||||
#define avx2_leAA_i8(d,w,x,l) avx2_geAA_i8(d,x,w,l)
|
||||
#define avx2_ltAA_i16(d,w,x,l) avx2_gtAA_i16(d,x,w,l)
|
||||
@ -31,6 +33,7 @@
|
||||
#define avx2_ltAA_f64(d,w,x,l) avx2_gtAA_f64(d,x,w,l)
|
||||
#define avx2_leAA_f64(d,w,x,l) avx2_geAA_f64(d,x,w,l)
|
||||
|
||||
#define AL(X) u64* rp; B r = m_bitarrc(&rp, X); usz ria=a(r)->ia;
|
||||
#define CMP_IMPL(CHR, NAME, RNAME, OP, FC, CF, BX) \
|
||||
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); \
|
||||
@ -48,7 +51,7 @@
|
||||
} \
|
||||
AL(x) \
|
||||
switch(we) { default: UD; \
|
||||
case el_bit: { u64* wp=bitarr_ptr(w); u64* xp=bitarr_ptr(x); for(usz i=0;i<bia;i++) { u64 wv=wp[i]; u64 xv=xp[i]; rp[i]=BX; } break; } \
|
||||
case el_bit: avx2_##NAME##AA_u1 (rp, bitarr_ptr(w), bitarr_ptr(x), ria); break; \
|
||||
case el_i8: avx2_##NAME##AA_i8 (rp, i8any_ptr (w), i8any_ptr (x), ria); break; \
|
||||
case el_i16: avx2_##NAME##AA_i16(rp, i16any_ptr(w), i16any_ptr(x), ria); break; \
|
||||
case el_i32: avx2_##NAME##AA_i32(rp, i32any_ptr(w), i32any_ptr(x), ria); break; \
|
||||
@ -61,7 +64,7 @@
|
||||
} \
|
||||
} else { AL(w) \
|
||||
switch(we) { default: UD; \
|
||||
case el_bit: { if (!q_bit(x)) break; u64 xv=bitx(x); u64* wp=bitarr_ptr(w); for(usz i=0;i<bia;i++) { u64 wv=wp[i]; rp[i]=BX; } dec(w); return r; } \
|
||||
case el_bit: if (!q_bit(x))break; avx2_##NAME##AS_u1 (rp, bitarr_ptr(w), o2bu(x), ria); dec(w); return r; \
|
||||
case el_i8: if (!q_i8 (x))break; avx2_##NAME##AS_i8 (rp, i8any_ptr (w), o2iu(x), ria); dec(w); return r; \
|
||||
case el_i16: if (!q_i16(x))break; avx2_##NAME##AS_i16(rp, i16any_ptr(w), o2iu(x), ria); dec(w); return r; \
|
||||
case el_i32: if (!q_i32(x))break; avx2_##NAME##AS_i32(rp, i32any_ptr(w), o2iu(x), ria); dec(w); return r; \
|
||||
@ -74,7 +77,7 @@
|
||||
} \
|
||||
} else if (isArr(x)) { u8 xe = TI(x,elType); if (xe==el_B) goto end; AL(x) \
|
||||
switch(xe) { default: UD; \
|
||||
case el_bit: { if (!q_bit(w)) break; u64 wv=bitx(w); u64* xp=bitarr_ptr(x); for(usz i=0;i<bia;i++) { u64 xv=xp[i]; rp[i]=BX; } dec(x); return r; } \
|
||||
case el_bit: if (!q_bit(w))break; avx2_##RNAME##AS_u1 (rp, bitarr_ptr(x), o2bu(w), ria); dec(x); return r; \
|
||||
case el_i8: if (!q_i8 (w))break; avx2_##RNAME##AS_i8 (rp, i8any_ptr (x), o2iu(w), ria); dec(x); return r; \
|
||||
case el_i16: if (!q_i16(w))break; avx2_##RNAME##AS_i16(rp, i16any_ptr(x), o2iu(w), ria); dec(x); return r; \
|
||||
case el_i32: if (!q_i32(w))break; avx2_##RNAME##AS_i32(rp, i32any_ptr(x), o2iu(w), ria); dec(x); return r; \
|
||||
|
||||
@ -3,15 +3,8 @@ include 'arch/c'
|
||||
def Size = u64
|
||||
include './avx2'
|
||||
include './bitops'
|
||||
include './loops'
|
||||
|
||||
def unroll{vars,begin,end,block & match{kind{begin},'number'} & match{kind{end},'number'}} = {
|
||||
def f{i,l & i==l} = 0
|
||||
def f{i,l & i!=l} = {
|
||||
exec{i, vars, block}
|
||||
f{i+1, l}
|
||||
}
|
||||
f{begin,end}
|
||||
}
|
||||
|
||||
def cdiv{a,b} = (a+b-1)/b
|
||||
|
||||
@ -39,21 +32,29 @@ as2bit{VT, unr, op}(dst:*u64, w:*eltype{VT}, x:eltype{VT}, len:Size) : void = {
|
||||
any2bit{VT, unr, op, {i}=>load{w,i}, {i}=>vload{wv,i}, {i}=>x, {i}=>xv, dst, len}
|
||||
}
|
||||
|
||||
bitAA{op}(dst:*u64, w:*u64, x:*u64, len:Size) : void = {
|
||||
@for (dst,w,x over _ from 0 to cdiv{len,64}) dst = op{w,x}
|
||||
}
|
||||
bitAS{op}(dst:*u64, w:*u64, x:u64, len:Size) : void = {
|
||||
x = -x
|
||||
@for (dst,w over _ from 0 to cdiv{len,64}) dst = op{w,x}
|
||||
}
|
||||
|
||||
#'avx2_eqAA_f64'=aa2bit{[4]f64,4,__eq}
|
||||
|
||||
'avx2_eqAA_i8'=aa2bit{[32]i8,1,__eq}; 'avx2_eqAA_i16'=aa2bit{[16]i16,1,__eq}; 'avx2_eqAA_i32'=aa2bit{[8]i32,1,__eq}; 'avx2_eqAA_f64'=aa2bit{[4]f64,2,__eq}
|
||||
'avx2_neAA_i8'=aa2bit{[32]i8,1,__ne}; 'avx2_neAA_i16'=aa2bit{[16]i16,1,__ne}; 'avx2_neAA_i32'=aa2bit{[8]i32,1,__ne}; 'avx2_neAA_f64'=aa2bit{[4]f64,2,__ne}
|
||||
'avx2_gtAA_i8'=aa2bit{[32]i8,1,__gt}; 'avx2_gtAA_i16'=aa2bit{[16]i16,1,__gt}; 'avx2_gtAA_i32'=aa2bit{[8]i32,1,__gt}; 'avx2_gtAA_f64'=aa2bit{[4]f64,2,__gt}
|
||||
'avx2_geAA_i8'=aa2bit{[32]i8,1,__ge}; 'avx2_geAA_i16'=aa2bit{[16]i16,1,__ge}; 'avx2_geAA_i32'=aa2bit{[8]i32,1,__ge}; 'avx2_geAA_f64'=aa2bit{[4]f64,2,__ge}
|
||||
'avx2_eqAA_i8'=aa2bit{[32]i8,1,__eq}; 'avx2_eqAA_i16'=aa2bit{[16]i16,1,__eq}; 'avx2_eqAA_i32'=aa2bit{[8]i32,1,__eq}; 'avx2_eqAA_u1'=bitAA{{a,b}=>a ^ ~b}; 'avx2_eqAA_f64'=aa2bit{[4]f64,2,__eq}
|
||||
'avx2_neAA_i8'=aa2bit{[32]i8,1,__ne}; 'avx2_neAA_i16'=aa2bit{[16]i16,1,__ne}; 'avx2_neAA_i32'=aa2bit{[8]i32,1,__ne}; 'avx2_neAA_u1'=bitAA{{a,b}=>a ^ b}; 'avx2_neAA_f64'=aa2bit{[4]f64,2,__ne}
|
||||
'avx2_gtAA_i8'=aa2bit{[32]i8,1,__gt}; 'avx2_gtAA_i16'=aa2bit{[16]i16,1,__gt}; 'avx2_gtAA_i32'=aa2bit{[8]i32,1,__gt}; 'avx2_gtAA_u1'=bitAA{{a,b}=>a & ~b}; 'avx2_gtAA_f64'=aa2bit{[4]f64,2,__gt}
|
||||
'avx2_geAA_i8'=aa2bit{[32]i8,1,__ge}; 'avx2_geAA_i16'=aa2bit{[16]i16,1,__ge}; 'avx2_geAA_i32'=aa2bit{[8]i32,1,__ge}; 'avx2_geAA_u1'=bitAA{{a,b}=>a | ~b}; 'avx2_geAA_f64'=aa2bit{[4]f64,2,__ge}
|
||||
'avx2_gtAA_u8'=aa2bit{[32]u8,1,__gt}; 'avx2_gtAA_u16'=aa2bit{[16]u16,1,__gt}
|
||||
'avx2_geAA_u8'=aa2bit{[32]u8,1,__ge}; 'avx2_geAA_u16'=aa2bit{[16]u16,1,__ge}
|
||||
|
||||
'avx2_eqAS_i8'=as2bit{[32]i8,1,__eq}; 'avx2_eqAS_i16'=as2bit{[16]i16,1,__eq}; 'avx2_eqAS_i32'=as2bit{[8]i32,1,__eq}; 'avx2_eqAS_f64'=as2bit{[4]f64,2,__eq}
|
||||
'avx2_neAS_i8'=as2bit{[32]i8,1,__ne}; 'avx2_neAS_i16'=as2bit{[16]i16,1,__ne}; 'avx2_neAS_i32'=as2bit{[8]i32,1,__ne}; 'avx2_neAS_f64'=as2bit{[4]f64,2,__ne}
|
||||
'avx2_gtAS_i8'=as2bit{[32]i8,1,__gt}; 'avx2_gtAS_i16'=as2bit{[16]i16,1,__gt}; 'avx2_gtAS_i32'=as2bit{[8]i32,1,__gt}; 'avx2_gtAS_f64'=as2bit{[4]f64,2,__gt}
|
||||
'avx2_geAS_i8'=as2bit{[32]i8,1,__ge}; 'avx2_geAS_i16'=as2bit{[16]i16,1,__ge}; 'avx2_geAS_i32'=as2bit{[8]i32,1,__ge}; 'avx2_geAS_f64'=as2bit{[4]f64,2,__ge}
|
||||
'avx2_ltAS_i8'=as2bit{[32]i8,1,__lt}; 'avx2_ltAS_i16'=as2bit{[16]i16,1,__lt}; 'avx2_ltAS_i32'=as2bit{[8]i32,1,__lt}; 'avx2_ltAS_f64'=as2bit{[4]f64,2,__lt}
|
||||
'avx2_leAS_i8'=as2bit{[32]i8,1,__le}; 'avx2_leAS_i16'=as2bit{[16]i16,1,__le}; 'avx2_leAS_i32'=as2bit{[8]i32,1,__le}; 'avx2_leAS_f64'=as2bit{[4]f64,2,__le}
|
||||
'avx2_eqAS_i8'=as2bit{[32]i8,1,__eq}; 'avx2_eqAS_i16'=as2bit{[16]i16,1,__eq}; 'avx2_eqAS_i32'=as2bit{[8]i32,1,__eq}; 'avx2_eqAS_u1'=bitAS{{a,b}=> a ^ ~b}; 'avx2_eqAS_f64'=as2bit{[4]f64,2,__eq}
|
||||
'avx2_neAS_i8'=as2bit{[32]i8,1,__ne}; 'avx2_neAS_i16'=as2bit{[16]i16,1,__ne}; 'avx2_neAS_i32'=as2bit{[8]i32,1,__ne}; 'avx2_neAS_u1'=bitAS{{a,b}=> a ^ b}; 'avx2_neAS_f64'=as2bit{[4]f64,2,__ne}
|
||||
'avx2_gtAS_i8'=as2bit{[32]i8,1,__gt}; 'avx2_gtAS_i16'=as2bit{[16]i16,1,__gt}; 'avx2_gtAS_i32'=as2bit{[8]i32,1,__gt}; 'avx2_gtAS_u1'=bitAS{{a,b}=> a & ~b}; 'avx2_gtAS_f64'=as2bit{[4]f64,2,__gt}
|
||||
'avx2_geAS_i8'=as2bit{[32]i8,1,__ge}; 'avx2_geAS_i16'=as2bit{[16]i16,1,__ge}; 'avx2_geAS_i32'=as2bit{[8]i32,1,__ge}; 'avx2_geAS_u1'=bitAS{{a,b}=> a | ~b}; 'avx2_geAS_f64'=as2bit{[4]f64,2,__ge}
|
||||
'avx2_ltAS_i8'=as2bit{[32]i8,1,__lt}; 'avx2_ltAS_i16'=as2bit{[16]i16,1,__lt}; 'avx2_ltAS_i32'=as2bit{[8]i32,1,__lt}; 'avx2_ltAS_u1'=bitAS{{a,b}=> ~a & b}; 'avx2_ltAS_f64'=as2bit{[4]f64,2,__lt}
|
||||
'avx2_leAS_i8'=as2bit{[32]i8,1,__le}; 'avx2_leAS_i16'=as2bit{[16]i16,1,__le}; 'avx2_leAS_i32'=as2bit{[8]i32,1,__le}; 'avx2_leAS_u1'=bitAS{{a,b}=> ~a | b}; 'avx2_leAS_f64'=as2bit{[4]f64,2,__le}
|
||||
'avx2_gtAS_u8'=as2bit{[32]u8,1,__gt}; 'avx2_gtAS_u16'=as2bit{[16]u16,1,__gt}
|
||||
'avx2_geAS_u8'=as2bit{[32]u8,1,__ge}; 'avx2_geAS_u16'=as2bit{[16]u16,1,__ge}
|
||||
'avx2_ltAS_u8'=as2bit{[32]u8,1,__lt}; 'avx2_ltAS_u16'=as2bit{[16]u16,1,__lt}
|
||||
|
||||
15
src/singeli/src/loops.singeli
Normal file
15
src/singeli/src/loops.singeli
Normal file
@ -0,0 +1,15 @@
|
||||
def unroll{vars,begin,end,block & match{kind{begin},'number'} & match{kind{end},'number'}} = {
|
||||
def f{i,l & i==l} = 0
|
||||
def f{i,l & i!=l} = {
|
||||
exec{i, vars, block}
|
||||
f{i+1, l}
|
||||
}
|
||||
f{begin,end}
|
||||
}
|
||||
def for{vars,begin,end,block} = {
|
||||
i:u64 = begin
|
||||
while (i < end) {
|
||||
exec{i, vars, block}
|
||||
i = i+1
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user