diff --git a/src/utils/mut.c b/src/utils/mut.c index 1d20c053..102e7400 100644 --- a/src/utils/mut.c +++ b/src/utils/mut.c @@ -273,76 +273,72 @@ DEF_G(void, copy, B, (void* a, usz ms, B x, usz xs, usz l), ms, x, x } #define COPY_FN(X,R) simd_copy_##X##_##R - #define MAKE_CPY(TY, MAKE, GET, WR, XRP, H2T, T, ...) \ - static copy_fn copy##T##Fns[10]; \ - NOINLINE void cpy##T##Arr_BF(void* xp, void* rp, u64 ia, Arr* xa) { \ + #define MAKE_CPY(TY, MAKE, GET, WR, XRP, H2T, E, N, ...) \ + static copy_fn copy0_##E##_fns[10]; \ + NOINLINE void cpy##N##Arr_BF(void* xp, void* rp, u64 ia, Arr* xa) { \ AS2B fn = TIv(xa,GET); \ for (usz i=0; i0) { \ - copy##T##Fns[TI(x,elType)](tyany_ptr(x), XRP, ia, a(x)); \ + copy0_##E##_fns[TI(x,elType)](tyany_ptr(x), XRP, ia, a(x)); \ } \ if (TY) ptr_decT(a(x)); \ else decG(x); \ NOGC_E; return (Arr*)r; \ } #define BIT_PUT(V) bitp_set((u64*)rp, i, o2bG(V)) - #define H2T_COPY(T) copy##T##Fns[el_MAX](bxp, rp, ia, xRaw) - #define MAKE_TYCPY(T, E, F, ...) MAKE_CPY(1, T##Atom* rp; Arr* r = m_##E##arrp(&rp, ia), getU, ((T##Atom*)rp)[i] = F, rp, H2T_COPY(T), T, __VA_ARGS__) + #define H2T_COPY(E) copy0_##E##_fns[el_MAX](bxp, rp, ia, xRaw) + #define MAKE_TYCPY(T, E, F, ...) MAKE_CPY(1, T##Atom* rp; Arr* r = m_##E##arrp(&rp, ia), getU, ((T##Atom*)rp)[i] = F, rp, H2T_COPY(E), E, T, __VA_ARGS__) #define MAKE_CCPY(T,E) MAKE_TYCPY(T, E, o2cG, {badCopy, badCopy, badCopy, badCopy, badCopy, COPY_FN(c8,E),COPY_FN(c16,E),COPY_FN(c32,E),cpy##T##Arr_B,COPY_FN(B,E)}) #define MAKE_ICPY(T,E) MAKE_TYCPY(T, E, o2fG, {COPY_FN(1,E),COPY_FN(i8,E),COPY_FN(i16,E),COPY_FN(i32,E),COPY_FN(f64,E),badCopy, badCopy, badCopy, cpy##T##Arr_B,COPY_FN(f64,E)}) MAKE_CPY(0, HArr_p p = m_harrUp(ia); Arr* r = (Arr*)p.c, get, ((B*)rp)[i] =, p.a, for (usz i=0; ia, E, p0, x, xe, cia); \ + COPY0_TO(m->a, E, p0, x, xe, cia); \ } #define APD_SH1_CHK(N) if (RARE(isAtm(x) || RNK(x)!=1 || cia!=IA(x) )) { apd_sh_fail(m,x,N); return; } #define APD_SHH_CHK(N) if (RARE(isAtm(x) || RNK(x)!=m->cr || !eqShPart(m->csh, SH(x), m->cr))) { apd_sh_fail(m,x,N); return; } -#define APD_WATOM(N, EB, TATOM, WATOM) \ - if (RARE(!TATOM)) APD_WIDEN(N); \ +#define APD_WATOM(N, EB, E, WATOM) \ + if (RARE(!q_##E(x))) APD_WIDEN(N); \ usz p0 = APD_POS(EB); \ APD_POS(EB) = p0+1; \ void* a = m->a; WATOM; -#define APD_MK(E, EB, WATOM, TATOM, TARR) \ +#define APD_MK(E, EB, WATOM, TARR) \ APD_MK0(E, EB, EB, sh1, TARR, m->cia, , APD_SH1_CHK(1)) \ APD_MK0(E, EB, EB, sh2, TARR, m->cia, , assert(m->cr>=2); APD_SHH_CHK(2)) \ - APD_MK0(E, 0, EB, tot, TARR, IA(x), if (isAtm(x)) { APD_WATOM(tot, EB, TATOM, WATOM); return; }, if (cia==0) return; ) \ + APD_MK0(E, 0, EB, tot, TARR, IA(x), if (isAtm(x)) { APD_WATOM(tot, EB, E, WATOM); return; }, if (cia==0) return; ) \ NOINLINE void apd_sh0_##E(ApdMut* m, B x) { \ APD_OR_FILL(EB, x); \ if (isArr(x)) { \ if (RARE(RNK(x)!=0)) { apd_sh_fail(m,x,0); return; } \ x = IGetU(x,0); \ } \ - APD_WATOM(sh0, EB, TATOM, WATOM); \ + APD_WATOM(sh0, EB, E, WATOM); \ } -APD_MK(bit, 0, bitp_set((u64*)a,p0,o2bG(x)), q_bit(x), xe==el_bit) -APD_MK(i8, 0, ((i8 *)a)[p0]=o2iG(x), q_i8(x), xe<=el_i8 ) APD_MK(c8, 0, ((u8 *)a)[p0]=o2cG(x), q_c8(x), xe==el_c8) -APD_MK(i16, 0, ((i16*)a)[p0]=o2iG(x), q_i16(x), xe<=el_i16) APD_MK(c16, 0, ((u16*)a)[p0]=o2cG(x), q_c16(x), xe>=el_c8 && xe<=el_c16) -APD_MK(i32, 0, ((i32*)a)[p0]=o2iG(x), q_i32(x), xe<=el_i32) APD_MK(c32, 0, ((u32*)a)[p0]=o2cG(x), q_c32(x), xe>=el_c8 && xe<=el_c32) -APD_MK(f64, 0, ((f64*)a)[p0]=o2fG(x), q_f64(x), xe<=el_f64) APD_MK(B, 1, ((B*)a)[p0]=inc(x);, 1, 1) +APD_MK(bit, 0, bitp_set((u64*)a,p0,o2bG(x)), xe==el_bit) +APD_MK(i8, 0, ((i8 *)a)[p0]=o2iG(x), xe<=el_i8 ) APD_MK(c8, 0, ((u8 *)a)[p0]=o2cG(x), xe==el_c8) +APD_MK(i16, 0, ((i16*)a)[p0]=o2iG(x), xe<=el_i16) APD_MK(c16, 0, ((u16*)a)[p0]=o2cG(x), xe>=el_c8 && xe<=el_c16) +APD_MK(i32, 0, ((i32*)a)[p0]=o2iG(x), xe<=el_i32) APD_MK(c32, 0, ((u32*)a)[p0]=o2cG(x), xe>=el_c8 && xe<=el_c32) +APD_MK(f64, 0, ((f64*)a)[p0]=o2fG(x), xe<=el_f64) APD_MK(B, 1, ((B*)a)[p0]=inc(x);, 1) #undef APD_MK NOINLINE void apd_shE_T(ApdMut* m, B x) { APD_SHH_CHK(2) }