deduplicate a bit

This commit is contained in:
dzaima 2022-01-01 22:51:14 +02:00
parent ff4573f65c
commit b6f43ec4be
4 changed files with 18 additions and 19 deletions

View File

@ -11,6 +11,15 @@ static inline B arith_recm(BB2B f, B x) {
return withFill(r, fx);
}
B bit_negate(B x) { // consumes
u64* xp = bitarr_ptr(x);
u64* rp; B r = m_bitarrc(&rp, x);
usz ia = BIT_N(a(x)->ia);
for (usz i = 0; i < ia; i++) rp[i] = ~xp[i];
dec(x);
return r;
}
#define GC1i(SYMB,NAME,FEXPR,IBAD,IEXPR,BX) B NAME##_c1(B t, B x) { \
if (isF64(x)) { f64 v = x.f; return m_f64(FEXPR); } \
if (RARE(!isArr(x))) thrM(SYMB ": Expected argument to be a number"); \
@ -37,21 +46,18 @@ static inline B arith_recm(BB2B f, B x) {
}
#define P1(N) { if(isArr(x)) { SLOW1("arithm " #N, x); return arith_recm(N##_c1, x); } }
B add_c1(B t, B x) { return x; }
GC1i("-", sub, -v, v== MIN, -v, {}) // change icond to v==-v to support ¯0 (TODO that won't work for i8/i16)
GC1i("|", stile, fabs(v), v== MIN, v<0?-v:v,{})
GC1i("", floor, floor(v), 0, v, {})
GC1i("", ceil, ceil(v), 0, v, {})
GC1i("×", mul, v==0?0:v>0?1:-1, 0, v==0?0:v>0?1:-1,{})
GC1i("¬", not, 1-v, v<=-MAX, 1-v, {
if(xe==el_bit) {
u64* xp=bitarr_ptr(x); u64* rp; B r=m_bitarrc(&rp,x);
for (u64 i = 0; i < BIT_N(sz); i++) rp[i] = ~xp[i];
dec(x); return r;
}
if(xe==el_bit) return bit_negate(x);
})
#define P1(N) { if(isArr(x)) { SLOW1("arithm " #N, x); return arith_recm(N##_c1, x); } }
B div_c1(B t, B x) { if (isF64(x)) return m_f64( 1/x.f ); P1( div); thrM("÷: Getting reciprocal of non-number"); }
B pow_c1(B t, B x) { if (isF64(x)) return m_f64( exp(x.f)); P1( pow); thrM("⋆: Getting exp of non-number"); }
B root_c1(B t, B x) { if (isF64(x)) return m_f64( sqrt(x.f)); P1( root); thrM("√: Getting root of non-number"); }

View File

@ -5,10 +5,10 @@ B asFill(B x) { // consumes
u8 xe = TI(x,elType);
usz ia = a(x)->ia;
if (elNum(xe)) {
u64* rp; B r = m_bitarrc(&rp, x);
for (usz i = 0; i < BIT_N(ia); i++) rp[i] = 0;
Arr* r = allZeroes(ia);
arr_shCopy(r, x);
dec(x);
return r;
return taga(r);
}
if (elChr(xe)) {
u8* rp; B r = m_c8arrc(&rp, x);

View File

@ -90,7 +90,9 @@ static bool eqShape(B w, B x) { assert(isArr(w)); assert(isArr(x));
}
B bit_sel(B b, B e0, bool h0, B e1, bool h1); // consumes b; h0/h1 represent whether the corresponding element _might_ be in the result (can be true if unknown)
Arr* allZeroes(usz ia);
Arr* allOnes(usz ia);
B bit_negate(B x); // consumes
static B m_hVec1(B a ); // consumes all
static B m_hVec2(B a, B b ); // consumes all

View File

@ -3,15 +3,6 @@
NOINLINE Arr* allZeroes(usz ia) { u64* rp; Arr* r = m_bitarrp(&rp, ia); for (usz i = 0; i < BIT_N(ia); i++) rp[i] = 0; return r; }
NOINLINE Arr* allOnes (usz ia) { u64* rp; Arr* r = m_bitarrp(&rp, ia); for (usz i = 0; i < BIT_N(ia); i++) rp[i] = ~0ULL; return r; }
NOINLINE B bit_negate(B x) { // consumes
u64* xp = bitarr_ptr(x);
u64* rp; B r = m_bitarrc(&rp, x);
usz ia = BIT_N(a(x)->ia);
for (usz i = 0; i < ia; i++) rp[i] = ~xp[i];
dec(x);
return r;
}
NOINLINE B bit_sel(B b, B e0, bool h0, B e1, bool h1) {
u8 t0 = selfElType(e0);
u8 t1 = selfElType(e1);