Hi all,
gas disassembles a form of the strht ARM instruction improperly:
strht r0, [r1], -r2 @ assembles to E02100B2
@ disassembles as "strh r0, [r1], -r2 ; UNPREDICTABLE"
strht r0, [r1], r2 @ assembles to E0A100B2
@ disassembles as "strh r0, [r1], r2 ; UNPREDICTABLE"
This patch fixes that. New tests are added for that case, and also for the
similar ldrht instruction.
Ok for trunk?
Thanks,
Kyrill
opcodes/ChangeLog
2013-02-01 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* arm-dis.c: Add another pattern for strht.
gas/testsuite/ChangeLog
2013-02-01 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* gas/arm/archv6t2.s: Add strht and ldrht tests.
* gas/arm/archv6t2.d: Add disassembly patterns for the above.
gas-strht.txt
diff --git a/gas/testsuite/gas/arm/archv6t2.d b/gas/testsuite/gas/arm/archv6t2.d
index 2c8d5b6..eb76a32 100644
--- a/gas/testsuite/gas/arm/archv6t2.d
+++ b/gas/testsuite/gas/arm/archv6t2.d
@@ -49,3 +49,15 @@ Disassembly of section .text:
0+a4 <[^>]+> e03090b9 ldrht r9, \[r0\], -r9
0+a8 <[^>]+> e0f099b9 ldrht r9, \[r0\], #153.*
0+ac <[^>]+> e07099b9 ldrht r9, \[r0\], #-153.*
+0+b0 <[^>]+> 10b090b9 ldrhtne r9, \[r0\], r9
+0+b4 <[^>]+> 103090b9 ldrhtne r9, \[r0\], -r9
+0+b8 <[^>]+> 10f099b9 ldrhtne r9, \[r0\], #153 ; 0x99
+0+bc <[^>]+> 107099b9 ldrhtne r9, \[r0\], #-153 ; 0xffffff67
+0+c0 <[^>]+> e02100b2 strht r0, \[r1\], -r2
+0+c4 <[^>]+> 102100b2 strhtne r0, \[r1\], -r2
+0+c8 <[^>]+> e0a100b2 strht r0, \[r1\], r2
+0+cc <[^>]+> 10a100b2 strhtne r0, \[r1\], r2
+0+d0 <[^>]+> e0e100b2 strht r0, \[r1\], #2
+0+d4 <[^>]+> e06100b2 strht r0, \[r1\], #-2
+0+d8 <[^>]+> 10e100b2 strhtne r0, \[r1\], #2
+0+dc <[^>]+> 106100b2 strhtne r0, \[r1\], #-2
diff --git a/gas/testsuite/gas/arm/archv6t2.s b/gas/testsuite/gas/arm/archv6t2.s
index 292f11c..81ff501 100644
--- a/gas/testsuite/gas/arm/archv6t2.s
+++ b/gas/testsuite/gas/arm/archv6t2.s
@@ -53,3 +53,15 @@ x:
ldrht r9, [r0], -r9
ldrht r9, [r0], #0x99
ldrht r9, [r0], #-0x99
+ ldrneht r9, [r0], r9
+ ldrneht r9, [r0], -r9
+ ldrneht r9, [r0], #0x99
+ ldrneht r9, [r0], #-0x99
+ strht r0, [r1], -r2
+ strneht r0, [r1], -r2
+ strht r0, [r1], r2
+ strneht r0, [r1], r2
+ strht r0, [r1], #2
+ strht r0, [r1], #-2
+ strneht r0, [r1], #2
+ strneht r0, [r1], #-2
diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c
index d140761..a1a6f4c 100644
--- a/opcodes/arm-dis.c
+++ b/opcodes/arm-dis.c
@@ -929,7 +929,8 @@ static const struct opcode32 arm_opcodes[] =
{ARM_EXT_V6T2, 0x07c00010, 0x0fe00070, "bfi%c\t%12-15R, %0-3r, %E"},
{ARM_EXT_V6T2, 0x00600090, 0x0ff000f0, "mls%c\t%16-19R, %0-3R, %8-11R, %12-15R"},
{ARM_EXT_V6T2, 0x006000b0, 0x0f7000f0, "strht%c\t%12-15R, %S"},
-
+ {ARM_EXT_V6T2, 0x002000b0, 0x0f7000f0, "strht%c\t%12-15R, %S"},
+