aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-arm.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2011-08-03 11:35:56 +0000
committerNick Clifton <nickc@redhat.com>2011-08-03 11:35:56 +0000
commit877807f8c481a4c5780b3d7bba7963c068910434 (patch)
treee85f7cb43cf0495ffc896ecbaf604c14b676e1db /gas/config/tc-arm.c
parent092d27ff4797e721d10b5de0394a2725ff8a966e (diff)
downloadgdb-877807f8c481a4c5780b3d7bba7963c068910434.zip
gdb-877807f8c481a4c5780b3d7bba7963c068910434.tar.gz
gdb-877807f8c481a4c5780b3d7bba7963c068910434.tar.bz2
* config/tc-arm.c (do_t_strexbh): New.
(insns): Update accordingly. * gas/arm/strex-bad-t.d: New testcase. * gas/arm/strex-bad-t.s: Likewise. * gas/arm/strex-bad-t.l: Likewise. * gas/arm/strex-t.s: Likewise. * gas/arm/strex-t.d: Likewise.
Diffstat (limited to 'gas/config/tc-arm.c')
-rw-r--r--gas/config/tc-arm.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index b018b4f..77606a3 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -8501,6 +8501,21 @@ do_strex (void)
}
static void
+do_t_strexbh (void)
+{
+ constraint (!inst.operands[2].isreg || !inst.operands[2].preind
+ || inst.operands[2].postind || inst.operands[2].writeback
+ || inst.operands[2].immisreg || inst.operands[2].shifted
+ || inst.operands[2].negative,
+ BAD_ADDR_MODE);
+
+ constraint (inst.operands[0].reg == inst.operands[1].reg
+ || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
+
+ do_rm_rd_rn ();
+}
+
+static void
do_strexd (void)
{
constraint (inst.operands[1].reg % 2 != 0,
@@ -17516,9 +17531,9 @@ static const struct asm_opcode insns[] =
TCE("ldrexh", 1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
rd_rn, rd_rn),
TCE("strexb", 1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
- strex, rm_rd_rn),
+ strex, t_strexbh),
TCE("strexh", 1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
- strex, rm_rd_rn),
+ strex, t_strexbh),
TUF("clrex", 57ff01f, f3bf8f2f, 0, (), noargs, noargs),
#undef ARM_VARIANT