Add mangled names to addr2line -i output.
[deliverable/binutils-gdb.git] / gas / config / tc-arm.c
index 7cd3db4f3906dad1b01fe60069bd126a00408923..c11e149b45969039e8bc7f9c38fb1debca6bf9a1 100644 (file)
@@ -213,6 +213,9 @@ struct arm_it
   int          size;
   int          size_req;
   int          cond;
+  /* Set to the opcode if the instruction needs relaxation.
+     Zero if the instruction is not relaxed.  */
+  unsigned long        relax;
   struct
   {
     bfd_reloc_code_real_type type;
@@ -4218,6 +4221,8 @@ encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
 
   if (reloc_override)
     inst.reloc.type = reloc_override;
+  else if (thumb_mode)
+    inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
   else
     inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
   return SUCCESS;
@@ -4337,9 +4342,14 @@ do_rn_rd (void)
 static void
 do_rd_rm_rn (void)
 {
+  unsigned Rn = inst.operands[2].reg;
+  /* Enforce resutrictions on SWP instruction.  */
+  if ((inst.instruction & 0x0fbfffff) == 0x01000090)
+    constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
+               _("Rn must not overlap other operands"));
   inst.instruction |= inst.operands[0].reg << 12;
   inst.instruction |= inst.operands[1].reg;
-  inst.instruction |= inst.operands[2].reg << 16;
+  inst.instruction |= Rn << 16;
 }
 
 static void
@@ -5085,9 +5095,9 @@ do_shift (void)
 }
 
 static void
-do_smi (void)
+do_smc (void)
 {
-  inst.reloc.type = BFD_RELOC_ARM_SMI;
+  inst.reloc.type = BFD_RELOC_ARM_SMC;
   inst.reloc.pc_rel = 0;
 }
 
@@ -5495,9 +5505,14 @@ do_iwmmxt_wmov (void)
 static void
 do_iwmmxt_wldstbh (void)
 {
+  int reloc;
   inst.instruction |= inst.operands[0].reg << 12;
   inst.reloc.exp.X_add_number *= 4;
-  encode_arm_cp_address (1, TRUE, FALSE, BFD_RELOC_ARM_CP_OFF_IMM_S2);
+  if (thumb_mode)
+    reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
+  else
+    reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
+  encode_arm_cp_address (1, TRUE, FALSE, reloc);
 }
 
 static void
@@ -5747,17 +5762,24 @@ encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
    encodings (the latter only in post-V6T2 cores).  The index is the
    value used in the insns table below.  When there is more than one
    possible 16-bit encoding for the instruction, this table always
-   holds variant (1).  */
+   holds variant (1).
+   Also contains several pseudo-instructions used during relaxation.  */
 #define T16_32_TAB                             \
   X(adc,   4140, eb400000),                    \
   X(adcs,  4140, eb500000),                    \
   X(add,   1c00, eb000000),                    \
   X(adds,  1c00, eb100000),                    \
+  X(addi,  0000, f1000000),                    \
+  X(addis, 0000, f1100000),                    \
+  X(add_pc,000f, f20f0000),                    \
+  X(add_sp,000d, f10d0000),                    \
   X(adr,   000f, f20f0000),                    \
   X(and,   4000, ea000000),                    \
   X(ands,  4000, ea100000),                    \
   X(asr,   1000, fa40f000),                    \
   X(asrs,  1000, fa50f000),                    \
+  X(b,     e000, f000b000),                    \
+  X(bcond, d000, f0008000),                    \
   X(bic,   4380, ea200000),                    \
   X(bics,  4380, ea300000),                    \
   X(cmn,   42c0, eb100f00),                    \
@@ -5765,14 +5787,19 @@ encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
   X(cpsie, b660, f3af8400),                    \
   X(cpsid, b670, f3af8600),                    \
   X(cpy,   4600, ea4f0000),                    \
+  X(dec_sp,80dd, f1bd0d00),                    \
   X(eor,   4040, ea800000),                    \
   X(eors,  4040, ea900000),                    \
+  X(inc_sp,00dd, f10d0d00),                    \
   X(ldmia, c800, e8900000),                    \
   X(ldr,   6800, f8500000),                    \
   X(ldrb,  7800, f8100000),                    \
   X(ldrh,  8800, f8300000),                    \
   X(ldrsb, 5600, f9100000),                    \
   X(ldrsh, 5e00, f9300000),                    \
+  X(ldr_pc,4800, f85f0000),                    \
+  X(ldr_pc2,4800, f85f0000),                   \
+  X(ldr_sp,9800, f85d0000),                    \
   X(lsl,   0000, fa00f000),                    \
   X(lsls,  0000, fa10f000),                    \
   X(lsr,   0800, fa20f000),                    \
@@ -5800,8 +5827,11 @@ encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
   X(str,   6000, f8400000),                    \
   X(strb,  7000, f8000000),                    \
   X(strh,  8000, f8200000),                    \
+  X(str_sp,9000, f84d0000),                    \
   X(sub,   1e00, eba00000),                    \
   X(subs,  1e00, ebb00000),                    \
+  X(subi,  8000, f1a00000),                    \
+  X(subis, 8000, f1b00000),                    \
   X(sxtb,  b240, fa4ff080),                    \
   X(sxth,  b200, fa0ff080),                    \
   X(tst,   4200, ea100f00),                    \
@@ -5863,17 +5893,61 @@ do_t_add_sub (void)
 
   if (unified_syntax)
     {
+      bfd_boolean flags;
+      bfd_boolean narrow;
+      int opcode;
+
+      flags = (inst.instruction == T_MNEM_adds
+              || inst.instruction == T_MNEM_subs);
+      if (flags)
+       narrow = (current_it_mask == 0);
+      else
+       narrow = (current_it_mask != 0);
       if (!inst.operands[2].isreg)
        {
-         /* ??? Convert large immediates to addw/subw.  */
-         /* ??? 16-bit adds with small immediates.  */
-         /* For an immediate, we always generate a 32-bit opcode;
-            section relaxation will shrink it later if possible.  */
-         inst.instruction = THUMB_OP32 (inst.instruction);
-         inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
-         inst.instruction |= inst.operands[0].reg << 8;
-         inst.instruction |= inst.operands[1].reg << 16;
-         inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
+         opcode = 0;
+         if (inst.size_req != 4)
+           {
+             int add;
+
+             add = (inst.instruction == T_MNEM_add
+                    || inst.instruction == T_MNEM_adds);
+             /* Attempt to use a narrow opcode, with relaxation if
+                appropriate.  */
+             if (Rd == REG_SP && Rs == REG_SP && !flags)
+               opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
+             else if (Rd <= 7 && Rs == REG_SP && add && !flags)
+               opcode = T_MNEM_add_sp;
+             else if (Rd <= 7 && Rs == REG_PC && add && !flags)
+               opcode = T_MNEM_add_pc;
+             else if (Rd <= 7 && Rs <= 7 && narrow)
+               {
+                 if (flags)
+                   opcode = add ? T_MNEM_addis : T_MNEM_subis;
+                 else
+                   opcode = add ? T_MNEM_addi : T_MNEM_subi;
+               }
+             if (opcode)
+               {
+                 inst.instruction = THUMB_OP16(opcode);
+                 inst.instruction |= (Rd << 4) | Rs;
+                 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
+                 if (inst.size_req != 2)
+                   inst.relax = opcode;
+               }
+             else
+               constraint (inst.size_req == 2, BAD_HIREG);
+           }
+         if (inst.size_req == 4
+             || (inst.size_req != 2 && !opcode))
+           {
+             /* ??? Convert large immediates to addw/subw.  */
+             inst.instruction = THUMB_OP32 (inst.instruction);
+             inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
+             inst.instruction |= inst.operands[0].reg << 8;
+             inst.instruction |= inst.operands[1].reg << 16;
+             inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
+           }
        }
       else
        {
@@ -5881,13 +5955,6 @@ do_t_add_sub (void)
          /* See if we can do this with a 16-bit instruction.  */
          if (!inst.operands[2].shifted && inst.size_req != 4)
            {
-             bfd_boolean narrow;
-
-             if (inst.instruction == T_MNEM_adds
-                 || inst.instruction == T_MNEM_subs)
-               narrow = (current_it_mask == 0);
-             else
-               narrow = (current_it_mask != 0);
              if (Rd > 7 || Rs > 7 || Rn > 7)
                narrow = FALSE;
 
@@ -5980,10 +6047,16 @@ do_t_add_sub (void)
 static void
 do_t_adr (void)
 {
-  if (unified_syntax && inst.size_req != 2)
+  if (unified_syntax && inst.size_req == 0 && inst.operands[0].reg <= 7)
+    {
+      /* Defer to section relaxation.  */
+      inst.relax = inst.instruction;
+      inst.instruction = THUMB_OP16 (inst.instruction);
+      inst.instruction |= inst.operands[0].reg << 4;
+    }
+  else if (unified_syntax && inst.size_req != 2)
     {
-      /* Always generate a 32-bit opcode;
-        section relaxation will shrink it later if possible.  */
+      /* Generate a 32-bit opcode.  */
       inst.instruction = THUMB_OP32 (inst.instruction);
       inst.instruction |= inst.operands[0].reg << 8;
       inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
@@ -5991,6 +6064,7 @@ do_t_adr (void)
     }
   else
     {
+      /* Generate a 16-bit opcode.  */
       inst.instruction = THUMB_OP16 (inst.instruction);
       inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
       inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
@@ -6254,29 +6328,37 @@ do_t_blx (void)
 static void
 do_t_branch (void)
 {
-  if (unified_syntax && inst.size_req != 2)
+  int opcode;
+  if (inst.cond != COND_ALWAYS)
+    opcode = T_MNEM_bcond;
+  else
+    opcode = inst.instruction;
+
+  if (unified_syntax && inst.size_req == 4)
     {
+      inst.instruction = THUMB_OP32(opcode);
       if (inst.cond == COND_ALWAYS)
-       {
-         inst.instruction = 0xf000b000;
-         inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH25;
-       }
+       inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH25;
       else
        {
          assert (inst.cond != 0xF);
-         inst.instruction = (inst.cond << 22) | 0xf0008000;
+         inst.instruction |= inst.cond << 22;
          inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH20;
        }
     }
   else
     {
+      inst.instruction = THUMB_OP16(opcode);
       if (inst.cond == COND_ALWAYS)
        inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12;
       else
        {
-         inst.instruction = 0xd000 | (inst.cond << 8);
+         inst.instruction |= inst.cond << 8;
          inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9;
        }
+      /* Allow section relaxation.  */
+      if (unified_syntax && inst.size_req != 2)
+       inst.relax = opcode;
     }
 
   inst.reloc.pc_rel = 1;
@@ -6550,21 +6632,67 @@ do_t_ldrexd (void)
 static void
 do_t_ldst (void)
 {
+  unsigned long opcode;
+  int Rn;
+
+  opcode = inst.instruction;
   if (unified_syntax)
     {
-      /* Generation of 16-bit instructions for anything other than
-        Rd, [Rn, Ri] is deferred to section relaxation time.  */
-      if (inst.operands[1].isreg && inst.operands[1].immisreg
+      if (inst.operands[1].isreg
+         && !inst.operands[1].writeback
          && !inst.operands[1].shifted && !inst.operands[1].postind
          && !inst.operands[1].negative && inst.operands[0].reg <= 7
-         && inst.operands[1].reg <= 7 && inst.operands[1].imm <= 7
-         && inst.instruction <= 0xffff)
+         && opcode <= 0xffff
+         && inst.size_req != 4)
        {
-         inst.instruction = THUMB_OP16 (inst.instruction);
-         goto op16;
+         /* Insn may have a 16-bit form.  */
+         Rn = inst.operands[1].reg;
+         if (inst.operands[1].immisreg)
+           {
+             inst.instruction = THUMB_OP16 (opcode);
+             /* [Rn, Ri] */
+             if (Rn <= 7 && inst.operands[1].imm <= 7)
+               goto op16;
+           }
+         else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
+                   && opcode != T_MNEM_ldrsb)
+                  || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
+                  || (Rn == REG_SP && opcode == T_MNEM_str))
+           {
+             /* [Rn, #const] */
+             if (Rn > 7)
+               {
+                 if (Rn == REG_PC)
+                   {
+                     if (inst.reloc.pc_rel)
+                       opcode = T_MNEM_ldr_pc2;
+                     else
+                       opcode = T_MNEM_ldr_pc;
+                   }
+                 else
+                   {
+                     if (opcode == T_MNEM_ldr)
+                       opcode = T_MNEM_ldr_sp;
+                     else
+                       opcode = T_MNEM_str_sp;
+                   }
+                 inst.instruction = inst.operands[0].reg << 8;
+               }
+             else
+               {
+                 inst.instruction = inst.operands[0].reg;
+                 inst.instruction |= inst.operands[1].reg << 3;
+               }
+             inst.instruction |= THUMB_OP16 (opcode);
+             if (inst.size_req == 2)
+               inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
+             else
+               inst.relax = opcode;
+             return;
+           }
        }
-
-      inst.instruction = THUMB_OP32 (inst.instruction);
+      /* Definitely a 32-bit variant.  */
+      inst.instruction = THUMB_OP32 (opcode);
       inst.instruction |= inst.operands[0].reg << 12;
       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
       return;
@@ -6696,19 +6824,43 @@ do_t_mov_cmp (void)
     {
       int r0off = (inst.instruction == T_MNEM_mov
                   || inst.instruction == T_MNEM_movs) ? 8 : 16;
+      unsigned long opcode;
+      bfd_boolean narrow;
+      bfd_boolean low_regs;
+
+      low_regs = (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7);
+      opcode = inst.instruction;
+      if (current_it_mask)
+       narrow = opcode != T_MNEM_movs;
+      else
+       narrow = opcode != T_MNEM_movs || low_regs;
+      if (inst.size_req == 4
+         || inst.operands[1].shifted)
+       narrow = FALSE;
+
       if (!inst.operands[1].isreg)
        {
-         /* For an immediate, we always generate a 32-bit opcode;
-            section relaxation will shrink it later if possible.  */
-         inst.instruction = THUMB_OP32 (inst.instruction);
-         inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
-         inst.instruction |= inst.operands[0].reg << r0off;
-         inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
+         /* Immediate operand.  */
+         if (current_it_mask == 0 && opcode == T_MNEM_mov)
+           narrow = 0;
+         if (low_regs && narrow)
+           {
+             inst.instruction = THUMB_OP16 (opcode);
+             inst.instruction |= inst.operands[0].reg << 8;
+             if (inst.size_req == 2)
+               inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
+             else
+               inst.relax = opcode;
+           }
+         else
+           {
+             inst.instruction = THUMB_OP32 (inst.instruction);
+             inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
+             inst.instruction |= inst.operands[0].reg << r0off;
+             inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
+           }
        }
-      else if (inst.size_req == 4
-              || inst.operands[1].shifted
-              || (inst.instruction == T_MNEM_movs
-                  && (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)))
+      else if (!narrow)
        {
          inst.instruction = THUMB_OP32 (inst.instruction);
          inst.instruction |= inst.operands[0].reg << r0off;
@@ -6733,7 +6885,7 @@ do_t_mov_cmp (void)
            break;
 
          case T_MNEM_cmp:
-           if (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7)
+           if (low_regs)
              {
                inst.instruction = T_OPCODE_CMP_LR;
                inst.instruction |= inst.operands[0].reg;
@@ -6801,6 +6953,20 @@ do_t_mvn_tst (void)
     {
       int r0off = (inst.instruction == T_MNEM_mvn
                   || inst.instruction == T_MNEM_mvns) ? 8 : 16;
+      bfd_boolean narrow;
+
+      if (inst.size_req == 4
+         || inst.instruction > 0xffff
+         || inst.operands[1].shifted
+         || inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
+       narrow = FALSE;
+      else if (inst.instruction == T_MNEM_cmn)
+       narrow = TRUE;
+      else if (THUMB_SETS_FLAGS (inst.instruction))
+       narrow = (current_it_mask == 0);
+      else
+       narrow = (current_it_mask != 0);
+
       if (!inst.operands[1].isreg)
        {
          /* For an immediate, we always generate a 32-bit opcode;
@@ -6814,12 +6980,7 @@ do_t_mvn_tst (void)
       else
        {
          /* See if we can do this with a 16-bit instruction.  */
-         if (inst.instruction < 0xffff
-             && THUMB_SETS_FLAGS (inst.instruction)
-             && !inst.operands[1].shifted
-             && inst.operands[0].reg <= 7
-             && inst.operands[1].reg <= 7
-             && inst.size_req != 4)
+         if (narrow)
            {
              inst.instruction = THUMB_OP16 (inst.instruction);
              inst.instruction |= inst.operands[0].reg;
@@ -6947,9 +7108,18 @@ do_t_neg (void)
 {
   if (unified_syntax)
     {
-      if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7
-         || !THUMB_SETS_FLAGS (inst.instruction)
-         || inst.size_req == 4)
+      bfd_boolean narrow;
+
+      if (THUMB_SETS_FLAGS (inst.instruction))
+       narrow = (current_it_mask == 0);
+      else
+       narrow = (current_it_mask != 0);
+      if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
+       narrow = FALSE;
+      if (inst.size_req == 4)
+       narrow = FALSE;
+
+      if (!narrow)
        {
          inst.instruction = THUMB_OP32 (inst.instruction);
          inst.instruction |= inst.operands[0].reg << 8;
@@ -7127,12 +7297,38 @@ do_t_shift (void)
 
   if (unified_syntax)
     {
-      if (inst.operands[0].reg > 7
-         || inst.operands[1].reg > 7
-         || !THUMB_SETS_FLAGS (inst.instruction)
-         || (!inst.operands[2].isreg && inst.instruction == T_MNEM_rors)
-         || (inst.operands[2].isreg && inst.operands[1].reg != inst.operands[0].reg)
-         || inst.size_req == 4)
+      bfd_boolean narrow;
+      int shift_kind;
+
+      switch (inst.instruction)
+       {
+       case T_MNEM_asr:
+       case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
+       case T_MNEM_lsl:
+       case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
+       case T_MNEM_lsr:
+       case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
+       case T_MNEM_ror:
+       case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
+       default: abort ();
+       }
+
+      if (THUMB_SETS_FLAGS (inst.instruction))
+       narrow = (current_it_mask == 0);
+      else
+       narrow = (current_it_mask != 0);
+      if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
+       narrow = FALSE;
+      if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
+       narrow = FALSE;
+      if (inst.operands[2].isreg
+         && (inst.operands[1].reg != inst.operands[0].reg
+             || inst.operands[2].reg > 7))
+       narrow = FALSE;
+      if (inst.size_req == 4)
+       narrow = FALSE;
+
+      if (!narrow)
        {
          if (inst.operands[2].isreg)
            {
@@ -7144,19 +7340,7 @@ do_t_shift (void)
          else
            {
              inst.operands[1].shifted = 1;
-             switch (inst.instruction)
-               {
-               case T_MNEM_asr:
-               case T_MNEM_asrs: inst.operands[1].shift_kind = SHIFT_ASR; break;
-               case T_MNEM_lsl:
-               case T_MNEM_lsls: inst.operands[1].shift_kind = SHIFT_LSL; break;
-               case T_MNEM_lsr:
-               case T_MNEM_lsrs: inst.operands[1].shift_kind = SHIFT_LSR; break;
-               case T_MNEM_ror:
-               case T_MNEM_rors: inst.operands[1].shift_kind = SHIFT_ROR; break;
-               default: abort ();
-               }
-             
+             inst.operands[1].shift_kind = shift_kind;
              inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
                                             ? T_MNEM_movs : T_MNEM_mov);
              inst.instruction |= inst.operands[0].reg << 8;
@@ -7169,12 +7353,12 @@ do_t_shift (void)
        {
          if (inst.operands[2].isreg)
            {
-             switch (inst.instruction)
+             switch (shift_kind)
                {
-               case T_MNEM_asrs: inst.instruction = T_OPCODE_ASR_R; break;
-               case T_MNEM_lsls: inst.instruction = T_OPCODE_LSL_R; break;
-               case T_MNEM_lsrs: inst.instruction = T_OPCODE_LSR_R; break;
-               case T_MNEM_rors: inst.instruction = T_OPCODE_ROR_R; break;
+               case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
+               case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
+               case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
+               case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
                default: abort ();
                }
          
@@ -7183,11 +7367,11 @@ do_t_shift (void)
            }
          else
            {
-             switch (inst.instruction)
+             switch (shift_kind)
                {
-               case T_MNEM_asrs: inst.instruction = T_OPCODE_ASR_I; break;
-               case T_MNEM_lsls: inst.instruction = T_OPCODE_LSL_I; break;
-               case T_MNEM_lsrs: inst.instruction = T_OPCODE_LSR_I; break;
+               case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
+               case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
+               case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
                default: abort ();
                }
              inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
@@ -7246,7 +7430,7 @@ do_t_simd (void)
 }
 
 static void
-do_t_smi (void)
+do_t_smc (void)
 {
   unsigned int value = inst.reloc.exp.X_add_number;
   constraint (inst.reloc.exp.X_op != O_constant,
@@ -7448,6 +7632,46 @@ fix_new_arm (fragS *        frag,
   new_fix->tc_fix_data = thumb_mode;
 }
 
+/* Create a frg for an instruction requiring relaxation.  */
+static void
+output_relax_insn (void)
+{
+  char * to;
+  symbolS *sym;
+  int offset;
+
+  switch (inst.reloc.exp.X_op)
+    {
+    case O_symbol:
+      sym = inst.reloc.exp.X_add_symbol;
+      offset = inst.reloc.exp.X_add_number;
+      break;
+    case O_constant:
+      sym = NULL;
+      offset = inst.reloc.exp.X_add_number;
+      break;
+    default:
+      sym = make_expr_symbol (&inst.reloc.exp);
+      offset = 0;
+      break;
+  }
+  to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
+                inst.relax, sym, offset, NULL/*offset, opcode*/);
+  md_number_to_chars (to, inst.instruction, THUMB_SIZE);
+
+#ifdef OBJ_ELF
+  dwarf2_emit_insn (INSN_SIZE);
+#endif
+}
+
+/* Write a 32-bit thumb instruction to buf.  */
+static void
+put_thumb32_insn (char * buf, unsigned long insn)
+{
+  md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
+  md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
+}
+
 static void
 output_inst (const char * str)
 {
@@ -7458,6 +7682,10 @@ output_inst (const char * str)
       as_bad ("%s -- `%s'", inst.error, str);
       return;
     }
+  if (inst.relax) {
+      output_relax_insn();
+      return;
+  }
   if (inst.size == 0)
     return;
 
@@ -7466,8 +7694,7 @@ output_inst (const char * str)
   if (thumb_mode && (inst.size > THUMB_SIZE))
     {
       assert (inst.size == (2 * THUMB_SIZE));
-      md_number_to_chars (to, inst.instruction >> 16, THUMB_SIZE);
-      md_number_to_chars (to + THUMB_SIZE, inst.instruction, THUMB_SIZE);
+      put_thumb32_insn (to, inst.instruction);
     }
   else if (inst.size > INSN_SIZE)
     {
@@ -7635,8 +7862,10 @@ opcode_lookup (char **str)
        {
        case OT_cinfix3:
        case OT_odd_infix_unc:
+         /* Some mnemonics are ambiguous between infix and suffix
+            conditions.  Disambiguate based on assembly syntax.  */
          if (!unified_syntax)
-           return 0;
+           break;
          /* else fall through */
 
        case OT_csuffix:
@@ -7716,8 +7945,14 @@ md_assemble (char *str)
 
   if (thumb_mode)
     {
+      unsigned long variant;
+
+      variant = cpu_variant;
+      /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
+      if ((variant & ARM_EXT_V6T2) == 0)
+       variant &= ARM_ANY;
       /* Check that this instruction is supported for this CPU.  */
-      if (thumb_mode == 1 && (opcode->tvariant & cpu_variant) == 0)
+      if (thumb_mode == 1 && (opcode->tvariant & variant) == 0)
        {
          as_bad (_("selected processor does not support `%s'"), str);
          return;
@@ -7758,7 +7993,7 @@ md_assemble (char *str)
       if (current_it_mask == 0x10)
        current_it_mask = 0;
 
-      if (!inst.error)
+      if (!(inst.error || inst.relax))
        {
          assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
          inst.size = (inst.instruction > 0xffff ? 4 : 2);
@@ -8204,6 +8439,13 @@ static const struct asm_cond conds[] =
 #define C3(mnem, op, nops, ops, ae)    \
   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
 
+/* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
+#define cCE(mnem,  op, nops, ops, ae)  \
+  { #mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
+
+#define cC3(mnem, op, nops, ops, ae)   \
+  { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
+
 #define xCM_(m1, m2, m3, op, nops, ops, ae)    \
   { #m1 #m2 #m3, OPS##nops ops, \
     sizeof(#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof(#m1) - 1, \
@@ -8296,7 +8538,7 @@ static const struct asm_opcode insns[] =
  tC3(ldmfd,    8900000, ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
 
  TCE(swi,      f000000, df00,     1, (EXPi),        swi, t_swi),
TCE(b,                a000000, e000,     1, (EXPr),        branch, t_branch),
tCE(b,                a000000, b,        1, (EXPr),        branch, t_branch),
  TCE(bl,       b000000, f000f800, 1, (EXPr),        branch, t_branch23),
 
   /* Pseudo ops.  */
@@ -8604,7 +8846,7 @@ static const struct asm_opcode insns[] =
 
 #undef ARM_VARIANT
 #define ARM_VARIANT ARM_EXT_V6Z
- TCE(smi,      1600070, f7f08000, 1, (EXPi), smi, t_smi),
+ TCE(smc,      1600070, f7f08000, 1, (EXPi), smc, t_smc),
 
 #undef ARM_VARIANT
 #define ARM_VARIANT ARM_EXT_V6T2
@@ -8653,815 +8895,815 @@ static const struct asm_opcode insns[] =
 
 #undef ARM_VARIANT
 #define ARM_VARIANT FPU_FPA_EXT_V1  /* Core FPA instruction set (V1).  */
 CE(wfs,      e200110, 1, (RR),            rd),
 CE(rfs,      e300110, 1, (RR),            rd),
 CE(wfc,      e400110, 1, (RR),            rd),
 CE(rfc,      e500110, 1, (RR),            rd),
-
 C3(ldfs,     c100100, 2, (RF, ADDR),      rd_cpaddr),
 C3(ldfd,     c108100, 2, (RF, ADDR),      rd_cpaddr),
 C3(ldfe,     c500100, 2, (RF, ADDR),      rd_cpaddr),
 C3(ldfp,     c508100, 2, (RF, ADDR),      rd_cpaddr),
-
 C3(stfs,     c000100, 2, (RF, ADDR),      rd_cpaddr),
 C3(stfd,     c008100, 2, (RF, ADDR),      rd_cpaddr),
 C3(stfe,     c400100, 2, (RF, ADDR),      rd_cpaddr),
 C3(stfp,     c408100, 2, (RF, ADDR),      rd_cpaddr),
-
 C3(mvfs,     e008100, 2, (RF, RF_IF),     rd_rm),
 C3(mvfsp,    e008120, 2, (RF, RF_IF),     rd_rm),
 C3(mvfsm,    e008140, 2, (RF, RF_IF),     rd_rm),
 C3(mvfsz,    e008160, 2, (RF, RF_IF),     rd_rm),
 C3(mvfd,     e008180, 2, (RF, RF_IF),     rd_rm),
 C3(mvfdp,    e0081a0, 2, (RF, RF_IF),     rd_rm),
 C3(mvfdm,    e0081c0, 2, (RF, RF_IF),     rd_rm),
 C3(mvfdz,    e0081e0, 2, (RF, RF_IF),     rd_rm),
 C3(mvfe,     e088100, 2, (RF, RF_IF),     rd_rm),
 C3(mvfep,    e088120, 2, (RF, RF_IF),     rd_rm),
 C3(mvfem,    e088140, 2, (RF, RF_IF),     rd_rm),
 C3(mvfez,    e088160, 2, (RF, RF_IF),     rd_rm),
-
 C3(mnfs,     e108100, 2, (RF, RF_IF),     rd_rm),
 C3(mnfsp,    e108120, 2, (RF, RF_IF),     rd_rm),
 C3(mnfsm,    e108140, 2, (RF, RF_IF),     rd_rm),
 C3(mnfsz,    e108160, 2, (RF, RF_IF),     rd_rm),
 C3(mnfd,     e108180, 2, (RF, RF_IF),     rd_rm),
 C3(mnfdp,    e1081a0, 2, (RF, RF_IF),     rd_rm),
 C3(mnfdm,    e1081c0, 2, (RF, RF_IF),     rd_rm),
 C3(mnfdz,    e1081e0, 2, (RF, RF_IF),     rd_rm),
 C3(mnfe,     e188100, 2, (RF, RF_IF),     rd_rm),
 C3(mnfep,    e188120, 2, (RF, RF_IF),     rd_rm),
 C3(mnfem,    e188140, 2, (RF, RF_IF),     rd_rm),
 C3(mnfez,    e188160, 2, (RF, RF_IF),     rd_rm),
-
 C3(abss,     e208100, 2, (RF, RF_IF),     rd_rm),
 C3(abssp,    e208120, 2, (RF, RF_IF),     rd_rm),
 C3(abssm,    e208140, 2, (RF, RF_IF),     rd_rm),
 C3(abssz,    e208160, 2, (RF, RF_IF),     rd_rm),
 C3(absd,     e208180, 2, (RF, RF_IF),     rd_rm),
 C3(absdp,    e2081a0, 2, (RF, RF_IF),     rd_rm),
 C3(absdm,    e2081c0, 2, (RF, RF_IF),     rd_rm),
 C3(absdz,    e2081e0, 2, (RF, RF_IF),     rd_rm),
 C3(abse,     e288100, 2, (RF, RF_IF),     rd_rm),
 C3(absep,    e288120, 2, (RF, RF_IF),     rd_rm),
 C3(absem,    e288140, 2, (RF, RF_IF),     rd_rm),
 C3(absez,    e288160, 2, (RF, RF_IF),     rd_rm),
-
 C3(rnds,     e308100, 2, (RF, RF_IF),     rd_rm),
 C3(rndsp,    e308120, 2, (RF, RF_IF),     rd_rm),
 C3(rndsm,    e308140, 2, (RF, RF_IF),     rd_rm),
 C3(rndsz,    e308160, 2, (RF, RF_IF),     rd_rm),
 C3(rndd,     e308180, 2, (RF, RF_IF),     rd_rm),
 C3(rnddp,    e3081a0, 2, (RF, RF_IF),     rd_rm),
 C3(rnddm,    e3081c0, 2, (RF, RF_IF),     rd_rm),
 C3(rnddz,    e3081e0, 2, (RF, RF_IF),     rd_rm),
 C3(rnde,     e388100, 2, (RF, RF_IF),     rd_rm),
 C3(rndep,    e388120, 2, (RF, RF_IF),     rd_rm),
 C3(rndem,    e388140, 2, (RF, RF_IF),     rd_rm),
 C3(rndez,    e388160, 2, (RF, RF_IF),     rd_rm),
-
 C3(sqts,     e408100, 2, (RF, RF_IF),     rd_rm),
 C3(sqtsp,    e408120, 2, (RF, RF_IF),     rd_rm),
 C3(sqtsm,    e408140, 2, (RF, RF_IF),     rd_rm),
 C3(sqtsz,    e408160, 2, (RF, RF_IF),     rd_rm),
 C3(sqtd,     e408180, 2, (RF, RF_IF),     rd_rm),
 C3(sqtdp,    e4081a0, 2, (RF, RF_IF),     rd_rm),
 C3(sqtdm,    e4081c0, 2, (RF, RF_IF),     rd_rm),
 C3(sqtdz,    e4081e0, 2, (RF, RF_IF),     rd_rm),
 C3(sqte,     e488100, 2, (RF, RF_IF),     rd_rm),
 C3(sqtep,    e488120, 2, (RF, RF_IF),     rd_rm),
 C3(sqtem,    e488140, 2, (RF, RF_IF),     rd_rm),
 C3(sqtez,    e488160, 2, (RF, RF_IF),     rd_rm),
-
 C3(logs,     e508100, 2, (RF, RF_IF),     rd_rm),
 C3(logsp,    e508120, 2, (RF, RF_IF),     rd_rm),
 C3(logsm,    e508140, 2, (RF, RF_IF),     rd_rm),
 C3(logsz,    e508160, 2, (RF, RF_IF),     rd_rm),
 C3(logd,     e508180, 2, (RF, RF_IF),     rd_rm),
 C3(logdp,    e5081a0, 2, (RF, RF_IF),     rd_rm),
 C3(logdm,    e5081c0, 2, (RF, RF_IF),     rd_rm),
 C3(logdz,    e5081e0, 2, (RF, RF_IF),     rd_rm),
 C3(loge,     e588100, 2, (RF, RF_IF),     rd_rm),
 C3(logep,    e588120, 2, (RF, RF_IF),     rd_rm),
 C3(logem,    e588140, 2, (RF, RF_IF),     rd_rm),
 C3(logez,    e588160, 2, (RF, RF_IF),     rd_rm),
-
 C3(lgns,     e608100, 2, (RF, RF_IF),     rd_rm),
 C3(lgnsp,    e608120, 2, (RF, RF_IF),     rd_rm),
 C3(lgnsm,    e608140, 2, (RF, RF_IF),     rd_rm),
 C3(lgnsz,    e608160, 2, (RF, RF_IF),     rd_rm),
 C3(lgnd,     e608180, 2, (RF, RF_IF),     rd_rm),
 C3(lgndp,    e6081a0, 2, (RF, RF_IF),     rd_rm),
 C3(lgndm,    e6081c0, 2, (RF, RF_IF),     rd_rm),
 C3(lgndz,    e6081e0, 2, (RF, RF_IF),     rd_rm),
 C3(lgne,     e688100, 2, (RF, RF_IF),     rd_rm),
 C3(lgnep,    e688120, 2, (RF, RF_IF),     rd_rm),
 C3(lgnem,    e688140, 2, (RF, RF_IF),     rd_rm),
 C3(lgnez,    e688160, 2, (RF, RF_IF),     rd_rm),
-
 C3(exps,     e708100, 2, (RF, RF_IF),     rd_rm),
 C3(expsp,    e708120, 2, (RF, RF_IF),     rd_rm),
 C3(expsm,    e708140, 2, (RF, RF_IF),     rd_rm),
 C3(expsz,    e708160, 2, (RF, RF_IF),     rd_rm),
 C3(expd,     e708180, 2, (RF, RF_IF),     rd_rm),
 C3(expdp,    e7081a0, 2, (RF, RF_IF),     rd_rm),
 C3(expdm,    e7081c0, 2, (RF, RF_IF),     rd_rm),
 C3(expdz,    e7081e0, 2, (RF, RF_IF),     rd_rm),
 C3(expe,     e788100, 2, (RF, RF_IF),     rd_rm),
 C3(expep,    e788120, 2, (RF, RF_IF),     rd_rm),
 C3(expem,    e788140, 2, (RF, RF_IF),     rd_rm),
 C3(expdz,    e788160, 2, (RF, RF_IF),     rd_rm),
-
 C3(sins,     e808100, 2, (RF, RF_IF),     rd_rm),
 C3(sinsp,    e808120, 2, (RF, RF_IF),     rd_rm),
 C3(sinsm,    e808140, 2, (RF, RF_IF),     rd_rm),
 C3(sinsz,    e808160, 2, (RF, RF_IF),     rd_rm),
 C3(sind,     e808180, 2, (RF, RF_IF),     rd_rm),
 C3(sindp,    e8081a0, 2, (RF, RF_IF),     rd_rm),
 C3(sindm,    e8081c0, 2, (RF, RF_IF),     rd_rm),
 C3(sindz,    e8081e0, 2, (RF, RF_IF),     rd_rm),
 C3(sine,     e888100, 2, (RF, RF_IF),     rd_rm),
 C3(sinep,    e888120, 2, (RF, RF_IF),     rd_rm),
 C3(sinem,    e888140, 2, (RF, RF_IF),     rd_rm),
 C3(sinez,    e888160, 2, (RF, RF_IF),     rd_rm),
-
 C3(coss,     e908100, 2, (RF, RF_IF),     rd_rm),
 C3(cossp,    e908120, 2, (RF, RF_IF),     rd_rm),
 C3(cossm,    e908140, 2, (RF, RF_IF),     rd_rm),
 C3(cossz,    e908160, 2, (RF, RF_IF),     rd_rm),
 C3(cosd,     e908180, 2, (RF, RF_IF),     rd_rm),
 C3(cosdp,    e9081a0, 2, (RF, RF_IF),     rd_rm),
 C3(cosdm,    e9081c0, 2, (RF, RF_IF),     rd_rm),
 C3(cosdz,    e9081e0, 2, (RF, RF_IF),     rd_rm),
 C3(cose,     e988100, 2, (RF, RF_IF),     rd_rm),
 C3(cosep,    e988120, 2, (RF, RF_IF),     rd_rm),
 C3(cosem,    e988140, 2, (RF, RF_IF),     rd_rm),
 C3(cosez,    e988160, 2, (RF, RF_IF),     rd_rm),
-
 C3(tans,     ea08100, 2, (RF, RF_IF),     rd_rm),
 C3(tansp,    ea08120, 2, (RF, RF_IF),     rd_rm),
 C3(tansm,    ea08140, 2, (RF, RF_IF),     rd_rm),
 C3(tansz,    ea08160, 2, (RF, RF_IF),     rd_rm),
 C3(tand,     ea08180, 2, (RF, RF_IF),     rd_rm),
 C3(tandp,    ea081a0, 2, (RF, RF_IF),     rd_rm),
 C3(tandm,    ea081c0, 2, (RF, RF_IF),     rd_rm),
 C3(tandz,    ea081e0, 2, (RF, RF_IF),     rd_rm),
 C3(tane,     ea88100, 2, (RF, RF_IF),     rd_rm),
 C3(tanep,    ea88120, 2, (RF, RF_IF),     rd_rm),
 C3(tanem,    ea88140, 2, (RF, RF_IF),     rd_rm),
 C3(tanez,    ea88160, 2, (RF, RF_IF),     rd_rm),
-
 C3(asns,     eb08100, 2, (RF, RF_IF),     rd_rm),
 C3(asnsp,    eb08120, 2, (RF, RF_IF),     rd_rm),
 C3(asnsm,    eb08140, 2, (RF, RF_IF),     rd_rm),
 C3(asnsz,    eb08160, 2, (RF, RF_IF),     rd_rm),
 C3(asnd,     eb08180, 2, (RF, RF_IF),     rd_rm),
 C3(asndp,    eb081a0, 2, (RF, RF_IF),     rd_rm),
 C3(asndm,    eb081c0, 2, (RF, RF_IF),     rd_rm),
 C3(asndz,    eb081e0, 2, (RF, RF_IF),     rd_rm),
 C3(asne,     eb88100, 2, (RF, RF_IF),     rd_rm),
 C3(asnep,    eb88120, 2, (RF, RF_IF),     rd_rm),
 C3(asnem,    eb88140, 2, (RF, RF_IF),     rd_rm),
 C3(asnez,    eb88160, 2, (RF, RF_IF),     rd_rm),
-
 C3(acss,     ec08100, 2, (RF, RF_IF),     rd_rm),
 C3(acssp,    ec08120, 2, (RF, RF_IF),     rd_rm),
 C3(acssm,    ec08140, 2, (RF, RF_IF),     rd_rm),
 C3(acssz,    ec08160, 2, (RF, RF_IF),     rd_rm),
 C3(acsd,     ec08180, 2, (RF, RF_IF),     rd_rm),
 C3(acsdp,    ec081a0, 2, (RF, RF_IF),     rd_rm),
 C3(acsdm,    ec081c0, 2, (RF, RF_IF),     rd_rm),
 C3(acsdz,    ec081e0, 2, (RF, RF_IF),     rd_rm),
 C3(acse,     ec88100, 2, (RF, RF_IF),     rd_rm),
 C3(acsep,    ec88120, 2, (RF, RF_IF),     rd_rm),
 C3(acsem,    ec88140, 2, (RF, RF_IF),     rd_rm),
 C3(acsez,    ec88160, 2, (RF, RF_IF),     rd_rm),
-
 C3(atns,     ed08100, 2, (RF, RF_IF),     rd_rm),
 C3(atnsp,    ed08120, 2, (RF, RF_IF),     rd_rm),
 C3(atnsm,    ed08140, 2, (RF, RF_IF),     rd_rm),
 C3(atnsz,    ed08160, 2, (RF, RF_IF),     rd_rm),
 C3(atnd,     ed08180, 2, (RF, RF_IF),     rd_rm),
 C3(atndp,    ed081a0, 2, (RF, RF_IF),     rd_rm),
 C3(atndm,    ed081c0, 2, (RF, RF_IF),     rd_rm),
 C3(atndz,    ed081e0, 2, (RF, RF_IF),     rd_rm),
 C3(atne,     ed88100, 2, (RF, RF_IF),     rd_rm),
 C3(atnep,    ed88120, 2, (RF, RF_IF),     rd_rm),
 C3(atnem,    ed88140, 2, (RF, RF_IF),     rd_rm),
 C3(atnez,    ed88160, 2, (RF, RF_IF),     rd_rm),
-
 C3(urds,     ee08100, 2, (RF, RF_IF),     rd_rm),
 C3(urdsp,    ee08120, 2, (RF, RF_IF),     rd_rm),
 C3(urdsm,    ee08140, 2, (RF, RF_IF),     rd_rm),
 C3(urdsz,    ee08160, 2, (RF, RF_IF),     rd_rm),
 C3(urdd,     ee08180, 2, (RF, RF_IF),     rd_rm),
 C3(urddp,    ee081a0, 2, (RF, RF_IF),     rd_rm),
 C3(urddm,    ee081c0, 2, (RF, RF_IF),     rd_rm),
 C3(urddz,    ee081e0, 2, (RF, RF_IF),     rd_rm),
 C3(urde,     ee88100, 2, (RF, RF_IF),     rd_rm),
 C3(urdep,    ee88120, 2, (RF, RF_IF),     rd_rm),
 C3(urdem,    ee88140, 2, (RF, RF_IF),     rd_rm),
 C3(urdez,    ee88160, 2, (RF, RF_IF),     rd_rm),
-
 C3(nrms,     ef08100, 2, (RF, RF_IF),     rd_rm),
 C3(nrmsp,    ef08120, 2, (RF, RF_IF),     rd_rm),
 C3(nrmsm,    ef08140, 2, (RF, RF_IF),     rd_rm),
 C3(nrmsz,    ef08160, 2, (RF, RF_IF),     rd_rm),
 C3(nrmd,     ef08180, 2, (RF, RF_IF),     rd_rm),
 C3(nrmdp,    ef081a0, 2, (RF, RF_IF),     rd_rm),
 C3(nrmdm,    ef081c0, 2, (RF, RF_IF),     rd_rm),
 C3(nrmdz,    ef081e0, 2, (RF, RF_IF),     rd_rm),
 C3(nrme,     ef88100, 2, (RF, RF_IF),     rd_rm),
 C3(nrmep,    ef88120, 2, (RF, RF_IF),     rd_rm),
 C3(nrmem,    ef88140, 2, (RF, RF_IF),     rd_rm),
 C3(nrmez,    ef88160, 2, (RF, RF_IF),     rd_rm),
-
 C3(adfs,     e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfsp,    e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfsm,    e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfsz,    e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfd,     e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfdp,    e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfdm,    e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfdz,    e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfe,     e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfep,    e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfem,    e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(adfez,    e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(sufs,     e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufsp,    e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufsm,    e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufsz,    e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufd,     e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufdp,    e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufdm,    e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufdz,    e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufe,     e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufep,    e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufem,    e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(sufez,    e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(rsfs,     e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfsp,    e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfsm,    e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfsz,    e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfd,     e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfdp,    e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfdm,    e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfdz,    e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfe,     e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfep,    e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfem,    e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rsfez,    e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(mufs,     e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufsp,    e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufsm,    e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufsz,    e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufd,     e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufdp,    e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufdm,    e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufdz,    e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufe,     e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufep,    e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufem,    e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(mufez,    e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(dvfs,     e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfsp,    e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfsm,    e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfsz,    e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfd,     e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfdp,    e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfdm,    e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfdz,    e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfe,     e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfep,    e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfem,    e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(dvfez,    e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(rdfs,     e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfsp,    e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfsm,    e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfsz,    e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfd,     e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfdp,    e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfdm,    e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfdz,    e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfe,     e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfep,    e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfem,    e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rdfez,    e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(pows,     e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powsp,    e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powsm,    e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powsz,    e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powd,     e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powdp,    e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powdm,    e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powdz,    e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powe,     e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powep,    e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powem,    e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(powez,    e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(rpws,     e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwsp,    e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwsm,    e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwsz,    e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwd,     e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwdp,    e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwdm,    e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwdz,    e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwe,     e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwep,    e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwem,    e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rpwez,    e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(rmfs,     e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfsp,    e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfsm,    e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfsz,    e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfd,     e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfdp,    e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfdm,    e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfdz,    e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfe,     e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfep,    e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfem,    e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(rmfez,    e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(fmls,     e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmlsp,    e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmlsm,    e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmlsz,    e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmld,     e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmldp,    e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmldm,    e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmldz,    e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmle,     e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmlep,    e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmlem,    e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fmlez,    e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(fdvs,     ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvsp,    ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvsm,    ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvsz,    ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvd,     ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvdp,    ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvdm,    ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvdz,    ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdve,     ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvep,    ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvem,    ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(fdvez,    ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(frds,     eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frdsp,    eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frdsm,    eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frdsz,    eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frdd,     eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frddp,    eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frddm,    eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frddz,    eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frde,     eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frdep,    eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frdem,    eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(frdez,    eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 C3(pols,     ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(polsp,    ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(polsm,    ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(polsz,    ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(pold,     ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(poldp,    ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(poldm,    ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(poldz,    ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(pole,     ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(polep,    ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(polem,    ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
 C3(polez,    ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
-
 CE(cmf,      e90f110, 2, (RF, RF_IF),     fpa_cmp),
cCE(wfs,      e200110, 1, (RR),            rd),
cCE(rfs,      e300110, 1, (RR),            rd),
cCE(wfc,      e400110, 1, (RR),            rd),
cCE(rfc,      e500110, 1, (RR),            rd),
+
cC3(ldfs,     c100100, 2, (RF, ADDR),      rd_cpaddr),
cC3(ldfd,     c108100, 2, (RF, ADDR),      rd_cpaddr),
cC3(ldfe,     c500100, 2, (RF, ADDR),      rd_cpaddr),
cC3(ldfp,     c508100, 2, (RF, ADDR),      rd_cpaddr),
+
cC3(stfs,     c000100, 2, (RF, ADDR),      rd_cpaddr),
cC3(stfd,     c008100, 2, (RF, ADDR),      rd_cpaddr),
cC3(stfe,     c400100, 2, (RF, ADDR),      rd_cpaddr),
cC3(stfp,     c408100, 2, (RF, ADDR),      rd_cpaddr),
+
cC3(mvfs,     e008100, 2, (RF, RF_IF),     rd_rm),
cC3(mvfsp,    e008120, 2, (RF, RF_IF),     rd_rm),
cC3(mvfsm,    e008140, 2, (RF, RF_IF),     rd_rm),
cC3(mvfsz,    e008160, 2, (RF, RF_IF),     rd_rm),
cC3(mvfd,     e008180, 2, (RF, RF_IF),     rd_rm),
cC3(mvfdp,    e0081a0, 2, (RF, RF_IF),     rd_rm),
cC3(mvfdm,    e0081c0, 2, (RF, RF_IF),     rd_rm),
cC3(mvfdz,    e0081e0, 2, (RF, RF_IF),     rd_rm),
cC3(mvfe,     e088100, 2, (RF, RF_IF),     rd_rm),
cC3(mvfep,    e088120, 2, (RF, RF_IF),     rd_rm),
cC3(mvfem,    e088140, 2, (RF, RF_IF),     rd_rm),
cC3(mvfez,    e088160, 2, (RF, RF_IF),     rd_rm),
+
cC3(mnfs,     e108100, 2, (RF, RF_IF),     rd_rm),
cC3(mnfsp,    e108120, 2, (RF, RF_IF),     rd_rm),
cC3(mnfsm,    e108140, 2, (RF, RF_IF),     rd_rm),
cC3(mnfsz,    e108160, 2, (RF, RF_IF),     rd_rm),
cC3(mnfd,     e108180, 2, (RF, RF_IF),     rd_rm),
cC3(mnfdp,    e1081a0, 2, (RF, RF_IF),     rd_rm),
cC3(mnfdm,    e1081c0, 2, (RF, RF_IF),     rd_rm),
cC3(mnfdz,    e1081e0, 2, (RF, RF_IF),     rd_rm),
cC3(mnfe,     e188100, 2, (RF, RF_IF),     rd_rm),
cC3(mnfep,    e188120, 2, (RF, RF_IF),     rd_rm),
cC3(mnfem,    e188140, 2, (RF, RF_IF),     rd_rm),
cC3(mnfez,    e188160, 2, (RF, RF_IF),     rd_rm),
+
cC3(abss,     e208100, 2, (RF, RF_IF),     rd_rm),
cC3(abssp,    e208120, 2, (RF, RF_IF),     rd_rm),
cC3(abssm,    e208140, 2, (RF, RF_IF),     rd_rm),
cC3(abssz,    e208160, 2, (RF, RF_IF),     rd_rm),
cC3(absd,     e208180, 2, (RF, RF_IF),     rd_rm),
cC3(absdp,    e2081a0, 2, (RF, RF_IF),     rd_rm),
cC3(absdm,    e2081c0, 2, (RF, RF_IF),     rd_rm),
cC3(absdz,    e2081e0, 2, (RF, RF_IF),     rd_rm),
cC3(abse,     e288100, 2, (RF, RF_IF),     rd_rm),
cC3(absep,    e288120, 2, (RF, RF_IF),     rd_rm),
cC3(absem,    e288140, 2, (RF, RF_IF),     rd_rm),
cC3(absez,    e288160, 2, (RF, RF_IF),     rd_rm),
+
cC3(rnds,     e308100, 2, (RF, RF_IF),     rd_rm),
cC3(rndsp,    e308120, 2, (RF, RF_IF),     rd_rm),
cC3(rndsm,    e308140, 2, (RF, RF_IF),     rd_rm),
cC3(rndsz,    e308160, 2, (RF, RF_IF),     rd_rm),
cC3(rndd,     e308180, 2, (RF, RF_IF),     rd_rm),
cC3(rnddp,    e3081a0, 2, (RF, RF_IF),     rd_rm),
cC3(rnddm,    e3081c0, 2, (RF, RF_IF),     rd_rm),
cC3(rnddz,    e3081e0, 2, (RF, RF_IF),     rd_rm),
cC3(rnde,     e388100, 2, (RF, RF_IF),     rd_rm),
cC3(rndep,    e388120, 2, (RF, RF_IF),     rd_rm),
cC3(rndem,    e388140, 2, (RF, RF_IF),     rd_rm),
cC3(rndez,    e388160, 2, (RF, RF_IF),     rd_rm),
+
cC3(sqts,     e408100, 2, (RF, RF_IF),     rd_rm),
cC3(sqtsp,    e408120, 2, (RF, RF_IF),     rd_rm),
cC3(sqtsm,    e408140, 2, (RF, RF_IF),     rd_rm),
cC3(sqtsz,    e408160, 2, (RF, RF_IF),     rd_rm),
cC3(sqtd,     e408180, 2, (RF, RF_IF),     rd_rm),
cC3(sqtdp,    e4081a0, 2, (RF, RF_IF),     rd_rm),
cC3(sqtdm,    e4081c0, 2, (RF, RF_IF),     rd_rm),
cC3(sqtdz,    e4081e0, 2, (RF, RF_IF),     rd_rm),
cC3(sqte,     e488100, 2, (RF, RF_IF),     rd_rm),
cC3(sqtep,    e488120, 2, (RF, RF_IF),     rd_rm),
cC3(sqtem,    e488140, 2, (RF, RF_IF),     rd_rm),
cC3(sqtez,    e488160, 2, (RF, RF_IF),     rd_rm),
+
cC3(logs,     e508100, 2, (RF, RF_IF),     rd_rm),
cC3(logsp,    e508120, 2, (RF, RF_IF),     rd_rm),
cC3(logsm,    e508140, 2, (RF, RF_IF),     rd_rm),
cC3(logsz,    e508160, 2, (RF, RF_IF),     rd_rm),
cC3(logd,     e508180, 2, (RF, RF_IF),     rd_rm),
cC3(logdp,    e5081a0, 2, (RF, RF_IF),     rd_rm),
cC3(logdm,    e5081c0, 2, (RF, RF_IF),     rd_rm),
cC3(logdz,    e5081e0, 2, (RF, RF_IF),     rd_rm),
cC3(loge,     e588100, 2, (RF, RF_IF),     rd_rm),
cC3(logep,    e588120, 2, (RF, RF_IF),     rd_rm),
cC3(logem,    e588140, 2, (RF, RF_IF),     rd_rm),
cC3(logez,    e588160, 2, (RF, RF_IF),     rd_rm),
+
cC3(lgns,     e608100, 2, (RF, RF_IF),     rd_rm),
cC3(lgnsp,    e608120, 2, (RF, RF_IF),     rd_rm),
cC3(lgnsm,    e608140, 2, (RF, RF_IF),     rd_rm),
cC3(lgnsz,    e608160, 2, (RF, RF_IF),     rd_rm),
cC3(lgnd,     e608180, 2, (RF, RF_IF),     rd_rm),
cC3(lgndp,    e6081a0, 2, (RF, RF_IF),     rd_rm),
cC3(lgndm,    e6081c0, 2, (RF, RF_IF),     rd_rm),
cC3(lgndz,    e6081e0, 2, (RF, RF_IF),     rd_rm),
cC3(lgne,     e688100, 2, (RF, RF_IF),     rd_rm),
cC3(lgnep,    e688120, 2, (RF, RF_IF),     rd_rm),
cC3(lgnem,    e688140, 2, (RF, RF_IF),     rd_rm),
cC3(lgnez,    e688160, 2, (RF, RF_IF),     rd_rm),
+
cC3(exps,     e708100, 2, (RF, RF_IF),     rd_rm),
cC3(expsp,    e708120, 2, (RF, RF_IF),     rd_rm),
cC3(expsm,    e708140, 2, (RF, RF_IF),     rd_rm),
cC3(expsz,    e708160, 2, (RF, RF_IF),     rd_rm),
cC3(expd,     e708180, 2, (RF, RF_IF),     rd_rm),
cC3(expdp,    e7081a0, 2, (RF, RF_IF),     rd_rm),
cC3(expdm,    e7081c0, 2, (RF, RF_IF),     rd_rm),
cC3(expdz,    e7081e0, 2, (RF, RF_IF),     rd_rm),
cC3(expe,     e788100, 2, (RF, RF_IF),     rd_rm),
cC3(expep,    e788120, 2, (RF, RF_IF),     rd_rm),
cC3(expem,    e788140, 2, (RF, RF_IF),     rd_rm),
cC3(expdz,    e788160, 2, (RF, RF_IF),     rd_rm),
+
cC3(sins,     e808100, 2, (RF, RF_IF),     rd_rm),
cC3(sinsp,    e808120, 2, (RF, RF_IF),     rd_rm),
cC3(sinsm,    e808140, 2, (RF, RF_IF),     rd_rm),
cC3(sinsz,    e808160, 2, (RF, RF_IF),     rd_rm),
cC3(sind,     e808180, 2, (RF, RF_IF),     rd_rm),
cC3(sindp,    e8081a0, 2, (RF, RF_IF),     rd_rm),
cC3(sindm,    e8081c0, 2, (RF, RF_IF),     rd_rm),
cC3(sindz,    e8081e0, 2, (RF, RF_IF),     rd_rm),
cC3(sine,     e888100, 2, (RF, RF_IF),     rd_rm),
cC3(sinep,    e888120, 2, (RF, RF_IF),     rd_rm),
cC3(sinem,    e888140, 2, (RF, RF_IF),     rd_rm),
cC3(sinez,    e888160, 2, (RF, RF_IF),     rd_rm),
+
cC3(coss,     e908100, 2, (RF, RF_IF),     rd_rm),
cC3(cossp,    e908120, 2, (RF, RF_IF),     rd_rm),
cC3(cossm,    e908140, 2, (RF, RF_IF),     rd_rm),
cC3(cossz,    e908160, 2, (RF, RF_IF),     rd_rm),
cC3(cosd,     e908180, 2, (RF, RF_IF),     rd_rm),
cC3(cosdp,    e9081a0, 2, (RF, RF_IF),     rd_rm),
cC3(cosdm,    e9081c0, 2, (RF, RF_IF),     rd_rm),
cC3(cosdz,    e9081e0, 2, (RF, RF_IF),     rd_rm),
cC3(cose,     e988100, 2, (RF, RF_IF),     rd_rm),
cC3(cosep,    e988120, 2, (RF, RF_IF),     rd_rm),
cC3(cosem,    e988140, 2, (RF, RF_IF),     rd_rm),
cC3(cosez,    e988160, 2, (RF, RF_IF),     rd_rm),
+
cC3(tans,     ea08100, 2, (RF, RF_IF),     rd_rm),
cC3(tansp,    ea08120, 2, (RF, RF_IF),     rd_rm),
cC3(tansm,    ea08140, 2, (RF, RF_IF),     rd_rm),
cC3(tansz,    ea08160, 2, (RF, RF_IF),     rd_rm),
cC3(tand,     ea08180, 2, (RF, RF_IF),     rd_rm),
cC3(tandp,    ea081a0, 2, (RF, RF_IF),     rd_rm),
cC3(tandm,    ea081c0, 2, (RF, RF_IF),     rd_rm),
cC3(tandz,    ea081e0, 2, (RF, RF_IF),     rd_rm),
cC3(tane,     ea88100, 2, (RF, RF_IF),     rd_rm),
cC3(tanep,    ea88120, 2, (RF, RF_IF),     rd_rm),
cC3(tanem,    ea88140, 2, (RF, RF_IF),     rd_rm),
cC3(tanez,    ea88160, 2, (RF, RF_IF),     rd_rm),
+
cC3(asns,     eb08100, 2, (RF, RF_IF),     rd_rm),
cC3(asnsp,    eb08120, 2, (RF, RF_IF),     rd_rm),
cC3(asnsm,    eb08140, 2, (RF, RF_IF),     rd_rm),
cC3(asnsz,    eb08160, 2, (RF, RF_IF),     rd_rm),
cC3(asnd,     eb08180, 2, (RF, RF_IF),     rd_rm),
cC3(asndp,    eb081a0, 2, (RF, RF_IF),     rd_rm),
cC3(asndm,    eb081c0, 2, (RF, RF_IF),     rd_rm),
cC3(asndz,    eb081e0, 2, (RF, RF_IF),     rd_rm),
cC3(asne,     eb88100, 2, (RF, RF_IF),     rd_rm),
cC3(asnep,    eb88120, 2, (RF, RF_IF),     rd_rm),
cC3(asnem,    eb88140, 2, (RF, RF_IF),     rd_rm),
cC3(asnez,    eb88160, 2, (RF, RF_IF),     rd_rm),
+
cC3(acss,     ec08100, 2, (RF, RF_IF),     rd_rm),
cC3(acssp,    ec08120, 2, (RF, RF_IF),     rd_rm),
cC3(acssm,    ec08140, 2, (RF, RF_IF),     rd_rm),
cC3(acssz,    ec08160, 2, (RF, RF_IF),     rd_rm),
cC3(acsd,     ec08180, 2, (RF, RF_IF),     rd_rm),
cC3(acsdp,    ec081a0, 2, (RF, RF_IF),     rd_rm),
cC3(acsdm,    ec081c0, 2, (RF, RF_IF),     rd_rm),
cC3(acsdz,    ec081e0, 2, (RF, RF_IF),     rd_rm),
cC3(acse,     ec88100, 2, (RF, RF_IF),     rd_rm),
cC3(acsep,    ec88120, 2, (RF, RF_IF),     rd_rm),
cC3(acsem,    ec88140, 2, (RF, RF_IF),     rd_rm),
cC3(acsez,    ec88160, 2, (RF, RF_IF),     rd_rm),
+
cC3(atns,     ed08100, 2, (RF, RF_IF),     rd_rm),
cC3(atnsp,    ed08120, 2, (RF, RF_IF),     rd_rm),
cC3(atnsm,    ed08140, 2, (RF, RF_IF),     rd_rm),
cC3(atnsz,    ed08160, 2, (RF, RF_IF),     rd_rm),
cC3(atnd,     ed08180, 2, (RF, RF_IF),     rd_rm),
cC3(atndp,    ed081a0, 2, (RF, RF_IF),     rd_rm),
cC3(atndm,    ed081c0, 2, (RF, RF_IF),     rd_rm),
cC3(atndz,    ed081e0, 2, (RF, RF_IF),     rd_rm),
cC3(atne,     ed88100, 2, (RF, RF_IF),     rd_rm),
cC3(atnep,    ed88120, 2, (RF, RF_IF),     rd_rm),
cC3(atnem,    ed88140, 2, (RF, RF_IF),     rd_rm),
cC3(atnez,    ed88160, 2, (RF, RF_IF),     rd_rm),
+
cC3(urds,     ee08100, 2, (RF, RF_IF),     rd_rm),
cC3(urdsp,    ee08120, 2, (RF, RF_IF),     rd_rm),
cC3(urdsm,    ee08140, 2, (RF, RF_IF),     rd_rm),
cC3(urdsz,    ee08160, 2, (RF, RF_IF),     rd_rm),
cC3(urdd,     ee08180, 2, (RF, RF_IF),     rd_rm),
cC3(urddp,    ee081a0, 2, (RF, RF_IF),     rd_rm),
cC3(urddm,    ee081c0, 2, (RF, RF_IF),     rd_rm),
cC3(urddz,    ee081e0, 2, (RF, RF_IF),     rd_rm),
cC3(urde,     ee88100, 2, (RF, RF_IF),     rd_rm),
cC3(urdep,    ee88120, 2, (RF, RF_IF),     rd_rm),
cC3(urdem,    ee88140, 2, (RF, RF_IF),     rd_rm),
cC3(urdez,    ee88160, 2, (RF, RF_IF),     rd_rm),
+
cC3(nrms,     ef08100, 2, (RF, RF_IF),     rd_rm),
cC3(nrmsp,    ef08120, 2, (RF, RF_IF),     rd_rm),
cC3(nrmsm,    ef08140, 2, (RF, RF_IF),     rd_rm),
cC3(nrmsz,    ef08160, 2, (RF, RF_IF),     rd_rm),
cC3(nrmd,     ef08180, 2, (RF, RF_IF),     rd_rm),
cC3(nrmdp,    ef081a0, 2, (RF, RF_IF),     rd_rm),
cC3(nrmdm,    ef081c0, 2, (RF, RF_IF),     rd_rm),
cC3(nrmdz,    ef081e0, 2, (RF, RF_IF),     rd_rm),
cC3(nrme,     ef88100, 2, (RF, RF_IF),     rd_rm),
cC3(nrmep,    ef88120, 2, (RF, RF_IF),     rd_rm),
cC3(nrmem,    ef88140, 2, (RF, RF_IF),     rd_rm),
cC3(nrmez,    ef88160, 2, (RF, RF_IF),     rd_rm),
+
cC3(adfs,     e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfsp,    e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfsm,    e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfsz,    e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfd,     e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfdp,    e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfdm,    e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfdz,    e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfe,     e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfep,    e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfem,    e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(adfez,    e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(sufs,     e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufsp,    e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufsm,    e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufsz,    e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufd,     e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufdp,    e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufdm,    e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufdz,    e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufe,     e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufep,    e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufem,    e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(sufez,    e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(rsfs,     e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfsp,    e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfsm,    e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfsz,    e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfd,     e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfdp,    e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfdm,    e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfdz,    e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfe,     e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfep,    e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfem,    e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rsfez,    e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(mufs,     e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufsp,    e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufsm,    e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufsz,    e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufd,     e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufdp,    e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufdm,    e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufdz,    e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufe,     e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufep,    e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufem,    e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(mufez,    e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(dvfs,     e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfsp,    e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfsm,    e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfsz,    e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfd,     e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfdp,    e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfdm,    e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfdz,    e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfe,     e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfep,    e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfem,    e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(dvfez,    e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(rdfs,     e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfsp,    e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfsm,    e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfsz,    e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfd,     e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfdp,    e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfdm,    e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfdz,    e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfe,     e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfep,    e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfem,    e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rdfez,    e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(pows,     e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powsp,    e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powsm,    e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powsz,    e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powd,     e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powdp,    e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powdm,    e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powdz,    e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powe,     e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powep,    e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powem,    e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(powez,    e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(rpws,     e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwsp,    e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwsm,    e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwsz,    e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwd,     e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwdp,    e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwdm,    e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwdz,    e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwe,     e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwep,    e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwem,    e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rpwez,    e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(rmfs,     e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfsp,    e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfsm,    e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfsz,    e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfd,     e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfdp,    e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfdm,    e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfdz,    e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfe,     e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfep,    e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfem,    e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(rmfez,    e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(fmls,     e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmlsp,    e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmlsm,    e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmlsz,    e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmld,     e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmldp,    e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmldm,    e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmldz,    e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmle,     e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmlep,    e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmlem,    e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fmlez,    e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(fdvs,     ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvsp,    ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvsm,    ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvsz,    ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvd,     ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvdp,    ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvdm,    ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvdz,    ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdve,     ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvep,    ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvem,    ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(fdvez,    ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(frds,     eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frdsp,    eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frdsm,    eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frdsz,    eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frdd,     eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frddp,    eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frddm,    eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frddz,    eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frde,     eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frdep,    eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frdem,    eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(frdez,    eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cC3(pols,     ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(polsp,    ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(polsm,    ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(polsz,    ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(pold,     ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(poldp,    ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(poldm,    ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(poldz,    ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(pole,     ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(polep,    ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(polem,    ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
cC3(polez,    ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
+
cCE(cmf,      e90f110, 2, (RF, RF_IF),     fpa_cmp),
  C3E(cmfe,     ed0f110, 2, (RF, RF_IF),     fpa_cmp),
 CE(cnf,      eb0f110, 2, (RF, RF_IF),     fpa_cmp),
cCE(cnf,      eb0f110, 2, (RF, RF_IF),     fpa_cmp),
  C3E(cnfe,     ef0f110, 2, (RF, RF_IF),     fpa_cmp),
 
 C3(flts,     e000110, 2, (RF, RR),        rn_rd),
 C3(fltsp,    e000130, 2, (RF, RR),        rn_rd),
 C3(fltsm,    e000150, 2, (RF, RR),        rn_rd),
 C3(fltsz,    e000170, 2, (RF, RR),        rn_rd),
 C3(fltd,     e000190, 2, (RF, RR),        rn_rd),
 C3(fltdp,    e0001b0, 2, (RF, RR),        rn_rd),
 C3(fltdm,    e0001d0, 2, (RF, RR),        rn_rd),
 C3(fltdz,    e0001f0, 2, (RF, RR),        rn_rd),
 C3(flte,     e080110, 2, (RF, RR),        rn_rd),
 C3(fltep,    e080130, 2, (RF, RR),        rn_rd),
 C3(fltem,    e080150, 2, (RF, RR),        rn_rd),
 C3(fltez,    e080170, 2, (RF, RR),        rn_rd),
cC3(flts,     e000110, 2, (RF, RR),        rn_rd),
cC3(fltsp,    e000130, 2, (RF, RR),        rn_rd),
cC3(fltsm,    e000150, 2, (RF, RR),        rn_rd),
cC3(fltsz,    e000170, 2, (RF, RR),        rn_rd),
cC3(fltd,     e000190, 2, (RF, RR),        rn_rd),
cC3(fltdp,    e0001b0, 2, (RF, RR),        rn_rd),
cC3(fltdm,    e0001d0, 2, (RF, RR),        rn_rd),
cC3(fltdz,    e0001f0, 2, (RF, RR),        rn_rd),
cC3(flte,     e080110, 2, (RF, RR),        rn_rd),
cC3(fltep,    e080130, 2, (RF, RR),        rn_rd),
cC3(fltem,    e080150, 2, (RF, RR),        rn_rd),
cC3(fltez,    e080170, 2, (RF, RR),        rn_rd),
 
   /* The implementation of the FIX instruction is broken on some
      assemblers, in that it accepts a precision specifier as well as a
      rounding specifier, despite the fact that this is meaningless.
      To be more compatible, we accept it as well, though of course it
      does not set any bits.  */
 CE(fix,      e100110, 2, (RR, RF),        rd_rm),
 C3(fixp,     e100130, 2, (RR, RF),        rd_rm),
 C3(fixm,     e100150, 2, (RR, RF),        rd_rm),
 C3(fixz,     e100170, 2, (RR, RF),        rd_rm),
 C3(fixsp,    e100130, 2, (RR, RF),        rd_rm),
 C3(fixsm,    e100150, 2, (RR, RF),        rd_rm),
 C3(fixsz,    e100170, 2, (RR, RF),        rd_rm),
 C3(fixdp,    e100130, 2, (RR, RF),        rd_rm),
 C3(fixdm,    e100150, 2, (RR, RF),        rd_rm),
 C3(fixdz,    e100170, 2, (RR, RF),        rd_rm),
 C3(fixep,    e100130, 2, (RR, RF),        rd_rm),
 C3(fixem,    e100150, 2, (RR, RF),        rd_rm),
 C3(fixez,    e100170, 2, (RR, RF),        rd_rm),
cCE(fix,      e100110, 2, (RR, RF),        rd_rm),
cC3(fixp,     e100130, 2, (RR, RF),        rd_rm),
cC3(fixm,     e100150, 2, (RR, RF),        rd_rm),
cC3(fixz,     e100170, 2, (RR, RF),        rd_rm),
cC3(fixsp,    e100130, 2, (RR, RF),        rd_rm),
cC3(fixsm,    e100150, 2, (RR, RF),        rd_rm),
cC3(fixsz,    e100170, 2, (RR, RF),        rd_rm),
cC3(fixdp,    e100130, 2, (RR, RF),        rd_rm),
cC3(fixdm,    e100150, 2, (RR, RF),        rd_rm),
cC3(fixdz,    e100170, 2, (RR, RF),        rd_rm),
cC3(fixep,    e100130, 2, (RR, RF),        rd_rm),
cC3(fixem,    e100150, 2, (RR, RF),        rd_rm),
cC3(fixez,    e100170, 2, (RR, RF),        rd_rm),
 
   /* Instructions that were new with the real FPA, call them V2.  */
 #undef ARM_VARIANT
 #define ARM_VARIANT FPU_FPA_EXT_V2
 CE(lfm,      c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
 C3(lfmfd,    c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
 C3(lfmea,    d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
 CE(sfm,      c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
 C3(sfmfd,    d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
 C3(sfmea,    c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
cCE(lfm,      c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
cC3(lfmfd,    c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
cC3(lfmea,    d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
cCE(sfm,      c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
cC3(sfmfd,    d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
cC3(sfmea,    c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
 
 #undef ARM_VARIANT
 #define ARM_VARIANT FPU_VFP_EXT_V1xD  /* VFP V1xD (single precision).  */
   /* Moves and type conversions.  */
 CE(fcpys,    eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(fmrs,     e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
 CE(fmsr,     e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
 CE(fmstat,   ef1fa10, 0, (),               noargs),
 CE(fsitos,   eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(fuitos,   eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(ftosis,   ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(ftosizs,  ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(ftouis,   ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(ftouizs,  ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(fmrx,     ef00a10, 2, (RR, RVC),        rd_rn),
 CE(fmxr,     ee00a10, 2, (RVC, RR),        rn_rd),
cCE(fcpys,    eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(fmrs,     e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
cCE(fmsr,     e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
cCE(fmstat,   ef1fa10, 0, (),               noargs),
cCE(fsitos,   eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(fuitos,   eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(ftosis,   ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(ftosizs,  ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(ftouis,   ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(ftouizs,  ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(fmrx,     ef00a10, 2, (RR, RVC),        rd_rn),
cCE(fmxr,     ee00a10, 2, (RVC, RR),        rn_rd),
 
   /* Memory operations.         */
 CE(flds,     d100a00, 2, (RVS, ADDR),      vfp_sp_ldst),
 CE(fsts,     d000a00, 2, (RVS, ADDR),      vfp_sp_ldst),
 CE(fldmias,  c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
 CE(fldmfds,  c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
 CE(fldmdbs,  d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
 CE(fldmeas,  d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
 CE(fldmiax,  c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
 CE(fldmfdx,  c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
 CE(fldmdbx,  d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
 CE(fldmeax,  d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
 CE(fstmias,  c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
 CE(fstmeas,  c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
 CE(fstmdbs,  d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
 CE(fstmfds,  d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
 CE(fstmiax,  c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
 CE(fstmeax,  c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
 CE(fstmdbx,  d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
 CE(fstmfdx,  d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
cCE(flds,     d100a00, 2, (RVS, ADDR),      vfp_sp_ldst),
cCE(fsts,     d000a00, 2, (RVS, ADDR),      vfp_sp_ldst),
cCE(fldmias,  c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
cCE(fldmfds,  c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
cCE(fldmdbs,  d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
cCE(fldmeas,  d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
cCE(fldmiax,  c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
cCE(fldmfdx,  c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
cCE(fldmdbx,  d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
cCE(fldmeax,  d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
cCE(fstmias,  c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
cCE(fstmeas,  c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
cCE(fstmdbs,  d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
cCE(fstmfds,  d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
cCE(fstmiax,  c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
cCE(fstmeax,  c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
cCE(fstmdbx,  d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
cCE(fstmfdx,  d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
 
   /* Monadic operations.  */
 CE(fabss,    eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(fnegs,    eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(fsqrts,   eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(fabss,    eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(fnegs,    eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(fsqrts,   eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
 
   /* Dyadic operations.         */
 CE(fadds,    e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
 CE(fsubs,    e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
 CE(fmuls,    e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
 CE(fdivs,    e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
 CE(fmacs,    e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
 CE(fmscs,    e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
 CE(fnmuls,   e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
 CE(fnmacs,   e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
 CE(fnmscs,   e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
cCE(fadds,    e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
cCE(fsubs,    e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
cCE(fmuls,    e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
cCE(fdivs,    e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
cCE(fmacs,    e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
cCE(fmscs,    e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
cCE(fnmuls,   e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
cCE(fnmacs,   e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
cCE(fnmscs,   e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
 
   /* Comparisons.  */
 CE(fcmps,    eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(fcmpzs,   eb50a40, 1, (RVS),            vfp_sp_compare_z),
 CE(fcmpes,   eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
 CE(fcmpezs,  eb50ac0, 1, (RVS),            vfp_sp_compare_z),
cCE(fcmps,    eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(fcmpzs,   eb50a40, 1, (RVS),            vfp_sp_compare_z),
cCE(fcmpes,   eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
cCE(fcmpezs,  eb50ac0, 1, (RVS),            vfp_sp_compare_z),
 
 #undef ARM_VARIANT
 #define ARM_VARIANT FPU_VFP_EXT_V1 /* VFP V1 (Double precision).  */
   /* Moves and type conversions.  */
 CE(fcpyd,    eb00b40, 2, (RVD, RVD),       rd_rm),
 CE(fcvtds,   eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
 CE(fcvtsd,   eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
 CE(fmdhr,    e200b10, 2, (RVD, RR),        rn_rd),
 CE(fmdlr,    e000b10, 2, (RVD, RR),        rn_rd),
 CE(fmrdh,    e300b10, 2, (RR, RVD),        rd_rn),
 CE(fmrdl,    e100b10, 2, (RR, RVD),        rd_rn),
 CE(fsitod,   eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
 CE(fuitod,   eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
 CE(ftosid,   ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
 CE(ftosizd,  ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
 CE(ftouid,   ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
 CE(ftouizd,  ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
cCE(fcpyd,    eb00b40, 2, (RVD, RVD),       rd_rm),
cCE(fcvtds,   eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
cCE(fcvtsd,   eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
cCE(fmdhr,    e200b10, 2, (RVD, RR),        rn_rd),
cCE(fmdlr,    e000b10, 2, (RVD, RR),        rn_rd),
cCE(fmrdh,    e300b10, 2, (RR, RVD),        rd_rn),
cCE(fmrdl,    e100b10, 2, (RR, RVD),        rd_rn),
cCE(fsitod,   eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
cCE(fuitod,   eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
cCE(ftosid,   ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
cCE(ftosizd,  ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
cCE(ftouid,   ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
cCE(ftouizd,  ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
 
   /* Memory operations.         */
 CE(fldd,     d100b00, 2, (RVD, ADDR),      vfp_dp_ldst),
 CE(fstd,     d000b00, 2, (RVD, ADDR),      vfp_dp_ldst),
 CE(fldmiad,  c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
 CE(fldmfdd,  c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
 CE(fldmdbd,  d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
 CE(fldmead,  d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
 CE(fstmiad,  c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
 CE(fstmead,  c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
 CE(fstmdbd,  d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
 CE(fstmfdd,  d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
cCE(fldd,     d100b00, 2, (RVD, ADDR),      vfp_dp_ldst),
cCE(fstd,     d000b00, 2, (RVD, ADDR),      vfp_dp_ldst),
cCE(fldmiad,  c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
cCE(fldmfdd,  c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
cCE(fldmdbd,  d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
cCE(fldmead,  d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
cCE(fstmiad,  c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
cCE(fstmead,  c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
cCE(fstmdbd,  d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
cCE(fstmfdd,  d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
 
   /* Monadic operations.  */
 CE(fabsd,    eb00bc0, 2, (RVD, RVD),       rd_rm),
 CE(fnegd,    eb10b40, 2, (RVD, RVD),       rd_rm),
 CE(fsqrtd,   eb10bc0, 2, (RVD, RVD),       rd_rm),
cCE(fabsd,    eb00bc0, 2, (RVD, RVD),       rd_rm),
cCE(fnegd,    eb10b40, 2, (RVD, RVD),       rd_rm),
cCE(fsqrtd,   eb10bc0, 2, (RVD, RVD),       rd_rm),
 
   /* Dyadic operations.         */
 CE(faddd,    e300b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
 CE(fsubd,    e300b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
 CE(fmuld,    e200b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
 CE(fdivd,    e800b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
 CE(fmacd,    e000b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
 CE(fmscd,    e100b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
 CE(fnmuld,   e200b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
 CE(fnmacd,   e000b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
 CE(fnmscd,   e100b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
cCE(faddd,    e300b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
cCE(fsubd,    e300b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
cCE(fmuld,    e200b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
cCE(fdivd,    e800b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
cCE(fmacd,    e000b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
cCE(fmscd,    e100b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
cCE(fnmuld,   e200b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
cCE(fnmacd,   e000b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
cCE(fnmscd,   e100b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
 
   /* Comparisons.  */
 CE(fcmpd,    eb40b40, 2, (RVD, RVD),       rd_rm),
 CE(fcmpzd,   eb50b40, 1, (RVD),            rd),
 CE(fcmped,   eb40bc0, 2, (RVD, RVD),       rd_rm),
 CE(fcmpezd,  eb50bc0, 1, (RVD),            rd),
cCE(fcmpd,    eb40b40, 2, (RVD, RVD),       rd_rm),
cCE(fcmpzd,   eb50b40, 1, (RVD),            rd),
cCE(fcmped,   eb40bc0, 2, (RVD, RVD),       rd_rm),
cCE(fcmpezd,  eb50bc0, 1, (RVD),            rd),
 
 #undef ARM_VARIANT
 #define ARM_VARIANT FPU_VFP_EXT_V2
 CE(fmsrr,    c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
 CE(fmrrs,    c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
 CE(fmdrr,    c400b10, 3, (RVD, RR, RR),    rm_rd_rn),
 CE(fmrrd,    c500b10, 3, (RR, RR, RVD),    rd_rn_rm),
cCE(fmsrr,    c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
cCE(fmrrs,    c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
cCE(fmdrr,    c400b10, 3, (RVD, RR, RR),    rm_rd_rn),
cCE(fmrrd,    c500b10, 3, (RR, RR, RVD),    rd_rn_rm),
 
 #undef ARM_VARIANT
 #define ARM_VARIANT ARM_CEXT_XSCALE /* Intel XScale extensions.         */
 CE(mia,      e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
 CE(miaph,    e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
 CE(miabb,    e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
 CE(miabt,    e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
 CE(miatb,    e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
 CE(miatt,    e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
 CE(mar,      c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
 CE(mra,      c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
cCE(mia,      e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
cCE(miaph,    e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
cCE(miabb,    e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
cCE(miabt,    e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
cCE(miatb,    e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
cCE(miatt,    e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
cCE(mar,      c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
cCE(mra,      c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
 
 #undef ARM_VARIANT
 #define ARM_VARIANT ARM_CEXT_IWMMXT /* Intel Wireless MMX technology.  */
 CE(tandcb,   e13f130, 1, (RR),                   iwmmxt_tandorc),
 CE(tandch,   e53f130, 1, (RR),                   iwmmxt_tandorc),
 CE(tandcw,   e93f130, 1, (RR),                   iwmmxt_tandorc),
 CE(tbcstb,   e400010, 2, (RIWR, RR),             rn_rd),
 CE(tbcsth,   e400050, 2, (RIWR, RR),             rn_rd),
 CE(tbcstw,   e400090, 2, (RIWR, RR),             rn_rd),
 CE(textrcb,  e130170, 2, (RR, I7),               iwmmxt_textrc),
 CE(textrch,  e530170, 2, (RR, I7),               iwmmxt_textrc),
 CE(textrcw,  e930170, 2, (RR, I7),               iwmmxt_textrc),
 CE(textrmub, e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
 CE(textrmuh, e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
 CE(textrmuw, e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
 CE(textrmsb, e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
 CE(textrmsh, e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
 CE(textrmsw, e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
 CE(tinsrb,   e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
 CE(tinsrh,   e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
 CE(tinsrw,   e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
 CE(tmcr,     e000110, 2, (RIWC, RR),             rn_rd),
 CE(tmcrr,    c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
 CE(tmia,     e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
 CE(tmiaph,   e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
 CE(tmiabb,   e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
 CE(tmiabt,   e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
 CE(tmiatb,   e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
 CE(tmiatt,   e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
 CE(tmovmskb, e100030, 2, (RR, RIWR),             rd_rn),
 CE(tmovmskh, e500030, 2, (RR, RIWR),             rd_rn),
 CE(tmovmskw, e900030, 2, (RR, RIWR),             rd_rn),
 CE(tmrc,     e100110, 2, (RR, RIWC),             rd_rn),
 CE(tmrrc,    c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
 CE(torcb,    e13f150, 1, (RR),                   iwmmxt_tandorc),
 CE(torch,    e53f150, 1, (RR),                   iwmmxt_tandorc),
 CE(torcw,    e93f150, 1, (RR),                   iwmmxt_tandorc),
 CE(waccb,    e0001c0, 2, (RIWR, RIWR),           rd_rn),
 CE(wacch,    e4001c0, 2, (RIWR, RIWR),           rd_rn),
 CE(waccw,    e8001c0, 2, (RIWR, RIWR),           rd_rn),
 CE(waddbss,  e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(waddb,    e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(waddbus,  e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(waddhss,  e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(waddh,    e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(waddhus,  e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(waddwss,  eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(waddw,    e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(waddwus,  e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(waligni,  e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
 CE(walignr0, e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(walignr1, e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(walignr2, ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(walignr3, eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wand,     e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wandn,    e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wavg2b,   e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wavg2br,  e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wavg2h,   ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wavg2hr,  ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wcmpeqb,  e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wcmpeqh,  e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wcmpeqw,  e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wcmpgtub, e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wcmpgtuh, e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wcmpgtuw, e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wcmpgtsb, e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wcmpgtsh, e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wcmpgtsw, eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wldrb,    c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
 CE(wldrh,    c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
 CE(wldrw,    c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
 CE(wldrd,    c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
 CE(wmacs,    e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmacsz,   e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmacu,    e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmacuz,   e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmadds,   ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmaddu,   e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmaxsb,   e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmaxsh,   e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmaxsw,   ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmaxub,   e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmaxuh,   e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmaxuw,   e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wminsb,   e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wminsh,   e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wminsw,   eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wminub,   e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wminuh,   e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wminuw,   e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmov,     e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
 CE(wmulsm,   e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmulsl,   e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmulum,   e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wmulul,   e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wor,      e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wpackhss, e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wpackhus, e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wpackwss, eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wpackwus, e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wpackdss, ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wpackdus, ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wrorh,    e700040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wrorhg,   e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wrorw,    eb00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wrorwg,   eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wrord,    ef00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wrordg,   ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wsadb,    e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsadbz,   e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsadh,    e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsadhz,   e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wshufh,   e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
 CE(wsllh,    e500040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsllhg,   e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wsllw,    e900040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsllwg,   e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wslld,    ed00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wslldg,   ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wsrah,    e400040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsrahg,   e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wsraw,    e800040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsrawg,   e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wsrad,    ec00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsradg,   ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wsrlh,    e600040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsrlhg,   e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wsrlw,    ea00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsrlwg,   ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wsrld,    ee00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsrldg,   ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
 CE(wstrb,    c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
 CE(wstrh,    c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
 CE(wstrw,    c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
 CE(wstrd,    c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
 CE(wsubbss,  e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsubb,    e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsubbus,  e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsubhss,  e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsubh,    e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsubhus,  e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsubwss,  eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsubw,    e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wsubwus,  e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wunpckehub,e0000c0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckehuh,e4000c0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckehuw,e8000c0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckehsb,e2000c0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckehsh,e6000c0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckehsw,ea000c0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckihb, e1000c0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
 CE(wunpckihh, e5000c0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
 CE(wunpckihw, e9000c0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
 CE(wunpckelub,e0000e0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckeluh,e4000e0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckeluw,e8000e0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckelsb,e2000e0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckelsh,e6000e0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckelsw,ea000e0, 2, (RIWR, RIWR),          rd_rn),
 CE(wunpckilb, e1000e0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
 CE(wunpckilh, e5000e0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
 CE(wunpckilw, e9000e0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
 CE(wxor,     e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
 CE(wzero,    e300000, 1, (RIWR),                 iwmmxt_wzero),
cCE(tandcb,   e13f130, 1, (RR),                   iwmmxt_tandorc),
cCE(tandch,   e53f130, 1, (RR),                   iwmmxt_tandorc),
cCE(tandcw,   e93f130, 1, (RR),                   iwmmxt_tandorc),
cCE(tbcstb,   e400010, 2, (RIWR, RR),             rn_rd),
cCE(tbcsth,   e400050, 2, (RIWR, RR),             rn_rd),
cCE(tbcstw,   e400090, 2, (RIWR, RR),             rn_rd),
cCE(textrcb,  e130170, 2, (RR, I7),               iwmmxt_textrc),
cCE(textrch,  e530170, 2, (RR, I7),               iwmmxt_textrc),
cCE(textrcw,  e930170, 2, (RR, I7),               iwmmxt_textrc),
cCE(textrmub, e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
cCE(textrmuh, e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
cCE(textrmuw, e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
cCE(textrmsb, e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
cCE(textrmsh, e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
cCE(textrmsw, e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
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(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),
cCE(tmiabb,   e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
cCE(tmiabt,   e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
cCE(tmiatb,   e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
cCE(tmiatt,   e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
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(tmrrc,    c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
cCE(torcb,    e13f150, 1, (RR),                   iwmmxt_tandorc),
cCE(torch,    e53f150, 1, (RR),                   iwmmxt_tandorc),
cCE(torcw,    e93f150, 1, (RR),                   iwmmxt_tandorc),
cCE(waccb,    e0001c0, 2, (RIWR, RIWR),           rd_rn),
cCE(wacch,    e4001c0, 2, (RIWR, RIWR),           rd_rn),
cCE(waccw,    e8001c0, 2, (RIWR, RIWR),           rd_rn),
cCE(waddbss,  e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(waddb,    e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(waddbus,  e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(waddhss,  e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(waddh,    e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(waddhus,  e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(waddwss,  eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(waddw,    e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(waddwus,  e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(waligni,  e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
cCE(walignr0, e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(walignr1, e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(walignr2, ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(walignr3, eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wand,     e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wandn,    e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wavg2b,   e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wavg2br,  e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wavg2h,   ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wavg2hr,  ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wcmpeqb,  e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wcmpeqh,  e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wcmpeqw,  e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wcmpgtub, e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wcmpgtuh, e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wcmpgtuw, e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wcmpgtsb, e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wcmpgtsh, e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wcmpgtsw, eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wldrb,    c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
cCE(wldrh,    c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
cCE(wldrw,    c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
cCE(wldrd,    c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
cCE(wmacs,    e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmacsz,   e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmacu,    e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmacuz,   e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmadds,   ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmaddu,   e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmaxsb,   e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmaxsh,   e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmaxsw,   ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmaxub,   e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmaxuh,   e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmaxuw,   e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wminsb,   e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wminsh,   e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wminsw,   eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wminub,   e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wminuh,   e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wminuw,   e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmov,     e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
cCE(wmulsm,   e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmulsl,   e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmulum,   e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wmulul,   e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wor,      e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wpackhss, e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wpackhus, e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wpackwss, eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wpackwus, e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wpackdss, ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wpackdus, ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wrorh,    e700040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wrorhg,   e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wrorw,    eb00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wrorwg,   eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wrord,    ef00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wrordg,   ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wsadb,    e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsadbz,   e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsadh,    e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsadhz,   e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wshufh,   e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
cCE(wsllh,    e500040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsllhg,   e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wsllw,    e900040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsllwg,   e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wslld,    ed00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wslldg,   ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wsrah,    e400040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsrahg,   e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wsraw,    e800040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsrawg,   e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wsrad,    ec00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsradg,   ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wsrlh,    e600040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsrlhg,   e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wsrlw,    ea00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsrlwg,   ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wsrld,    ee00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsrldg,   ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
cCE(wstrb,    c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
cCE(wstrh,    c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
cCE(wstrw,    c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
cCE(wstrd,    c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
cCE(wsubbss,  e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsubb,    e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsubbus,  e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsubhss,  e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsubh,    e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsubhus,  e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsubwss,  eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsubw,    e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wsubwus,  e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wunpckehub,e0000c0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckehuh,e4000c0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckehuw,e8000c0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckehsb,e2000c0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckehsh,e6000c0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckehsw,ea000c0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckihb, e1000c0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
cCE(wunpckihh, e5000c0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
cCE(wunpckihw, e9000c0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
cCE(wunpckelub,e0000e0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckeluh,e4000e0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckeluw,e8000e0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckelsb,e2000e0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckelsh,e6000e0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckelsw,ea000e0, 2, (RIWR, RIWR),          rd_rn),
cCE(wunpckilb, e1000e0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
cCE(wunpckilh, e5000e0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
cCE(wunpckilw, e9000e0, 3, (RIWR, RIWR, RIWR),            rd_rn_rm),
cCE(wxor,     e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
cCE(wzero,    e300000, 1, (RIWR),                 iwmmxt_wzero),
 
 #undef ARM_VARIANT
 #define ARM_VARIANT ARM_CEXT_MAVERICK /* Cirrus Maverick instructions. */
 CE(cfldrs,   c100400, 2, (RMF, ADDR),              rd_cpaddr),
 CE(cfldrd,   c500400, 2, (RMD, ADDR),              rd_cpaddr),
 CE(cfldr32,  c100500, 2, (RMFX, ADDR),             rd_cpaddr),
 CE(cfldr64,  c500500, 2, (RMDX, ADDR),             rd_cpaddr),
 CE(cfstrs,   c000400, 2, (RMF, ADDR),              rd_cpaddr),
 CE(cfstrd,   c400400, 2, (RMD, ADDR),              rd_cpaddr),
 CE(cfstr32,  c000500, 2, (RMFX, ADDR),             rd_cpaddr),
 CE(cfstr64,  c400500, 2, (RMDX, ADDR),             rd_cpaddr),
 CE(cfmvsr,   e000450, 2, (RMF, RR),                rn_rd),
 CE(cfmvrs,   e100450, 2, (RR, RMF),                rd_rn),
 CE(cfmvdlr,  e000410, 2, (RMD, RR),                rn_rd),
 CE(cfmvrdl,  e100410, 2, (RR, RMD),                rd_rn),
 CE(cfmvdhr,  e000430, 2, (RMD, RR),                rn_rd),
 CE(cfmvrdh,  e100430, 2, (RR, RMD),                rd_rn),
 CE(cfmv64lr, e000510, 2, (RMDX, RR),               rn_rd),
 CE(cfmvr64l, e100510, 2, (RR, RMDX),               rd_rn),
 CE(cfmv64hr, e000530, 2, (RMDX, RR),               rn_rd),
 CE(cfmvr64h, e100530, 2, (RR, RMDX),               rd_rn),
 CE(cfmval32, e200440, 2, (RMAX, RMFX),             rd_rn),
 CE(cfmv32al, e100440, 2, (RMFX, RMAX),             rd_rn),
 CE(cfmvam32, e200460, 2, (RMAX, RMFX),             rd_rn),
 CE(cfmv32am, e100460, 2, (RMFX, RMAX),             rd_rn),
 CE(cfmvah32, e200480, 2, (RMAX, RMFX),             rd_rn),
 CE(cfmv32ah, e100480, 2, (RMFX, RMAX),             rd_rn),
 CE(cfmva32,  e2004a0, 2, (RMAX, RMFX),             rd_rn),
 CE(cfmv32a,  e1004a0, 2, (RMFX, RMAX),             rd_rn),
 CE(cfmva64,  e2004c0, 2, (RMAX, RMDX),             rd_rn),
 CE(cfmv64a,  e1004c0, 2, (RMDX, RMAX),             rd_rn),
 CE(cfmvsc32, e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
 CE(cfmv32sc, e1004e0, 2, (RMDX, RMDS),             rd),
 CE(cfcpys,   e000400, 2, (RMF, RMF),               rd_rn),
 CE(cfcpyd,   e000420, 2, (RMD, RMD),               rd_rn),
 CE(cfcvtsd,  e000460, 2, (RMD, RMF),               rd_rn),
 CE(cfcvtds,  e000440, 2, (RMF, RMD),               rd_rn),
 CE(cfcvt32s, e000480, 2, (RMF, RMFX),              rd_rn),
 CE(cfcvt32d, e0004a0, 2, (RMD, RMFX),              rd_rn),
 CE(cfcvt64s, e0004c0, 2, (RMF, RMDX),              rd_rn),
 CE(cfcvt64d, e0004e0, 2, (RMD, RMDX),              rd_rn),
 CE(cfcvts32, e100580, 2, (RMFX, RMF),              rd_rn),
 CE(cfcvtd32, e1005a0, 2, (RMFX, RMD),              rd_rn),
 CE(cftruncs32,e1005c0, 2, (RMFX, RMF),             rd_rn),
 CE(cftruncd32,e1005e0, 2, (RMFX, RMD),             rd_rn),
 CE(cfrshl32, e000550, 3, (RMFX, RMFX, RR),         mav_triple),
 CE(cfrshl64, e000570, 3, (RMDX, RMDX, RR),         mav_triple),
 CE(cfsh32,   e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
 CE(cfsh64,   e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
 CE(cfcmps,   e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
 CE(cfcmpd,   e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
 CE(cfcmp32,  e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
 CE(cfcmp64,  e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
 CE(cfabss,   e300400, 2, (RMF, RMF),               rd_rn),
 CE(cfabsd,   e300420, 2, (RMD, RMD),               rd_rn),
 CE(cfnegs,   e300440, 2, (RMF, RMF),               rd_rn),
 CE(cfnegd,   e300460, 2, (RMD, RMD),               rd_rn),
 CE(cfadds,   e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
 CE(cfaddd,   e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
 CE(cfsubs,   e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
 CE(cfsubd,   e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
 CE(cfmuls,   e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
 CE(cfmuld,   e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
 CE(cfabs32,  e300500, 2, (RMFX, RMFX),             rd_rn),
 CE(cfabs64,  e300520, 2, (RMDX, RMDX),             rd_rn),
 CE(cfneg32,  e300540, 2, (RMFX, RMFX),             rd_rn),
 CE(cfneg64,  e300560, 2, (RMDX, RMDX),             rd_rn),
 CE(cfadd32,  e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
 CE(cfadd64,  e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
 CE(cfsub32,  e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
 CE(cfsub64,  e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
 CE(cfmul32,  e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
 CE(cfmul64,  e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
 CE(cfmac32,  e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
 CE(cfmsc32,  e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
 CE(cfmadd32, e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
 CE(cfmsub32, e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
 CE(cfmadda32, e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
 CE(cfmsuba32, e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
cCE(cfldrs,   c100400, 2, (RMF, ADDR),              rd_cpaddr),
cCE(cfldrd,   c500400, 2, (RMD, ADDR),              rd_cpaddr),
cCE(cfldr32,  c100500, 2, (RMFX, ADDR),             rd_cpaddr),
cCE(cfldr64,  c500500, 2, (RMDX, ADDR),             rd_cpaddr),
cCE(cfstrs,   c000400, 2, (RMF, ADDR),              rd_cpaddr),
cCE(cfstrd,   c400400, 2, (RMD, ADDR),              rd_cpaddr),
cCE(cfstr32,  c000500, 2, (RMFX, ADDR),             rd_cpaddr),
cCE(cfstr64,  c400500, 2, (RMDX, ADDR),             rd_cpaddr),
cCE(cfmvsr,   e000450, 2, (RMF, RR),                rn_rd),
cCE(cfmvrs,   e100450, 2, (RR, RMF),                rd_rn),
cCE(cfmvdlr,  e000410, 2, (RMD, RR),                rn_rd),
cCE(cfmvrdl,  e100410, 2, (RR, RMD),                rd_rn),
cCE(cfmvdhr,  e000430, 2, (RMD, RR),                rn_rd),
cCE(cfmvrdh,  e100430, 2, (RR, RMD),                rd_rn),
cCE(cfmv64lr, e000510, 2, (RMDX, RR),               rn_rd),
cCE(cfmvr64l, e100510, 2, (RR, RMDX),               rd_rn),
cCE(cfmv64hr, e000530, 2, (RMDX, RR),               rn_rd),
cCE(cfmvr64h, e100530, 2, (RR, RMDX),               rd_rn),
cCE(cfmval32, e200440, 2, (RMAX, RMFX),             rd_rn),
cCE(cfmv32al, e100440, 2, (RMFX, RMAX),             rd_rn),
cCE(cfmvam32, e200460, 2, (RMAX, RMFX),             rd_rn),
cCE(cfmv32am, e100460, 2, (RMFX, RMAX),             rd_rn),
cCE(cfmvah32, e200480, 2, (RMAX, RMFX),             rd_rn),
cCE(cfmv32ah, e100480, 2, (RMFX, RMAX),             rd_rn),
cCE(cfmva32,  e2004a0, 2, (RMAX, RMFX),             rd_rn),
cCE(cfmv32a,  e1004a0, 2, (RMFX, RMAX),             rd_rn),
cCE(cfmva64,  e2004c0, 2, (RMAX, RMDX),             rd_rn),
cCE(cfmv64a,  e1004c0, 2, (RMDX, RMAX),             rd_rn),
cCE(cfmvsc32, e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
cCE(cfmv32sc, e1004e0, 2, (RMDX, RMDS),             rd),
cCE(cfcpys,   e000400, 2, (RMF, RMF),               rd_rn),
cCE(cfcpyd,   e000420, 2, (RMD, RMD),               rd_rn),
cCE(cfcvtsd,  e000460, 2, (RMD, RMF),               rd_rn),
cCE(cfcvtds,  e000440, 2, (RMF, RMD),               rd_rn),
cCE(cfcvt32s, e000480, 2, (RMF, RMFX),              rd_rn),
cCE(cfcvt32d, e0004a0, 2, (RMD, RMFX),              rd_rn),
cCE(cfcvt64s, e0004c0, 2, (RMF, RMDX),              rd_rn),
cCE(cfcvt64d, e0004e0, 2, (RMD, RMDX),              rd_rn),
cCE(cfcvts32, e100580, 2, (RMFX, RMF),              rd_rn),
cCE(cfcvtd32, e1005a0, 2, (RMFX, RMD),              rd_rn),
cCE(cftruncs32,e1005c0, 2, (RMFX, RMF),             rd_rn),
cCE(cftruncd32,e1005e0, 2, (RMFX, RMD),             rd_rn),
cCE(cfrshl32, e000550, 3, (RMFX, RMFX, RR),         mav_triple),
cCE(cfrshl64, e000570, 3, (RMDX, RMDX, RR),         mav_triple),
cCE(cfsh32,   e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
cCE(cfsh64,   e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
cCE(cfcmps,   e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
cCE(cfcmpd,   e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
cCE(cfcmp32,  e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
cCE(cfcmp64,  e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
cCE(cfabss,   e300400, 2, (RMF, RMF),               rd_rn),
cCE(cfabsd,   e300420, 2, (RMD, RMD),               rd_rn),
cCE(cfnegs,   e300440, 2, (RMF, RMF),               rd_rn),
cCE(cfnegd,   e300460, 2, (RMD, RMD),               rd_rn),
cCE(cfadds,   e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
cCE(cfaddd,   e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
cCE(cfsubs,   e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
cCE(cfsubd,   e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
cCE(cfmuls,   e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
cCE(cfmuld,   e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
cCE(cfabs32,  e300500, 2, (RMFX, RMFX),             rd_rn),
cCE(cfabs64,  e300520, 2, (RMDX, RMDX),             rd_rn),
cCE(cfneg32,  e300540, 2, (RMFX, RMFX),             rd_rn),
cCE(cfneg64,  e300560, 2, (RMDX, RMDX),             rd_rn),
cCE(cfadd32,  e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
cCE(cfadd64,  e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
cCE(cfsub32,  e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
cCE(cfsub64,  e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
cCE(cfmul32,  e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
cCE(cfmul64,  e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
cCE(cfmac32,  e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
cCE(cfmsc32,  e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
cCE(cfmadd32, e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
cCE(cfmsub32, e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
cCE(cfmadda32, e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
cCE(cfmsuba32, e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
 };
 #undef ARM_VARIANT
 #undef THUMB_VARIANT
@@ -9470,6 +9712,8 @@ static const struct asm_opcode insns[] =
 #undef TUE
 #undef TUF
 #undef TCC
+#undef cCE
+#undef cC3
 #undef CE
 #undef CM
 #undef UE
@@ -9530,12 +9774,344 @@ md_chars_to_number (char * buf, int n)
 
 /* MD interface: Sections.  */
 
+/* Estimate the size of a frag before relaxing.  Assume everything fits in
+   2 bytes.  */
+
 int
-md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
+md_estimate_size_before_relax (fragS * fragp,
                               segT    segtype ATTRIBUTE_UNUSED)
 {
-  as_fatal (_("md_estimate_size_before_relax\n"));
-  return 1;
+  fragp->fr_var = 2;
+  return 2;
+}
+
+/* Convert a machine dependent frag.  */
+
+void
+md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
+{
+  unsigned long insn;
+  unsigned long old_op;
+  char *buf;
+  expressionS exp;
+  fixS *fixp;
+  int reloc_type;
+  int pc_rel;
+  int opcode;
+
+  buf = fragp->fr_literal + fragp->fr_fix;
+
+  old_op = bfd_get_16(abfd, buf);
+  if (fragp->fr_symbol) {
+      exp.X_op = O_symbol;
+      exp.X_add_symbol = fragp->fr_symbol;
+  } else {
+      exp.X_op = O_constant;
+  }
+  exp.X_add_number = fragp->fr_offset;
+  opcode = fragp->fr_subtype;
+  switch (opcode)
+    {
+    case T_MNEM_ldr_pc:
+    case T_MNEM_ldr_pc2:
+    case T_MNEM_ldr_sp:
+    case T_MNEM_str_sp:
+    case T_MNEM_ldr:
+    case T_MNEM_ldrb:
+    case T_MNEM_ldrh:
+    case T_MNEM_str:
+    case T_MNEM_strb:
+    case T_MNEM_strh:
+      if (fragp->fr_var == 4)
+       {
+         insn = THUMB_OP32(opcode);
+         if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
+           {
+             insn |= (old_op & 0x700) << 4;
+           }
+         else
+           {
+             insn |= (old_op & 7) << 12;
+             insn |= (old_op & 0x38) << 13;
+           }
+         insn |= 0x00000c00;
+         put_thumb32_insn (buf, insn);
+         reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
+       }
+      else
+       {
+         reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
+       }
+      pc_rel = (opcode == T_MNEM_ldr_pc2);
+      break;
+    case T_MNEM_adr:
+      if (fragp->fr_var == 4)
+       {
+         insn = THUMB_OP32 (opcode);
+         insn |= (old_op & 0xf0) << 4;
+         put_thumb32_insn (buf, insn);
+         reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
+       }
+      else
+       {
+         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
+         exp.X_add_number -= 4;
+       }
+      pc_rel = 1;
+      break;
+    case T_MNEM_mov:
+    case T_MNEM_movs:
+    case T_MNEM_cmp:
+    case T_MNEM_cmn:
+      if (fragp->fr_var == 4)
+       {
+         int r0off = (opcode == T_MNEM_mov
+                      || opcode == T_MNEM_movs) ? 0 : 8;
+         insn = THUMB_OP32 (opcode);
+         insn = (insn & 0xe1ffffff) | 0x10000000;
+         insn |= (old_op & 0x700) << r0off;
+         put_thumb32_insn (buf, insn);
+         reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
+       }
+      else
+       {
+         reloc_type = BFD_RELOC_ARM_THUMB_IMM;
+       }
+      pc_rel = 0;
+      break;
+    case T_MNEM_b:
+      if (fragp->fr_var == 4)
+       {
+         insn = THUMB_OP32(opcode);
+         put_thumb32_insn (buf, insn);
+         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
+       }
+      else
+       reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
+      pc_rel = 1;
+      break;
+    case T_MNEM_bcond:
+      if (fragp->fr_var == 4)
+       {
+         insn = THUMB_OP32(opcode);
+         insn |= (old_op & 0xf00) << 14;
+         put_thumb32_insn (buf, insn);
+         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
+       }
+      else
+       reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
+      pc_rel = 1;
+      break;
+    case T_MNEM_add_sp:
+    case T_MNEM_add_pc:
+    case T_MNEM_inc_sp:
+    case T_MNEM_dec_sp:
+      if (fragp->fr_var == 4)
+       {
+         /* ??? Choose between add and addw.  */
+         insn = THUMB_OP32 (opcode);
+         insn |= (old_op & 0xf0) << 4;
+         put_thumb32_insn (buf, insn);
+         reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
+       }
+      else
+       reloc_type = BFD_RELOC_ARM_THUMB_ADD;
+      pc_rel = 0;
+      break;
+
+    case T_MNEM_addi:
+    case T_MNEM_addis:
+    case T_MNEM_subi:
+    case T_MNEM_subis:
+      if (fragp->fr_var == 4)
+       {
+         insn = THUMB_OP32 (opcode);
+         insn |= (old_op & 0xf0) << 4;
+         insn |= (old_op & 0xf) << 16;
+         put_thumb32_insn (buf, insn);
+         reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
+       }
+      else
+       reloc_type = BFD_RELOC_ARM_THUMB_ADD;
+      pc_rel = 0;
+      break;
+    default:
+      abort();
+    }
+  fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
+                     reloc_type);
+  fixp->fx_file = fragp->fr_file;
+  fixp->fx_line = fragp->fr_line;
+  fragp->fr_fix += fragp->fr_var;
+}
+
+/* Return the size of a relaxable immediate operand instruction.
+   SHIFT and SIZE specify the form of the allowable immediate.  */
+static int
+relax_immediate (fragS *fragp, int size, int shift)
+{
+  offsetT offset;
+  offsetT mask;
+  offsetT low;
+
+  /* ??? Should be able to do better than this.  */
+  if (fragp->fr_symbol)
+    return 4;
+
+  low = (1 << shift) - 1;
+  mask = (1 << (shift + size)) - (1 << shift);
+  offset = fragp->fr_offset;
+  /* Force misaligned offsets to 32-bit variant.  */
+  if (offset & low)
+    return -4;
+  if (offset & ~mask)
+    return 4;
+  return 2;
+}
+
+/* Return the size of a relaxable adr pseudo-instruction or PC-relative
+   load.  */
+static int
+relax_adr (fragS *fragp, asection *sec)
+{
+  addressT addr;
+  offsetT val;
+
+  /* Assume worst case for symbols not known to be in the same section.  */
+  if (!S_IS_DEFINED(fragp->fr_symbol)
+      || sec != S_GET_SEGMENT (fragp->fr_symbol))
+    return 4;
+
+  val = S_GET_VALUE(fragp->fr_symbol) + fragp->fr_offset;
+  addr = fragp->fr_address + fragp->fr_fix;
+  addr = (addr + 4) & ~3;
+  /* Fix the insn as the 4-byte version if the target address is not
+     sufficiently aligned.  This is prevents an infinite loop when two
+     instructions have contradictory range/alignment requirements.  */
+  if (val & 3)
+    return -4;
+  val -= addr;
+  if (val < 0 || val > 1020)
+    return 4;
+  return 2;
+}
+
+/* Return the size of a relaxable add/sub immediate instruction.  */
+static int
+relax_addsub (fragS *fragp, asection *sec)
+{
+  char *buf;
+  int op;
+
+  buf = fragp->fr_literal + fragp->fr_fix;
+  op = bfd_get_16(sec->owner, buf);
+  if ((op & 0xf) == ((op >> 4) & 0xf))
+    return relax_immediate (fragp, 8, 0);
+  else
+    return relax_immediate (fragp, 3, 0);
+}
+
+
+/* Return the size of a relaxable branch instruction.  BITS is the
+   size of the offset field in the narrow instruction.  */
+
+static int
+relax_branch (fragS *fragp, asection *sec, int bits)
+{
+  addressT addr;
+  offsetT val;
+  offsetT limit;
+
+  /* Assume worst case for symbols not known to be in the same section.  */
+  if (!S_IS_DEFINED(fragp->fr_symbol)
+      || sec != S_GET_SEGMENT (fragp->fr_symbol))
+    return 4;
+
+  val = S_GET_VALUE(fragp->fr_symbol) + fragp->fr_offset;
+  addr = fragp->fr_address + fragp->fr_fix + 4;
+  val -= addr;
+
+  /* Offset is a signed value *2 */
+  limit = 1 << bits;
+  if (val >= limit || val < -limit)
+    return 4;
+  return 2;
+}
+
+
+/* Relax a machine dependent frag.  This returns the amount by which
+   the current size of the frag should change.  */
+
+int
+arm_relax_frag (asection *sec, fragS *fragp, long stretch ATTRIBUTE_UNUSED)
+{
+  int oldsize;
+  int newsize;
+
+  oldsize = fragp->fr_var;
+  switch (fragp->fr_subtype)
+    {
+    case T_MNEM_ldr_pc2:
+      newsize = relax_adr(fragp, sec);
+      break;
+    case T_MNEM_ldr_pc:
+    case T_MNEM_ldr_sp:
+    case T_MNEM_str_sp:
+      newsize = relax_immediate(fragp, 8, 2);
+      break;
+    case T_MNEM_ldr:
+    case T_MNEM_str:
+      newsize = relax_immediate(fragp, 5, 2);
+      break;
+    case T_MNEM_ldrh:
+    case T_MNEM_strh:
+      newsize = relax_immediate(fragp, 5, 1);
+      break;
+    case T_MNEM_ldrb:
+    case T_MNEM_strb:
+      newsize = relax_immediate(fragp, 5, 0);
+      break;
+    case T_MNEM_adr:
+      newsize = relax_adr(fragp, sec);
+      break;
+    case T_MNEM_mov:
+    case T_MNEM_movs:
+    case T_MNEM_cmp:
+    case T_MNEM_cmn:
+      newsize = relax_immediate(fragp, 8, 0);
+      break;
+    case T_MNEM_b:
+      newsize = relax_branch(fragp, sec, 11);
+      break;
+    case T_MNEM_bcond:
+      newsize = relax_branch(fragp, sec, 8);
+      break;
+    case T_MNEM_add_sp:
+    case T_MNEM_add_pc:
+      newsize = relax_immediate (fragp, 8, 2);
+      break;
+    case T_MNEM_inc_sp:
+    case T_MNEM_dec_sp:
+      newsize = relax_immediate (fragp, 7, 2);
+      break;
+    case T_MNEM_addi:
+    case T_MNEM_addis:
+    case T_MNEM_subi:
+    case T_MNEM_subis:
+      newsize = relax_addsub (fragp, sec);
+      break;
+    default:
+      abort();
+    }
+  if (newsize < 0)
+    {
+      fragp->fr_var = -newsize;
+      md_convert_frag (sec->owner, sec, fragp);
+      frag_wane(fragp);
+      return -(newsize + oldsize);
+    }
+  fragp->fr_var = newsize;
+  return newsize - oldsize;
 }
 
 /* Round up a section size to the appropriate boundary.         */
@@ -10106,6 +10682,7 @@ md_pcrel_from_section (fixS * fixP, segT seg)
     case BFD_RELOC_ARM_THUMB_OFFSET:
     case BFD_RELOC_ARM_T32_OFFSET_IMM:
     case BFD_RELOC_ARM_T32_ADD_PC12:
+    case BFD_RELOC_ARM_T32_CP_OFF_IMM:
       return (base + 4) & ~3;
 
       /* Thumb branches are simply offset by +4.  */
@@ -10308,6 +10885,17 @@ negate_data_op (unsigned long * instruction,
   return value;
 }
 
+/* Read a 32-bit thumb instruction from buf.  */
+static unsigned long
+get_thumb32_insn (char * buf)
+{
+  unsigned long insn;
+  insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
+  insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
+
+  return insn;
+}
+
 void
 md_apply_fix (fixS *   fixP,
               valueT * valP,
@@ -10680,10 +11268,10 @@ md_apply_fix (fixS *  fixP,
       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
       break;
 
-    case BFD_RELOC_ARM_SMI:
+    case BFD_RELOC_ARM_SMC:
       if (((unsigned long) value) > 0xffff)
        as_bad_where (fixP->fx_file, fixP->fx_line,
-                     _("invalid smi expression"));
+                     _("invalid smc expression"));
       newval = md_chars_to_number (buf, INSN_SIZE);
       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
       md_number_to_chars (buf, newval, INSN_SIZE);
@@ -10939,6 +11527,7 @@ md_apply_fix (fixS *    fixP,
 #endif
 
     case BFD_RELOC_ARM_CP_OFF_IMM:
+    case BFD_RELOC_ARM_T32_CP_OFF_IMM:
       if (value < -1023 || value > 1023 || (value & 3))
        as_bad_where (fixP->fx_file, fixP->fx_line,
                      _("co-processor offset out of range"));
@@ -10946,14 +11535,24 @@ md_apply_fix (fixS *  fixP,
       sign = value >= 0;
       if (value < 0)
        value = -value;
-      newval = md_chars_to_number (buf, INSN_SIZE) & 0xff7fff00;
+      if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
+         || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
+       newval = md_chars_to_number (buf, INSN_SIZE);
+      else
+       newval = get_thumb32_insn (buf);
+      newval &= 0xff7fff00;
       newval |= (value >> 2) | (sign ? INDEX_UP : 0);
       if (value == 0)
        newval &= ~WRITE_BACK;
-      md_number_to_chars (buf, newval, INSN_SIZE);
+      if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
+         || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
+       md_number_to_chars (buf, newval, INSN_SIZE);
+      else
+       put_thumb32_insn (buf, newval);
       break;
 
     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
+    case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
       if (value < -255 || value > 255)
        as_bad_where (fixP->fx_file, fixP->fx_line,
                      _("co-processor offset out of range"));
@@ -11267,10 +11866,11 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED,
          case BFD_RELOC_NONE:             type = "NONE";         break;
          case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
          case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
-         case BFD_RELOC_ARM_SMI:          type = "SMI";          break;
+         case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
          case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
          case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
          case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
+         case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
          case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
          case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
          case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
@@ -11374,7 +11974,10 @@ arm_force_relocation (struct fix * fixp)
   /* Resolve these relocations even if the symbol is extern or weak.  */
   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
-      || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
+      || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
+      || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
+      || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
+      || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12)
     return 0;
 
   return generic_force_reloc (fixp);
This page took 0.08258 seconds and 4 git commands to generate.