push out perf/writing stuff from m_nvm
This commit is contained in:
parent
72896feb8f
commit
51c41f0766
@ -425,6 +425,25 @@ static u32 readBytes4(u8* d) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void onJIT(Body* body, u8* binEx, u64 sz) {
|
||||||
|
#if USE_PERF
|
||||||
|
if (!perf_map) {
|
||||||
|
B s = m_str32(U"/tmp/perf-"); AFMT("%l.map", getpid());
|
||||||
|
perf_map = file_open(s, "open", "wa");
|
||||||
|
print(s); printf(": map\n");
|
||||||
|
dec(s);
|
||||||
|
}
|
||||||
|
u32 bcPos = body->map[0];
|
||||||
|
// printf("JIT %d:\n", perfid);
|
||||||
|
// vm_printPos(body->comp, bcPos, -1);
|
||||||
|
fprintf(perf_map, N64x" "N64x" JIT %d: BC@%u\n", (u64)binEx, sz, perfid++, bcPos);
|
||||||
|
#endif
|
||||||
|
#if WRITE_ASM
|
||||||
|
write_asm(binEx, sz);
|
||||||
|
// exit(0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
typedef B JITFn(B* cStack, Scope* sc);
|
typedef B JITFn(B* cStack, Scope* sc);
|
||||||
static inline i32 maxi32(i32 a, i32 b) { return a>b?a:b; }
|
static inline i32 maxi32(i32 a, i32 b) { return a>b?a:b; }
|
||||||
Nvm_res m_nvm(Body* body) {
|
Nvm_res m_nvm(Body* body) {
|
||||||
@ -585,24 +604,9 @@ Nvm_res m_nvm(Body* body) {
|
|||||||
GET_ASM();
|
GET_ASM();
|
||||||
u64 sz = ASM_SIZE;
|
u64 sz = ASM_SIZE;
|
||||||
u8* binEx = nvm_alloc(sz);
|
u8* binEx = nvm_alloc(sz);
|
||||||
#if USE_PERF
|
ASM_WRITE(binEx, sz);
|
||||||
if (!perf_map) {
|
|
||||||
B s = m_str32(U"/tmp/perf-"); AFMT("%l.map", getpid());
|
|
||||||
perf_map = file_open(s, "open", "wa");
|
|
||||||
print(s); printf(": map\n");
|
|
||||||
dec(s);
|
|
||||||
}
|
|
||||||
u32 bcPos = body->map[0];
|
|
||||||
// printf("JIT %d:\n", perfid);
|
|
||||||
// vm_printPos(body->comp, bcPos, -1);
|
|
||||||
fprintf(perf_map, N64x" "N64x" JIT %d: BC@%u\n", (u64)binEx, sz, perfid++, bcPos);
|
|
||||||
#endif
|
|
||||||
ASM_WRITE(binEx);
|
|
||||||
#if WRITE_ASM
|
|
||||||
write_asm(binEx, sz);
|
|
||||||
// exit(0);
|
|
||||||
#endif
|
|
||||||
FREE_ASM();
|
FREE_ASM();
|
||||||
|
onJIT(body, binEx, sz);
|
||||||
return (Nvm_res){.p = binEx, .refs = optRes.refs};
|
return (Nvm_res){.p = binEx, .refs = optRes.refs};
|
||||||
}
|
}
|
||||||
B evalJIT(Body* b, Scope* sc, u8* ptr) { // doesn't consume
|
B evalJIT(Body* b, Scope* sc, u8* ptr) { // doesn't consume
|
||||||
|
|||||||
@ -67,11 +67,11 @@ typedef u8 Reg;
|
|||||||
#define AADD(P,N) b_o=asm_add(b_o, P, N)
|
#define AADD(P,N) b_o=asm_add(b_o, P, N)
|
||||||
#define ASM_SIZE (b_o->size)
|
#define ASM_SIZE (b_o->size)
|
||||||
#define FREE_ASM() mm_free((Value*)b_o); TSFREE(b_r);
|
#define FREE_ASM() mm_free((Value*)b_o); TSFREE(b_r);
|
||||||
#define ASM_WRITE(P) { \
|
#define ASM_WRITE(P,SZ) { \
|
||||||
memcpy(binEx, bin, sz); \
|
memcpy(P, bin, SZ); \
|
||||||
u64 relAm = TSSIZE(b_r); \
|
u64 relAm = TSSIZE(b_r); \
|
||||||
for (u64 i = 0; i < relAm; i++) { \
|
for (u64 i = 0; i < relAm; i++) { \
|
||||||
u8* ins = binEx+b_r[i]; \
|
u8* ins = P+b_r[i]; \
|
||||||
u32 o = readBytes4(ins); \
|
u32 o = readBytes4(ins); \
|
||||||
u32 n = o-(u32)(u64)ins; \
|
u32 n = o-(u32)(u64)ins; \
|
||||||
memcpy(ins, (u8[]){BYTES4(n)}, 4); \
|
memcpy(ins, (u8[]){BYTES4(n)}, 4); \
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user