diff options
author | Joseph Myers <joseph@codesourcery.com> | 2006-08-03 16:23:01 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2006-08-03 16:23:01 +0000 |
commit | c3df17c49e4bbfd9b77f5af33e62ff9e7e2b3256 (patch) | |
tree | 1fd9fb40b15762c70841a62ed016be5fbae6043c | |
parent | d6a5d01244c1a895484c2f7be3f6354d81b9b378 (diff) | |
download | binutils-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.csl | 22 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 27 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/iwmmxt-bad.l | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/iwmmxt-bad.s | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/iwmmxt.d | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/iwmmxt.s | 5 |
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 |