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,74 +269,77 @@ internal void relink_tape(void) {
internal void compile_action(U4 val) internal void compile_action(U4 val)
{ {
if (val == PRIM_SWAP) { if (val >= 0x10000) {
emit8(0x48); emit8(0x87); emit8(0xC2); U4 p = val - 0x10000;
pad32(); if (p == PRIM_SWAP) {
return; emit8(0x48); emit8(0x87); emit8(0xC2);
} else if (val == PRIM_MULT) { pad32();
emit8(0x48); emit8(0x0F); emit8(0xAF); emit8(0xC2); return;
pad32(); } else if (p == PRIM_MULT) {
return; emit8(0x48); emit8(0x0F); emit8(0xAF); emit8(0xC2);
} else if (val == PRIM_ADD) { pad32();
emit8(0x48); emit8(0x01); emit8(0xD0); return;
pad32(); } else if (p == PRIM_ADD) {
return; emit8(0x48); emit8(0x01); emit8(0xD0);
} else if (val == PRIM_SUB) { pad32();
emit8(0x48); emit8(0x29); emit8(0xD0); return;
pad32(); } else if (p == PRIM_SUB) {
return; emit8(0x48); emit8(0x29); emit8(0xD0);
} else if (val == PRIM_FETCH) { pad32();
emit8(0x48); emit8(0x8B); emit8(0x04); emit8(0xC1); return;
pad32(); } else if (p == PRIM_FETCH) {
return; emit8(0x48); emit8(0x8B); emit8(0x04); emit8(0xC3); // mov rax, [rbx + rax*8]
} else if (val == PRIM_DEC) { pad32();
emit8(0x48); emit8(0xFF); emit8(0xC8); return;
pad32(); } else if (p == PRIM_DEC) {
return; emit8(0x48); emit8(0xFF); emit8(0xC8);
} else if (val == PRIM_STORE) { pad32();
emit8(0x48); emit8(0x89); emit8(0x14); emit8(0xC1); return;
pad32(); } else if (p == PRIM_STORE) {
return; emit8(0x48); emit8(0x89); emit8(0x14); emit8(0xC3); // mov [rbx + rax*8], rdx
} else if (val == PRIM_RET_Z) { pad32();
emit8(0x48); emit8(0x85); emit8(0xC0); return;
emit8(0x75); emit8(0x01); } else if (p == PRIM_RET_Z) {
emit8(0xC3); emit8(0x48); emit8(0x85); emit8(0xC0);
pad32(); emit8(0x75); emit8(0x01);
return; emit8(0xC3);
} else if (val == PRIM_RET_S) { pad32();
emit8(0x48); emit8(0x85); emit8(0xC0); return;
emit8(0x79); emit8(0x01); } else if (p == PRIM_RET_S) {
emit8(0xC3); emit8(0x48); emit8(0x85); emit8(0xC0);
pad32(); emit8(0x79); emit8(0x01);
return; emit8(0xC3);
} else if (val == PRIM_RET) { pad32();
emit8(0xC3); return;
pad32(); } else if (p == PRIM_RET) {
return; emit8(0xC3);
} else if (val == PRIM_DUP) { pad32();
emit8(0x48); emit8(0x89); emit8(0xC2); return;
pad32(); } else if (p == PRIM_DUP) {
return; emit8(0x48); emit8(0x89); emit8(0xC2);
} else if (val == PRIM_DROP) { pad32();
emit8(0x48); emit8(0x89); emit8(0xD0); return;
pad32(); } else if (p == PRIM_DROP) {
return; emit8(0x48); emit8(0x89); emit8(0xD0);
} else if (val == PRIM_PRINT) { pad32();
emit8(0x52); // push rdx return;
emit8(0x48); emit8(0x83); emit8(0xEC); emit8(0x20); // sub rsp, 32 (shadow space) } else if (p == PRIM_PRINT) {
emit8(0x48); emit8(0x89); emit8(0xC1); // mov rcx, rax emit8(0x52); // push rdx
emit8(0x49); emit8(0xB8); // mov r8, ... emit8(0x48); emit8(0x83); emit8(0xEC); emit8(0x20); // sub rsp, 32 (shadow space)
U8 addr = u8_(& ms_builtin_print); emit8(0x48); emit8(0x89); emit8(0xC1); // mov rcx, rax
emit32(u4_(addr & 0xFFFFFFFF)); emit8(0x49); emit8(0xB8); // mov r8, ...
emit32(u4_(addr >> 32)); U8 addr = u8_(& ms_builtin_print);
emit8(0x41); emit8(0xFF); emit8(0xD0); // call r8 emit32(u4_(addr & 0xFFFFFFFF));
emit8(0x48); emit8(0x83); emit8(0xC4); emit8(0x20); // add rsp, 32 emit32(u4_(addr >> 32));
emit8(0x5A); // pop rdx emit8(0x41); emit8(0xFF); emit8(0xD0); // call r8
pad32(); emit8(0x48); emit8(0x83); emit8(0xC4); emit8(0x20); // add rsp, 32
return; emit8(0x5A); // pop rdx
pad32();
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;