This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] ARM: Fix barrier instructions' operand acceptance
- From: tejas belagod <tejas dot belagod at arm dot com>
- To: binutils at sourceware dot org
- Date: Thu, 08 Jul 2010 14:11:11 +0100
- Subject: [PATCH] ARM: Fix barrier instructions' operand acceptance
Hi,
Attached is a patch that fixes the acceptance of all legal symbolic
operands for DMB, DSB and ISB barrier instructions. it also fixes the
acceptance of legal immediate values for operands which was previously
considered as garbage.
--
Tejas Belagod
ARM.
Proposed ChangeLog:
2010-07-08 Tejas Belagod <tejas.belagod@arm.com>
gas/testsuite
* gas/arm/barrier.s: New file.
* gas/arm/barrier.d: New file.
* gas/arm/barrier-thumb.s: New file.
* gas/arm/barrier-thumb.d: New file.
* gas/arm/barrier-bad.s: New file.
* gas/arm/barrier-bad.d: New file.
* gas/arm/barrier-bad.l: New file.
* gas/arm/barrier-bad-thumb.s: New file.
* gas/arm/barrier-bad-thumb.d: New file.
* gas/arm/barrier-bad-thumb.l: New file.
gas/config
* tc-arm.c (OP_oBARRIER): Remove.
(OP_oBARRIER_I15): Add.
(po_barrier_or_imm): Add macro.
(parse_operands): Improve OP_oBARRIER_I15 operand parsing.
(do_barrier): Check correct immediate range.
(do_t_barrier): Likewise.
(barrier_opt_names): Add entries for more symbolic operands.
(insns): Replace OP_oBARRIER with OP_oBARRIER_I15 for barriers.
opcodes/
* arm-dis.c (print_insn_arm): Add cases for printing more
symbolic operands.
(print_insn_thumb32): Likewise.
Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.451
diff -u -p -r1.451 tc-arm.c
--- gas/config/tc-arm.c 8 Jul 2010 06:22:23 -0000 1.451
+++ gas/config/tc-arm.c 8 Jul 2010 12:29:24 -0000
@@ -5898,7 +5898,7 @@ enum operand_parse_code
OP_oSHar, /* ASR immediate */
OP_oSHllar, /* LSL or ASR immediate */
OP_oROR, /* ROR 0/8/16/24 */
- OP_oBARRIER, /* Option argument for a barrier instruction. */
+ OP_oBARRIER_I15, /* Option argument for a barrier instruction. */
/* Some pre-defined mixed (ARM/THUMB) operands. */
OP_RR_npcsp = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
@@ -6008,6 +6008,30 @@ parse_operands (char *str, const unsigne
} \
while (0)
+#define po_barrier_or_imm(str) \
+ do \
+ { \
+ val = parse_barrier (&str); \
+ if (val == FAIL) \
+ { \
+ 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; \
+ } \
+ } \
+ } \
+ while (0)
+
skip_whitespace (str);
for (i = 0; upat[i] != OP_stop; i++)
@@ -6313,7 +6337,12 @@ parse_operands (char *str, const unsigne
case OP_oROR: val = parse_ror (&str); break;
case OP_PSR: val = parse_psr (&str); break;
case OP_COND: val = parse_cond (&str); break;
- case OP_oBARRIER:val = parse_barrier (&str); break;
+ case OP_oBARRIER_I15:
+ po_barrier_or_imm (str); break;
+ immediate:
+ if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
+ goto failure;
+ break;
case OP_RVC_PSR:
po_reg_or_goto (REG_TYPE_VFC, try_psr);
@@ -6481,7 +6510,7 @@ parse_operands (char *str, const unsigne
case OP_PSR:
case OP_RVC_PSR:
case OP_COND:
- case OP_oBARRIER:
+ case OP_oBARRIER_I15:
case OP_REGLST:
case OP_VRSLST:
case OP_VRDLST:
@@ -6546,6 +6575,7 @@ parse_operands (char *str, const unsigne
#undef po_reg_or_goto
#undef po_imm_or_fail
#undef po_scalar_or_fail
+#undef po_barrier_or_imm
/* Shorthand macro for instruction encoding functions issuing errors. */
#define constraint(expr, err) \
@@ -7124,7 +7154,8 @@ do_barrier (void)
if (inst.operands[0].present)
{
constraint ((inst.instruction & 0xf0) != 0x40
- && inst.operands[0].imm != 0xf,
+ && inst.operands[0].imm > 0xf
+ && inst.operands[0].imm < 0x0,
_("bad barrier type"));
inst.instruction |= inst.operands[0].imm;
}
@@ -9431,7 +9462,8 @@ do_t_barrier (void)
if (inst.operands[0].present)
{
constraint ((inst.instruction & 0xf0) != 0x40
- && inst.operands[0].imm != 0xf,
+ && inst.operands[0].imm > 0xf
+ && inst.operands[0].imm < 0x0,
_("bad barrier type"));
inst.instruction |= inst.operands[0].imm;
}
@@ -16283,10 +16315,18 @@ static const struct asm_cond conds[] =
static struct asm_barrier_opt barrier_opt_names[] =
{
- { "sy", 0xf },
- { "un", 0x7 },
- { "st", 0xe },
- { "unst", 0x6 }
+ { "sy", 0xf }, { "SY", 0xf },
+ { "un", 0x7 }, { "UN", 0x7 },
+ { "st", 0xe }, { "ST", 0xe },
+ { "unst", 0x6 }, { "UNST", 0x6 },
+ { "ish", 0xb }, { "ISH", 0xb },
+ { "sh", 0xb }, { "SH", 0xb },
+ { "ishst", 0xa }, { "ISHST", 0xa },
+ { "shst", 0xa }, { "SHST", 0xa },
+ { "nsh", 0x7 }, { "NSH", 0x7 },
+ { "nshst", 0x6 }, { "NSHST", 0x6 },
+ { "osh", 0x3 }, { "OSH", 0x3 },
+ { "oshst", 0x2 }, { "OSHST", 0x2 }
};
/* Table of ARM-format instructions. */
@@ -17002,9 +17042,9 @@ static const struct asm_opcode insns[] =
#undef THUMB_VARIANT
#define THUMB_VARIANT & arm_ext_barrier
- TUF("dmb", 57ff050, f3bf8f50, 1, (oBARRIER), barrier, t_barrier),
- TUF("dsb", 57ff040, f3bf8f40, 1, (oBARRIER), barrier, t_barrier),
- TUF("isb", 57ff060, f3bf8f60, 1, (oBARRIER), barrier, t_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),
/* ARM V7 instructions. */
#undef ARM_VARIANT
Index: opcodes/arm-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/arm-dis.c,v
retrieving revision 1.128
diff -u -p -r1.128 arm-dis.c
--- opcodes/arm-dis.c 28 Jun 2010 09:10:25 -0000 1.128
+++ opcodes/arm-dis.c 8 Jul 2010 12:29:36 -0000
@@ -3155,15 +3155,32 @@ print_insn_arm (bfd_vma pc, struct disas
break;
case 'U':
- switch (given & 0xf)
+ if ((given & 0xf0) == 0x60)
{
- case 0xf: func (stream, "sy"); break;
- case 0x7: func (stream, "un"); break;
- case 0xe: func (stream, "st"); break;
- case 0x6: func (stream, "unst"); break;
- default:
- func (stream, "#%d", (int) given & 0xf);
- break;
+ switch (given & 0xf)
+ {
+ case 0xf: func (stream, "sy"); break;
+ default:
+ func (stream, "#%d", (int) given & 0xf);
+ break;
+ }
+ }
+ else
+ {
+ switch (given & 0xf)
+ {
+ case 0xf: func (stream, "sy"); break;
+ case 0x7: func (stream, "un"); break;
+ case 0xe: func (stream, "st"); break;
+ case 0x6: func (stream, "unst"); break;
+ case 0xb: func (stream, "ish"); break;
+ case 0xa: func (stream, "ishst"); break;
+ case 0x3: func (stream, "osh"); break;
+ case 0x2: func (stream, "oshst"); break;
+ default:
+ func (stream, "#%d", (int) given & 0xf);
+ break;
+ }
}
break;
@@ -3998,16 +4015,33 @@ print_insn_thumb32 (bfd_vma pc, struct d
break;
case 'U':
- switch (given & 0xf)
+ if ((given & 0xf0) == 0x60)
{
- case 0xf: func (stream, "sy"); break;
- case 0x7: func (stream, "un"); break;
- case 0xe: func (stream, "st"); break;
- case 0x6: func (stream, "unst"); break;
- default:
- func (stream, "#%d", (int) given & 0xf);
- break;
+ switch (given & 0xf)
+ {
+ case 0xf: func (stream, "sy"); break;
+ default:
+ func (stream, "#%d", (int) given & 0xf);
+ break;
+ }
}
+ else
+ {
+ switch (given & 0xf)
+ {
+ case 0xf: func (stream, "sy"); break;
+ case 0x7: func (stream, "un"); break;
+ case 0xe: func (stream, "st"); break;
+ case 0x6: func (stream, "unst"); break;
+ case 0xb: func (stream, "ish"); break;
+ case 0xa: func (stream, "ishst"); break;
+ case 0x3: func (stream, "osh"); break;
+ case 0x2: func (stream, "oshst"); break;
+ default:
+ func (stream, "#%d", (int) given & 0xf);
+ break;
+ }
+ }
break;
case 'C':
Index: gas/testsuite/gas/arm/barrier-bad-thumb.d
===================================================================
RCS file: gas/testsuite/gas/arm/barrier-bad-thumb.d
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier-bad-thumb.d 2010-07-08 13:29:07.135266000 +0100
@@ -0,0 +1,3 @@
+#name: All options expect SY are reserved for ISB
+#skip: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd
+#error-output: barrier-bad-thumb.l
Index: gas/testsuite/gas/arm/barrier-bad-thumb.l
===================================================================
RCS file: gas/testsuite/gas/arm/barrier-bad-thumb.l
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier-bad-thumb.l 2010-07-08 13:29:07.154247000 +0100
@@ -0,0 +1,8 @@
+[^:]*: 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'
Index: gas/testsuite/gas/arm/barrier-bad-thumb.s
===================================================================
RCS file: gas/testsuite/gas/arm/barrier-bad-thumb.s
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier-bad-thumb.s 2010-07-08 13:29:07.162272000 +0100
@@ -0,0 +1,11 @@
+.syntax unified
+.thumb
+.arch armv7a
+isb st
+isb ish
+isb ishst
+isb nsh
+isb nshst
+isb osh
+isb oshst
+
Index: gas/testsuite/gas/arm/barrier-bad.d
===================================================================
RCS file: gas/testsuite/gas/arm/barrier-bad.d
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier-bad.d 2010-07-08 13:29:07.175267000 +0100
@@ -0,0 +1,3 @@
+#name: All options expect SY are reserved for ISB
+#skip: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd
+#error-output: barrier-bad.l
Index: gas/testsuite/gas/arm/barrier-bad.l
===================================================================
RCS file: gas/testsuite/gas/arm/barrier-bad.l
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier-bad.l 2010-07-08 13:29:07.183283000 +0100
@@ -0,0 +1,8 @@
+[^:]*: Assembler messages:
+[^:]*:3: Error: invalid barrier type -- `isb st'
+[^:]*:4: Error: invalid barrier type -- `isb ish'
+[^:]*:5: Error: invalid barrier type -- `isb ishst'
+[^:]*:6: Error: invalid barrier type -- `isb nsh'
+[^:]*:7: Error: invalid barrier type -- `isb nshst'
+[^:]*:8: Error: invalid barrier type -- `isb osh'
+[^:]*:9: Error: invalid barrier type -- `isb oshst'
Index: gas/testsuite/gas/arm/barrier-bad.s
===================================================================
RCS file: gas/testsuite/gas/arm/barrier-bad.s
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier-bad.s 2010-07-08 13:29:07.191284000 +0100
@@ -0,0 +1,10 @@
+.syntax unified
+.arch armv7a
+isb st
+isb ish
+isb ishst
+isb nsh
+isb nshst
+isb osh
+isb oshst
+
Index: gas/testsuite/gas/arm/barrier-thumb.d
===================================================================
RCS file: gas/testsuite/gas/arm/barrier-thumb.d
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier-thumb.d 2010-07-08 13:29:07.200289000 +0100
@@ -0,0 +1,73 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: Barrier Instruction Operands
+#as: -mcpu=cortex-a8
+# This test is only valid on ELF based ports.
+#not-target: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd
+
+# Test Barrier Instruction Operands
+
+.*: *file format .*arm.*
+
+Disassembly of section .text:
+00000000 <[^>]*> f3bf 8f5f dmb (sy|#15)
+00000004 <[^>]*> f3bf 8f5e dmb (st|#14)
+00000008 <[^>]*> f3bf 8f5b dmb (sh|ish|#11)
+0000000c <[^>]*> f3bf 8f5b dmb (sh|ish|#11)
+00000010 <[^>]*> f3bf 8f5a dmb (ishst|shst|#10)
+00000014 <[^>]*> f3bf 8f5a dmb (ishst|shst|#10)
+00000018 <[^>]*> f3bf 8f57 dmb (un|nsh|#7)
+0000001c <[^>]*> f3bf 8f57 dmb (un|nsh|#7)
+00000020 <[^>]*> f3bf 8f56 dmb (unst|nshst|#6)
+00000024 <[^>]*> f3bf 8f56 dmb (unst|nshst|#6)
+00000028 <[^>]*> f3bf 8f53 dmb (osh|#3)
+0000002c <[^>]*> f3bf 8f52 dmb (oshst|#2)
+00000030 <[^>]*> f3bf 8f4f dsb (sy|#15)
+00000034 <[^>]*> f3bf 8f4e dsb (st|#14)
+00000038 <[^>]*> f3bf 8f4b dsb (sh|ish|#11)
+0000003c <[^>]*> f3bf 8f4b dsb (sh|ish|#11)
+00000040 <[^>]*> f3bf 8f4a dsb (ishst|ish|#10)
+00000044 <[^>]*> f3bf 8f4a dsb (ishst|ish|#10)
+00000048 <[^>]*> f3bf 8f47 dsb (un|nsh|#7)
+0000004c <[^>]*> f3bf 8f47 dsb (un|nsh|#7)
+00000050 <[^>]*> f3bf 8f46 dsb (nshst|unst|#6)
+00000054 <[^>]*> f3bf 8f46 dsb (nshst|unst|#6)
+00000058 <[^>]*> f3bf 8f43 dsb (osh|#3)
+0000005c <[^>]*> f3bf 8f6f isb (sy|#15)
+00000060 <[^>]*> f3bf 8f6f isb (sy|#15)
+00000064 <[^>]*> f3bf 8f5f dmb (sy|#15)
+00000068 <[^>]*> f3bf 8f5e dmb (st|#14)
+0000006c <[^>]*> f3bf 8f5b dmb (sh|ish|#11)
+00000070 <[^>]*> f3bf 8f5b dmb (sh|ish|#11)
+00000074 <[^>]*> f3bf 8f5a dmb (ishst|shst|#10)
+00000078 <[^>]*> f3bf 8f5a dmb (ishst|shst|#10)
+0000007c <[^>]*> f3bf 8f57 dmb (un|nsh|#7)
+00000080 <[^>]*> f3bf 8f57 dmb (un|nsh|#7)
+00000084 <[^>]*> f3bf 8f56 dmb (unst|nshst|#6)
+00000088 <[^>]*> f3bf 8f56 dmb (unst|nshst|#6)
+0000008c <[^>]*> f3bf 8f53 dmb (osh|#3)
+00000090 <[^>]*> f3bf 8f52 dmb (oshst|#2)
+00000094 <[^>]*> f3bf 8f4f dsb (sy|#15)
+00000098 <[^>]*> f3bf 8f4e dsb (st|#14)
+0000009c <[^>]*> f3bf 8f4b dsb (sh|ish|#11)
+000000a0 <[^>]*> f3bf 8f4b dsb (sh|ish|#11)
+000000a4 <[^>]*> f3bf 8f4a dsb (ishst|ish|#10)
+000000a8 <[^>]*> f3bf 8f4a dsb (ishst|ish|#10)
+000000ac <[^>]*> f3bf 8f47 dsb (un|nsh|#7)
+000000b0 <[^>]*> f3bf 8f47 dsb (un|nsh|#7)
+000000b4 <[^>]*> f3bf 8f46 dsb (nshst|unst|#6)
+000000b8 <[^>]*> f3bf 8f46 dsb (nshst|unst|#6)
+000000bc <[^>]*> f3bf 8f43 dsb (osh|#3)
+000000c0 <[^>]*> f3bf 8f6f isb (sy|#15)
+000000c4 <[^>]*> f3bf 8f40 dsb #0
+000000c8 <[^>]*> f3bf 8f4f dsb (sy|#15)
+000000cc <[^>]*> f3bf 8f50 dmb #0
+000000d0 <[^>]*> f3bf 8f5f dmb (sy|#15)
+000000d4 <[^>]*> f3bf 8f60 isb #0
+000000d8 <[^>]*> f3bf 8f6e isb #14
+000000dc <[^>]*> f3bf 8f6b isb #11
+000000e0 <[^>]*> f3bf 8f6a isb #10
+000000e4 <[^>]*> f3bf 8f67 isb #7
+000000e8 <[^>]*> f3bf 8f66 isb #6
+000000ec <[^>]*> f3bf 8f63 isb #3
+000000f0 <[^>]*> f3bf 8f62 isb #2
+000000f4 <[^>]*> f3bf 8f6f isb (sy|#15)
Index: gas/testsuite/gas/arm/barrier-thumb.s
===================================================================
RCS file: gas/testsuite/gas/arm/barrier-thumb.s
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier-thumb.s 2010-07-08 13:29:07.208296000 +0100
@@ -0,0 +1,74 @@
+@ 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
Index: gas/testsuite/gas/arm/barrier.d
===================================================================
RCS file: gas/testsuite/gas/arm/barrier.d
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier.d 2010-07-08 13:29:07.216308000 +0100
@@ -0,0 +1,73 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: Barrier Instruction Operands
+#as: -mcpu=cortex-a8
+# This test is only valid on ELF based ports.
+#not-target: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd
+
+# Test Barrier Instruction Operands
+
+.*: *file format .*arm.*
+
+Disassembly of section .text:
+00000000 <[^>]*> f57ff05f dmb (sy|#15)
+00000004 <[^>]*> f57ff05e dmb (st|#14)
+00000008 <[^>]*> f57ff05b dmb (sh|ish|#11)
+0000000c <[^>]*> f57ff05b dmb (sh|ish|#11)
+00000010 <[^>]*> f57ff05a dmb (ishst|shst|#10)
+00000014 <[^>]*> f57ff05a dmb (ishst|shst|#10)
+00000018 <[^>]*> f57ff057 dmb (un|nsh|#7)
+0000001c <[^>]*> f57ff057 dmb (un|nsh|#7)
+00000020 <[^>]*> f57ff056 dmb (unst|nshst|#6)
+00000024 <[^>]*> f57ff056 dmb (unst|nshst|#6)
+00000028 <[^>]*> f57ff053 dmb (osh|#3)
+0000002c <[^>]*> f57ff052 dmb (oshst|#2)
+00000030 <[^>]*> f57ff04f dsb (sy|#15)
+00000034 <[^>]*> f57ff04e dsb (st|#14)
+00000038 <[^>]*> f57ff04b dsb (sh|ish|#11)
+0000003c <[^>]*> f57ff04b dsb (sh|ish|#11)
+00000040 <[^>]*> f57ff04a dsb (ishst|ish|#10)
+00000044 <[^>]*> f57ff04a dsb (ishst|ish|#10)
+00000048 <[^>]*> f57ff047 dsb (un|nsh|#7)
+0000004c <[^>]*> f57ff047 dsb (un|nsh|#7)
+00000050 <[^>]*> f57ff046 dsb (nshst|unst|#6)
+00000054 <[^>]*> f57ff046 dsb (nshst|unst|#6)
+00000058 <[^>]*> f57ff043 dsb (osh|#3)
+0000005c <[^>]*> f57ff06f isb (sy|#15)
+00000060 <[^>]*> f57ff06f isb (sy|#15)
+00000064 <[^>]*> f57ff05f dmb (sy|#15)
+00000068 <[^>]*> f57ff05e dmb (st|#14)
+0000006c <[^>]*> f57ff05b dmb (sh|ish|#11)
+00000070 <[^>]*> f57ff05b dmb (sh|ish|#11)
+00000074 <[^>]*> f57ff05a dmb (ishst|shst|#10)
+00000078 <[^>]*> f57ff05a dmb (ishst|shst|#10)
+0000007c <[^>]*> f57ff057 dmb (un|nsh|#7)
+00000080 <[^>]*> f57ff057 dmb (un|nsh|#7)
+00000084 <[^>]*> f57ff056 dmb (unst|nshst|#6)
+00000088 <[^>]*> f57ff056 dmb (unst|nshst|#6)
+0000008c <[^>]*> f57ff053 dmb (osh|#3)
+00000090 <[^>]*> f57ff052 dmb (oshst|#2)
+00000094 <[^>]*> f57ff04f dsb (sy|#15)
+00000098 <[^>]*> f57ff04e dsb (st|#14)
+0000009c <[^>]*> f57ff04b dsb (sh|ish|#11)
+000000a0 <[^>]*> f57ff04b dsb (sh|ish|#11)
+000000a4 <[^>]*> f57ff04a dsb (ishst|ish|#10)
+000000a8 <[^>]*> f57ff04a dsb (ishst|ish|#10)
+000000ac <[^>]*> f57ff047 dsb (un|nsh|#7)
+000000b0 <[^>]*> f57ff047 dsb (un|nsh|#7)
+000000b4 <[^>]*> f57ff046 dsb (nshst|unst|#6)
+000000b8 <[^>]*> f57ff046 dsb (nshst|unst|#6)
+000000bc <[^>]*> f57ff043 dsb (osh|#3)
+000000c0 <[^>]*> f57ff06f isb (sy|#15)
+000000c4 <[^>]*> f57ff040 dsb #0
+000000c8 <[^>]*> f57ff04f dsb (sy|#15)
+000000cc <[^>]*> f57ff050 dmb #0
+000000d0 <[^>]*> f57ff05f dmb (sy|#15)
+000000d4 <[^>]*> f57ff060 isb #0
+000000d8 <[^>]*> f57ff06e isb #14
+000000dc <[^>]*> f57ff06b isb #11
+000000e0 <[^>]*> f57ff06a isb #10
+000000e4 <[^>]*> f57ff067 isb #7
+000000e8 <[^>]*> f57ff066 isb #6
+000000ec <[^>]*> f57ff063 isb #3
+000000f0 <[^>]*> f57ff062 isb #2
+000000f4 <[^>]*> f57ff06f isb (sy|#15)
Index: gas/testsuite/gas/arm/barrier.s
===================================================================
RCS file: gas/testsuite/gas/arm/barrier.s
--- /dev/null 2010-06-14 17:20:13.293370595 +0100
+++ gas/testsuite/gas/arm/barrier.s 2010-07-08 13:29:07.224320000 +0100
@@ -0,0 +1,74 @@
+@ Test case to validate barrier instruction operands
+.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
+