Module Name: src
Committed By: matt
Date: Wed Dec 18 18:31:22 UTC 2013
Modified Files:
src/gnu/dist/binutils/opcodes [matt-nb5-mips64]: arm-dis.c
Log Message:
Decode some armv7 instructions
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.3 -r1.1.1.3.32.1 src/gnu/dist/binutils/opcodes/arm-dis.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/gnu/dist/binutils/opcodes/arm-dis.c
diff -u src/gnu/dist/binutils/opcodes/arm-dis.c:1.1.1.3 src/gnu/dist/binutils/opcodes/arm-dis.c:1.1.1.3.32.1
--- src/gnu/dist/binutils/opcodes/arm-dis.c:1.1.1.3 Thu Feb 2 21:14:00 2006
+++ src/gnu/dist/binutils/opcodes/arm-dis.c Wed Dec 18 18:31:22 2013
@@ -80,6 +80,7 @@
%A print address for ldc/stc/ldf/stf instruction
%m print register mask for ldm/stm instruction
%C print the PSR sub type.
+ %E print the LSB and WIDTH fields of a BFI or BFC instruction.
%F print the COUNT field of a LFM/SFM instruction.
IWMMXT specific format options:
%<bitfield>g print as an iWMMXt 64-bit register
@@ -118,6 +119,18 @@ static const struct arm_opcode arm_opcod
{ARM_EXT_V3M, 0x00800090, 0x0fa000f0, "%22?sumull%c%20's\t%12-15r, %16-19r, %0-3r, %8-11r"},
{ARM_EXT_V3M, 0x00a00090, 0x0fa000f0, "%22?sumlal%c%20's\t%12-15r, %16-19r, %0-3r, %8-11r"},
+ /* ARM V7 instructions. */
+ {ARM_EXT_V7A, 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
+ {ARM_EXT_V7A, 0x07c0001f, 0x0fa0007f, "bfc%c\t%12-15R, %E"},
+ {ARM_EXT_V7A, 0x07c00010, 0x0fa00070, "bfi%c\t%12-15R, %0-3r, %E"},
+ {ARM_EXT_V7A, 0x03000000, 0x0ff00000, "movw%c\t%12-15r, #%16-19,0-11d"},
+ {ARM_EXT_V7A, 0xf57ff05f, 0xffffffff, "dmb"},
+ {ARM_EXT_V7A, 0xf57ff050, 0xfffffff0, "dmb\t#%0-3d"},
+ {ARM_EXT_V7A, 0xf57ff05f, 0xffffffff, "dsb"},
+ {ARM_EXT_V7A, 0xf57ff050, 0xfffffff0, "dsb\t%#0-3d"},
+ {ARM_EXT_V7A, 0xf57ff06f, 0xffffffff, "isb"},
+ {ARM_EXT_V7A, 0xf57ff060, 0xfffffff0, "isb\t%#0-3d"},
+
/* ARM V6Z instructions. */
{ARM_EXT_V6Z, 0x01600070, 0x0ff000f0, "smi%c\t%e"},
@@ -380,7 +393,8 @@ static const struct arm_opcode arm_opcod
{ARM_EXT_V1, 0x00e00000, 0x0de00000, "rsc%c%20's\t%12-15r, %16-19r, %o"},
{ARM_EXT_V3, 0x0120f000, 0x0db0f000, "msr%c\t%22?SCPSR%C, %o"},
{ARM_EXT_V3, 0x010f0000, 0x0fbf0fff, "mrs%c\t%12-15r, %22?SCPSR"},
- {ARM_EXT_V1, 0x01000000, 0x0de00000, "tst%c%p\t%16-19r, %o"},
+ {ARM_EXT_V1, 0x01100000, 0x0df00000, "tst%c%p\t%16-19r, %o"},
+ {ARM_EXT_V1, 0x03100000, 0x0df00000, "tst%c%p\t%16-19r, %o"},
{ARM_EXT_V1, 0x01200000, 0x0de00000, "teq%c%p\t%16-19r, %o"},
{ARM_EXT_V1, 0x01400000, 0x0de00000, "cmp%c%p\t%16-19r, %o"},
{ARM_EXT_V1, 0x01600000, 0x0de00000, "cmn%c%p\t%16-19r, %o"},
@@ -1234,6 +1248,19 @@ print_insn_arm (pc, info, given)
func (stream, "c");
break;
+ case 'E':
+ {
+ long msb = (given >> 16) & 0x1f;
+ long lsb = (given >> 7) & 0x1f;
+ long width = msb - lsb + 1;
+
+ if (width > 0)
+ func(stream, "#%lu, #%lu", lsb, width);
+ else
+ func(stream, "(invalid %lu:%lu)", lsb, msb);
+ }
+ break;
+
case 'F':
switch (given & 0x00408000)
{
@@ -1307,60 +1334,59 @@ print_insn_arm (pc, info, given)
{
int bitstart = *c++ - '0';
int bitend = 0;
+ long value = 0;
+
while (*c >= '0' && *c <= '9')
bitstart = (bitstart * 10) + *c++ - '0';
switch (*c)
{
case '-':
- c++;
+ while (*c == '-')
+ {
+ c++;
+ bitend = 0;
+ while (*c >= '0' && *c <= '9')
+ bitend = (bitend * 10) + *c++ - '0';
- while (*c >= '0' && *c <= '9')
- bitend = (bitend * 10) + *c++ - '0';
+ if (!bitend)
+ abort ();
+
+ if (*c == ',')
+ {
+ c++;
+ value <<= (bitend - bitstart + 1);
+ value |= (given & ((2 << bitend) - 1)) >> bitstart;
+
+ bitstart = 0;
+ while (*c >= '0' && *c <= '9')
+ bitstart = (bitstart * 10) + *c++ - '0';
+ }
+ }
- if (!bitend)
- abort ();
+ value <<= (bitend - bitstart + 1);
+ value |= (given & ((2 << bitend) - 1)) >> bitstart;
switch (*c)
{
case 'r':
{
- long reg;
-
- reg = given >> bitstart;
- reg &= (2 << (bitend - bitstart)) - 1;
-
- func (stream, "%s", arm_regnames[reg]);
+ func (stream, "%s", arm_regnames[value]);
}
break;
case 'd':
{
- long reg;
-
- reg = given >> bitstart;
- reg &= (2 << (bitend - bitstart)) - 1;
-
- func (stream, "%d", reg);
+ func (stream, "%d", value);
}
break;
case 'W':
{
- long reg;
-
- reg = given >> bitstart;
- reg &= (2 << (bitend - bitstart)) - 1;
-
- func (stream, "%d", reg + 1);
+ func (stream, "%d", value + 1);
}
break;
case 'x':
{
- long reg;
-
- reg = given >> bitstart;
- reg &= (2 << (bitend - bitstart)) - 1;
-
- func (stream, "0x%08x", reg);
+ func (stream, "0x%08x", value);
/* Some SWI instructions have special
meanings. */
@@ -1372,44 +1398,31 @@ print_insn_arm (pc, info, given)
break;
case 'X':
{
- long reg;
-
- reg = given >> bitstart;
- reg &= (2 << (bitend - bitstart)) - 1;
-
- func (stream, "%01x", reg & 0xf);
+ func (stream, "%01x", value & 0xf);
}
break;
case 'f':
{
- long reg;
-
- reg = given >> bitstart;
- reg &= (2 << (bitend - bitstart)) - 1;
-
- if (reg > 7)
+ if (value > 7)
func (stream, "#%s",
- arm_fp_const[reg & 7]);
+ arm_fp_const[value & 7]);
else
- func (stream, "f%d", reg);
+ func (stream, "f%d", value);
}
break;
case 'w':
{
- long reg;
-
if (bitstart != bitend)
{
- reg = given >> bitstart;
- reg &= (2 << (bitend - bitstart)) - 1;
if (bitend - bitstart == 1)
- func (stream, "%s", iwmmxt_wwnames[reg]);
+ func (stream, "%s", iwmmxt_wwnames[value]);
else
- func (stream, "%s", iwmmxt_wwssnames[reg]);
+ func (stream, "%s", iwmmxt_wwssnames[value]);
}
else
{
+ long reg;
reg = (((given >> 8) & 0x1) |
((given >> 22) & 0x1));
func (stream, "%s", iwmmxt_wwnames[reg]);
@@ -1419,7 +1432,6 @@ print_insn_arm (pc, info, given)
case 'g':
{
- long reg;
int current_regnames;
if (! iwmmxt_regnames)
@@ -1427,16 +1439,13 @@ print_insn_arm (pc, info, given)
current_regnames = set_arm_regname_option
(iwmmxt_regnames);
- reg = given >> bitstart;
- reg &= (2 << (bitend - bitstart)) - 1;
- func (stream, "%s", arm_regnames[reg]);
+ func (stream, "%s", arm_regnames[value]);
set_arm_regname_option (current_regnames);
}
break;
case 'G':
{
- long reg;
int current_regnames;
if (! iwmmxt_regnames)
@@ -1444,9 +1453,7 @@ print_insn_arm (pc, info, given)
current_regnames = set_arm_regname_option
(iwmmxt_regnames + 1);
- reg = given >> bitstart;
- reg &= (2 << (bitend - bitstart)) - 1;
- func (stream, "%s", arm_regnames[reg]);
+ func (stream, "%s", arm_regnames[value]);
set_arm_regname_option (current_regnames);
}
break;