diff --git a/src/builtins/slash.c b/src/builtins/slash.c index dccc80c6..86ea9ea5 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -654,18 +654,31 @@ B slash_c2(B t, B w, B x) { if (isArr(x) && RNK(x)==1 && q_i32(w)) { usz xia = IA(x); i32 wv = o2i(w); - if (wv<=0) { + if (wv<=1) { if (wv<0) thrM("/: 𝕨 cannot be negative"); - return taga(arr_shVec(TI(x,slice)(x, 0, 0))); + return wv ? x : taga(arr_shVec(TI(x,slice)(x, 0, 0))); } - if (TI(x,elType)==el_i32) { - i32* xp = i32any_ptr(x); - i32* rp; r = m_i32arrv(&rp, xia*wv); - for (usz i = 0; i < xia; i++) { - for (i64 j = 0; j < wv; j++) *rp++ = xp[i]; - } + u8 xe = TI(x,elType); + #define CONST_REP(T) \ + usz s = xia*wv; \ + T* xp = tyany_ptr(x); \ + T* rp = m_tyarrv(&r, elWidth(xe), s, el2t(xe)); \ + usz b = 1<<10; \ + T js=xp[0], px=js; \ + for (usz k=0, j=0, ij=wv; ; ) { \ + usz e = b