nice
This commit is contained in:
@@ -89,15 +89,22 @@ internal void debug_log(Str8 fmt, KTL_Str8 table) {
|
||||
ms_write_console(stdout_handle, (UTF8 const*r)"\n", 1, nullptr, 0);
|
||||
}
|
||||
|
||||
void ms_builtin_print(U8 val) {
|
||||
char val_hex[9];
|
||||
u64_to_hex(val, val_hex, 8);
|
||||
val_hex[8] = '\0';
|
||||
U8 ms_builtin_print(U8 val, U8 rdx_val, U8 r8_val, U8 r9_val) {
|
||||
char hex1[9], hex2[9], hex3[9], hex4[9];
|
||||
u64_to_hex(val, hex1, 8); hex1[8] = '\0';
|
||||
u64_to_hex(rdx_val, hex2, 8); hex2[8] = '\0';
|
||||
u64_to_hex(r8_val, hex3, 8); hex3[8] = '\0';
|
||||
u64_to_hex(r9_val, hex4, 8); hex4[8] = '\0';
|
||||
|
||||
KTL_Slot_Str8 log_table[] = {
|
||||
{ ktl_str8_key("val"), str8(val_hex) },
|
||||
{ ktl_str8_key("v1"), str8(hex1) },
|
||||
{ ktl_str8_key("v2"), str8(hex2) },
|
||||
{ ktl_str8_key("v3"), str8(hex3) },
|
||||
{ ktl_str8_key("v4"), str8(hex4) },
|
||||
};
|
||||
debug_log(str8("ms_builtin_print called with: <val>"), ktl_str8_from_arr(log_table));
|
||||
debug_log(str8("FFI PRINT -> RCX:<v1> RDX:<v2> R8:<v3> R9:<v4>"), ktl_str8_from_arr(log_table));
|
||||
if (log_count < 16) log_buffer[log_count++] = val;
|
||||
return val;
|
||||
}
|
||||
|
||||
// Visual Linker & O(1) Dictionary
|
||||
@@ -324,16 +331,25 @@ internal void compile_action(U4 val)
|
||||
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, ...
|
||||
// FFI Dance: Save RDX, Align RSP (32 shadow + 8 align = 40)
|
||||
emit8(0x52); // push rdx
|
||||
emit8(0x48); emit8(0x83); emit8(0xEC); emit8(0x28); // sub rsp, 40
|
||||
|
||||
// Map arguments: RCX=RAX, RDX=RDX(already loaded), R8=Globals[0], R9=Globals[1]
|
||||
emit8(0x48); emit8(0x89); emit8(0xC1); // mov rcx, rax
|
||||
emit8(0x4C); emit8(0x8B); emit8(0x03); // mov r8, [rbx]
|
||||
emit8(0x4C); emit8(0x8B); emit8(0x4B); emit8(0x08); // mov r9, [rbx+8]
|
||||
|
||||
// Load func ptr and call
|
||||
emit8(0x49); emit8(0xBA); // mov r10, ...
|
||||
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
|
||||
emit8(0x41); emit8(0xFF); emit8(0xD2); // call r10
|
||||
|
||||
// Restore
|
||||
emit8(0x48); emit8(0x83); emit8(0xC4); emit8(0x28); // add rsp, 40
|
||||
emit8(0x5A); // pop rdx
|
||||
pad32();
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user