make ubsan happier, optimize nextBC

still doesn't like f==(f64)(someIntType)f but that's, like, not replaceable
This commit is contained in:
dzaima 2021-07-17 21:22:23 +03:00
parent cd86a0b242
commit 1719374e0a
4 changed files with 16 additions and 14 deletions

View File

@ -16,7 +16,7 @@
// separate memory management system for executable code; isn't garbage-collected // separate memory management system for executable code; isn't garbage-collected
EmptyValue* mmX_buckets[64]; EmptyValue* mmX_buckets[64];
u64* mmX_ctrs[64]; u64 mmX_ctrs[64];
#define BSZ(X) (1ull<<(X)) #define BSZ(X) (1ull<<(X))
#define BSZI(X) ((u8)(64-__builtin_clzl((X)-1ull))) #define BSZI(X) ((u8)(64-__builtin_clzl((X)-1ull)))
#define MMI(X) X #define MMI(X) X

View File

@ -98,13 +98,13 @@ static inline void asm_1(TStack* o, i8 v) {
static inline void asm_4(TStack* o, i32 v) { int size = o->size; static inline void asm_4(TStack* o, i32 v) { int size = o->size;
// o->data[size+0] = (v ) & 0xff; o->data[size+1] = (v>> 8) & 0xff; // o->data[size+0] = (v ) & 0xff; o->data[size+1] = (v>> 8) & 0xff;
// o->data[size+2] = (v>>16) & 0xff; o->data[size+3] = (v>>24) & 0xff; // o->data[size+2] = (v>>16) & 0xff; o->data[size+3] = (v>>24) & 0xff;
*(u32*)(o->data+size) = v; // clang for whatever reason fails to optimize the above when it's inlined memcpy(o->data+size, (i32[]){v}, 4); // slightly less UB than an unaligned move
o->size = size+4; o->size = size+4;
} }
static inline void asm_8(TStack* o, i64 v) { int size = o->size; u8* p = o->data; static inline void asm_8(TStack* o, i64 v) { int size = o->size;
// p[size+0] = (u8)(v ); p[size+1] = (u8)(v>> 8); p[size+2] = (u8)(v>>16); p[size+3] = (u8)(v>>24); // o->data[size+0] = (u8)(v ); o->data[size+1] = (u8)(v>> 8); o->data[size+2] = (u8)(v>>16); o->data[size+3] = (u8)(v>>24);
// p[size+4] = (u8)(v>>32); p[size+5] = (u8)(v>>40); p[size+6] = (u8)(v>>48); p[size+7] = (u8)(v>>56); // o->data[size+4] = (u8)(v>>32); o->data[size+5] = (u8)(v>>40); o->data[size+6] = (u8)(v>>48); o->data[size+7] = (u8)(v>>56);
*(u64*)(p+size) = v; memcpy(o->data+size, (i64[]){v}, 8);
o->size+= 8; o->size+= 8;
} }
static inline void asm_a(TStack* o, u64 len, u8 v[]) { static inline void asm_a(TStack* o, u64 len, u8 v[]) {

View File

@ -18,6 +18,7 @@
F(SETNi)F(SETUi)F(SETMi)F(SETNv)F(SETUv)F(SETMv)F(FAIL) F(SETNi)F(SETUi)F(SETMi)F(SETNv)F(SETUv)F(SETMv)F(FAIL)
u32* nextBC(u32* p) { u32* nextBC(u32* p) {
i32 off;
switch(*p) { switch(*p) {
case FN1C: case FN2C: case FN1O: case FN2O: case FN1C: case FN2C: case FN1O: case FN2O:
case OP1D: case OP2D: case OP2H: case OP1D: case OP2D: case OP2H:
@ -25,20 +26,21 @@ u32* nextBC(u32* p) {
case SETN: case SETU: case SETM: case SETH: case SETN: case SETU: case SETM: case SETH:
case POPS: case CHKV: case VFYM: case RETN: case RETD: case POPS: case CHKV: case VFYM: case RETN: case RETD:
case FAIL: case FAIL:
return p+1; off = 1; break;
case PUSH: case DFND: case ARRO: case ARRM: case PUSH: case DFND: case ARRO: case ARRM:
case VARO: case VARM: case FLDO: case FLDM: case VARO: case VARM: case FLDO: case FLDM:
case SYSV: case NSPM: case SYSV: case NSPM:
return p+2; off = 2; break;
case LOCO: case LOCM: case LOCU: case LOCO: case LOCM: case LOCU:
case EXTO: case EXTM: case EXTU: case EXTO: case EXTM: case EXTU:
case ADDI: case ADDU: case ADDI: case ADDU:
case FN1Ci: case FN1Oi: case FN2Ci: case SETNi: case SETUi: case SETMi: case SETNv: case SETUv: case SETMv: case FN1Ci: case FN1Oi: case FN2Ci: case SETNi: case SETUi: case SETMi: case SETNv: case SETUv: case SETMv:
return p+3; off = 3; break;
case FN2Oi: case FN2Oi:
return p+5; off = 5; break;
default: return 0; default: UD;
} }
return p+off;
} }
i32 stackDiff(u32* p) { i32 stackDiff(u32* p) {
if (*p==ARRO|*p==ARRM) return 1-p[1]; if (*p==ARRO|*p==ARRM) return 1-p[1];
@ -133,7 +135,7 @@ static Body* m_body(i32 vam, i32 pos, u16 maxStack, u16 maxPSC) { // leaves varI
#if JIT_START > 0 #if JIT_START > 0
body->callCount = 0; body->callCount = 0;
#endif #endif
body->bc = pos + (u32*)NULL; // hackish way to temporarily store the offset body->bcTmp = pos;
body->maxStack = maxStack; body->maxStack = maxStack;
body->maxPSC = maxPSC; body->maxPSC = maxPSC;
body->bl = NULL; body->bl = NULL;
@ -345,7 +347,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
} }
for (i32 i = 0; i < bodyCount; i++) { for (i32 i = 0; i < bodyCount; i++) {
bl->bodies[i] = bodies[i]; bl->bodies[i] = bodies[i];
bodies[i]->bc+= nbc-(i32*)NULL; bodies[i]->bc = (u32*)nbc + bodies[i]->bcTmp;
bodies[i]->bl = bl; bodies[i]->bl = bl;
} }
bl->dyBody = bodies[index2]; bl->dyBody = bodies[index2];

View File

@ -96,7 +96,7 @@ struct Body {
#if JIT_START > 0 #if JIT_START > 0
u16 callCount; u16 callCount;
#endif #endif
u32* bc; // pointer in bl->bc union { u32* bc; i32 bcTmp; }; // pointer in bl->bc; bcTmp to make ubsan happy (god dammit C)
u32 maxStack; u32 maxStack;
u16 maxPSC; u16 maxPSC;
#if JIT_START != -1 #if JIT_START != -1