separate array & scalar cases in arith builtins

This commit is contained in:
dzaima 2021-12-13 00:16:15 +02:00
parent 9044cd0ef0
commit e7662b0f6a
3 changed files with 19 additions and 10 deletions

View File

@ -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), {})

View File

@ -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) {

View File

@ -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))