diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 393ec12..07f9c59 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -11,7 +11,8 @@ "Bash(tee:*)", "Bash(cmd.exe:*)", "Bash(pwsh.exe:*)", - "Bash(echo No ANTHROPIC env vars found:*)" + "Bash(echo No ANTHROPIC env vars found:*)", + "Bash(powershell:*)" ] } } diff --git a/attempt_1/main.c b/attempt_1/main.c index 1cfd578..1dd85aa 100644 --- a/attempt_1/main.c +++ b/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;