From f0d6a652402c62769e9c51b551baad46fe8b533a Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 25 Aug 2023 03:12:11 +0300 Subject: [PATCH] move unaligned load/store helpers to stuff.h also replace a NULL with "" to make iBuf+0 not be UB --- src/builtins/slash.c | 2 +- src/builtins/sysfn.c | 2 +- src/core/stuff.h | 4 ++++ src/utils/bits.c | 7 ++----- src/utils/includeSingeli.h | 3 --- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/builtins/slash.c b/src/builtins/slash.c index ff8c78ea..ccf8405a 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -822,7 +822,7 @@ B slash_c2(B t, B w, B x) { u64 mt = (u64)1<<(d+1); // Bit d+1 may be needed, isn't pdep-ed usz tsh = d*wv-(d+1); for (usz xi=0, o=0, j=0; j> (xi%8); + xw = loadu_u64((u64*)((u8*)xp+xi/8)) >> (xi%8); u64 ex = (xw&mt)<>o|(xw&1)); diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index 74e7b33e..d7d8f1a1 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -1058,7 +1058,7 @@ B sh_c2(B t, B w, B x) { iBuf = TALLOCP(char, iLen); toUTF8(inObj, iBuf); } - } else iBuf = NULL; + } else iBuf = ""; #define FREE_INPUT do { if (iLen>0) { if (raw) free_chars(iBufRaw); else TFREE(iBuf); } } while(0) bool iDone = false; diff --git a/src/core/stuff.h b/src/core/stuff.h index 36c4f398..3c301a3a 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -3,6 +3,10 @@ #define MAP_NORESERVE 0 // apparently needed for freebsd or something #endif +static void storeu_u64(u64* p, u64 v) { memcpy((char*)p, &v, 8); } static u64 loadu_u64(u64* p) { u64 v; memcpy(&v, (char*)p, 8); return v; } +static void storeu_u32(u32* p, u32 v) { memcpy((char*)p, &v, 4); } static u32 loadu_u32(u32* p) { u32 v; memcpy(&v, (char*)p, 4); return v; } +static void storeu_u16(u16* p, u16 v) { memcpy((char*)p, &v, 2); } static u16 loadu_u16(u16* p) { u16 v; memcpy(&v, (char*)p, 2); return v; } + void print_allocStats(void); void vm_pstLive(void); diff --git a/src/utils/bits.c b/src/utils/bits.c index 27ccc0b6..c7346fd4 100644 --- a/src/utils/bits.c +++ b/src/utils/bits.c @@ -117,9 +117,6 @@ FORCE_INLINE void ab_add(ABState* state, u64 val, ux count) { // assumes bits pa } -FORCE_INLINE u64 ruu64(void* p) { u64 r; memcpy(&r, p, 8); return r; } // read byte-unaligned u64 -FORCE_INLINE void wuu64(void* p, u64 v) { memcpy(p, &v, 8); } // write byte-unaligned u64 - static NOINLINE B zeroPadToCellBits0(B x, usz lr, usz cam, usz pcsz, usz ncsz) { // consumes; for now assumes ncsz is either a multiple of 64, or one of 8,16,32 assert((ncsz&7) == 0 && RNK(x)>=1 && pcsz>6; // full u64 count per cell in x u64 msk = (1ull<<(ocsz&63))-1; for (ux i = 0; i < cam; i++) { - for (ux j = 0; j < rfu64; j++) ab_add(&ab, ruu64(j + (u64*)xp), 64); - ab_add(&ab, ruu64(rfu64 + (u64*)xp)&msk, ocsz&63); + for (ux j = 0; j < rfu64; j++) ab_add(&ab, loadu_u64(j + (u64*)xp), 64); + ab_add(&ab, loadu_u64(rfu64 + (u64*)xp)&msk, ocsz&63); rp+= ocsz>>6; xp+= xcsz>>3; } diff --git a/src/utils/includeSingeli.h b/src/utils/includeSingeli.h index 838eac55..23c607df 100644 --- a/src/utils/includeSingeli.h +++ b/src/utils/includeSingeli.h @@ -13,9 +13,6 @@ #define _mm_storeu_si32 custom_storeu_si32 #endif - static void storeu_u64(u64* p, u64 v) { memcpy((char*)p, &v, 8); } static u64 loadu_u64(u64* p) { u64 v; memcpy(&v, (char*)p, 8); return v; } - static void storeu_u32(u32* p, u32 v) { memcpy((char*)p, &v, 4); } static u32 loadu_u32(u32* p) { u32 v; memcpy(&v, (char*)p, 4); return v; } - static void storeu_u16(u16* p, u16 v) { memcpy((char*)p, &v, 2); } static u16 loadu_u16(u16* p) { u16 v; memcpy(&v, (char*)p, 2); return v; } #define BCALL(N, X) N(b(X)) #define interp_f64(X) b(X).f