xtensa: gas: support optional immediate simcall parameter
authorMax Filippov <jcmvbkbc@gmail.com>
Tue, 28 Apr 2020 11:15:05 +0000 (04:15 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Thu, 30 Apr 2020 01:31:32 +0000 (18:31 -0700)
Starting with RH.0 release Xtensa ISA adds immediate parameter to
simcall opcode. For assembly source compatibility treat "simcall"
instruction without parameter as "simcall 0" when parameter is required.

2020-04-29  Max Filippov  <jcmvbkbc@gmail.com>
gas/
* config/tc-xtensa.c (XTENSA_MARCH_EARLIEST): Define macro as 0
if it's not defined.
(microarch_earliest): New static variable.
(xg_translate_idioms): Translate "simcall" to "simcall 0" when
simcall opcode has mandatory parameter.
(xg_init_global_config): Initialize microarch_earliest.

gas/ChangeLog
gas/config/tc-xtensa.c

index 69e117cf5ebcdc729443363483c02db18731f5d8..f47deba09b6317c8c979d99afd0cb98b2fcc3172 100644 (file)
@@ -1,3 +1,12 @@
+2020-04-29  Max Filippov  <jcmvbkbc@gmail.com>
+
+       * config/tc-xtensa.c (XTENSA_MARCH_EARLIEST): Define macro as 0
+       if it's not defined.
+       (microarch_earliest): New static variable.
+       (xg_translate_idioms): Translate "simcall" to "simcall 0" when
+       simcall opcode has mandatory parameter.
+       (xg_init_global_config): Initialize microarch_earliest.
+
 2020-04-29  Nick Clifton  <nickc@redhat.com>
 
        PR 22699
index ee75c13548ff1ba0f04b3e74b81188fc52338ec7..14a5a2a9497e45abdf2035b77f95e59970a327c5 100644 (file)
 #define XSHAL_ABI 0
 #endif
 
+#ifndef XTENSA_MARCH_EARLIEST
+#define XTENSA_MARCH_EARLIEST 0
+#endif
+
 #ifndef uint32
 #define uint32 unsigned int
 #endif
@@ -74,6 +78,8 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
 bfd_boolean density_supported;
 bfd_boolean absolute_literals_supported;
 
+static unsigned microarch_earliest;
+
 static vliw_insn cur_vinsn;
 
 unsigned xtensa_num_pipe_stages;
@@ -2502,6 +2508,18 @@ xg_translate_idioms (char **popname, int *pnum_args, char **arg_strings)
       return 0;
     }
 
+  /* Without an operand, this is given a default immediate operand of 0.  */
+  if ((strcmp (opname, "simcall") == 0 && microarch_earliest >= 280000))
+    {
+      if (*pnum_args == 0)
+       {
+         arg_strings[0] = (char *) xmalloc (2);
+         strcpy (arg_strings[0], "0");
+         *pnum_args = 1;
+       }
+      return 0;
+    }
+
   if (strcmp (opname, "bbsi.l") == 0)
     {
       if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
@@ -5236,6 +5254,8 @@ xg_init_global_config (void)
 
   directive_state[directive_density] = XCHAL_HAVE_DENSITY;
   directive_state[directive_absolute_literals] = XSHAL_USE_ABSOLUTE_LITERALS;
+
+  microarch_earliest = XTENSA_MARCH_EARLIEST;
 }
 
 void