Clobber implicit_wr and implicit_rd

This commit is contained in:
gingerBill
2026-08-19 11:03:50 +01:00
parent ec81477af6
commit 8d0cc4d64b
3 changed files with 41 additions and 6 deletions

View File

@@ -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");

View File

@@ -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];

View File

@@ -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