make ubsan happier, optimize nextBC
still doesn't like f==(f64)(someIntType)f but that's, like, not replaceable
This commit is contained in:
parent
cd86a0b242
commit
1719374e0a
@ -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
|
||||||
|
|||||||
@ -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[]) {
|
||||||
|
|||||||
16
src/vm.c
16
src/vm.c
@ -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];
|
||||||
|
|||||||
2
src/vm.h
2
src/vm.h
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user