This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH v2] arm: correct barrier immediate checks


Both do_barrier() and do_t_barrier() had a bogus constraint() invocation. It
turns out plain unnecessary, as po_barrier_or_imm() already does the needed
checking. Since after removing this it became even more obvious that
do_barrier() and do_t_barrier() are identical, remove the latter at once.

gas/
2013-04-10  Jan Beulich <jbeulich@suse.com>

	* gas/config/tc-arm.c (parse_operands): Re-write
	po_barrier_or_imm().
	(do_barrier): Remove bogus constraint().
	(do_t_barrier): Remove.

gas/testsuite/
2013-04-10  Jan Beulich <jbeulich@suse.com>

	* gas/arm/barrier-bad.d: Change title.
	* gas/arm/barrier-bad.s: Add immediate form of ISB and DSB as
	well as one symbolic form of DSB.
	* gas/arm/barrier-bad.l: Update accordingly.
	* gas/arm/barrier-bad-thumb.d: Adjust title. Use barrier.s as
	source. Pass -mthumb to gas.
	* gas/arm/barrier-bad-thumb.l: Remove.
	* gas/arm/barrier-bad-thumb.s: Remove.
	* gas/arm/barrier-thumb.d: Adjust title. Use barrier.s as source.
	Pass -mthumb to gas.
	* gas/arm/barrier-thumb.s: Remove.

--- 2013-04-10/gas/config/tc-arm.c
+++ 2013-04-10/gas/config/tc-arm.c
@@ -6338,22 +6338,16 @@ parse_operands (char *str, const unsigne
   do							   \
     {						 	   \
       val = parse_barrier (&str);			   \
-      if (val == FAIL)					   \
+      if (val == FAIL && ! ISALPHA (*str))		   \
+	goto immediate;					   \
+      if (val == FAIL					   \
+	  /* ISB can only take SY as an option.  */	   \
+	  || ((inst.instruction & 0xf0) == 0x60		   \
+	       && val != 0xf))				   \
 	{						   \
-	  if (ISALPHA (*str))				   \
-	      goto failure;				   \
-	  else						   \
-	      goto immediate;				   \
-	}						   \
-      else						   \
-	{						   \
-	  if ((inst.instruction & 0xf0) == 0x60		   \
-	      && val != 0xf)				   \
-	    {						   \
-	       /* ISB can only take SY as an option.  */   \
-	       inst.error = _("invalid barrier type");	   \
-	       goto failure;				   \
-	    }						   \
+	   inst.error = _("invalid barrier type");	   \
+	   backtrack_pos = 0;				   \
+	   goto failure;				   \
 	}						   \
     }							   \
   while (0)
@@ -7541,13 +7535,7 @@ static void
 do_barrier (void)
 {
   if (inst.operands[0].present)
-    {
-      constraint ((inst.instruction & 0xf0) != 0x40
-		  && inst.operands[0].imm > 0xf
-		  && inst.operands[0].imm < 0x0,
-		  _("bad barrier type"));
-      inst.instruction |= inst.operands[0].imm;
-    }
+    inst.instruction |= inst.operands[0].imm;
   else
     inst.instruction |= 0xf;
 }
@@ -10051,21 +10039,6 @@ do_t_arit3c (void)
 }
 
 static void
-do_t_barrier (void)
-{
-  if (inst.operands[0].present)
-    {
-      constraint ((inst.instruction & 0xf0) != 0x40
-		  && inst.operands[0].imm > 0xf
-		  && inst.operands[0].imm < 0x0,
-		  _("bad barrier type"));
-      inst.instruction |= inst.operands[0].imm;
-    }
-  else
-    inst.instruction |= 0xf;
-}
-
-static void
 do_t_bfc (void)
 {
   unsigned Rd;
@@ -18510,9 +18483,9 @@ static const struct asm_opcode insns[] =
 #undef  THUMB_VARIANT
 #define THUMB_VARIANT  & arm_ext_barrier
 
- TUF("dmb",	57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier,  t_barrier),
- TUF("dsb",	57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier,  t_barrier),
- TUF("isb",	57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier,  t_barrier),
+ TUF("dmb",	57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, barrier),
+ TUF("dsb",	57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, barrier),
+ TUF("isb",	57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, barrier),
 
  /* ARM V7 instructions.  */
 #undef  ARM_VARIANT
--- 2013-04-10/gas/testsuite/gas/arm/barrier-bad.d
+++ 2013-04-10/gas/testsuite/gas/arm/barrier-bad.d
@@ -1,3 +1,3 @@
-#name: All options expect SY are reserved for ISB
+#name: Bad barrier options (ARM)
 #skip: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd
 #error-output: barrier-bad.l
--- 2013-04-10/gas/testsuite/gas/arm/barrier-bad.l
+++ 2013-04-10/gas/testsuite/gas/arm/barrier-bad.l
@@ -6,3 +6,6 @@
 [^:]*:7: Error: invalid barrier type -- `isb nshst'
 [^:]*:8: Error: invalid barrier type -- `isb osh'
 [^:]*:9: Error: invalid barrier type -- `isb oshst'
+[^:]*:10: Error: immediate value out of range -- `isb #23'
+[^:]*:11: Error: invalid barrier type -- `dsb xyz'
+[^:]*:12: Error: immediate value out of range -- `dsb #34'
--- 2013-04-10/gas/testsuite/gas/arm/barrier-bad.s
+++ 2013-04-10/gas/testsuite/gas/arm/barrier-bad.s
@@ -7,4 +7,6 @@ isb nsh
 isb nshst
 isb osh
 isb oshst
-
+isb #23
+dsb xyz
+dsb #34
--- 2013-04-10/gas/testsuite/gas/arm/barrier-bad-thumb.d
+++ 2013-04-10/gas/testsuite/gas/arm/barrier-bad-thumb.d
@@ -1,3 +1,5 @@
-#name: All options expect SY are reserved for ISB
+#name: Bad barrier options (Thumb)
 #skip: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd
-#error-output: barrier-bad-thumb.l
+#source: barrier-bad.s
+#as: -mthumb
+#error-output: barrier-bad.l
--- 2013-04-10/gas/testsuite/gas/arm/barrier-bad-thumb.l
+++ /dev/null
@@ -1,8 +0,0 @@
-[^:]*: Assembler messages:
-[^:]*:4: Error: invalid barrier type -- `isb st'
-[^:]*:5: Error: invalid barrier type -- `isb ish'
-[^:]*:6: Error: invalid barrier type -- `isb ishst'
-[^:]*:7: Error: invalid barrier type -- `isb nsh'
-[^:]*:8: Error: invalid barrier type -- `isb nshst'
-[^:]*:9: Error: invalid barrier type -- `isb osh'
-[^:]*:10: Error: invalid barrier type -- `isb oshst'
--- 2013-04-10/gas/testsuite/gas/arm/barrier-bad-thumb.s
+++ /dev/null
@@ -1,11 +0,0 @@
-.syntax unified
-.thumb
-.arch armv7a
-isb st
-isb ish
-isb ishst
-isb nsh
-isb nshst
-isb osh
-isb oshst
-
--- 2013-04-10/gas/testsuite/gas/arm/barrier-thumb.d
+++ 2013-04-10/gas/testsuite/gas/arm/barrier-thumb.d
@@ -1,6 +1,7 @@
 #objdump: -dr --prefix-addresses --show-raw-insn
-#name: Barrier Instruction Operands
-#as: -mcpu=cortex-a8
+#name: Barrier Instruction Operands (Thumb)
+#source: barrier.s
+#as: -mcpu=cortex-a8 -mthumb
 # This test is only valid on ELF based ports.
 #not-target: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd
 
--- 2013-04-10/gas/testsuite/gas/arm/barrier-thumb.s
+++ /dev/null
@@ -1,74 +0,0 @@
-@ Test case to validate barrier instruction operands for T2
-.thumb
-.section .text
-.syntax unified
-	@Tests to verify dsb, dmb and isb operand acceptance
-	dmb sy
-	dmb st
-	dmb ish
-	dmb sh
-	dmb ishst
-	dmb shst
-	dmb nsh
-	dmb un
-	dmb nshst
-	dmb unst
-	dmb osh
-	dmb oshst
-	dsb sy
-	dsb st
-	dsb ish
-	dsb sh
-	dsb ishst
-	dsb shst
-	dsb nsh
-	dsb un
-	dsb nshst
-	dsb unst
-	dsb osh
-	isb sy
-	isb
-
-	@Sanity checks for operands in upper case
-	dmb SY
-	dmb ST
-	dmb ISH
-	dmb SH
-	dmb ISHST
-	dmb SHST
-	dmb NSH
-	dmb UN
-	dmb NSHST
-	dmb UNST
-	dmb OSH
-	dmb OSHST
-	dsb SY
-	dsb ST
-	dsb ISH
-	dsb SH
-	dsb ISHST
-	dsb SHST
-	dsb NSH
-	dsb UN
-	dsb NSHST
-	dsb UNST
-	dsb OSH
-	isb SY
-
-	@Tests to verify immediate operands
-        dsb 0
-        dsb #15
-
-        dmb 0
-        dmb #15
-        
-        isb 0
-        isb #14
-        isb #11
-        isb #10
-        isb #7
-        isb #6
-        isb #3
-        isb #2
-
-        isb #15


Attachment: binutils-mainline-arm-barrier-imm.patch
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]