separate array & scalar cases in arith builtins
This commit is contained in:
parent
9044cd0ef0
commit
e7662b0f6a
@ -151,9 +151,14 @@
|
||||
dec(a); return r;
|
||||
}
|
||||
|
||||
#define GC2i(SYMB, NAME, EXPR, EXTRA, BIT) B NAME##_c2(B t, B w, B x) { \
|
||||
#define GC2i(SYMB, NAME, EXPR, EXTRA1, EXTRA2, BIT) \
|
||||
static NOINLINE B NAME##_c2_arr(B t, B w, B x); \
|
||||
B NAME##_c2(B t, B w, B x) { \
|
||||
if (isF64(w) & isF64(x)) {f64 wv=w.f,xv=x.f;return m_f64(EXPR);} \
|
||||
EXTRA \
|
||||
EXTRA1 return NAME##_c2_arr(t,w,x); \
|
||||
} \
|
||||
static B NAME##_c2_arr(B t, B w, B x) { \
|
||||
EXTRA2 \
|
||||
if (isArr(w)|isArr(x)) { \
|
||||
if (isArr(w)&isArr(x) && rnk(w)==rnk(x)) { \
|
||||
if (memcmp(a(w)->sh, a(x)->sh, rnk(w)*sizeof(usz))) thrF(SYMB ": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \
|
||||
@ -233,9 +238,11 @@ static f64 pfmod(f64 a, f64 b) {
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
GC2i("+", add, wv+xv, {
|
||||
if (isC32(w) & isF64(x)) { u64 r = (u64)(o2cu(w)+o2i64(x)); if(r>CHR_MAX)thrM("+: Invalid character"); return m_c32((u32)r); }
|
||||
if (isF64(w) & isC32(x)) { u64 r = (u64)(o2cu(x)+o2i64(w)); if(r>CHR_MAX)thrM("+: Invalid character"); return m_c32((u32)r); }
|
||||
},{
|
||||
if (isArr(w)&isC32(x) || isC32(w)&isArr(x)) { if (isArr(w)) { B t=w;w=x;x=t; }
|
||||
if (TI(x,elType) == el_i32) {
|
||||
u32 wv = o2cu(w);
|
||||
@ -253,6 +260,7 @@ GC2i("+", add, wv+xv, {
|
||||
GC2i("-", sub, wv-xv, {
|
||||
if (isC32(w) & isF64(x)) { u64 r = (u64)((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((i32)(u32)w.u - (i32)(u32)x.u);
|
||||
},{
|
||||
if (isArr(w) && TI(w,elType)==el_c32) {
|
||||
if (isC32(x)) {
|
||||
i32 xv = (i32)o2cu(x);
|
||||
@ -280,12 +288,12 @@ GC2i("-", sub, wv-xv, {
|
||||
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, {}, 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)
|
||||
}, {}, 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), {})
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
#include "../utils/talloc.h"
|
||||
#include "../builtins.h"
|
||||
|
||||
bool please_tail_call_err = true;
|
||||
|
||||
bool inErr;
|
||||
NORETURN NOINLINE void err(char* s) {
|
||||
|
||||
@ -12,8 +12,8 @@ static NOINLINE void fillBitsDec(u64* dst, u64 sz, bool v, u64 x) {
|
||||
fillBits(dst, sz, v);
|
||||
}
|
||||
|
||||
bool please_tail_call_cmp_err = 1;
|
||||
static NOINLINE void cmp_err() { if (please_tail_call_cmp_err) thrM("Invalid comparison"); }
|
||||
extern bool please_tail_call_err;
|
||||
static NOINLINE void cmp_err() { if (please_tail_call_err) thrM("Invalid comparison"); }
|
||||
|
||||
|
||||
#define BCALL(N, X) N(b(X))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user