ARM assembler: Allow up to 32 single precision registers in the VPUSH and VPOP instru...
authorMarkus Klein <markus.klein@sma.de>
Thu, 28 Oct 2021 16:17:25 +0000 (17:17 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 28 Oct 2021 16:17:25 +0000 (17:17 +0100)
PR 28436
* config/tc-arm.c (do_vfp_nsyn_push_pop_check): New function.
(do_vfp_nsyn_pop): Use the new function.
(do_vfp_nsyn_push): Use the new function.
* testsuite/gas/arm/v8_1m-mve.s: Add new instructions.
* testsuite/gas/arm/v8_1m-mve.d: Updated expected disassembly.

gas/ChangeLog
gas/config/tc-arm.c
gas/testsuite/gas/arm/v8_1m-mve.d
gas/testsuite/gas/arm/v8_1m-mve.s

index 25ad2d1892f7b05e3f5c794bde4e694597d3c0a4..1133847e8201f23778323d36bcc9db03834ea474 100644 (file)
@@ -1,3 +1,12 @@
+2021-10-28  Markus Klein  <markus.klein@sma.de>
+
+       PR 28436
+       * config/tc-arm.c (do_vfp_nsyn_push_pop_check): New function.
+       (do_vfp_nsyn_pop): Use the new function.
+       (do_vfp_nsyn_push): Use the new function.
+       * testsuite/gas/arm/v8_1m-mve.s: Add new instructions.
+       * testsuite/gas/arm/v8_1m-mve.d: Updated expected disassembly.
+
 2021-09-27  Nick Alcock  <nick.alcock@oracle.com>
 
        * configure: Regenerate.
index 302a18f4a1ea63b39c612a706c542aa3fc9dd500..9ad7009ddb69d9536ecf4d72c611fdd1d8fcb7ee 100644 (file)
@@ -20736,20 +20736,32 @@ do_neon_ldm_stm (void)
   do_vfp_cond_or_thumb ();
 }
 
+static void
+do_vfp_nsyn_push_pop_check (void)
+{
+  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1xd), _(BAD_FPU));
+
+  if (inst.operands[1].issingle)
+    {
+      constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 32,
+                 _("register list must contain at least 1 and at most 32 registers"));
+    }
+  else
+    {
+      constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
+                 _("register list must contain at least 1 and at most 16 registers"));
+    }
+}
+
 static void
 do_vfp_nsyn_pop (void)
 {
   nsyn_insert_sp ();
-  if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)) {
-    return do_vfp_nsyn_opcode ("vldm");
-  }
 
-  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1xd),
-             _(BAD_FPU));
+  if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
+    return do_vfp_nsyn_opcode ("vldm");
 
-  constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
-             _("register list must contain at least 1 and at most 16 "
-               "registers"));
+  do_vfp_nsyn_push_pop_check ();
 
   if (inst.operands[1].issingle)
     do_vfp_nsyn_opcode ("fldmias");
@@ -20761,16 +20773,11 @@ static void
 do_vfp_nsyn_push (void)
 {
   nsyn_insert_sp ();
-  if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)) {
-    return do_vfp_nsyn_opcode ("vstmdb");
-  }
 
-  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1xd),
-             _(BAD_FPU));
+  if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
+    return do_vfp_nsyn_opcode ("vstmdb");
 
-  constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
-             _("register list must contain at least 1 and at most 16 "
-               "registers"));
+  do_vfp_nsyn_push_pop_check ();
 
   if (inst.operands[1].issingle)
     do_vfp_nsyn_opcode ("fstmdbs");
@@ -20778,7 +20785,6 @@ do_vfp_nsyn_push (void)
     do_vfp_nsyn_opcode ("fstmdbd");
 }
 
-
 static void
 do_neon_ldr_str (void)
 {
index 4c528de073fdc2a52c5bfbb77c41bdd0c0bc2161..a1eba2d3813a1b0814ec120729a7552e318862f3 100644 (file)
@@ -25,3 +25,7 @@ Disassembly of section .text:
  *[0-9a-f]+:   ed91 fb00       vldr    d15, \[r1\]
  *[0-9a-f]+:   edc1 fa00       vstr    s31, \[r1\]
  *[0-9a-f]+:   edd1 fa00       vldr    s31, \[r1\]
+ *[0-9a-f]+:   ed2d 0a20       vpush   {s0-s31}
+ *[0-9a-f]+:   ed2d 0a10       vpush   {s0-s15}
+ *[0-9a-f]+:   ecbd 0a10       vpop    {s0-s15}
+ *[0-9a-f]+:   ecbd 0a20       vpop    {s0-s31}
index cae1f93c1581c4cfc61191f4e4815a20b50378d1..df3442249ab5d06120505c1c7e990714c1326a63 100644 (file)
@@ -22,3 +22,8 @@ vstr d15,[r1]
 vldr d15,[r1]
 vstr s31,[r1]
 vldr s31,[r1]
+       
+vpush {s0-s31}         // -> false error, is a valid command
+vpush {s0-s15}         // OK
+vpop {s0-s15}          // OK
+vpop {s0-s31}          // -> false error, is a valid command