[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