fixes
This commit is contained in:
150
attempt_1/main.c
150
attempt_1/main.c
@@ -233,7 +233,7 @@ internal U4 resolve_name_to_index(const char* ref_name) {
|
||||
char c2 = prim_names[p][c] ? prim_names[p][c] : ' ';
|
||||
if (c1 != c2) { match = 0; break; }
|
||||
}
|
||||
if (match) return p;
|
||||
if (match) return p + 0x10000;
|
||||
}
|
||||
|
||||
for (U8 j = 0; j < tape_count; j++) {
|
||||
@@ -269,74 +269,77 @@ internal void relink_tape(void) {
|
||||
|
||||
internal void compile_action(U4 val)
|
||||
{
|
||||
if (val == PRIM_SWAP) {
|
||||
emit8(0x48); emit8(0x87); emit8(0xC2);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_MULT) {
|
||||
emit8(0x48); emit8(0x0F); emit8(0xAF); emit8(0xC2);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_ADD) {
|
||||
emit8(0x48); emit8(0x01); emit8(0xD0);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_SUB) {
|
||||
emit8(0x48); emit8(0x29); emit8(0xD0);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_FETCH) {
|
||||
emit8(0x48); emit8(0x8B); emit8(0x04); emit8(0xC1);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_DEC) {
|
||||
emit8(0x48); emit8(0xFF); emit8(0xC8);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_STORE) {
|
||||
emit8(0x48); emit8(0x89); emit8(0x14); emit8(0xC1);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_RET_Z) {
|
||||
emit8(0x48); emit8(0x85); emit8(0xC0);
|
||||
emit8(0x75); emit8(0x01);
|
||||
emit8(0xC3);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_RET_S) {
|
||||
emit8(0x48); emit8(0x85); emit8(0xC0);
|
||||
emit8(0x79); emit8(0x01);
|
||||
emit8(0xC3);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_RET) {
|
||||
emit8(0xC3);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_DUP) {
|
||||
emit8(0x48); emit8(0x89); emit8(0xC2);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_DROP) {
|
||||
emit8(0x48); emit8(0x89); emit8(0xD0);
|
||||
pad32();
|
||||
return;
|
||||
} else if (val == PRIM_PRINT) {
|
||||
emit8(0x52); // push rdx
|
||||
emit8(0x48); emit8(0x83); emit8(0xEC); emit8(0x20); // sub rsp, 32 (shadow space)
|
||||
emit8(0x48); emit8(0x89); emit8(0xC1); // mov rcx, rax
|
||||
emit8(0x49); emit8(0xB8); // mov r8, ...
|
||||
U8 addr = u8_(& ms_builtin_print);
|
||||
emit32(u4_(addr & 0xFFFFFFFF));
|
||||
emit32(u4_(addr >> 32));
|
||||
emit8(0x41); emit8(0xFF); emit8(0xD0); // call r8
|
||||
emit8(0x48); emit8(0x83); emit8(0xC4); emit8(0x20); // add rsp, 32
|
||||
emit8(0x5A); // pop rdx
|
||||
pad32();
|
||||
return;
|
||||
if (val >= 0x10000) {
|
||||
U4 p = val - 0x10000;
|
||||
if (p == PRIM_SWAP) {
|
||||
emit8(0x48); emit8(0x87); emit8(0xC2);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_MULT) {
|
||||
emit8(0x48); emit8(0x0F); emit8(0xAF); emit8(0xC2);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_ADD) {
|
||||
emit8(0x48); emit8(0x01); emit8(0xD0);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_SUB) {
|
||||
emit8(0x48); emit8(0x29); emit8(0xD0);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_FETCH) {
|
||||
emit8(0x48); emit8(0x8B); emit8(0x04); emit8(0xC3); // mov rax, [rbx + rax*8]
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_DEC) {
|
||||
emit8(0x48); emit8(0xFF); emit8(0xC8);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_STORE) {
|
||||
emit8(0x48); emit8(0x89); emit8(0x14); emit8(0xC3); // mov [rbx + rax*8], rdx
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_RET_Z) {
|
||||
emit8(0x48); emit8(0x85); emit8(0xC0);
|
||||
emit8(0x75); emit8(0x01);
|
||||
emit8(0xC3);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_RET_S) {
|
||||
emit8(0x48); emit8(0x85); emit8(0xC0);
|
||||
emit8(0x79); emit8(0x01);
|
||||
emit8(0xC3);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_RET) {
|
||||
emit8(0xC3);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_DUP) {
|
||||
emit8(0x48); emit8(0x89); emit8(0xC2);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_DROP) {
|
||||
emit8(0x48); emit8(0x89); emit8(0xD0);
|
||||
pad32();
|
||||
return;
|
||||
} else if (p == PRIM_PRINT) {
|
||||
emit8(0x52); // push rdx
|
||||
emit8(0x48); emit8(0x83); emit8(0xEC); emit8(0x20); // sub rsp, 32 (shadow space)
|
||||
emit8(0x48); emit8(0x89); emit8(0xC1); // mov rcx, rax
|
||||
emit8(0x49); emit8(0xB8); // mov r8, ...
|
||||
U8 addr = u8_(& ms_builtin_print);
|
||||
emit32(u4_(addr & 0xFFFFFFFF));
|
||||
emit32(u4_(addr >> 32));
|
||||
emit8(0x41); emit8(0xFF); emit8(0xD0); // call r8
|
||||
emit8(0x48); emit8(0x83); emit8(0xC4); emit8(0x20); // add rsp, 32
|
||||
emit8(0x5A); // pop rdx
|
||||
pad32();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (val > 0) {
|
||||
if (val > 0 && val < 0x10000) {
|
||||
U4 target = tape_to_code_offset[val];
|
||||
pad32();
|
||||
S4 rel32 = s4_(target) - s4_(code_arena.used + 5);
|
||||
@@ -352,8 +355,10 @@ IA_ void compile_and_run_tape(void)
|
||||
log_count = 0;
|
||||
gdi_log_count = 0;
|
||||
|
||||
emit8(0x48); emit8(0x8B); emit8(0x41); emit8(0x70);
|
||||
emit8(0x48); emit8(0x8B); emit8(0x51); emit8(0x78);
|
||||
emit8(0x53); // push rbx (callee-saved; also aligns RSP to 0 mod 16)
|
||||
emit8(0x48); emit8(0x89); emit8(0xCB); // mov rbx, rcx (stable globals ptr for whole JIT session)
|
||||
emit8(0x48); emit8(0x8B); emit8(0x43); emit8(0x70); // mov rax, [rbx+0x70]
|
||||
emit8(0x48); emit8(0x8B); emit8(0x53); emit8(0x78); // mov rdx, [rbx+0x78]
|
||||
|
||||
U4*r tape_ptr = u4_r(tape_arena.start);
|
||||
U8*r anno_ptr = u8_r(anno_arena.start);
|
||||
@@ -419,9 +424,10 @@ IA_ void compile_and_run_tape(void)
|
||||
u4_r(code_arena.start + def_jmp_offset)[0] = current - (def_jmp_offset + 4);
|
||||
}
|
||||
|
||||
emit8(0x48); emit8(0x89); emit8(0x41); emit8(0x70);
|
||||
emit8(0x48); emit8(0x89); emit8(0x51); emit8(0x78);
|
||||
emit8(0xC3);
|
||||
emit8(0x48); emit8(0x89); emit8(0x43); emit8(0x70); // mov [rbx+0x70], rax
|
||||
emit8(0x48); emit8(0x89); emit8(0x53); emit8(0x78); // mov [rbx+0x78], rdx
|
||||
emit8(0x5B); // pop rbx
|
||||
emit8(0xC3); // ret
|
||||
|
||||
typedef void JIT_Func(U8* globals_ptr);
|
||||
JIT_Func* func = (JIT_Func*)code_arena.start;
|
||||
|
||||
Reference in New Issue
Block a user