summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2006-08-03 16:23:01 +0000
committerJoseph Myers <joseph@codesourcery.com>2006-08-03 16:23:01 +0000
commitc3df17c49e4bbfd9b77f5af33e62ff9e7e2b3256 (patch)
tree1fd9fb40b15762c70841a62ed016be5fbae6043c
parentd6a5d01244c1a895484c2f7be3f6354d81b9b378 (diff)
downloadbinutils-gdb-c3df17c49e4bbfd9b77f5af33e62ff9e7e2b3256.tar.gz
Backport from mainline.
gas/ * config/tc-arm.c (parse_operands): Handle invalid register name for OP_RIWR_RIWC. gas/testsuite/ * gas/arm/iwmmxt-bad.s: Test invalid register names for wldrw and wstrw. * gas/arm/iwmmxt-bad.l: Update. gas/ * config/tc-arm.c (enum operand_parse_code): Add OP_RIWC_RIWG. (parse_operands): Handle it. (insns): Use it for tmcr and tmrc. gas/testsuite/ * gas/arm/iwmmxt.s: Test tmcr and tmrc with wcgr registers. * gas/arm/iwmmxt.d: Update.
-rw-r--r--ChangeLog.csl22
-rw-r--r--gas/config/tc-arm.c27
-rw-r--r--gas/testsuite/gas/arm/iwmmxt-bad.l2
-rw-r--r--gas/testsuite/gas/arm/iwmmxt-bad.s2
-rw-r--r--gas/testsuite/gas/arm/iwmmxt.d4
-rw-r--r--gas/testsuite/gas/arm/iwmmxt.s5
6 files changed, 53 insertions, 9 deletions
diff --git a/ChangeLog.csl b/ChangeLog.csl
index 6295d38e636..f03e3fc70cd 100644
--- a/ChangeLog.csl
+++ b/ChangeLog.csl
@@ -1,3 +1,25 @@
+2006-08-03 Joseph Myers <joseph@codesourcery.com>
+
+ Backport from mainline.
+
+ gas/
+ * config/tc-arm.c (parse_operands): Handle invalid register name
+ for OP_RIWR_RIWC.
+
+ gas/testsuite/
+ * gas/arm/iwmmxt-bad.s: Test invalid register names for wldrw and
+ wstrw.
+ * gas/arm/iwmmxt-bad.l: Update.
+
+ gas/
+ * config/tc-arm.c (enum operand_parse_code): Add OP_RIWC_RIWG.
+ (parse_operands): Handle it.
+ (insns): Use it for tmcr and tmrc.
+
+ gas/testsuite/
+ * gas/arm/iwmmxt.s: Test tmcr and tmrc with wcgr registers.
+ * gas/arm/iwmmxt.d: Update.
+
2006-07-27 Carlos O'Donell <carlos@codesourcery.com>
bfd/
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 07ac1476b01..9f00ffaf0ac 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -5319,6 +5319,7 @@ enum operand_parse_code
OP_RR_EXi, /* ARM register or expression with imm prefix */
OP_RF_IF, /* FPA register or immediate */
OP_RIWR_RIWC, /* iWMMXt R or C reg */
+ OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
/* Optional operands. */
OP_oI7b, /* immediate, prefix optional, 0 .. 7 */
@@ -5697,9 +5698,10 @@ parse_operands (char *str, const unsigned char *pattern)
case OP_RIWR_RIWC:
{
struct reg_entry *rege = arm_reg_parse_multi (&str);
- if (rege->type != REG_TYPE_MMXWR
- && rege->type != REG_TYPE_MMXWC
- && rege->type != REG_TYPE_MMXWCG)
+ if (!rege
+ || (rege->type != REG_TYPE_MMXWR
+ && rege->type != REG_TYPE_MMXWC
+ && rege->type != REG_TYPE_MMXWCG))
{
inst.error = _("iWMMXt data or control register expected");
goto failure;
@@ -5709,6 +5711,21 @@ parse_operands (char *str, const unsigned char *pattern)
}
break;
+ case OP_RIWC_RIWG:
+ {
+ struct reg_entry *rege = arm_reg_parse_multi (&str);
+ if (!rege
+ || (rege->type != REG_TYPE_MMXWC
+ && rege->type != REG_TYPE_MMXWCG))
+ {
+ inst.error = _("iWMMXt control register expected");
+ goto failure;
+ }
+ inst.operands[i].reg = rege->number;
+ inst.operands[i].isreg = 1;
+ }
+ break;
+
/* Misc */
case OP_CPSF: val = parse_cps_flags (&str); break;
case OP_ENDI: val = parse_endian_specifier (&str); break;
@@ -15643,7 +15660,7 @@ static const struct asm_opcode insns[] =
cCE(tinsrb, e600010, 3, (RIWR, RR, I7), iwmmxt_tinsr),
cCE(tinsrh, e600050, 3, (RIWR, RR, I7), iwmmxt_tinsr),
cCE(tinsrw, e600090, 3, (RIWR, RR, I7), iwmmxt_tinsr),
- cCE(tmcr, e000110, 2, (RIWC, RR), rn_rd),
+ cCE(tmcr, e000110, 2, (RIWC_RIWG, RR), rn_rd),
cCE(tmcrr, c400000, 3, (RIWR, RR, RR), rm_rd_rn),
cCE(tmia, e200010, 3, (RIWR, RR, RR), iwmmxt_tmia),
cCE(tmiaph, e280010, 3, (RIWR, RR, RR), iwmmxt_tmia),
@@ -15654,7 +15671,7 @@ static const struct asm_opcode insns[] =
cCE(tmovmskb, e100030, 2, (RR, RIWR), rd_rn),
cCE(tmovmskh, e500030, 2, (RR, RIWR), rd_rn),
cCE(tmovmskw, e900030, 2, (RR, RIWR), rd_rn),
- cCE(tmrc, e100110, 2, (RR, RIWC), rd_rn),
+ cCE(tmrc, e100110, 2, (RR, RIWC_RIWG), rd_rn),
cCE(tmrrc, c500000, 3, (RR, RR, RIWR), rd_rn_rm),
cCE(torcb, e13f150, 1, (RR), iwmmxt_tandorc),
cCE(torch, e53f150, 1, (RR), iwmmxt_tandorc),
diff --git a/gas/testsuite/gas/arm/iwmmxt-bad.l b/gas/testsuite/gas/arm/iwmmxt-bad.l
index 65889380cf1..d030a6da46a 100644
--- a/gas/testsuite/gas/arm/iwmmxt-bad.l
+++ b/gas/testsuite/gas/arm/iwmmxt-bad.l
@@ -8,3 +8,5 @@
[^:]*:7: Error: iWMMXt data register expected -- `wstrh wcgr0,\[r1\]'
[^:]*:8: Error: iWMMXt data register expected -- `wstrd wcgr0,\[r1\]'
[^:]*:9: Error: iWMMXt control register expected -- `tmcr wibble,r1'
+[^:]*:10: Error: iWMMXt data or control register expected -- `wldrw wibble,\[r1\]'
+[^:]*:11: Error: iWMMXt data or control register expected -- `wstrw wibble,\[r1\]'
diff --git a/gas/testsuite/gas/arm/iwmmxt-bad.s b/gas/testsuite/gas/arm/iwmmxt-bad.s
index 47d8d71f865..98fc239374b 100644
--- a/gas/testsuite/gas/arm/iwmmxt-bad.s
+++ b/gas/testsuite/gas/arm/iwmmxt-bad.s
@@ -7,3 +7,5 @@
wstrh wcgr0,[r1]
wstrd wcgr0,[r1]
tmcr wibble,r1
+ wldrw wibble,[r1]
+ wstrw wibble,[r1]
diff --git a/gas/testsuite/gas/arm/iwmmxt.d b/gas/testsuite/gas/arm/iwmmxt.d
index 494199d2bc4..85f4ac2e84e 100644
--- a/gas/testsuite/gas/arm/iwmmxt.d
+++ b/gas/testsuite/gas/arm/iwmmxt.d
@@ -166,6 +166,6 @@ Disassembly of section .text:
0+278 <[^>]*> 0e9540ea[ ]+wunpckilweq[ ]+wr4, wr5, wr10
0+27c <[^>]*> 1e143005[ ]+wxorne[ ]+wr3, wr4, wr5
0+280 <[^>]*> ae377007[ ]+wandnge[ ]+wr7, wr7, wr7
-0+284 <[^>]*> e1a00000[ ]+nop[ ]+\(mov r0,r0\)
-0+288 <[^>]*> e1a00000[ ]+nop[ ]+\(mov r0,r0\)
+0+284 <[^>]*> ee080110[ ]+tmcr[ ]+wcgr0, r0
+0+288 <[^>]*> ee1a1110[ ]+tmrc[ ]+r1, wcgr2
0+28c <[^>]*> e1a00000[ ]+nop[ ]+\(mov r0,r0\)
diff --git a/gas/testsuite/gas/arm/iwmmxt.s b/gas/testsuite/gas/arm/iwmmxt.s
index 0ebbad5cd3c..42bbb7ab4ce 100644
--- a/gas/testsuite/gas/arm/iwmmxt.s
+++ b/gas/testsuite/gas/arm/iwmmxt.s
@@ -203,7 +203,8 @@ iwmmxt:
wzeroge wr7
+ tmcr wcgr0, r0
+ tmrc r1, wcgr2
+
@ a.out-required section size padding
nop
- nop
- nop