Add helper methods to the asm_tables_amd64.cpp

This commit is contained in:
gingerBill
2026-08-12 21:18:10 +01:00
parent 5768668af9
commit 08f3be70cf
2 changed files with 78 additions and 0 deletions

View File

@@ -180,6 +180,45 @@ struct Asm_amd64 {
OperandSet_OP2 = 1<<2,
OperandSet_OP3 = 1<<3,
};
u16 clobber_bit_for_reg_name(String const &pin) {
static const struct { String name; u16 bit; } table[] = {
{str_lit("rax"), ClobberReg_RAX}, {str_lit("eax"), ClobberReg_RAX}, {str_lit("ax"), ClobberReg_RAX}, {str_lit("al"), ClobberReg_RAX}, {str_lit("ah"), ClobberReg_RAX},
{str_lit("rbx"), ClobberReg_RBX}, {str_lit("ebx"), ClobberReg_RBX}, {str_lit("bx"), ClobberReg_RBX}, {str_lit("bl"), ClobberReg_RBX}, {str_lit("bh"), ClobberReg_RBX},
{str_lit("rcx"), ClobberReg_RCX}, {str_lit("ecx"), ClobberReg_RCX}, {str_lit("cx"), ClobberReg_RCX}, {str_lit("cl"), ClobberReg_RCX}, {str_lit("ch"), ClobberReg_RCX},
{str_lit("rdx"), ClobberReg_RDX}, {str_lit("edx"), ClobberReg_RDX}, {str_lit("dx"), ClobberReg_RDX}, {str_lit("dl"), ClobberReg_RDX}, {str_lit("dh"), ClobberReg_RDX},
{str_lit("rsi"), ClobberReg_RSI}, {str_lit("esi"), ClobberReg_RSI}, {str_lit("si"), ClobberReg_RSI}, {str_lit("sil"), ClobberReg_RSI},
{str_lit("rdi"), ClobberReg_RDI}, {str_lit("edi"), ClobberReg_RDI}, {str_lit("di"), ClobberReg_RDI}, {str_lit("dil"), ClobberReg_RDI},
{str_lit("rsp"), ClobberReg_RSP}, {str_lit("esp"), ClobberReg_RSP},
{str_lit("rbp"), ClobberReg_RBP}, {str_lit("ebp"), ClobberReg_RBP},
{str_lit("r11"), ClobberReg_R11}, {str_lit("r11d"), ClobberReg_R11},
{str_lit("r11w"), ClobberReg_R11}, {str_lit("r11b"), ClobberReg_R11},
{str_lit("xmm0"), ClobberReg_XMM0},
};
for (auto const &t : table) {
if (pin == t.name) {
return t.bit;
}
}
return 0;
}
char const *clobber_reg_bit_name(u16 bit) {
switch (bit) {
case ClobberReg_RAX: return "rax";
case ClobberReg_RBX: return "rbx";
case ClobberReg_RCX: return "rcx";
case ClobberReg_RDX: return "rdx";
case ClobberReg_RSI: return "rsi";
case ClobberReg_RDI: return "rdi";
case ClobberReg_RSP: return "rsp";
case ClobberReg_RBP: return "rbp";
case ClobberReg_R11: return "r11";
case ClobberReg_XMM0: return "xmm0";
}
return "<reg>";
}
struct Clobber {
OperandSet written;
OperandSet read;