From ffc4cec1ae3ace5e4eb02733e84e62f94fbc31cf Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 5 Sep 2021 23:26:31 +0300 Subject: [PATCH] monadic i8/i16 arith --- src/builtins/arithm.c | 26 +++++++++++++++----------- src/core.h | 8 ++++---- src/core/fillarr.c | 4 +++- src/h.h | 4 ++-- src/opt/single.c | 2 +- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/builtins/arithm.c b/src/builtins/arithm.c index 6d74d414..808f76f8 100644 --- a/src/builtins/arithm.c +++ b/src/builtins/arithm.c @@ -15,14 +15,18 @@ static inline B arith_recm(BB2B f, B x) { if (RARE(!isArr(x))) thrM(SYMB ": Expected argument to be a number"); \ u8 xe = TI(x,elType); \ i64 sz = a(x)->ia; \ - if (xe==el_i32) { i32* xp = i32any_ptr(x); \ - i32* rp; B r = m_i32arrc(&rp, x); \ - for (i64 i = 0; i < sz; i++) { i32 v = xp[i]; \ - if (RARE(IBAD)) { dec(r); goto base; } \ - rp[i] = IEXPR; \ - } \ - dec(x); return r; \ - } \ + if (xe==el_i8) { i8 MAX=I8_MAX; i8 MIN=I8_MIN; i8* xp=i8any_ptr(x); i8* rp; B r=m_i8arrc(&rp,x); \ + for (i64 i = 0; i < sz; i++) { i8 v = xp[i]; if (RARE(IBAD)) { dec(r); goto base; } rp[i] = IEXPR; } \ + dec(x); (void)MIN;(void)MAX; return r; \ + } \ + if (xe==el_i16) { i16 MAX=I16_MAX; i16 MIN=I16_MIN; i16* xp=i16any_ptr(x); i16* rp; B r=m_i16arrc(&rp,x); \ + for (i64 i = 0; i < sz; i++) { i16 v = xp[i]; if (RARE(IBAD)) { dec(r); goto base; } rp[i] = IEXPR; } \ + dec(x); (void)MIN;(void)MAX; return r; \ + } \ + if (xe==el_i32) { i32 MAX=I32_MAX; i32 MIN=I32_MIN; i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrc(&rp,x); \ + for (i64 i = 0; i < sz; i++) { i32 v = xp[i]; if (RARE(IBAD)) { dec(r); goto base; } rp[i] = IEXPR; } \ + dec(x); (void)MIN;(void)MAX; return r; \ + } \ if (xe==el_f64) { f64* xp = f64any_ptr(x); \ f64* rp; B r = m_f64arrc(&rp, x); \ for (i64 i = 0; i < sz; i++) { f64 v = xp[i]; rp[i] = FEXPR; } \ @@ -34,9 +38,9 @@ static inline B arith_recm(BB2B f, B x) { #define P1(N) { if(isArr(x)) return arith_recm(N##_c1, x); } B add_c1(B t, B x) { return x; } -GC1i("-", sub, -v, v==I32_MAX, -v) // change icond to v==-v to support ¯0 -GC1i("¬", not, 1-v, v<=-I32_MAX, 1-v) // v<=-I32_MAX -GC1i("|", stile, fabs(v), v==I32_MIN, v<0?-v:v) +GC1i("-", sub, -v, v== MAX, -v) // change icond to v==-v to support ¯0 +GC1i("¬", not, 1-v, v<=-MAX, 1-v) // v<=-I32_MAX +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) diff --git a/src/core.h b/src/core.h index 9fa683bc..63081333 100644 --- a/src/core.h +++ b/src/core.h @@ -76,10 +76,10 @@ static i64 isum(B x) { // doesn't consume; may error; TODO error on overflow i64 r = 0; usz xia = a(x)->ia; u8 xe = TI(x,elType); - if (xe==el_i32) { - i32* p = i32any_ptr(x); - for (usz i = 0; i < xia; i++) r+= p[i]; - } else if (xe==el_f64) { + if (xe==el_i8 ) { i8* p = i8any_ptr (x); for (usz i = 0; i < xia; i++) r+= p[i]; } + else if (xe==el_i16) { i16* p = i16any_ptr(x); for (usz i = 0; i < xia; i++) r+= p[i]; } + else if (xe==el_i32) { i32* p = i32any_ptr(x); for (usz i = 0; i < xia; i++) r+= p[i]; } + else if (xe==el_f64) { f64* p = f64any_ptr(x); for (usz i = 0; i < xia; i++) { if(p[i]!=(i64)p[i]) thrM("Expected integer"); r+= p[i]; } } else { diff --git a/src/core/fillarr.c b/src/core/fillarr.c index 57242a96..cd27e7c9 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -5,7 +5,7 @@ B asFill(B x) { // consumes u8 xe = TI(x,elType); usz ia = a(x)->ia; if (xe<=el_f64) { - i32* rp; B r = m_i32arrc(&rp, x); + i8* rp; B r = m_i8arrc(&rp, x); for (usz i = 0; i < ia; i++) rp[i] = 0; dec(x); return r; @@ -113,6 +113,8 @@ B withFill(B x, B fill) { // consumes both if (noFill(fill) && xt!=t_fillarr && xt!=t_fillslice) return x; switch(xt) { case t_f64arr: case t_f64slice: + case t_i8arr: case t_i8slice: if(fill.u == m_i32(0 ).u) return x; break; + case t_i16arr: case t_i16slice: if(fill.u == m_i32(0 ).u) return x; break; case t_i32arr: case t_i32slice: if(fill.u == m_i32(0 ).u) return x; break; case t_c32arr: case t_c32slice: if(fill.u == m_c32(' ').u) return x; break; case t_fillslice: if (fillEqual(((FillArr*)c(Slice,x)->p)->fill, fill)) { dec(fill); return x; } break; diff --git a/src/h.h b/src/h.h index b06e1dc6..047025e7 100644 --- a/src/h.h +++ b/src/h.h @@ -102,8 +102,8 @@ #define f64 double #define I8_MIN -128 #define I8_MAX 127 -#define I16_MIN -65536 -#define I16_MAX 65535 +#define I16_MIN -32768 +#define I16_MAX 32767 #define I32_MIN -2147483648 #define I32_MAX 2147483647 #define I64_MIN ((i64)(1ULL<<63)) diff --git a/src/opt/single.c b/src/opt/single.c index baf53339..8366e5d8 100644 --- a/src/opt/single.c +++ b/src/opt/single.c @@ -1,4 +1,5 @@ #include "../core.h" +#include "../load.c" #include "../core/tyarr.c" #include "../core/harr.c" #include "../core/fillarr.c" @@ -25,5 +26,4 @@ #include "../nfns.c" #include "../rtwrap.c" #include "../jit/nvm.c" -#include "../load.c" #include "../main.c"