PR gas/12854
authorNick Clifton <nickc@redhat.com>
Mon, 13 Jun 2011 09:57:35 +0000 (09:57 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 13 Jun 2011 09:57:35 +0000 (09:57 +0000)
* gas/arm/shift-bad.s: New test.
* gas/arm/shift-bad.l: Expcted error output.
* gas/arm/shift-bad.s: New control file.

* config/tc-arm.c (do_shift): Do not allow shift operations at the
end of a register based shift insn.
(do_t_shift): Likewise.

gas/ChangeLog
gas/config/tc-arm.c
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/shift-bad.d [new file with mode: 0644]
gas/testsuite/gas/arm/shift-bad.l [new file with mode: 0644]
gas/testsuite/gas/arm/shift-bad.s [new file with mode: 0644]

index d265730b024cc9df92553ebc39a03ef76d464abe..90c585fce900509dc37fc362763e4fe9242fda69 100644 (file)
@@ -1,3 +1,10 @@
+2011-06-13  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/12854
+       * config/tc-arm.c (do_shift): Do not allow shift operations at the
+       end of a register based shift insn.
+       (do_t_shift): Likewise.
+
 2011-06-13  Nick Clifton  <nickc@redhat.com>
 
        * config/tc-score.c (s3_my_get_expression): Delete unused local
index d4262a9e3a7cb95bfdcabe0f12c75eb4d8a30e09..a34dceca5db4bc45cfd76612dadc10613c596aa5 100644 (file)
@@ -8343,6 +8343,9 @@ do_shift (void)
     {
       inst.instruction |= inst.operands[2].reg << 8;
       inst.instruction |= SHIFT_BY_REG;
+      /* PR 12854: Error on extraneous shifts.  */
+      constraint (inst.operands[2].shifted,
+                 _("extraneous shift as part of operand to shift insn"));
     }
   else
     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
@@ -11535,6 +11538,10 @@ do_t_shift (void)
              inst.instruction |= inst.operands[0].reg << 8;
              inst.instruction |= inst.operands[1].reg << 16;
              inst.instruction |= inst.operands[2].reg;
+
+             /* PR 12854: Error on extraneous shifts.  */
+             constraint (inst.operands[2].shifted,
+                         _("extraneous shift as part of operand to shift insn"));
            }
          else
            {
index db2ff768e6e7926f9ec8b7058c07c7ca38820143..8932f9a15059179642b0033f56321bbe6d17a182 100644 (file)
@@ -1,3 +1,10 @@
+2011-06-13  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/12854
+       * gas/arm/shift-bad.s: New test.
+       * gas/arm/shift-bad.l: Expcted error output.
+       * gas/arm/shift-bad.s: New control file.
+
 2011-06-12  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gas/i386/arch-10-lzcnt.d: Updated.
diff --git a/gas/testsuite/gas/arm/shift-bad.d b/gas/testsuite/gas/arm/shift-bad.d
new file mode 100644 (file)
index 0000000..7d4cac1
--- /dev/null
@@ -0,0 +1,3 @@
+# name: PR 12854: Extraneous shifts
+# as:
+# error-output: shift-bad.l
diff --git a/gas/testsuite/gas/arm/shift-bad.l b/gas/testsuite/gas/arm/shift-bad.l
new file mode 100644 (file)
index 0000000..6db9583
--- /dev/null
@@ -0,0 +1,6 @@
+.*shift-bad.s: Assembler messages:
+.*shift-bad.s:3: Error: extraneous shift as part of operand to shift insn -- `asr r0,r1,r2,ror#5'
+.*shift-bad.s:4: Error: extraneous shift as part of operand to shift insn -- `ror r0,r1,r2,lsl r3'
+.*shift-bad.s:8: Error: extraneous shift as part of operand to shift insn -- `ror r0,r1,r2,lsl#1'
+.*shift-bad.s:9: Error: extraneous shift as part of operand to shift insn -- `lsl r0,r1,r2,lsl#1'
+.*shift-bad.s:10: Error: extraneous shift as part of operand to shift insn -- `lsl r0,r1,r2,asr r0'
diff --git a/gas/testsuite/gas/arm/shift-bad.s b/gas/testsuite/gas/arm/shift-bad.s
new file mode 100644 (file)
index 0000000..6e6a795
--- /dev/null
@@ -0,0 +1,10 @@
+        .syntax unified
+
+        asr     r0, r1, r2, ror #5
+        ror     r0, r1, r2, lsl r3
+
+        .thumb_func
+foo:
+        ror     r0, r1, r2, lsl #1
+        lsl     r0, r1, r2, lsl #1
+        lsl     r0, r1, r2, asr r0