explicit pointer → u64 conversion
work towards gcc 32-bit x86 builds. (gcc sign-extended pointers without this changeset) gcc miscompiles `union B` usage though (https://godbolt.org/z/hEWKdc5PK), which I can do nothing about, so clang is still the only option for 32-bit x86 builds
This commit is contained in:
parent
9c1cbdc998
commit
3ab92ecd66
6
src/h.h
6
src/h.h
@ -188,7 +188,9 @@ static const u16 OBJ_TAG = 0b1111111111110110; // FFF6 1111111111110110ppppppppp
|
||||
static const u16 ARR_TAG = 0b1111111111110111; // FFF7 1111111111110111ppppppppppppppppppppppppppppppppppppppppppppp000 array (everything else here is an atom)
|
||||
static const u16 VAL_TAG = 0b1111111111110 ; // FFF. 1111111111110................................................... pointer to Value, needs refcounting
|
||||
#define ftag(X) ((u64)(X) << 48)
|
||||
#define tag(V, T) b(((u64)(V)) | ftag(T))
|
||||
#define ptr2u64(X) ((u64)(uintptr_t)(X))
|
||||
#define tagu64(V, T) b((u64)(V) | ftag(T))
|
||||
#define tag(V, T) b(ptr2u64(V) | ftag(T))
|
||||
#define taga(V) tag(V,ARR_TAG)
|
||||
|
||||
void cbqn_init(void);
|
||||
@ -408,7 +410,7 @@ FORCE_INLINE bool isPrim(B x) { return isCallable(x) && v(x)->flags; }
|
||||
|
||||
// make objects
|
||||
static B m_f64(f64 n) { assert(isF64(b(n))); return b(n); } // assert just to make sure we're actually creating a float
|
||||
static B m_c32(u32 n) { return tag(n,C32_TAG); } // TODO check validity?
|
||||
static B m_c32(u32 n) { return tagu64(n,C32_TAG); } // TODO check validity?
|
||||
static B m_i32(i32 n) { return m_f64(n); }
|
||||
static B m_usz(usz n) { return n<I32_MAX? m_i32((i32)n) : m_f64(n); }
|
||||
|
||||
|
||||
@ -298,7 +298,7 @@ static OptRes opt(u32* bc0) {
|
||||
break;
|
||||
}
|
||||
case VARM: { u32 d = *bc++; u32 p = *bc++;
|
||||
TSADD(stk,SREF(tag((u64)d<<32 | (u32)p, VAR_TAG), pos));
|
||||
TSADD(stk,SREF(tagu64((u64)d<<32 | (u32)p, VAR_TAG), pos));
|
||||
break;
|
||||
}
|
||||
case FN1C: case FN1O: { S(f,0)
|
||||
@ -638,8 +638,8 @@ Nvm_res m_nvm(Body* body) {
|
||||
case TR2D: TOPp; GET(R_A1,1,1); CCALL(i_TR2D); break; // (B g, B h)
|
||||
case TR3D: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); CCALL(i_TR3D); break; // (B f,B g, B h)
|
||||
case TR3O: TOPp; GET(R_A1,1,0); GET(R_A2,2,1); CCALL(i_TR3O); break; // (B f,B g, B h)
|
||||
case VARM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tag((u64)d<<32 | (u32)p, VAR_TAG).u); } break;
|
||||
case EXTM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tag((u64)d<<32 | (u32)p, EXT_TAG).u); } break;
|
||||
case VARM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tagu64((u64)d<<32 | (u32)p, VAR_TAG).u); } break;
|
||||
case EXTM: TOPs; { u64 d=*bc++; u64 p=*bc++; IMM(R_RES, tagu64((u64)d<<32 | (u32)p, EXT_TAG).u); } break;
|
||||
case VARO: TOPs; { u64 d=*bc++; u64 p=*bc++; LSC(R_A1,d);
|
||||
MOV8rmo(R_RES,R_A1,p*8+offsetof(Scope,vars)); // read variable
|
||||
INCB(R_RES,R_A2,R_A3); // increment refcount if one's needed
|
||||
|
||||
@ -106,7 +106,7 @@ void writeNum(FILE* f, u64 v, i32 len);
|
||||
void BN(dumpHeap)(FILE* f) {
|
||||
for (u64 i = 0; i < alSize; i++) {
|
||||
AllocInfo ci = al[i];
|
||||
u64 addrI = (u64) ci.p;
|
||||
u64 addrI = ptr2u64(ci.p);
|
||||
writeNum(f, ci.sz, 8);
|
||||
writeNum(f, addrI, 8);
|
||||
char* prefix = str1(BN());
|
||||
|
||||
12
src/vm.c
12
src/vm.c
@ -321,7 +321,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
|
||||
bDone[id] = true;
|
||||
Block* bl = compileBlock(IGetU(allBlocks,id), comp, bDone, bc, bcIA, allBlocks, allBodies, nameList, sc, depth+1, c-bc);
|
||||
TSADD(newBC, bl->ty==0? DFND0 : bl->ty==1? DFND1 : DFND2);
|
||||
A64((u64)bl);
|
||||
A64(ptr2u64(bl));
|
||||
TSADD(usedBlocks, bl);
|
||||
break;
|
||||
}
|
||||
@ -386,8 +386,8 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
|
||||
u64 bodyReqAm = TSSIZE(bodyReqs);
|
||||
for (u64 i = 0; i < bodyReqAm; i++) {
|
||||
NextRequest r = bodyReqs[i];
|
||||
/*ugly, but whatever*/ u64 v1 = (u64)bodyMap[r.pos1]; newBC[r.off+0] = (u32)v1; newBC[r.off+1] = v1>>32;
|
||||
if (r.pos2!=U32_MAX) { u64 v2 = (u64)bodyMap[r.pos2]; newBC[r.off+2] = (u32)v2; newBC[r.off+3] = v2>>32; }
|
||||
/*ugly, but whatever*/ u64 v1 = ptr2u64(bodyMap[r.pos1]); newBC[r.off+0] = (u32)v1; newBC[r.off+1] = v1>>32;
|
||||
if (r.pos2!=U32_MAX) { u64 v2 = ptr2u64(bodyMap[r.pos2]); newBC[r.off+2] = (u32)v2; newBC[r.off+3] = v2>>32; }
|
||||
}
|
||||
TSFREE(bodyReqs);
|
||||
TFREE(bodyMap);
|
||||
@ -716,7 +716,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume
|
||||
#endif
|
||||
#define L64 ({ u64 r = bc[0] | ((u64)bc[1])<<32; bc+= 2; r; })
|
||||
#if VM_POS
|
||||
#define POS_UPD envCurr->pos = (u64)(bc-1);
|
||||
#define POS_UPD envCurr->pos = ptr2u64(bc-1);
|
||||
#else
|
||||
#define POS_UPD
|
||||
#endif
|
||||
@ -799,7 +799,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume
|
||||
}
|
||||
|
||||
case VARM: { u32 d = *bc++; u32 p = *bc++;
|
||||
ADD(tag((u64)d<<32 | (u32)p, VAR_TAG));
|
||||
ADD(tagu64((u64)d<<32 | (u32)p, VAR_TAG));
|
||||
break;
|
||||
}
|
||||
case VARO: { u32 d = *bc++; u32 p = *bc++;
|
||||
@ -816,7 +816,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume
|
||||
}
|
||||
|
||||
case EXTM: { u32 d = *bc++; u32 p = *bc++;
|
||||
ADD(tag((u64)d<<32 | (u32)p, EXT_TAG));
|
||||
ADD(tagu64((u64)d<<32 | (u32)p, EXT_TAG));
|
||||
break;
|
||||
}
|
||||
case EXTO: { u32 d = *bc++; u32 p = *bc++;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user