Improve mnemonic_builders for x86

This commit is contained in:
gingerBill
2026-06-14 17:03:19 +01:00
parent a8d7aedf1e
commit 2e58cc51d9
3 changed files with 9875 additions and 9827 deletions

View File

@@ -39,9 +39,9 @@ infer_labels_from_branches :: proc(
) {
offset_to_label: map[u32]u32
defer delete(offset_to_label)
for id in 0..<u32(len(label_defs)) {
for _, id in label_defs {
if label_defs[id] != LABEL_UNDEFINED {
offset_to_label[u32(label_defs[id])] = id
offset_to_label[u32(label_defs[id])] = u32(id)
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -116,13 +116,22 @@ main :: proc() {
return int(a) < int(b)
})
max_name_padding := 0
for mnemonic in mnemonic_list {
procs := procs_by_mnemonic[mnemonic]
for entry in procs {
generate_proc(&sb, entry)
max_name_padding = max(max_name_padding, len(entry.proc_name))
}
}
for mnemonic in mnemonic_list {
procs := procs_by_mnemonic[mnemonic]
for entry in procs {
generate_proc(&sb, entry, max_name_padding)
}
for entry in procs {
generate_emit_proc(&sb, entry)
generate_emit_proc(&sb, entry, max_name_padding)
}
}
@@ -143,28 +152,47 @@ main :: proc() {
// inst_ overload group
strings.write_string(&sb, "inst_")
strings.write_string(&sb, mnemonic_lower)
strings.write_string(&sb, " :: proc{ ")
for entry, i in procs {
if i > 0 { strings.write_string(&sb, ", ") }
strings.write_string(&sb, entry.proc_name)
for n := max_name_padding-len(mnemonic_lower); n > 0; n -= 1 {
strings.write_byte(&sb, ' ')
}
if len(procs) == 1 {
strings.write_string(&sb, " :: ")
strings.write_string(&sb, procs[0].proc_name)
strings.write_string(&sb, "\n")
} else {
strings.write_string(&sb, " :: proc{ ")
for entry, i in procs {
if i > 0 { strings.write_string(&sb, ", ") }
strings.write_string(&sb, entry.proc_name)
}
strings.write_string(&sb, " }\n")
}
strings.write_string(&sb, " }\n")
// emit_ overload group
strings.write_string(&sb, "emit_")
strings.write_string(&sb, mnemonic_lower)
strings.write_string(&sb, " :: proc{ ")
for entry, i in procs {
if i > 0 { strings.write_string(&sb, ", ") }
// Replace "inst_" prefix with "emit_"
emit_name := strings.concatenate({"emit_", entry.proc_name[5:]})
strings.write_string(&sb, emit_name)
for n := max_name_padding-len(mnemonic_lower); n > 0; n -= 1 {
strings.write_byte(&sb, ' ')
}
if len(procs) == 1 {
emit_name := strings.concatenate({"emit_", procs[0].proc_name[5:]})
strings.write_string(&sb, " :: ")
strings.write_string(&sb, emit_name)
strings.write_string(&sb, "\n")
} else {
strings.write_string(&sb, " :: proc{ ")
for entry, i in procs {
if i > 0 { strings.write_string(&sb, ", ") }
// Replace "inst_" prefix with "emit_"
emit_name := strings.concatenate({"emit_", entry.proc_name[5:]})
strings.write_string(&sb, emit_name)
}
strings.write_string(&sb, " }\n")
}
strings.write_string(&sb, " }\n")
}
output := strings.to_string(sb)
@@ -215,30 +243,37 @@ Mem256 :: distinct struct { mem: Memory }
Mem512 :: distinct struct { mem: Memory }
// Memory wrapper constructors
@(require_results)
mem8 :: #force_inline proc "contextless" (m: Memory) -> Mem8 {
return Mem8{ mem = m }
}
@(require_results)
mem16 :: #force_inline proc "contextless" (m: Memory) -> Mem16 {
return Mem16{ mem = m }
}
@(require_results)
mem32 :: #force_inline proc "contextless" (m: Memory) -> Mem32 {
return Mem32{ mem = m }
}
@(require_results)
mem64 :: #force_inline proc "contextless" (m: Memory) -> Mem64 {
return Mem64{ mem = m }
}
@(require_results)
mem128 :: #force_inline proc "contextless" (m: Memory) -> Mem128 {
return Mem128{ mem = m }
}
@(require_results)
mem256 :: #force_inline proc "contextless" (m: Memory) -> Mem256 {
return Mem256{ mem = m }
}
@(require_results)
mem512 :: #force_inline proc "contextless" (m: Memory) -> Mem512 {
return Mem512{ mem = m }
}
@@ -1299,7 +1334,7 @@ generate_emit_helper_call :: proc(sb: ^strings.Builder, entry: Proc_Entry) {
}
// Generate a single inst_ procedure (compact one-line format)
generate_proc :: proc(sb: ^strings.Builder, entry: Proc_Entry) {
generate_proc :: proc(sb: ^strings.Builder, entry: Proc_Entry, max_name_padding: int) {
sig := entry.sig
names := param_names(sig)
@@ -1319,6 +1354,9 @@ generate_proc :: proc(sb: ^strings.Builder, entry: Proc_Entry) {
// Write compact one-line procedure using helper call
strings.write_string(sb, entry.proc_name)
for n := max_name_padding - len(entry.proc_name); n > 0; n -= 1 {
strings.write_byte(sb, ' ')
}
strings.write_string(sb, " :: #force_inline proc \"contextless\" (")
strings.write_string(sb, params)
strings.write_string(sb, ") -> Instruction { return ")
@@ -1328,7 +1366,7 @@ generate_proc :: proc(sb: ^strings.Builder, entry: Proc_Entry) {
// Generate a single emit_ procedure (compact one-line format)
// Note: emit procedures are NOT contextless because append requires context
generate_emit_proc :: proc(sb: ^strings.Builder, entry: Proc_Entry) {
generate_emit_proc :: proc(sb: ^strings.Builder, entry: Proc_Entry, max_name_padding: int) {
sig := entry.sig
names := param_names(sig)
@@ -1353,6 +1391,9 @@ generate_emit_proc :: proc(sb: ^strings.Builder, entry: Proc_Entry) {
// Write compact one-line procedure using emit helper call
// NOT contextless - append requires context
strings.write_string(sb, emit_name)
for n := max_name_padding - len(entry.proc_name); n > 0; n -= 1 {
strings.write_byte(sb, ' ')
}
strings.write_string(sb, " :: #force_inline proc(")
strings.write_string(sb, params)
strings.write_string(sb, ") { ")