From 8d0cc4d64b1a3b64feb37afed7bed1a66ebd56d4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 19 Aug 2026 11:03:50 +0100 Subject: [PATCH] Clobber `implicit_wr` and `implicit_rd` --- .../isa/x86/tablegen/cpp-compiler/cpp-gen.odin | 16 ++++++++++++++++ src/asm_tables_amd64.cpp | 16 ++++++++++++++++ src/check_asm.cpp | 15 +++++++++------ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/core/rexcode/isa/x86/tablegen/cpp-compiler/cpp-gen.odin b/core/rexcode/isa/x86/tablegen/cpp-compiler/cpp-gen.odin index 84df9b951..7153452ef 100644 --- a/core/rexcode/isa/x86/tablegen/cpp-compiler/cpp-gen.odin +++ b/core/rexcode/isa/x86/tablegen/cpp-compiler/cpp-gen.odin @@ -293,6 +293,22 @@ main :: proc() { return ((side_effects & VOLATILE_SE) != 0); } }; + + void clobber_implicit_regs(StringSet *clobber_registers_set, ClobberRegs implicit_regs) { + u16 const NAMED = + ClobberReg_RAX|ClobberReg_RBX|ClobberReg_RCX|ClobberReg_RDX| + ClobberReg_RSI|ClobberReg_RDI|ClobberReg_RBP|ClobberReg_R11| + ClobberReg_XMM0; + u16 regs = implicit_regs & NAMED; + + for (u16 bit = 1; bit != 0; bit <<= 1) { + if ((regs & bit) == 0) { + continue; + } + char const *rname = clobber_reg_bit_name(bit); + string_set_update(clobber_registers_set, make_string_c(rname)); + } + } """) strings.write_string(&sb, "\n"); diff --git a/src/asm_tables_amd64.cpp b/src/asm_tables_amd64.cpp index 6d7362bc3..9e011c86f 100644 --- a/src/asm_tables_amd64.cpp +++ b/src/asm_tables_amd64.cpp @@ -296,6 +296,22 @@ struct Asm_amd64 { return ((side_effects & VOLATILE_SE) != 0); } }; + + void clobber_implicit_regs(StringSet *clobber_registers_set, ClobberRegs implicit_regs) { + u16 const NAMED = + ClobberReg_RAX|ClobberReg_RBX|ClobberReg_RCX|ClobberReg_RDX| + ClobberReg_RSI|ClobberReg_RDI|ClobberReg_RBP|ClobberReg_R11| + ClobberReg_XMM0; + u16 regs = implicit_regs & NAMED; + + for (u16 bit = 1; bit != 0; bit <<= 1) { + if ((regs & bit) == 0) { + continue; + } + char const *rname = clobber_reg_bit_name(bit); + string_set_update(clobber_registers_set, make_string_c(rname)); + } + } static u16 const register_codes [REG_COUNT]; static String const register_strings[REG_COUNT]; diff --git a/src/check_asm.cpp b/src/check_asm.cpp index 4443fc8a7..84174ed3e 100644 --- a/src/check_asm.cpp +++ b/src/check_asm.cpp @@ -935,6 +935,9 @@ gb_internal void check_mnemonic(AsmCtx *asm_ctx, CheckerContext *ctx, Entity *tm auto clobber_forms = asm_ctx->clobber_forms(mnemonic); auto clobber = clobber_forms[valid_form_index]; + asm_ctx->clobber_implicit_regs(&tmpl_entity->AsmTemplate.clobber_registers_set, clobber.implicit_wr); + asm_ctx->clobber_implicit_regs(&tmpl_entity->AsmTemplate.clobber_registers_set, clobber.implicit_rd); + tmpl_entity->AsmTemplate.clobber_flags |= clobber.implies_clobber_flags(); tmpl_entity->AsmTemplate.clobber_memory |= clobber.implies_clobber_memory(); tmpl_entity->AsmTemplate.is_volatile |= clobber.implies_side_effects(); @@ -1435,8 +1438,8 @@ gb_internal void check_asm_template(AsmCtx *asm_ctx, CheckerContext *ctx, Entity entity->type = type; - bool is_volatile = false; - bool is_align_stack = false; + bool is_volatile = false; + bool is_align_stack = false; auto *clobber_registers_set = &entity->AsmTemplate.clobber_registers_set; check_asm_specs(asm_ctx, ctx, ate->param_scope, at->specs, &ate->decls); @@ -1499,10 +1502,10 @@ gb_internal void check_asm_template(AsmCtx *asm_ctx, CheckerContext *ctx, Entity } } - entity->AsmTemplate.clobber_flags = clobber_flags; - entity->AsmTemplate.clobber_memory = clobber_memory; - entity->AsmTemplate.is_volatile = is_volatile; - entity->AsmTemplate.is_align_stack = is_align_stack; + entity->AsmTemplate.clobber_flags = clobber_flags; + entity->AsmTemplate.clobber_memory = clobber_memory; + entity->AsmTemplate.is_volatile = is_volatile; + entity->AsmTemplate.is_align_stack = is_align_stack; } // collect label decls