S/390: ifunc: Redirect local function calls to the IPLT.
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
index ca9ea2deb4e327117101392171c58bd0c95dd295..ae18cf2dee03f31883bf064c56d6e5a4465cb195 100644 (file)
@@ -102,6 +102,7 @@ static void VPCMP_Fixup (int, int);
 static void OP_0f07 (int, int);
 static void OP_Monitor (int, int);
 static void OP_Mwait (int, int);
+static void OP_Mwaitx (int, int);
 static void NOP_Fixup1 (int, int);
 static void NOP_Fixup2 (int, int);
 static void OP_3DNowSuffix (int, int);
@@ -222,12 +223,6 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
 }
 
 /* Possible values for prefix requirement.  */
-#define PREFIX_UD_SHIFT                8
-#define PREFIX_UD_REPZ         (PREFIX_REPZ << PREFIX_UD_SHIFT)
-#define PREFIX_UD_REPNZ                (PREFIX_REPNZ << PREFIX_UD_SHIFT)
-#define PREFIX_UD_DATA         (PREFIX_DATA << PREFIX_UD_SHIFT)
-#define PREFIX_UD_ADDR         (PREFIX_ADDR << PREFIX_UD_SHIFT)
-#define PREFIX_UD_LOCK         (PREFIX_LOCK << PREFIX_UD_SHIFT)
 #define PREFIX_IGNORED_SHIFT   16
 #define PREFIX_IGNORED_REPZ    (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
 #define PREFIX_IGNORED_REPNZ   (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
@@ -807,6 +802,7 @@ enum
   MOD_0FB2,
   MOD_0FB4,
   MOD_0FB5,
+  MOD_0FC3,
   MOD_0FC7_REG_3,
   MOD_0FC7_REG_4,
   MOD_0FC7_REG_5,
@@ -824,6 +820,37 @@ enum
   MOD_VEX_0F16_PREFIX_0,
   MOD_VEX_0F17,
   MOD_VEX_0F2B,
+  MOD_VEX_W_0_0F41_P_0_LEN_1,
+  MOD_VEX_W_1_0F41_P_0_LEN_1,
+  MOD_VEX_W_0_0F41_P_2_LEN_1,
+  MOD_VEX_W_1_0F41_P_2_LEN_1,
+  MOD_VEX_W_0_0F42_P_0_LEN_1,
+  MOD_VEX_W_1_0F42_P_0_LEN_1,
+  MOD_VEX_W_0_0F42_P_2_LEN_1,
+  MOD_VEX_W_1_0F42_P_2_LEN_1,
+  MOD_VEX_W_0_0F44_P_0_LEN_1,
+  MOD_VEX_W_1_0F44_P_0_LEN_1,
+  MOD_VEX_W_0_0F44_P_2_LEN_1,
+  MOD_VEX_W_1_0F44_P_2_LEN_1,
+  MOD_VEX_W_0_0F45_P_0_LEN_1,
+  MOD_VEX_W_1_0F45_P_0_LEN_1,
+  MOD_VEX_W_0_0F45_P_2_LEN_1,
+  MOD_VEX_W_1_0F45_P_2_LEN_1,
+  MOD_VEX_W_0_0F46_P_0_LEN_1,
+  MOD_VEX_W_1_0F46_P_0_LEN_1,
+  MOD_VEX_W_0_0F46_P_2_LEN_1,
+  MOD_VEX_W_1_0F46_P_2_LEN_1,
+  MOD_VEX_W_0_0F47_P_0_LEN_1,
+  MOD_VEX_W_1_0F47_P_0_LEN_1,
+  MOD_VEX_W_0_0F47_P_2_LEN_1,
+  MOD_VEX_W_1_0F47_P_2_LEN_1,
+  MOD_VEX_W_0_0F4A_P_0_LEN_1,
+  MOD_VEX_W_1_0F4A_P_0_LEN_1,
+  MOD_VEX_W_0_0F4A_P_2_LEN_1,
+  MOD_VEX_W_1_0F4A_P_2_LEN_1,
+  MOD_VEX_W_0_0F4B_P_0_LEN_1,
+  MOD_VEX_W_1_0F4B_P_0_LEN_1,
+  MOD_VEX_W_0_0F4B_P_2_LEN_1,
   MOD_VEX_0F50,
   MOD_VEX_0F71_REG_2,
   MOD_VEX_0F71_REG_4,
@@ -835,6 +862,26 @@ enum
   MOD_VEX_0F73_REG_3,
   MOD_VEX_0F73_REG_6,
   MOD_VEX_0F73_REG_7,
+  MOD_VEX_W_0_0F91_P_0_LEN_0,
+  MOD_VEX_W_1_0F91_P_0_LEN_0,
+  MOD_VEX_W_0_0F91_P_2_LEN_0,
+  MOD_VEX_W_1_0F91_P_2_LEN_0,
+  MOD_VEX_W_0_0F92_P_0_LEN_0,
+  MOD_VEX_W_0_0F92_P_2_LEN_0,
+  MOD_VEX_W_0_0F92_P_3_LEN_0,
+  MOD_VEX_W_1_0F92_P_3_LEN_0,
+  MOD_VEX_W_0_0F93_P_0_LEN_0,
+  MOD_VEX_W_0_0F93_P_2_LEN_0,
+  MOD_VEX_W_0_0F93_P_3_LEN_0,
+  MOD_VEX_W_1_0F93_P_3_LEN_0,
+  MOD_VEX_W_0_0F98_P_0_LEN_0,
+  MOD_VEX_W_1_0F98_P_0_LEN_0,
+  MOD_VEX_W_0_0F98_P_2_LEN_0,
+  MOD_VEX_W_1_0F98_P_2_LEN_0,
+  MOD_VEX_W_0_0F99_P_0_LEN_0,
+  MOD_VEX_W_1_0F99_P_0_LEN_0,
+  MOD_VEX_W_0_0F99_P_2_LEN_0,
+  MOD_VEX_W_1_0F99_P_2_LEN_0,
   MOD_VEX_0FAE_REG_2,
   MOD_VEX_0FAE_REG_3,
   MOD_VEX_0FD7_PREFIX_2,
@@ -849,6 +896,14 @@ enum
   MOD_VEX_0F385A_PREFIX_2,
   MOD_VEX_0F388C_PREFIX_2,
   MOD_VEX_0F388E_PREFIX_2,
+  MOD_VEX_W_0_0F3A30_P_2_LEN_0,
+  MOD_VEX_W_1_0F3A30_P_2_LEN_0,
+  MOD_VEX_W_0_0F3A31_P_2_LEN_0,
+  MOD_VEX_W_1_0F3A31_P_2_LEN_0,
+  MOD_VEX_W_0_0F3A32_P_2_LEN_0,
+  MOD_VEX_W_1_0F3A32_P_2_LEN_0,
+  MOD_VEX_W_0_0F3A33_P_2_LEN_0,
+  MOD_VEX_W_1_0F3A33_P_2_LEN_0,
 
   MOD_EVEX_0F10_PREFIX_1,
   MOD_EVEX_0F10_PREFIX_3,
@@ -932,7 +987,7 @@ enum
   PREFIX_0FBC,
   PREFIX_0FBD,
   PREFIX_0FC2,
-  PREFIX_0FC3,
+  PREFIX_MOD_0_0FC3,
   PREFIX_MOD_0_0FC7_REG_6,
   PREFIX_MOD_3_0FC7_REG_6,
   PREFIX_MOD_3_0FC7_REG_7,
@@ -1638,6 +1693,8 @@ enum
   X86_64_CE,
   X86_64_D4,
   X86_64_D5,
+  X86_64_E8,
+  X86_64_E9,
   X86_64_EA,
   X86_64_0F01_REG_0,
   X86_64_0F01_REG_1,
@@ -2407,9 +2464,12 @@ struct dis386 {
          is true
    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
    'S' => print 'w', 'l' or 'q' if suffix_always is true
-   'T' => print 'q' in 64bit mode and behave as 'P' otherwise
-   'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
-   'V' => print 'q' in 64bit mode and behave as 'S' otherwise
+   'T' => print 'q' in 64bit mode if instruction has no operand size
+         prefix and behave as 'P' otherwise
+   'U' => print 'q' in 64bit mode if instruction has no operand size
+         prefix and behave as 'Q' otherwise
+   'V' => print 'q' in 64bit mode if instruction has no operand size
+         prefix and behave as 'S' otherwise
    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
    'X' => print 's', 'd' depending on data16 prefix (for XMM)
    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
@@ -2417,10 +2477,16 @@ struct dis386 {
    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
    '!' => change condition from true to false or from false to true.
    '%' => add 1 upper case letter to the macro.
+   '^' => print 'w' or 'l' depending on operand size prefix or
+         suffix_always is true (lcall/ljmp).
+   '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
+         on operand size prefix.
 
    2 upper case letter macros:
-   "XY" => print 'x' or 'y' if no register operands or suffix_always
-          is true.
+   "XY" => print 'x' or 'y' if suffix_always is true or no register
+          operands and no broadcast.
+   "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
+          register operands and no broadcast.
    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
           or suffix_always is true
@@ -2701,8 +2767,8 @@ static const struct dis386 dis386[] = {
   { "outB",            { Ib, AL }, 0 },
   { "outG",            { Ib, zAX }, 0 },
   /* e8 */
-  { "callT",           { Jv, BND }, 0 },
-  { "jmpT",            { Jv, BND }, 0 },
+  { X86_64_TABLE (X86_64_E8) },
+  { X86_64_TABLE (X86_64_E9) },
   { X86_64_TABLE (X86_64_EA) },
   { "jmp",             { Jb, BND }, 0 },
   { "inB",             { AL, indirDX }, 0 },
@@ -2950,7 +3016,7 @@ static const struct dis386 dis386_twobyte[] = {
   { "xaddB",           { Ebh1, Gb }, 0 },
   { "xaddS",           { Evh1, Gv }, 0 },
   { PREFIX_TABLE (PREFIX_0FC2) },
-  { PREFIX_TABLE (PREFIX_0FC3) },
+  { MOD_TABLE (MOD_0FC3) },
   { "pinsrw",          { MX, Edqw, Ib }, PREFIX_OPCODE },
   { "pextrw",          { Gdq, MS, Ib }, PREFIX_OPCODE },
   { "shufpX",          { XM, EXx, Ib }, PREFIX_OPCODE },
@@ -4042,9 +4108,9 @@ static const struct dis386 prefix_table[][4] = {
     { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
   },
 
-  /* PREFIX_0FC3 */
+  /* PREFIX_MOD_0_0FC3 */
   {
-    { "movntiS", { Ma, Gv }, PREFIX_OPCODE },
+    { "movntiS", { Ev, Gv }, PREFIX_OPCODE },
   },
 
   /* PREFIX_MOD_0_0FC7_REG_6 */
@@ -6838,6 +6904,18 @@ static const struct dis386 x86_64_table[][2] = {
     { "aad", { Ib }, 0 },
   },
 
+  /* X86_64_E8 */
+  {
+    { "callP",         { Jv, BND }, 0 },
+    { "call@",         { Jv, BND }, 0 }
+  },
+
+  /* X86_64_E9 */
+  {
+    { "jmpP",          { Jv, BND }, 0 },
+    { "jmp@",          { Jv, BND }, 0 }
+  },
+
   /* X86_64_EA */
   {
     { "Jjmp{T|}", { Ap }, 0 },
@@ -10427,82 +10505,82 @@ static const struct dis386 vex_w_table[][2] = {
   },
   {
     /* VEX_W_0F41_P_0_LEN_1 */
-    { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
-    { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
   },
   {
     /* VEX_W_0F41_P_2_LEN_1 */
-    { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
-    { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
   },
   {
     /* VEX_W_0F42_P_0_LEN_1 */
-    { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
-    { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
   },
   {
     /* VEX_W_0F42_P_2_LEN_1 */
-    { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
-    { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
   },
   {
     /* VEX_W_0F44_P_0_LEN_0 */
-    { "knotw",         { MaskG, MaskR }, 0 },
-    { "knotq",         { MaskG, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
   },
   {
     /* VEX_W_0F44_P_2_LEN_0 */
-    { "knotb",         { MaskG, MaskR }, 0 },
-    { "knotd",         { MaskG, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
   },
   {
     /* VEX_W_0F45_P_0_LEN_1 */
-    { "korw",           { MaskG, MaskVex, MaskR }, 0 },
-    { "korq",           { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
   },
   {
     /* VEX_W_0F45_P_2_LEN_1 */
-    { "korb",           { MaskG, MaskVex, MaskR }, 0 },
-    { "kord",           { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
   },
   {
     /* VEX_W_0F46_P_0_LEN_1 */
-    { "kxnorw",         { MaskG, MaskVex, MaskR }, 0 },
-    { "kxnorq",         { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
   },
   {
     /* VEX_W_0F46_P_2_LEN_1 */
-    { "kxnorb",         { MaskG, MaskVex, MaskR }, 0 },
-    { "kxnord",         { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
   },
   {
     /* VEX_W_0F47_P_0_LEN_1 */
-    { "kxorw",          { MaskG, MaskVex, MaskR }, 0 },
-    { "kxorq",          { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
   },
   {
     /* VEX_W_0F47_P_2_LEN_1 */
-    { "kxorb",          { MaskG, MaskVex, MaskR }, 0 },
-    { "kxord",          { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
   },
   {
     /* VEX_W_0F4A_P_0_LEN_1 */
-    { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
-    { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
   },
   {
     /* VEX_W_0F4A_P_2_LEN_1 */
-    { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
-    { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
   },
   {
     /* VEX_W_0F4B_P_0_LEN_1 */
-    { "kunpckwd",      { MaskG, MaskVex, MaskR }, 0 },
-    { "kunpckdq",      { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
+    { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
   },
   {
     /* VEX_W_0F4B_P_2_LEN_1 */
-    { "kunpckbw",      { MaskG, MaskVex, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
   },
   {
     /* VEX_W_0F50_M_0 */
@@ -10832,59 +10910,59 @@ static const struct dis386 vex_w_table[][2] = {
   },
   {
     /* VEX_W_0F91_P_0_LEN_0 */
-    { "kmovw",         { Ew, MaskG }, 0 },
-    { "kmovq",         { Eq, MaskG }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
   },
   {
     /* VEX_W_0F91_P_2_LEN_0 */
-    { "kmovb",         { Eb, MaskG }, 0 },
-    { "kmovd",         { Ed, MaskG }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
   },
   {
     /* VEX_W_0F92_P_0_LEN_0 */
-    { "kmovw",         { MaskG, Rdq }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
   },
   {
     /* VEX_W_0F92_P_2_LEN_0 */
-    { "kmovb",         { MaskG, Rdq }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
   },
   {
     /* VEX_W_0F92_P_3_LEN_0 */
-    { "kmovd",         { MaskG, Rdq }, 0 },
-    { "kmovq",         { MaskG, Rdq }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F92_P_3_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F92_P_3_LEN_0) },
   },
   {
     /* VEX_W_0F93_P_0_LEN_0 */
-    { "kmovw",         { Gdq, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
   },
   {
     /* VEX_W_0F93_P_2_LEN_0 */
-    { "kmovb",         { Gdq, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
   },
   {
     /* VEX_W_0F93_P_3_LEN_0 */
-    { "kmovd",         { Gdq, MaskR }, 0 },
-    { "kmovq",         { Gdq, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F93_P_3_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F93_P_3_LEN_0) },
   },
   {
     /* VEX_W_0F98_P_0_LEN_0 */
-    { "kortestw",      { MaskG, MaskR }, 0 },
-    { "kortestq",      { MaskG, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
   },
   {
     /* VEX_W_0F98_P_2_LEN_0 */
-    { "kortestb",      { MaskG, MaskR }, 0 },
-    { "kortestd",      { MaskG, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
   },
   {
     /* VEX_W_0F99_P_0_LEN_0 */
-    { "ktestw",        { MaskG, MaskR }, 0 },
-    { "ktestq",        { MaskG, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
   },
   {
     /* VEX_W_0F99_P_2_LEN_0 */
-    { "ktestb",        { MaskG, MaskR }, 0 },
-    { "ktestd",        { MaskG, MaskR }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
   },
   {
     /* VEX_W_0FAE_R_2_M_0 */
@@ -11470,23 +11548,23 @@ static const struct dis386 vex_w_table[][2] = {
   },
   {
     /* VEX_W_0F3A30_P_2_LEN_0 */
-    { "kshiftrb",      { MaskG, MaskR, Ib }, 0 },
-    { "kshiftrw",      { MaskG, MaskR, Ib }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) },
   },
   {
     /* VEX_W_0F3A31_P_2_LEN_0 */
-    { "kshiftrd",      { MaskG, MaskR, Ib }, 0 },
-    { "kshiftrq",      { MaskG, MaskR, Ib }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) },
   },
   {
     /* VEX_W_0F3A32_P_2_LEN_0 */
-    { "kshiftlb",      { MaskG, MaskR, Ib }, 0 },
-    { "kshiftlw",      { MaskG, MaskR, Ib }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) },
   },
   {
     /* VEX_W_0F3A33_P_2_LEN_0 */
-    { "kshiftld",      { MaskG, MaskR, Ib }, 0 },
-    { "kshiftlq",      { MaskG, MaskR, Ib }, 0 },
+    { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) },
+    { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) },
   },
   {
     /* VEX_W_0F3A38_P_2 */
@@ -11580,11 +11658,11 @@ static const struct dis386 mod_table[][2] = {
   },
   {
     /* MOD_FF_REG_3 */
-    { "Jcall{T|}", { indirEp }, 0 },
+    { "Jcall^", { indirEp }, 0 },
   },
   {
     /* MOD_FF_REG_5 */
-    { "Jjmp{T|}", { indirEp }, 0 },
+    { "Jjmp^", { indirEp }, 0 },
   },
   {
     /* MOD_0F01_REG_0 */
@@ -11808,9 +11886,13 @@ static const struct dis386 mod_table[][2] = {
     /* MOD_0FB5 */
     { "lgsS",          { Gv, Mp }, 0 },
   },
+  {
+    /* MOD_0FC3 */
+    { PREFIX_TABLE (PREFIX_MOD_0_0FC3) },
+  },
   {
     /* MOD_0FC7_REG_3 */
-    { "xrstors",               { FXSAVE }, 0 },
+    { "xrstors",       { FXSAVE }, 0 },
   },
   {
     /* MOD_0FC7_REG_4 */
@@ -11884,6 +11966,161 @@ static const struct dis386 mod_table[][2] = {
     /* MOD_VEX_0F2B */
     { VEX_W_TABLE (VEX_W_0F2B_M_0) },
   },
+  {
+    /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
+    { Bad_Opcode },
+    { "knotw",          { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
+    { Bad_Opcode },
+    { "knotq",          { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "knotb",          { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "knotd",          { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "korw",       { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "korq",       { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "korb",       { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kord",       { MaskG, MaskVex, MaskR }, 0 },
+  },
+ {
+    /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kxnorw",     { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kxnorq",     { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kxnorb",     { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kxnord",     { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kxorw",      { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kxorq",      { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kxorb",      { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kxord",      { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kunpckwd",   { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
+    { Bad_Opcode },
+    { "kunpckdq",   { MaskG, MaskVex, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
+    { Bad_Opcode },
+    { "kunpckbw",   { MaskG, MaskVex, MaskR }, 0 },
+  },
   {
     /* MOD_VEX_0F50 */
     { Bad_Opcode },
@@ -11939,6 +12176,106 @@ static const struct dis386 mod_table[][2] = {
     { Bad_Opcode },
     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
   },
+  {
+    /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
+    { "kmovw",         { Ew, MaskG }, 0 },
+    { Bad_Opcode },
+  },
+  {
+    /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
+    { "kmovq",         { Eq, MaskG }, 0 },
+    { Bad_Opcode },
+  },
+  {
+    /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
+    { "kmovb",         { Eb, MaskG }, 0 },
+    { Bad_Opcode },
+  },
+  {
+    /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
+    { "kmovd",         { Ed, MaskG }, 0 },
+    { Bad_Opcode },
+  },
+  {
+    /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
+    { Bad_Opcode },
+    { "kmovw",         { MaskG, Rdq }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kmovb",         { MaskG, Rdq }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F92_P_3_LEN_0 */
+    { Bad_Opcode },
+    { "kmovd",         { MaskG, Rdq }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F92_P_3_LEN_0 */
+    { Bad_Opcode },
+    { "kmovq",         { MaskG, Rdq }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
+    { Bad_Opcode },
+    { "kmovw",         { Gdq, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kmovb",         { Gdq, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F93_P_3_LEN_0 */
+    { Bad_Opcode },
+    { "kmovd",         { Gdq, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F93_P_3_LEN_0 */
+    { Bad_Opcode },
+    { "kmovq",         { Gdq, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
+    { Bad_Opcode },
+    { "kortestw", { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
+    { Bad_Opcode },
+    { "kortestq", { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kortestb", { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kortestd", { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
+    { Bad_Opcode },
+    { "ktestw", { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
+    { Bad_Opcode },
+    { "ktestq", { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "ktestb", { MaskG, MaskR }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "ktestd", { MaskG, MaskR }, 0 },
+  },
   {
     /* MOD_VEX_0FAE_REG_2 */
     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
@@ -11996,6 +12333,46 @@ static const struct dis386 mod_table[][2] = {
     /* MOD_VEX_0F388E_PREFIX_2 */
     { "vpmaskmov%LW",  { Mx, Vex, XM }, 0 },
   },
+  {
+    /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kshiftrb",       { MaskG, MaskR, Ib }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kshiftrw",       { MaskG, MaskR, Ib }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kshiftrd",       { MaskG, MaskR, Ib }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kshiftrq",       { MaskG, MaskR, Ib }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kshiftlb",       { MaskG, MaskR, Ib }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kshiftlw",       { MaskG, MaskR, Ib }, 0 },
+  },
+  {
+    /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kshiftld",       { MaskG, MaskR, Ib }, 0 },
+  },
+  {
+    /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
+    { Bad_Opcode },
+    { "kshiftlq",       { MaskG, MaskR, Ib }, 0 },
+  },
 #define NEED_MOD_TABLE
 #include "i386-dis-evex.h"
 #undef NEED_MOD_TABLE
@@ -12055,8 +12432,8 @@ static const struct dis386 rm_table[][8] = {
     /* RM_0F01_REG_7 */
     { "swapgs",                { Skip_MODRM }, 0  },
     { "rdtscp",                { Skip_MODRM }, 0  },
-    { Bad_Opcode },
-    { Bad_Opcode },
+    { "monitorx",      { { OP_Monitor, 0 } }, 0  },
+    { "mwaitx",                { { OP_Mwaitx,  0 } }, 0  },
     { "clzero",                { Skip_MODRM }, 0  },
   },
   {
@@ -12327,6 +12704,14 @@ static char close_char;
 static char separator_char;
 static char scale_char;
 
+enum x86_64_isa
+{
+  amd64 = 0,
+  intel64
+};
+
+static enum x86_64_isa isa64;
+
 /* Here for backwards compatibility.  When gdb stops using
    print_insn_i386_att and print_insn_i386_intel these functions can
    disappear, and print_insn_i386 be merged into print_insn.  */
@@ -12376,6 +12761,8 @@ with the -M switch (multiple options should be separated by commas):\n"));
   fprintf (stream, _("  data32      Assume 32bit data size\n"));
   fprintf (stream, _("  data16      Assume 16bit data size\n"));
   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
+  fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
+  fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
 }
 
 /* Bad opcode.  */
@@ -12859,7 +13246,11 @@ print_insn (bfd_vma pc, disassemble_info *info)
 
   for (p = info->disassembler_options; p != NULL; )
     {
-      if (CONST_STRNEQ (p, "x86-64"))
+      if (CONST_STRNEQ (p, "amd64"))
+       isa64 = amd64;
+      else if (CONST_STRNEQ (p, "intel64"))
+       isa64 = intel64;
+      else if (CONST_STRNEQ (p, "x86-64"))
        {
          address_mode = mode_64bit;
          priv.orig_sizeflag = AFLAG | DFLAG;
@@ -13047,8 +13438,10 @@ print_insn (bfd_vma pc, disassemble_info *info)
   if (*codep == 0x0f)
     {
       unsigned char threebyte;
-      FETCH_DATA (info, codep + 2);
-      threebyte = *++codep;
+
+      codep++;
+      FETCH_DATA (info, codep + 1);
+      threebyte = *codep;
       dp = &dis386_twobyte[threebyte];
       need_modrm = twobyte_has_modrm[*codep];
       codep++;
@@ -13193,6 +13586,13 @@ print_insn (bfd_vma pc, disassemble_info *info)
       for (i = 0; i < MAX_OPERANDS; ++i)
        op_txt[i] = op_out[i];
 
+      if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
+          && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
+       {
+         op_txt[2] = op_out[3];
+         op_txt[3] = op_out[2];
+       }
+
       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
        {
          op_ad = op_index[i];
@@ -13801,6 +14201,34 @@ case_B:
            *obufp++ = 'd';
          break;
        case 'Z':
+         if (l != 0 || len != 1)
+           {
+             if (l != 1 || len != 2 || last[0] != 'X')
+               {
+                 SAVE_LAST (*p);
+                 break;
+               }
+             if (!need_vex || !vex.evex)
+               abort ();
+             if (intel_syntax
+                 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
+               break;
+             switch (vex.length)
+               {
+               case 128:
+                 *obufp++ = 'x';
+                 break;
+               case 256:
+                 *obufp++ = 'y';
+                 break;
+               case 512:
+                 *obufp++ = 'z';
+                 break;
+               default:
+                 abort ();
+               }
+             break;
+           }
          if (intel_syntax)
            break;
          if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
@@ -14099,7 +14527,7 @@ case_S:
              if (!need_vex)
                abort ();
              if (intel_syntax
-                 || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
+                 || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
                break;
              switch (vex.length)
                {
@@ -14109,8 +14537,10 @@ case_S:
                case 256:
                  *obufp++ = 'y';
                  break;
+               case 512:
+                 if (!vex.evex)
                default:
-                 abort ();
+                   abort ();
                }
            }
          break;
@@ -14151,6 +14581,32 @@ case_S:
                *obufp++ = vex.w ? 'q': 'd';
            }
          break;
+       case '^':
+         if (intel_syntax)
+           break;
+         if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
+           {
+             if (sizeflag & DFLAG)
+               *obufp++ = 'l';
+             else
+               *obufp++ = 'w';
+             used_prefixes |= (prefixes & PREFIX_DATA);
+           }
+         break;
+       case '@':
+         if (intel_syntax)
+           break;
+         if (address_mode == mode_64bit
+             && (isa64 == intel64
+                 || ((sizeflag & DFLAG) || (rex & REX_W))))
+             *obufp++ = 'q';
+         else if ((prefixes & PREFIX_DATA))
+           {
+             if (!(sizeflag & DFLAG))
+               *obufp++ = 'w';
+             used_prefixes |= (prefixes & PREFIX_DATA);
+           }
+         break;
        }
       alt = 0;
     }
@@ -15292,11 +15748,11 @@ get64 (void)
   a = *codep++ & 0xff;
   a |= (*codep++ & 0xff) << 8;
   a |= (*codep++ & 0xff) << 16;
-  a |= (*codep++ & 0xff) << 24;
+  a |= (*codep++ & 0xffu) << 24;
   b = *codep++ & 0xff;
   b |= (*codep++ & 0xff) << 8;
   b |= (*codep++ & 0xff) << 16;
-  b |= (*codep++ & 0xff) << 24;
+  b |= (*codep++ & 0xffu) << 24;
   x = a + ((bfd_vma) b << 32);
 #else
   abort ();
@@ -15667,8 +16123,11 @@ OP_J (int bytemode, int sizeflag)
        disp -= 0x100;
       break;
     case v_mode:
-      USED_REX (REX_W);
-      if ((sizeflag & DFLAG) || (rex & REX_W))
+      if (isa64 == amd64)
+       USED_REX (REX_W);
+      if ((sizeflag & DFLAG)
+         || (address_mode == mode_64bit
+             && (isa64 != amd64 || (rex & REX_W))))
        disp = get32s ();
       else
        {
@@ -15684,7 +16143,8 @@ OP_J (int bytemode, int sizeflag)
            segment = ((start_pc + codep - start_codep)
                       & ~((bfd_vma) 0xffff));
        }
-      if (!(rex & REX_W))
+      if (address_mode != mode_64bit
+         || (isa64 == amd64 && !(rex & REX_W)))
        used_prefixes |= (prefixes & PREFIX_DATA);
       break;
     default:
@@ -16353,6 +16813,25 @@ CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
     }
 }
 
+static void
+OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
+         int sizeflag ATTRIBUTE_UNUSED)
+{
+  /* mwaitx %eax,%ecx,%ebx */
+  if (!intel_syntax)
+    {
+      const char **names = (address_mode == mode_64bit
+                           ? names64 : names32);
+      strcpy (op_out[0], names[0]);
+      strcpy (op_out[1], names[1]);
+      strcpy (op_out[2], names[3]);
+      two_source_ops = 1;
+    }
+  /* Skip mod/rm byte.  */
+  MODRM_CHECK;
+  codep++;
+}
+
 static void
 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
          int sizeflag ATTRIBUTE_UNUSED)
This page took 0.035693 seconds and 4 git commands to generate.