[PATCH] ppc: use reg_name_search for CFI register lookup
Dmitry Selyutin
ghostmansd@gmail.com
Thu Jul 14 06:05:18 GMT 2022
---
gas/config/tc-ppc.c | 37 +++++++++++++++----------------------
1 file changed, 15 insertions(+), 22 deletions(-)
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
index 05d8ee19be..765eb3fa2f 100644
--- a/gas/config/tc-ppc.c
+++ b/gas/config/tc-ppc.c
@@ -7715,10 +7715,8 @@ ppc_cfi_frame_initial_instructions (void)
int
tc_ppc_regname_to_dw2regnum (char *regname)
{
- unsigned int regnum = -1;
unsigned int i;
- const char *p;
- char *q;
+ const struct pd_reg *reg;
static struct { const char *name; int dw2regnum; } regnames[] =
{
{ "sp", 1 }, { "r.sp", 1 }, { "rtoc", 2 }, { "r.toc", 2 },
@@ -7731,23 +7729,18 @@ tc_ppc_regname_to_dw2regnum (char *regname)
if (strcmp (regnames[i].name, regname) == 0)
return regnames[i].dw2regnum;
- if (regname[0] == 'r' || regname[0] == 'f' || regname[0] == 'v')
- {
- p = regname + 1 + (regname[1] == '.');
- regnum = strtoul (p, &q, 10);
- if (p == q || *q || regnum >= 32)
- return -1;
- if (regname[0] == 'f')
- regnum += 32;
- else if (regname[0] == 'v')
- regnum += 77;
- }
- else if (regname[0] == 'c' && regname[1] == 'r')
- {
- p = regname + 2 + (regname[2] == '.');
- if (p[0] < '0' || p[0] > '7' || p[1])
- return -1;
- regnum = p[0] - '0' + 68;
- }
- return regnum;
+ if (regname[0] == '%' && ISALPHA (regname[1]))
+ ++regname;
+
+ reg = reg_name_search (pre_defined_registers,
+ ARRAY_SIZE (pre_defined_registers), regname);
+
+ if ((reg != NULL) &&
+ (((reg->flags & PPC_OPERAND_GPR) == PPC_OPERAND_GPR) ||
+ ((reg->flags & PPC_OPERAND_FPR) == PPC_OPERAND_FPR) ||
+ ((reg->flags & PPC_OPERAND_VR) == PPC_OPERAND_VR) ||
+ ((reg->flags & PPC_OPERAND_CR_REG) == PPC_OPERAND_CR_REG)))
+ return reg->value;
+
+ return -1;
}
--
2.37.0
More information about the Binutils
mailing list