diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index a3dedadb..180c797a 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -123,7 +123,35 @@ } \ dec(w); dec(x); return r; \ } - #define GC2i(SYMB, NAME, EXPR, EXTRA, BIT, BX) B NAME##_c2(B t, B w, B x) { \ + + static B bitAA0(B w, B x, usz ia) { UD; } + static B bitAN0(B a, B b, usz ia) { UD; } + static NOINLINE B bitAA1(B w, B x, usz ia) { + u64* rp; B r = m_bitarrc(&rp, x); + u64* wp=bitarr_ptr(w); u64* xp=bitarr_ptr(x); + for (usz i=0; iia; u8 xe = TI(x,elType); \ if (xe==el_bit) { \ - if (BIT && q_fbit(w.f)) { u64* rp; B r=m_bitarrc(&rp,x); \ - u64 wv = bitx(w); u64* xp = bitarr_ptr(x); \ - for (usz i=0; iia; u8 we = TI(w,elType); \ if (we==el_bit) { \ - if (BIT && q_fbit(x.f)) { u64* rp; B r=m_bitarrc(&rp,w); \ - u64 xv = bitx(x); u64* wp = bitarr_ptr(w); \ - for (usz i=0; iCHR_MAX)thrM("-: Invalid character"); return m_c32((u32)r); } if (isC32(w) & isC32(x)) return m_f64((i32)(u32)w.u - (i32)(u32)x.u); @@ -258,16 +276,16 @@ GC2i("-", sub, wv-xv, { } } } -}, 0, -) +}, 0) GC2i("¬", not, 1+wv-xv, { if (isC32(w) & isF64(x)) { u64 r = (u64)(1+(i32)o2cu(w)-o2i64(x)); if(r>CHR_MAX)thrM("¬: Invalid character"); return m_c32((u32)r); } if (isC32(w) & isC32(x)) return m_f64(1 + (i32)(u32)w.u - (i32)(u32)x.u); -}, 0, -) -GC2i("×", mul, wv*xv, {}, 1, &) -GC2i("∧", and, wv*xv, {}, 1, &) -GC2i("∨", or , (wv+xv)-(wv*xv), {}, 1, |) -GC2i("⌊", floor, wv>xv?xv:wv, {}, 1, &) // optimizer optimizes out the fallback mess -GC2i("⌈", ceil , wv>xv?wv:xv, {}, 1, |) +}, 0) +GC2i("×", mul, wv*xv, {}, 2) +GC2i("∧", and, wv*xv, {}, 2) +GC2i("∨", or , (wv+xv)-(wv*xv), {}, 1) +GC2i("⌊", floor, wv>xv?xv:wv, {}, 2) // optimizer optimizes out the fallback mess +GC2i("⌈", ceil , wv>xv?wv:xv, {}, 1) GC2f("÷", div , w.f/x.f, {}) GC2f("⋆", pow , pow(w.f, x.f), {})