ppc: refactor assemling logic
[binutils-gdb.git] / gas / config / tc-ppc-svp64.c
index b9a07c2f594de9c4f00856953b6d086e86a82daf..a87e71c203875e855c5924b2d120c81c891abfc5 100644 (file)
@@ -720,7 +720,10 @@ svp64_decode (char *str, struct svp64_ctx *svp64)
 {
   char *opc;
   size_t opclen;
+  char *args;
+  size_t argslen;
   char *iter;
+  char *base = str;
 
   str += (sizeof ("sv.") - 1);
   if (! ISALPHA (*str))
@@ -745,10 +748,21 @@ svp64_decode (char *str, struct svp64_ctx *svp64)
 
   for (; (iter = svp64_decode_mode (str, svp64)) != NULL; str = iter)
     ;
+  args = str;
+  argslen = strlen (args);
 
   svp64->desc = (const struct svp64_desc *) str_hash_find (svp64_hash, opc);
   if (!svp64->desc)
     svp64_raise (_("unrecognized opcode: `%s'"), str);
+
+  iter = base;
+  memmove (iter, opc, opclen);
+  iter += opclen;
+  *iter++ = ' ';
+
+  memmove (iter, args, argslen);
+  iter += argslen;
+  *iter++ = '\0';
 }
 
 static void
@@ -1009,7 +1023,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);
 }