Cleanup ppc code dealing with opcode dumps.
[binutils-gdb.git] / opcodes / i386-dis.c
index e5791c9a5f5192229c44b01ee506f2546da8cbc1..98950e20f070dbf5e6eb95024f4363e1beae874b 100644 (file)
@@ -250,6 +250,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 #define EbS { OP_E, b_swap_mode }
 #define EbndS { OP_E, bnd_swap_mode }
 #define Ev { OP_E, v_mode }
+#define Eva { OP_E, va_mode }
 #define Ev_bnd { OP_E, v_bnd_mode }
 #define EvS { OP_E, v_swap_mode }
 #define Ed { OP_E, d_mode }
@@ -499,6 +500,8 @@ enum
   v_mode,
   /* operand size depends on prefixes with operand swapped */
   v_swap_mode,
+  /* operand size depends on address prefix */
+  va_mode,
   /* word operand */
   w_mode,
   /* double word operand  */
@@ -735,6 +738,7 @@ enum
   REG_0F01,
   REG_0F0D,
   REG_0F18,
+  REG_0F1C_MOD_0,
   REG_0F1E_MOD_3,
   REG_0F71,
   REG_0F72,
@@ -789,6 +793,7 @@ enum
   MOD_0F1A_PREFIX_0,
   MOD_0F1B_PREFIX_0,
   MOD_0F1B_PREFIX_1,
+  MOD_0F1C_PREFIX_0,
   MOD_0F1E_PREFIX_1,
   MOD_0F24,
   MOD_0F26,
@@ -967,6 +972,7 @@ enum
   PREFIX_0F16,
   PREFIX_0F1A,
   PREFIX_0F1B,
+  PREFIX_0F1C,
   PREFIX_0F1E,
   PREFIX_0F2A,
   PREFIX_0F2B,
@@ -1008,7 +1014,8 @@ enum
   PREFIX_MOD_3_0FAE_REG_4,
   PREFIX_MOD_0_0FAE_REG_5,
   PREFIX_MOD_3_0FAE_REG_5,
-  PREFIX_0FAE_REG_6,
+  PREFIX_MOD_0_0FAE_REG_6,
+  PREFIX_MOD_1_0FAE_REG_6,
   PREFIX_0FAE_REG_7,
   PREFIX_0FB8,
   PREFIX_0FBC,
@@ -2894,7 +2901,7 @@ static const struct dis386 dis386_twobyte[] = {
   { "nopQ",            { Ev }, 0 },
   { PREFIX_TABLE (PREFIX_0F1A) },
   { PREFIX_TABLE (PREFIX_0F1B) },
-  { "nopQ",            { Ev }, 0 },
+  { PREFIX_TABLE (PREFIX_0F1C) },
   { "nopQ",            { Ev }, 0 },
   { PREFIX_TABLE (PREFIX_0F1E) },
   { "nopQ",            { Ev }, 0 },
@@ -3646,6 +3653,17 @@ static const struct dis386 reg_table[][8] = {
     { MOD_TABLE (MOD_0F18_REG_6) },
     { MOD_TABLE (MOD_0F18_REG_7) },
   },
+  /* REG_0F1C_MOD_0 */
+  {
+    { "cldemote",      { Mb }, 0 },
+    { "nopQ",          { Ev }, 0 },
+    { "nopQ",          { Ev }, 0 },
+    { "nopQ",          { Ev }, 0 },
+    { "nopQ",          { Ev }, 0 },
+    { "nopQ",          { Ev }, 0 },
+    { "nopQ",          { Ev }, 0 },
+    { "nopQ",          { Ev }, 0 },
+  },
   /* REG_0F1E_MOD_3 */
   {
     { "nopQ",          { Ev }, 0 },
@@ -3897,6 +3915,14 @@ static const struct dis386 prefix_table[][4] = {
     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
   },
 
+  /* PREFIX_0F1C */
+  {
+    { MOD_TABLE (MOD_0F1C_PREFIX_0) },
+    { "nopQ",  { Ev }, PREFIX_OPCODE },
+    { "nopQ",  { Ev }, PREFIX_OPCODE },
+    { "nopQ",  { Ev }, PREFIX_OPCODE },
+  },
+
   /* PREFIX_0F1E */
   {
     { "nopQ",  { Ev }, PREFIX_OPCODE },
@@ -4191,13 +4217,21 @@ static const struct dis386 prefix_table[][4] = {
     { "incsspK",       { Rdq }, PREFIX_OPCODE },
   },
 
-  /* PREFIX_0FAE_REG_6 */
+  /* PREFIX_MOD_0_0FAE_REG_6 */
   {
     { "xsaveopt",      { FXSAVE }, PREFIX_OPCODE },
     { "clrssbsy",      { Mq }, PREFIX_OPCODE },
     { "clwb",  { Mb }, PREFIX_OPCODE },
   },
 
+  /* PREFIX_MOD_1_0FAE_REG_6 */
+  {
+    { RM_TABLE (RM_0FAE_REG_6) },
+    { "umonitor",      { Eva }, PREFIX_OPCODE },
+    { "tpause",        { Edq }, PREFIX_OPCODE },
+    { "umwait",        { Edq }, PREFIX_OPCODE },
+  },
+
   /* PREFIX_0FAE_REG_7 */
   {
     { "clflush",       { Mb }, 0 },
@@ -11608,6 +11642,11 @@ static const struct dis386 mod_table[][2] = {
     { "bndmk",         { Gbnd, Ev_bnd }, 0 },
     { "nopQ",          { Ev }, 0 },
   },
+  {
+    /* MOD_0F1C_PREFIX_0 */
+    { REG_TABLE (REG_0F1C_MOD_0) },
+    { "nopQ",          { Ev }, 0 },
+  },
   {
     /* MOD_0F1E_PREFIX_1 */
     { "nopQ",          { Ev }, 0 },
@@ -11726,8 +11765,8 @@ static const struct dis386 mod_table[][2] = {
   },
   {
     /* MOD_0FAE_REG_6 */
-    { PREFIX_TABLE (PREFIX_0FAE_REG_6) },
-    { RM_TABLE (RM_0FAE_REG_6) },
+    { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) },
+    { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) },
   },
   {
     /* MOD_0FAE_REG_7 */
@@ -12826,7 +12865,6 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
       switch ((*codep & 0x3))
        {
        case 0:
-         vex.prefix = 0;
          break;
        case 1:
          vex.prefix = DATA_PREFIX_OPCODE;
@@ -12891,7 +12929,6 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
       switch ((*codep & 0x3))
        {
        case 0:
-         vex.prefix = 0;
          break;
        case 1:
          vex.prefix = DATA_PREFIX_OPCODE;
@@ -12929,12 +12966,10 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
       /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
         VEX.vvvv is 1.  */
       vex.register_specifier = (~(*codep >> 3)) & 0xf;
-      vex.w = 0;
       vex.length = (*codep & 0x4) ? 256 : 128;
       switch ((*codep & 0x3))
        {
        case 0:
-         vex.prefix = 0;
          break;
        case 1:
          vex.prefix = DATA_PREFIX_OPCODE;
@@ -13009,7 +13044,6 @@ get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
       switch ((*codep & 0x3))
        {
        case 0:
-         vex.prefix = 0;
          break;
        case 1:
          vex.prefix = DATA_PREFIX_OPCODE;
@@ -13367,7 +13401,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
   need_vex = 0;
   need_vex_reg = 0;
   vex_w_done = 0;
-  vex.evex = 0;
+  memset (&vex, 0, sizeof (vex));
 
   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
     {
@@ -15114,6 +15148,21 @@ OP_E_register (int bytemode, int sizeflag)
          used_prefixes |= (prefixes & PREFIX_DATA);
        }
       break;
+    case va_mode:
+      names = (address_mode == mode_64bit
+              ? names64 : names32);
+      if (!(prefixes & PREFIX_ADDR))
+       names = (address_mode == mode_16bit
+                    ? names16 : names);
+      else
+       {
+         /* Remove "addr16/addr32".  */
+         all_prefixes[last_addr_prefix] = 0;
+         names = (address_mode != mode_32bit
+                      ? names32 : names16);
+         used_prefixes |= PREFIX_ADDR;
+       }
+      break;
     case mask_bd_mode:
     case mask_mode:
       if (reg > 0x7)