monadic i8/i16 arith
This commit is contained in:
parent
b1b066ce5c
commit
ffc4cec1ae
@ -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)
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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;
|
||||
|
||||
4
src/h.h
4
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))
|
||||
|
||||
@ -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"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user