diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index a9bc4d6d..47395b62 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -187,7 +187,7 @@ static B modint_AS(B w, B xv) { return modint_AA(w, C2(shape, C1(fne, incG(w)) if (q_i32(w)) { i32 wi32 = o2iG(w); if (wi32>0 && (wi32&(wi32-1))==0) { - if (wi32==1) { Arr* ra=allZeroes(IA(x)); arr_shCopy(ra, x); r = taga(ra); decG(x); return r; } + if (wi32==1) return i64EachDec(0, x); if (xe==el_bit) return x; // if n>1 (true from the above), 0‿1 ≡ (2⋆n)|0‿1 u8 elw = elWidth(xe); u32 mask0 = (u32)wi32; diff --git a/src/builtins/cmp.c b/src/builtins/cmp.c index 735495b6..2080c124 100644 --- a/src/builtins/cmp.c +++ b/src/builtins/cmp.c @@ -3,9 +3,7 @@ #include "../utils/calls.h" static NOINLINE void fillBits(u64* dst, u64 sz, bool v) { - u64 x = 0-(u64)v; - u64 am = (sz+63)/64; assert(am>0); - for (usz i = 0; i < am; i++) dst[i] = x; + memset((u8*)dst, v?0xff:0, BIT_N(sz)*8); } static NOINLINE void fillBitsDec(u64* dst, u64 sz, bool v, u64 x) { dec(b(x)); diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 70547edb..18664dec 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -85,9 +85,7 @@ NOINLINE B list_range(B x) { ud_rec(rp, 0, xia, pos, sh); fillarr_setFill(r, incG(rp[0])); } else { - i32* fp; - fillarr_setFill(r, m_i32arrv(&fp, xia)); - for (usz i = 0; i < xia; i++) fp[i] = 0; + fillarr_setFill(r, taga(arr_shVec(allZeroes(xia)))); } return taga(r); } diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 7ff9efd9..3cdf5ec5 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -414,11 +414,9 @@ B GRADE_CAT(c2)(B t, B w, B x) { u8 we = TI(w,elType); usz wia = IA(w); u8 xe = TI(x,elType); usz xia = IA(x); - B r; - if (wia==0 | xia==0) { - Arr* ra=allZeroes(xia); arr_shCopy(ra, x); - r=taga(ra); goto done; - } + B r; Arr* ra; + + if (wia==0 | xia==0) goto zeroes_done; if (wia==1) { B c = IGet(w, 0); if (LIKELY(wef; if (xe==el_bit && q_bit(w)) { // ⌊ & ⌈ handled above - if (rtid==n_or ) { if (!o2bG(w)) return scan_or(x, ia); B r = taga(arr_shVec(allOnes (ia))); decG(x); return r; } // ∨ - if (rtid==n_and | rtid==n_mul) { if ( o2bG(w)) return scan_and(x, ia); B r = taga(arr_shVec(allZeroes(ia))); decG(x); return r; } // ∧× - if (rtid==n_lt) return scan_lt(x, bitx(w), ia); // < + if (rtid==n_or ) return !o2bG(w)? scan_or(x, ia) : i64EachDec(1, x); // ∨ + if (rtid==n_and | rtid==n_mul) return o2bG(w)? scan_and(x, ia) : i64EachDec(0, x); // ∧× + if (rtid==n_lt) return scan_lt(x, bitx(w), ia); // < } } base:; diff --git a/src/builtins/search.c b/src/builtins/search.c index 228c7ae1..43a783ff 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -218,8 +218,7 @@ B indexOf_c2(B t, B w, B x) { u8 we = TI(w,elType); usz wia = IA(w); u8 xe = TI(x,elType); usz xia = IA(x); if (wia==0 || xia==0) { - B r=taga(arr_shCopy(allZeroes(xia), x)); - decG(w); decG(x); return r; + decG(w); return i64EachDec(0, x); } if (elNum(we) && elNum(xe)) { tyEls: @@ -303,8 +302,7 @@ B memberOf_c2(B t, B w, B x) { u8 we = TI(w,elType); usz wia = IA(w); u8 xe = TI(x,elType); usz xia = IA(x); if (wia==0 || xia==0) { - r=taga(arr_shCopy(allZeroes(wia), w)); - decG(w); goto dec_x; + decG(x); return i64EachDec(0, w); } if (elNum(we) && elNum(xe)) { tyEls: diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index a3835aef..99a79a92 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -124,6 +124,49 @@ static void fill_words(void* rp, u64 v, u64 bytes) { for (usz i=0; i=(u64)wi; xt>>=1) sh++; u64 sz = ((xi-1)>>sh)+1 + wi; TALLOC(i32, hash, sz); - for (u64 i = 0; i < sz; i++) hash[i] = xi; + FILL_TO(hash, el_i32, 0, x, sz); for (i32 i = xi-wi; i < xi; i++) { i32 j = wy2u0k(wyrand(&seed), i+1); u64 p = (u64)j >> sh; diff --git a/src/core/fillarr.c b/src/core/fillarr.c index 7dd88ba1..c56c1f37 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -4,12 +4,7 @@ B asFill(B x) { // consumes if (isArr(x)) { u8 xe = TI(x,elType); usz ia = IA(x); - if (elNum(xe)) { - Arr* r = allZeroes(ia); - arr_shCopy(r, x); - decG(x); - return taga(r); - } + if (elNum(xe)) return i64EachDec(0, x); if (elChr(xe)) { u8* rp; B r = m_c8arrc(&rp, x); for (usz i = 0; i < ia; i++) rp[i] = ' '; diff --git a/src/core/stuff.h b/src/core/stuff.h index 525eb6a4..36c4f398 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -148,8 +148,14 @@ static bool ptr_eqShape(usz* wsh, ur wr, usz* xsh, ur xr) { static bool eqShape(B w, B x) { assert(isArr(w) && isArr(x)); return ptr_eqShape(SH(w), RNK(w), SH(x), RNK(x)); } B bit_sel(B b, B e0, B e1); // consumes b; b must be bitarr; b⊏e0‿e1 -Arr* allZeroes(usz ia); -Arr* allOnes(usz ia); + + +Arr* allZeroes(usz ia); // ia⥊0 with undefined shape +Arr* allOnes(usz ia); // ia⥊1 with undefined shape + +Arr* reshape_one(usz nia, B x); // nia⥊1↑⥊x with undefined shape +B i64EachDec(i64 v, B x); // v¨ x; consumes x + B bit_negate(B x); // consumes void bit_negatePtr(u64* rp, u64* xp, usz count); // count is number of u64-s B widenBitArr(B x, ur axis); // consumes x, assumes bitarr; returns some array with cell size padded to the nearest of 8,16,32,64 if ≤64 bits, or a multiple of 64 bits otherwise diff --git a/src/ffi.c b/src/ffi.c index 3fcfc761..e9506fe3 100644 --- a/src/ffi.c +++ b/src/ffi.c @@ -329,14 +329,14 @@ BQNFFIEnt ffi_parseTypeStr(u32** src, bool inPtr, bool top) { // parse actual ty rt = ffi_type_pointer; } else { // largely copy-pasted from `case '{':` BQNFFIEnt* rp; ro = m_bqnFFIType(&rp, cty_starr, n+1); - for (int i = 0; i < n; i++) rp[i] = e; + PLAINLOOP for (int i = 0; i < n; i++) rp[i] = e; incBy(e.o, n-1); rp[n].structData = NULL; TAlloc* ao = ARBOBJ(sizeof(ffi_type*) * (n+1)); rp[n].structData = ao; ffi_type** els = rt.elements = (ffi_type**) ao->data; - for (usz i = 0; i < n; i++) els[i] = &rp[i].t; + PLAINLOOP for (usz i = 0; i < n; i++) els[i] = &rp[i].t; els[n] = NULL; rt.type = FFI_TYPE_STRUCT; @@ -344,7 +344,7 @@ BQNFFIEnt ffi_parseTypeStr(u32** src, bool inPtr, bool top) { // parse actual ty TALLOC(size_t, offsets, n); if (ffi_get_struct_offsets(FFI_DEFAULT_ABI, &rt, offsets) != FFI_OK) thrM("FFI: Failed getting array offsets"); if (rt.size>=U16_MAX) thrM("FFI: Array too large; limit is 65534 bytes"); - for (usz i = 0; i < n; i++) rp[i].offset = offsets[i]; + PLAINLOOP for (usz i = 0; i < n; i++) rp[i].offset = offsets[i]; c(BQNFFIType, ro)->structSize = rt.size; TFREE(offsets); } @@ -415,7 +415,7 @@ BQNFFIEnt ffi_parseTypeStr(u32** src, bool inPtr, bool top) { // parse actual ty TAlloc* ao = ARBOBJ(sizeof(ffi_type*) * (n+1)); rp[n].structData = ao; ffi_type** els = rt.elements = (ffi_type**) ao->data; - for (usz i = 0; i < n; i++) els[i] = &rp[i].t; + PLAINLOOP for (usz i = 0; i < n; i++) els[i] = &rp[i].t; els[n] = NULL; TSFREE(es); rt.type = FFI_TYPE_STRUCT; @@ -423,7 +423,7 @@ BQNFFIEnt ffi_parseTypeStr(u32** src, bool inPtr, bool top) { // parse actual ty TALLOC(size_t, offsets, n); if (ffi_get_struct_offsets(FFI_DEFAULT_ABI, &rt, offsets) != FFI_OK) thrM("FFI: Failed getting struct offsets"); if (rt.size>=U16_MAX) thrM("FFI: Struct too large; limit is 65534 bytes"); - for (usz i = 0; i < n; i++) rp[i].offset = offsets[i]; + PLAINLOOP for (usz i = 0; i < n; i++) rp[i].offset = offsets[i]; c(BQNFFIType, ro)->structSize = rt.size; TFREE(offsets); break; @@ -919,7 +919,7 @@ B ffiload_c2(B t, B w, B x) { if (sz<16) sz = 16; TAlloc* argsRaw = ARBOBJ(sz); ffi_type** argsRawArr = (ffi_type**)argsRaw->data; - for (usz i = 0; i < argn; i++) argsRawArr[i] = &args[i+1].t; + PLAINLOOP for (usz i = 0; i < argn; i++) argsRawArr[i] = &args[i+1].t; // for (usz i = 0; i < argn; i++) { // ffi_type c = *argsRawArr[i]; // printf("%zu %d %d %p\n", c.size, c.alignment, c.type, c.elements); diff --git a/src/main.c b/src/main.c index fb000812..379621f7 100644 --- a/src/main.c +++ b/src/main.c @@ -164,7 +164,7 @@ static NOINLINE i64 readInt(char** p) { static B sysvalNames, sysvalNamesNorm; NOINLINE void fill_color(ReplxxColor* cols, int s, int e, ReplxxColor col) { - for (int i = s; i < e; i++) cols[i] = col; + PLAINLOOP for (int i = s; i < e; i++) cols[i] = col; } static bool chr_nl(u32 c) { return c==10 || c==13; } static bool chr_dig(u32 c) { return c>='0' && c<='9'; } diff --git a/src/utils/bits.c b/src/utils/bits.c index f2e6eb5a..27ccc0b6 100644 --- a/src/utils/bits.c +++ b/src/utils/bits.c @@ -35,13 +35,8 @@ NOINLINE B bit_sel(B b, B e0, B e1) { case el_f64: goto t_f64; } t_bit: - if (f0) { - if (f1) { Arr* a = allOnes(ia); arr_shCopy(a, b); r = taga(a); goto dec_ret; } - else return bit_negate(b); - } else { - if (f1) return b; - else { Arr* a = allZeroes(ia); arr_shCopy(a, b); r = taga(a); goto dec_ret; } - } + if (f0) return f1? i64EachDec(1, b) : bit_negate(b); + else return f1? b : i64EachDec(0, b); t_i8: type=t_i8arr; width=0; e0i=( u8)( i8)f0; e1i=( u8)( i8)f1; goto sel; t_i16: type=t_i16arr; width=1; e0i=(u16)(i16)f0; e1i=(u16)(i16)f1; goto sel; t_i32: type=t_i32arr; width=2; e0i=(u32)(i32)f0; e1i=(u32)(i32)f1; goto sel;