push out perf/writing stuff from m_nvm

This commit is contained in:
dzaima 2021-07-03 23:32:56 +03:00
parent 72896feb8f
commit 51c41f0766
2 changed files with 24 additions and 20 deletions

View File

@ -425,6 +425,25 @@ static u32 readBytes4(u8* d) {
}
#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);
static inline i32 maxi32(i32 a, i32 b) { return a>b?a:b; }
Nvm_res m_nvm(Body* body) {
@ -585,24 +604,9 @@ Nvm_res m_nvm(Body* body) {
GET_ASM();
u64 sz = ASM_SIZE;
u8* binEx = nvm_alloc(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
ASM_WRITE(binEx);
#if WRITE_ASM
write_asm(binEx, sz);
// exit(0);
#endif
ASM_WRITE(binEx, sz);
FREE_ASM();
onJIT(body, binEx, sz);
return (Nvm_res){.p = binEx, .refs = optRes.refs};
}
B evalJIT(Body* b, Scope* sc, u8* ptr) { // doesn't consume

View File

@ -67,11 +67,11 @@ typedef u8 Reg;
#define AADD(P,N) b_o=asm_add(b_o, P, N)
#define ASM_SIZE (b_o->size)
#define FREE_ASM() mm_free((Value*)b_o); TSFREE(b_r);
#define ASM_WRITE(P) { \
memcpy(binEx, bin, sz); \
#define ASM_WRITE(P,SZ) { \
memcpy(P, bin, SZ); \
u64 relAm = TSSIZE(b_r); \
for (u64 i = 0; i < relAm; i++) { \
u8* ins = binEx+b_r[i]; \
u8* ins = P+b_r[i]; \
u32 o = readBytes4(ins); \
u32 n = o-(u32)(u64)ins; \
memcpy(ins, (u8[]){BYTES4(n)}, 4); \