The barrier instructions were introduced with armv7, armv6 had
coprocessor style barriers.
The un/unst options are listed under "alternative values of option are
supported for DMB and DSB, but ARM recommends that you do not use them"
in the documentation.
This also allows non "sy"/0xf options for dmb instructions instead
of only dsb.
Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/gnu/usr.bin/binutils-2.17/gas/config/tc-arm.c,v
retrieving revision 1.3
diff -u -p -r1.3 tc-arm.c
--- gas/config/tc-arm.c 22 Aug 2012 14:39:43 -0000 1.3
+++ gas/config/tc-arm.c 10 Jun 2015 07:01:20 -0000
@@ -4661,6 +4661,7 @@ do_barrier (void)
if (inst.operands[0].present)
{
constraint ((inst.instruction & 0xf0) != 0x40
+ && (inst.instruction & 0xf0) != 0x50
&& inst.operands[0].imm != 0xf,
"bad barrier type");
inst.instruction |= inst.operands[0].imm;
@@ -6555,6 +6556,7 @@ do_t_barrier (void)
if (inst.operands[0].present)
{
constraint ((inst.instruction & 0xf0) != 0x40
+ && (inst.instruction & 0xf0) != 0x50
&& inst.operands[0].imm != 0xf,
"bad barrier type");
inst.instruction |= inst.operands[0].imm;
@@ -8826,10 +8828,20 @@ static const struct asm_cond conds[] =
static struct asm_barrier_opt barrier_opt_names[] =
{
- { "sy", 0xf },
- { "un", 0x7 },
- { "st", 0xe },
- { "unst", 0x6 }
+ { "oshld", 0x1 },
+ { "oshst", 0x2 },
+ { "osh", 0x3 },
+ { "nshld", 0x5 },
+ { "nshst", 0x6 },
+ { "unst", 0x6 },
+ { "nsh", 0x7 },
+ { "un", 0x7 },
+ { "ishld", 0x9 },
+ { "ishst", 0xa },
+ { "ish", 0xb },
+ { "ld", 0xd },
+ { "st", 0xe },
+ { "sy", 0xf }
};
/* Table of ARM-format instructions. */
Index: opcodes/arm-dis.c
===================================================================
RCS file: /cvs/src/gnu/usr.bin/binutils-2.17/opcodes/arm-dis.c,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 arm-dis.c
--- opcodes/arm-dis.c 24 Apr 2011 20:14:49 -0000 1.1.1.1
+++ opcodes/arm-dis.c 10 Jun 2015 07:01:22 -0000
@@ -1951,10 +1951,18 @@ print_insn_arm (bfd_vma pc, struct disas
case 'U':
switch (given & 0xf)
{
- case 0xf: func(stream, "sy"); break;
- case 0x7: func(stream, "un"); break;
+ case 0x1: func(stream, "oshld"); break;
+ case 0x2: func(stream, "oshst"); break;
+ case 0x3: func(stream, "osh"); break;
+ case 0x5: func(stream, "nshld"); break;
+ case 0x6: func(stream, "nshst"); break;
+ case 0x7: func(stream, "nsh"); break;
+ case 0x9: func(stream, "ishld"); break;
+ case 0xa: func(stream, "ishst"); break;
+ case 0xb: func(stream, "ish"); break;
+ case 0xd: func(stream, "ld"); break;
case 0xe: func(stream, "st"); break;
- case 0x6: func(stream, "unst"); break;
+ case 0xf: func(stream, "sy"); break;
default:
func(stream, "#%d", (int)given & 0xf);
break;
@@ -2713,10 +2721,18 @@ print_insn_thumb32 (bfd_vma pc, struct d
case 'U':
switch (given & 0xf)
{
- case 0xf: func(stream, "sy"); break;
- case 0x7: func(stream, "un"); break;
+ case 0x1: func(stream, "oshld"); break;
+ case 0x2: func(stream, "oshst"); break;
+ case 0x3: func(stream, "osh"); break;
+ case 0x5: func(stream, "nshld"); break;
+ case 0x6: func(stream, "nshst"); break;
+ case 0x7: func(stream, "nsh"); break;
+ case 0x9: func(stream, "ishld"); break;
+ case 0xa: func(stream, "ishst"); break;
+ case 0xb: func(stream, "ish"); break;
+ case 0xd: func(stream, "ld"); break;
case 0xe: func(stream, "st"); break;
- case 0x6: func(stream, "unst"); break;
+ case 0xf: func(stream, "sy"); break;
default:
func(stream, "#%d", (int)given & 0xf);
break;