ppc: refactor assembly logic
authorDmitry Selyutin <ghostmansd@gmail.com>
Tue, 11 Apr 2023 18:27:25 +0000 (21:27 +0300)
committerDmitry Selyutin <ghostmansd@gmail.com>
Wed, 26 Apr 2023 16:47:42 +0000 (19:47 +0300)
gas/config/tc-ppc-svp64.c
gas/config/tc-ppc.c

index 91977b9d45a59aebac8f13bda15e1ac288c4451a..bf8c0c947b7165be05648127416a356da22315fa 100644 (file)
@@ -591,8 +591,12 @@ static void
 svp64_decode (char *str, struct svp64_ctx *svp64)
 {
   char *opc;
+  size_t opclen;
+  char *args;
+  size_t argslen;
   char *iter;
   const struct svp64_record *record;
+  char *base = str;
 
   str += (sizeof ("sv.") - 1);
   if (! ISALPHA (*str))
@@ -601,6 +605,7 @@ svp64_decode (char *str, struct svp64_ctx *svp64)
   opc = str;
   for (; ! ISSPACE (*str) && *str != SVP64_SEP && *str != '\0'; ++str)
     ;
+  opclen = (str - opc);
   if (*str != '\0')
     *str++ = '\0';
 
@@ -614,6 +619,14 @@ svp64_decode (char *str, struct svp64_ctx *svp64)
 
   for (; (iter = svp64_decode_mode (str, svp64)) != NULL; str = iter)
     ;
+
+  args = str;
+  argslen = strlen (args);
+
+  memmove (base, opc, opclen);
+  base[opclen] = ' ';
+  memmove ((base + opclen + 1), args, argslen);
+  base[opclen + 1 + argslen] = '\0';
 }
 
 static void
@@ -862,7 +875,5 @@ svp64_assemble (char *str)
   svp64_decode (str, &svp64);
   svp64_validate_and_fix (&svp64);
 
-  as_warn (_("opcode ignored (desc=%p)"), svp64.desc);
-  memcpy (str, "nop", sizeof ("nop"));
-  md_assemble (str);
+  ppc_assemble (str, &svp64);
 }
index d62e671ac525f97050b33698909cf29886650265..537d3561bb52ce682832dc5431d1c2e0d622aa44 100644 (file)
 #include "libxcoff.h"
 #endif
 
+struct svp64_ctx;
+
+static void
+ppc_assemble (char *str, struct svp64_ctx *svp64 ATTRIBUTE_UNUSED);
+
 #include "tc-ppc-svp64.c"
 
 /* This is the assembler for the PowerPC or POWER (RS/6000) chips.  */
@@ -3310,8 +3315,8 @@ is_svp64_insn (char *str)
 
 /* This routine is called for each instruction to be assembled.  */
 
-void
-md_assemble (char *str)
+static void
+ppc_assemble (char *str, struct svp64_ctx *svp64 ATTRIBUTE_UNUSED)
 {
   char *s;
   const struct powerpc_opcode *opcode;
@@ -3338,6 +3343,7 @@ md_assemble (char *str)
     {
       if (is_svp64_insn (str))
         {
+          *(s - 1) = ' '; /* restore the original string */
           svp64_assemble (str);
           return;
         }
@@ -4161,6 +4167,11 @@ md_assemble (char *str)
     }
 }
 
+void
+md_assemble (char *str)
+{
+  ppc_assemble (str, NULL);
+}
 \f
 #ifdef OBJ_ELF
 /* For ELF, add support for SHT_ORDERED.  */