From 52e7f43db080a890fc08dde31235f7c7a86178b9 Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Thu, 8 Jul 2010 22:40:28 +0000 Subject: [PATCH] 2010-07-08 Tejas Belagod 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. --- gas/ChangeLog | 11 ++++ gas/config/tc-arm.c | 64 ++++++++++++++++---- gas/testsuite/ChangeLog | 13 ++++ gas/testsuite/gas/arm/barrier-bad-thumb.d | 3 + gas/testsuite/gas/arm/barrier-bad-thumb.l | 8 +++ gas/testsuite/gas/arm/barrier-bad-thumb.s | 11 ++++ gas/testsuite/gas/arm/barrier-bad.d | 3 + gas/testsuite/gas/arm/barrier-bad.l | 8 +++ gas/testsuite/gas/arm/barrier-bad.s | 10 +++ gas/testsuite/gas/arm/barrier-thumb.d | 73 ++++++++++++++++++++++ gas/testsuite/gas/arm/barrier-thumb.s | 74 +++++++++++++++++++++++ gas/testsuite/gas/arm/barrier.d | 73 ++++++++++++++++++++++ gas/testsuite/gas/arm/barrier.s | 74 +++++++++++++++++++++++ opcodes/ChangeLog | 6 ++ opcodes/arm-dis.c | 66 +++++++++++++++----- 15 files changed, 469 insertions(+), 28 deletions(-) create mode 100644 gas/testsuite/gas/arm/barrier-bad-thumb.d create mode 100644 gas/testsuite/gas/arm/barrier-bad-thumb.l create mode 100644 gas/testsuite/gas/arm/barrier-bad-thumb.s create mode 100644 gas/testsuite/gas/arm/barrier-bad.d create mode 100644 gas/testsuite/gas/arm/barrier-bad.l create mode 100644 gas/testsuite/gas/arm/barrier-bad.s create mode 100644 gas/testsuite/gas/arm/barrier-thumb.d create mode 100644 gas/testsuite/gas/arm/barrier-thumb.s create mode 100644 gas/testsuite/gas/arm/barrier.d create mode 100644 gas/testsuite/gas/arm/barrier.s diff --git a/gas/ChangeLog b/gas/ChangeLog index a67cce38ad..038e3ce970 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2010-07-08 Tejas Belagod + + * 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. + 2010-07-08 Daniel Gutson * config/tc-arm.c (tc_gen_reloc): Add BFD_RELOC_ARM_T32_OFFSET_IMM diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 33d38ad469..6605e8176b 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -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 unsigned int *pattern, bfd_boolean thumb) } \ 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 unsigned int *pattern, bfd_boolean thumb) 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 unsigned int *pattern, bfd_boolean thumb) 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 unsigned int *pattern, bfd_boolean thumb) #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 diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index e9dbfe7fa4..9818a62e53 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2010-07-08 Tejas Belagod + + * 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. + 2010-07-08 Daniel Gutson * gas/arm/reloc-bad.d: New. diff --git a/gas/testsuite/gas/arm/barrier-bad-thumb.d b/gas/testsuite/gas/arm/barrier-bad-thumb.d new file mode 100644 index 0000000000..3df3f76c20 --- /dev/null +++ b/gas/testsuite/gas/arm/barrier-bad-thumb.d @@ -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 diff --git a/gas/testsuite/gas/arm/barrier-bad-thumb.l b/gas/testsuite/gas/arm/barrier-bad-thumb.l new file mode 100644 index 0000000000..a03a9e740b --- /dev/null +++ b/gas/testsuite/gas/arm/barrier-bad-thumb.l @@ -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' diff --git a/gas/testsuite/gas/arm/barrier-bad-thumb.s b/gas/testsuite/gas/arm/barrier-bad-thumb.s new file mode 100644 index 0000000000..67fc40a68d --- /dev/null +++ b/gas/testsuite/gas/arm/barrier-bad-thumb.s @@ -0,0 +1,11 @@ +.syntax unified +.thumb +.arch armv7a +isb st +isb ish +isb ishst +isb nsh +isb nshst +isb osh +isb oshst + diff --git a/gas/testsuite/gas/arm/barrier-bad.d b/gas/testsuite/gas/arm/barrier-bad.d new file mode 100644 index 0000000000..1e351bcd84 --- /dev/null +++ b/gas/testsuite/gas/arm/barrier-bad.d @@ -0,0 +1,3 @@ +#name: All options expect SY are reserved for ISB +#skip: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd +#error-output: barrier-bad.l diff --git a/gas/testsuite/gas/arm/barrier-bad.l b/gas/testsuite/gas/arm/barrier-bad.l new file mode 100644 index 0000000000..045ef47815 --- /dev/null +++ b/gas/testsuite/gas/arm/barrier-bad.l @@ -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' diff --git a/gas/testsuite/gas/arm/barrier-bad.s b/gas/testsuite/gas/arm/barrier-bad.s new file mode 100644 index 0000000000..3dfae788f7 --- /dev/null +++ b/gas/testsuite/gas/arm/barrier-bad.s @@ -0,0 +1,10 @@ +.syntax unified +.arch armv7a +isb st +isb ish +isb ishst +isb nsh +isb nshst +isb osh +isb oshst + diff --git a/gas/testsuite/gas/arm/barrier-thumb.d b/gas/testsuite/gas/arm/barrier-thumb.d new file mode 100644 index 0000000000..075a6632d3 --- /dev/null +++ b/gas/testsuite/gas/arm/barrier-thumb.d @@ -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) diff --git a/gas/testsuite/gas/arm/barrier-thumb.s b/gas/testsuite/gas/arm/barrier-thumb.s new file mode 100644 index 0000000000..cc42076670 --- /dev/null +++ b/gas/testsuite/gas/arm/barrier-thumb.s @@ -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 diff --git a/gas/testsuite/gas/arm/barrier.d b/gas/testsuite/gas/arm/barrier.d new file mode 100644 index 0000000000..972a51119d --- /dev/null +++ b/gas/testsuite/gas/arm/barrier.d @@ -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) diff --git a/gas/testsuite/gas/arm/barrier.s b/gas/testsuite/gas/arm/barrier.s new file mode 100644 index 0000000000..a4574e8aab --- /dev/null +++ b/gas/testsuite/gas/arm/barrier.s @@ -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 + diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index db9f65e8e7..c0c9835c10 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2010-07-08 Tejas Belagod + + * arm-dis.c (print_insn_arm): Add cases for printing more + symbolic operands. + (print_insn_thumb32): Likewise. + 2010-07-06 Maciej W. Rozycki * mips-dis.c (print_insn_mips): Correct branch instruction type diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c index 1463c65913..b16d50fe8c 100644 --- a/opcodes/arm-dis.c +++ b/opcodes/arm-dis.c @@ -3155,15 +3155,32 @@ print_insn_arm (bfd_vma pc, struct disassemble_info *info, long given) 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 disassemble_info *info, long given) 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': -- 2.34.1