This commit is contained in:
2026-02-21 11:34:04 -05:00
parent 68d0a5997f
commit ff49c3eada
2 changed files with 80 additions and 73 deletions

View File

@@ -11,7 +11,8 @@
"Bash(tee:*)", "Bash(tee:*)",
"Bash(cmd.exe:*)", "Bash(cmd.exe:*)",
"Bash(pwsh.exe:*)", "Bash(pwsh.exe:*)",
"Bash(echo No ANTHROPIC env vars found:*)" "Bash(echo No ANTHROPIC env vars found:*)",
"Bash(powershell:*)"
] ]
} }
} }

View File

@@ -233,7 +233,7 @@ internal U4 resolve_name_to_index(const char* ref_name) {
char c2 = prim_names[p][c] ? prim_names[p][c] : ' '; char c2 = prim_names[p][c] ? prim_names[p][c] : ' ';
if (c1 != c2) { match = 0; break; } if (c1 != c2) { match = 0; break; }
} }
if (match) return p; if (match) return p + 0x10000;
} }
for (U8 j = 0; j < tape_count; j++) { for (U8 j = 0; j < tape_count; j++) {
@@ -269,59 +269,61 @@ internal void relink_tape(void) {
internal void compile_action(U4 val) internal void compile_action(U4 val)
{ {
if (val == PRIM_SWAP) { if (val >= 0x10000) {
U4 p = val - 0x10000;
if (p == PRIM_SWAP) {
emit8(0x48); emit8(0x87); emit8(0xC2); emit8(0x48); emit8(0x87); emit8(0xC2);
pad32(); pad32();
return; return;
} else if (val == PRIM_MULT) { } else if (p == PRIM_MULT) {
emit8(0x48); emit8(0x0F); emit8(0xAF); emit8(0xC2); emit8(0x48); emit8(0x0F); emit8(0xAF); emit8(0xC2);
pad32(); pad32();
return; return;
} else if (val == PRIM_ADD) { } else if (p == PRIM_ADD) {
emit8(0x48); emit8(0x01); emit8(0xD0); emit8(0x48); emit8(0x01); emit8(0xD0);
pad32(); pad32();
return; return;
} else if (val == PRIM_SUB) { } else if (p == PRIM_SUB) {
emit8(0x48); emit8(0x29); emit8(0xD0); emit8(0x48); emit8(0x29); emit8(0xD0);
pad32(); pad32();
return; return;
} else if (val == PRIM_FETCH) { } else if (p == PRIM_FETCH) {
emit8(0x48); emit8(0x8B); emit8(0x04); emit8(0xC1); emit8(0x48); emit8(0x8B); emit8(0x04); emit8(0xC3); // mov rax, [rbx + rax*8]
pad32(); pad32();
return; return;
} else if (val == PRIM_DEC) { } else if (p == PRIM_DEC) {
emit8(0x48); emit8(0xFF); emit8(0xC8); emit8(0x48); emit8(0xFF); emit8(0xC8);
pad32(); pad32();
return; return;
} else if (val == PRIM_STORE) { } else if (p == PRIM_STORE) {
emit8(0x48); emit8(0x89); emit8(0x14); emit8(0xC1); emit8(0x48); emit8(0x89); emit8(0x14); emit8(0xC3); // mov [rbx + rax*8], rdx
pad32(); pad32();
return; return;
} else if (val == PRIM_RET_Z) { } else if (p == PRIM_RET_Z) {
emit8(0x48); emit8(0x85); emit8(0xC0); emit8(0x48); emit8(0x85); emit8(0xC0);
emit8(0x75); emit8(0x01); emit8(0x75); emit8(0x01);
emit8(0xC3); emit8(0xC3);
pad32(); pad32();
return; return;
} else if (val == PRIM_RET_S) { } else if (p == PRIM_RET_S) {
emit8(0x48); emit8(0x85); emit8(0xC0); emit8(0x48); emit8(0x85); emit8(0xC0);
emit8(0x79); emit8(0x01); emit8(0x79); emit8(0x01);
emit8(0xC3); emit8(0xC3);
pad32(); pad32();
return; return;
} else if (val == PRIM_RET) { } else if (p == PRIM_RET) {
emit8(0xC3); emit8(0xC3);
pad32(); pad32();
return; return;
} else if (val == PRIM_DUP) { } else if (p == PRIM_DUP) {
emit8(0x48); emit8(0x89); emit8(0xC2); emit8(0x48); emit8(0x89); emit8(0xC2);
pad32(); pad32();
return; return;
} else if (val == PRIM_DROP) { } else if (p == PRIM_DROP) {
emit8(0x48); emit8(0x89); emit8(0xD0); emit8(0x48); emit8(0x89); emit8(0xD0);
pad32(); pad32();
return; return;
} else if (val == PRIM_PRINT) { } else if (p == PRIM_PRINT) {
emit8(0x52); // push rdx emit8(0x52); // push rdx
emit8(0x48); emit8(0x83); emit8(0xEC); emit8(0x20); // sub rsp, 32 (shadow space) emit8(0x48); emit8(0x83); emit8(0xEC); emit8(0x20); // sub rsp, 32 (shadow space)
emit8(0x48); emit8(0x89); emit8(0xC1); // mov rcx, rax emit8(0x48); emit8(0x89); emit8(0xC1); // mov rcx, rax
@@ -335,8 +337,9 @@ internal void compile_action(U4 val)
pad32(); pad32();
return; return;
} }
}
if (val > 0) { if (val > 0 && val < 0x10000) {
U4 target = tape_to_code_offset[val]; U4 target = tape_to_code_offset[val];
pad32(); pad32();
S4 rel32 = s4_(target) - s4_(code_arena.used + 5); S4 rel32 = s4_(target) - s4_(code_arena.used + 5);
@@ -352,8 +355,10 @@ IA_ void compile_and_run_tape(void)
log_count = 0; log_count = 0;
gdi_log_count = 0; gdi_log_count = 0;
emit8(0x48); emit8(0x8B); emit8(0x41); emit8(0x70); emit8(0x53); // push rbx (callee-saved; also aligns RSP to 0 mod 16)
emit8(0x48); emit8(0x8B); emit8(0x51); emit8(0x78); 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); U4*r tape_ptr = u4_r(tape_arena.start);
U8*r anno_ptr = u8_r(anno_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); 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(0x43); emit8(0x70); // mov [rbx+0x70], rax
emit8(0x48); emit8(0x89); emit8(0x51); emit8(0x78); emit8(0x48); emit8(0x89); emit8(0x53); emit8(0x78); // mov [rbx+0x78], rdx
emit8(0xC3); emit8(0x5B); // pop rbx
emit8(0xC3); // ret
typedef void JIT_Func(U8* globals_ptr); typedef void JIT_Func(U8* globals_ptr);
JIT_Func* func = (JIT_Func*)code_arena.start; JIT_Func* func = (JIT_Func*)code_arena.start;