From 51c41f0766e308095e9c08519d00e326eb691c98 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 3 Jul 2021 23:32:56 +0300 Subject: [PATCH] push out perf/writing stuff from m_nvm --- src/jit/nvm_x86_64.c | 38 +++++++++++++++++++++----------------- src/jit/x86_64.h | 6 +++--- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/jit/nvm_x86_64.c b/src/jit/nvm_x86_64.c index 5bf4c964..2a60a6c5 100644 --- a/src/jit/nvm_x86_64.c +++ b/src/jit/nvm_x86_64.c @@ -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 diff --git a/src/jit/x86_64.h b/src/jit/x86_64.h index c2acf0c8..a0ffe4a9 100644 --- a/src/jit/x86_64.h +++ b/src/jit/x86_64.h @@ -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); \