diff --git a/src/builtins/arithm.c b/src/builtins/arithm.c index 9c556d5f..087dccae 100644 --- a/src/builtins/arithm.c +++ b/src/builtins/arithm.c @@ -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"); } diff --git a/src/core/fillarr.c b/src/core/fillarr.c index d7ea2695..65f7b16b 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -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); diff --git a/src/core/stuff.h b/src/core/stuff.h index 2ebbddb1..03664a5f 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -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 diff --git a/src/utils/bits.c b/src/utils/bits.c index 84be098f..eac58fcb 100644 --- a/src/utils/bits.c +++ b/src/utils/bits.c @@ -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);