Infer asm #side_effects where possible from the mnemonics

This commit is contained in:
gingerBill
2026-08-12 14:52:37 +01:00
parent ecb4495e81
commit 43f078aedc
3 changed files with 27 additions and 8 deletions

View File

@@ -200,7 +200,18 @@ main :: proc() {
strings.write_string(&sb, "\t\t\t\t SideEffectFlag_SERIALIZING)) != 0;\n")
strings.write_string(&sb, "\t\t}\n")
strings.write_string(&sb, "\t\tbool implies_side_effects() {\n")
strings.write_string(&sb, "\t\t\treturn side_effects;\n")
strings.write_string(&sb, "\t\t\tu16 const VOLATILE_SE =\n")
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_FENCE |\n")
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_SERIALIZING |\n")
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_CACHE |\n")
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_TRAP |\n")
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_INTERRUPT |\n")
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_HALT |\n")
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_PRIVILEGED |\n")
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_CONTROL |\n")
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_CET;\n")
strings.write_string(&sb, "\t\t\t\t// NOTE: SideEffectFlag_HINT deliberately excluded — inert, may be DCE'd.\n")
strings.write_string(&sb, "\t\t\treturn ((side_effects & VOLATILE_SE) != 0);\n")
strings.write_string(&sb, "\t\t}\n")
strings.write_string(&sb, "\t};\n")
}

View File

@@ -205,7 +205,18 @@ struct Asm_amd64 {
SideEffectFlag_SERIALIZING)) != 0;
}
bool implies_side_effects() {
return side_effects;
u16 const VOLATILE_SE =
SideEffectFlag_FENCE |
SideEffectFlag_SERIALIZING |
SideEffectFlag_CACHE |
SideEffectFlag_TRAP |
SideEffectFlag_INTERRUPT |
SideEffectFlag_HALT |
SideEffectFlag_PRIVILEGED |
SideEffectFlag_CONTROL |
SideEffectFlag_CET;
// NOTE: SideEffectFlag_HINT deliberately excluded — inert, may be DCE'd.
return ((side_effects & VOLATILE_SE) != 0);
}
};

View File

@@ -480,21 +480,18 @@ struct lbAsmGenerate_amd64 : lbAsmGenerate {
LLVMTypeRef fn_ty = LLVMFunctionType(ret_ty, param_types.data, cast(unsigned)param_types.count, /*vararg*/false);
// TODO(bill): determine all the cases when side-effects happen
bool has_side_effects = tmpl_node->has_side_effects;
LLVMValueRef ia = LLVMGetInlineAsm(
fn_ty,
asm_string, cast(size_t)gb_string_length(asm_string),
constraints, cast(size_t)gb_string_length(constraints),
/*HasSideEffects*/ has_side_effects,
/*IsAlignStack*/ tmpl_node->is_align_stack,
/*HasSideEffects*/ tmpl_entity->AsmTemplate.has_side_effects,
/*IsAlignStack*/ tmpl_entity->AsmTemplate.is_align_stack,
LLVMInlineAsmDialectATT,
/*CanThrow*/ false);
LLVMValueRef call = LLVMBuildCall2(p->builder, fn_ty, ia, call_args.data, cast(unsigned)call_args.count, "");
if (false) {
if (true) {
// DEBUG PRINT!!!
// DEBUG PRINT!!!
// DEBUG PRINT!!!