Backport from mainline.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 3 Aug 2006 16:23:01 +0000 (16:23 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 3 Aug 2006 16:23:01 +0000 (16:23 +0000)
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.

ChangeLog.csl
gas/config/tc-arm.c
gas/testsuite/gas/arm/iwmmxt-bad.l
gas/testsuite/gas/arm/iwmmxt-bad.s
gas/testsuite/gas/arm/iwmmxt.d
gas/testsuite/gas/arm/iwmmxt.s

index 6295d38..f03e3fc 100644 (file)
@@ -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/
index 07ac147..9f00ffa 100644 (file)
@@ -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),
index 6588938..d030a6d 100644 (file)
@@ -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\]'
index 47d8d71..98fc239 100644 (file)
@@ -7,3 +7,5 @@
        wstrh   wcgr0,[r1]
        wstrd   wcgr0,[r1]
        tmcr    wibble,r1
+       wldrw   wibble,[r1]
+       wstrw   wibble,[r1]
index 494199d..85f4ac2 100644 (file)
@@ -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\)
index 0ebbad5..42bbb7a 100644 (file)
@@ -203,7 +203,8 @@ iwmmxt:
 
        wzeroge         wr7
 
+       tmcr            wcgr0, r0
+       tmrc            r1, wcgr2
+
        @ a.out-required section size padding
        nop
-       nop
-       nop