]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - opcodes/i386-dis.c
Enable support to Intel Keylocker instructions
[thirdparty/binutils-gdb.git] / opcodes / i386-dis.c
index 511e6321ceb846e2710e4f5a3241473664df87f4..7c898ebce3ea2f04e4d8bebc61e3c94647b038c6 100644 (file)
@@ -691,6 +691,7 @@ enum
   REG_0F18,
   REG_0F1C_P_0_MOD_0,
   REG_0F1E_P_1_MOD_3,
+  REG_0F38D8_PREFIX_1,
   REG_0F71,
   REG_0F72,
   REG_0F73,
@@ -797,12 +798,18 @@ enum
   MOD_VEX_0F385E_X86_64_P_1_W_0,
   MOD_VEX_0F385E_X86_64_P_2_W_0,
   MOD_VEX_0F385E_X86_64_P_3_W_0,
+  MOD_0F38DC_PREFIX_1,
+  MOD_0F38DD_PREFIX_1,
+  MOD_0F38DE_PREFIX_1,
+  MOD_0F38DF_PREFIX_1,
   MOD_0F38F5,
   MOD_0F38F6_PREFIX_0,
   MOD_0F38F8_PREFIX_1,
   MOD_0F38F8_PREFIX_2,
   MOD_0F38F8_PREFIX_3,
   MOD_0F38F9,
+  MOD_0F38FA_PREFIX_1,
+  MOD_0F38FB_PREFIX_1,
   MOD_62_32BIT,
   MOD_C4_32BIT,
   MOD_C5_32BIT,
@@ -1011,10 +1018,17 @@ enum
   PREFIX_0FE7,
   PREFIX_0FF0,
   PREFIX_0FF7,
+  PREFIX_0F38D8,
+  PREFIX_0F38DC,
+  PREFIX_0F38DD,
+  PREFIX_0F38DE,
+  PREFIX_0F38DF,
   PREFIX_0F38F0,
   PREFIX_0F38F1,
   PREFIX_0F38F6,
   PREFIX_0F38F8,
+  PREFIX_0F38FA,
+  PREFIX_0F38FB,
   PREFIX_VEX_0F10,
   PREFIX_VEX_0F11,
   PREFIX_VEX_0F12,
@@ -1738,18 +1752,16 @@ struct dis386 {
    'M' => print 'r' if intel_mnemonic is false.
    'N' => print 'n' if instruction has no wait "prefix"
    'O' => print 'd' or 'o' (or 'q' in Intel mode)
-   'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
-         or suffix_always is true.  print 'q' if rex prefix is present.
+   'P' => behave as 'T' except with register operand outside of suffix_always
+         mode
    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
          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 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
+   'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
+         prefix or if suffix_always is true.
+   'U' unused.
+   'V' unused.
    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
    'X' => print 's', 'd' depending on data16 prefix (for XMM)
    'Y' unused.
@@ -1758,11 +1770,9 @@ struct dis386 {
    '%' => add 1 upper case letter to the macro.
    '^' => print 'w', 'l', or 'q' (Intel64 ISA only) 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.
-   '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
-         has no operand size prefix for AMD64 ISA, behave as 'P'
-         otherwise
+   '@' => in 64bit mode for Intel64 ISA or if instruction
+         has no operand sizing prefix, print 'q' if suffix_always is true or
+         nothing otherwise; behave as 'P' in all other cases
 
    2 upper case letter macros:
    "XY" => print 'x' or 'y' if suffix_always is true or no register
@@ -1880,23 +1890,23 @@ static const struct dis386 dis386[] = {
   { "dec{S|}",         { RMeSI }, 0 },
   { "dec{S|}",         { RMeDI }, 0 },
   /* 50 */
-  { "pushV",           { RMrAX }, 0 },
-  { "pushV",           { RMrCX }, 0 },
-  { "pushV",           { RMrDX }, 0 },
-  { "pushV",           { RMrBX }, 0 },
-  { "pushV",           { RMrSP }, 0 },
-  { "pushV",           { RMrBP }, 0 },
-  { "pushV",           { RMrSI }, 0 },
-  { "pushV",           { RMrDI }, 0 },
+  { "push{!P|}",               { RMrAX }, 0 },
+  { "push{!P|}",               { RMrCX }, 0 },
+  { "push{!P|}",               { RMrDX }, 0 },
+  { "push{!P|}",               { RMrBX }, 0 },
+  { "push{!P|}",               { RMrSP }, 0 },
+  { "push{!P|}",               { RMrBP }, 0 },
+  { "push{!P|}",               { RMrSI }, 0 },
+  { "push{!P|}",               { RMrDI }, 0 },
   /* 58 */
-  { "popV",            { RMrAX }, 0 },
-  { "popV",            { RMrCX }, 0 },
-  { "popV",            { RMrDX }, 0 },
-  { "popV",            { RMrBX }, 0 },
-  { "popV",            { RMrSP }, 0 },
-  { "popV",            { RMrBP }, 0 },
-  { "popV",            { RMrSI }, 0 },
-  { "popV",            { RMrDI }, 0 },
+  { "pop{!P|}",                { RMrAX }, 0 },
+  { "pop{!P|}",                { RMrCX }, 0 },
+  { "pop{!P|}",                { RMrDX }, 0 },
+  { "pop{!P|}",                { RMrBX }, 0 },
+  { "pop{!P|}",                { RMrSP }, 0 },
+  { "pop{!P|}",                { RMrBP }, 0 },
+  { "pop{!P|}",                { RMrSI }, 0 },
+  { "pop{!P|}",                { RMrDI }, 0 },
   /* 60 */
   { X86_64_TABLE (X86_64_60) },
   { X86_64_TABLE (X86_64_61) },
@@ -1907,9 +1917,9 @@ static const struct dis386 dis386[] = {
   { Bad_Opcode },      /* op size prefix */
   { Bad_Opcode },      /* adr size prefix */
   /* 68 */
-  { "pushT",           { sIv }, 0 },
+  { "pushP",           { sIv }, 0 },
   { "imulS",           { Gv, Ev, Iv }, 0 },
-  { "pushT",           { sIbT }, 0 },
+  { "pushP",           { sIbT }, 0 },
   { "imulS",           { Gv, Ev, sIb }, 0 },
   { "ins{b|}",         { Ybr, indirDX }, 0 },
   { X86_64_TABLE (X86_64_6D) },
@@ -1965,8 +1975,8 @@ static const struct dis386 dis386[] = {
   { "cR{t|}O",         { XX }, 0 },
   { X86_64_TABLE (X86_64_9A) },
   { Bad_Opcode },      /* fwait */
-  { "pushfT",          { XX }, 0 },
-  { "popfT",           { XX }, 0 },
+  { "pushfP",          { XX }, 0 },
+  { "popfP",           { XX }, 0 },
   { "sahf",            { XX }, 0 },
   { "lahf",            { XX }, 0 },
   /* a0 */
@@ -2015,10 +2025,10 @@ static const struct dis386 dis386[] = {
   { REG_TABLE (REG_C6) },
   { REG_TABLE (REG_C7) },
   /* c8 */
-  { "enterT",          { Iw, Ib }, 0 },
-  { "leaveT",          { XX }, 0 },
-  { "{l|}ret{|f}P",    { Iw }, 0 },
-  { "{l|}ret{|f}P",    { XX }, 0 },
+  { "enterP",          { Iw, Ib }, 0 },
+  { "leaveP",          { XX }, 0 },
+  { "{l|}ret{|f}%LP",  { Iw }, 0 },
+  { "{l|}ret{|f}%LP",  { XX }, 0 },
   { "int3",            { XX }, 0 },
   { "int",             { Ib }, 0 },
   { X86_64_TABLE (X86_64_CE) },
@@ -2261,8 +2271,8 @@ static const struct dis386 dis386_twobyte[] = {
   { "setle",           { Eb }, 0 },
   { "setg",            { Eb }, 0 },
   /* a0 */
-  { "pushT",           { fs }, 0 },
-  { "popT",            { fs }, 0 },
+  { "pushP",           { fs }, 0 },
+  { "popP",            { fs }, 0 },
   { "cpuid",           { XX }, 0 },
   { "btS",             { Ev, Gv }, 0 },
   { "shldS",           { Ev, Gv, Ib }, 0 },
@@ -2270,8 +2280,8 @@ static const struct dis386 dis386_twobyte[] = {
   { REG_TABLE (REG_0FA6) },
   { REG_TABLE (REG_0FA7) },
   /* a8 */
-  { "pushT",           { gs }, 0 },
-  { "popT",            { gs }, 0 },
+  { "pushP",           { gs }, 0 },
+  { "popP",            { gs }, 0 },
   { "rsm",             { XX }, 0 },
   { "btsS",            { Evh1, Gv }, 0 },
   { "shrdS",           { Ev, Gv, Ib }, 0 },
@@ -2695,7 +2705,7 @@ static const struct dis386 reg_table[][8] = {
   },
   /* REG_8F */
   {
-    { "popU",  { stackEv }, 0 },
+    { "pop{P|}", { stackEv }, 0 },
     { XOP_8F_TABLE (XOP_09) },
     { Bad_Opcode },
     { Bad_Opcode },
@@ -2821,11 +2831,11 @@ static const struct dis386 reg_table[][8] = {
   {
     { "incQ",  { Evh1 }, 0 },
     { "decQ",  { Evh1 }, 0 },
-    { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
+    { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
     { MOD_TABLE (MOD_FF_REG_3) },
-    { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
+    { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
     { MOD_TABLE (MOD_FF_REG_5) },
-    { "pushU", { stackEv }, 0 },
+    { "push{P|}", { stackEv }, 0 },
     { Bad_Opcode },
   },
   /* REG_0F00 */
@@ -2894,6 +2904,13 @@ static const struct dis386 reg_table[][8] = {
     { "nopQ",          { Ev }, 0 },
     { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
   },
+  /* REG_0F38D8_PREFIX_1 */
+  {
+    { "aesencwide128kl",       { M }, 0 },
+    { "aesdecwide128kl",       { M }, 0 },
+    { "aesencwide256kl",       { M }, 0 },
+    { "aesdecwide256kl",       { M }, 0 },
+  },
   /* REG_0F71 */
   {
     { Bad_Opcode },
@@ -3547,6 +3564,40 @@ static const struct dis386 prefix_table[][4] = {
     { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
   },
 
+  /* PREFIX_0F38D8 */
+  {
+    { Bad_Opcode },
+    { REG_TABLE (REG_0F38D8_PREFIX_1) },
+  },
+
+  /* PREFIX_0F38DC */
+  {
+    { Bad_Opcode },
+    { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
+    { "aesenc", { XM, EXx }, 0 },
+  },
+
+  /* PREFIX_0F38DD */
+  {
+    { Bad_Opcode },
+    { MOD_TABLE (MOD_0F38DD_PREFIX_1) },
+    { "aesenclast", { XM, EXx }, 0 },
+  },
+
+  /* PREFIX_0F38DE */
+  {
+    { Bad_Opcode },
+    { MOD_TABLE (MOD_0F38DE_PREFIX_1) },
+    { "aesdec", { XM, EXx }, 0 },
+  },
+
+  /* PREFIX_0F38DF */
+  {
+    { Bad_Opcode },
+    { MOD_TABLE (MOD_0F38DF_PREFIX_1) },
+    { "aesdeclast", { XM, EXx }, 0 },
+  },
+
   /* PREFIX_0F38F0 */
   {
     { "movbeS",        { Gv, Mv }, PREFIX_OPCODE },
@@ -3578,6 +3629,17 @@ static const struct dis386 prefix_table[][4] = {
     { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
     { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
   },
+  /* PREFIX_0F38FA */
+  {
+    { Bad_Opcode },
+    { MOD_TABLE (MOD_0F38FA_PREFIX_1) },
+  },
+
+  /* PREFIX_0F38FB */
+  {
+    { Bad_Opcode },
+    { MOD_TABLE (MOD_0F38FB_PREFIX_1) },
+  },
 
   /* PREFIX_VEX_0F10 */
   {
@@ -4072,7 +4134,7 @@ static const struct dis386 x86_64_table[][2] = {
 
   /* X86_64_9A */
   {
-    { "{l|}call{T|}", { Ap }, 0 },
+    { "{l|}call{P|}", { Ap }, 0 },
   },
 
   /* X86_64_C2 */
@@ -4128,7 +4190,7 @@ static const struct dis386 x86_64_table[][2] = {
 
   /* X86_64_EA */
   {
-    { "{l|}jmp{T|}", { Ap }, 0 },
+    { "{l|}jmp{P|}", { Ap }, 0 },
   },
 
   /* X86_64_0F01_REG_0 */
@@ -4438,14 +4500,14 @@ static const struct dis386 three_byte_table[][256] = {
     { Bad_Opcode },
     { Bad_Opcode },
     /* d8 */
-    { Bad_Opcode },
+    { PREFIX_TABLE (PREFIX_0F38D8) },
     { Bad_Opcode },
     { Bad_Opcode },
     { "aesimc", { XM, EXx }, PREFIX_DATA },
-    { "aesenc", { XM, EXx }, PREFIX_DATA },
-    { "aesenclast", { XM, EXx }, PREFIX_DATA },
-    { "aesdec", { XM, EXx }, PREFIX_DATA },
-    { "aesdeclast", { XM, EXx }, PREFIX_DATA },
+    { PREFIX_TABLE (PREFIX_0F38DC) },
+    { PREFIX_TABLE (PREFIX_0F38DD) },
+    { PREFIX_TABLE (PREFIX_0F38DE) },
+    { PREFIX_TABLE (PREFIX_0F38DF) },
     /* e0 */
     { Bad_Opcode },
     { Bad_Opcode },
@@ -4476,8 +4538,8 @@ static const struct dis386 three_byte_table[][256] = {
     /* f8 */
     { PREFIX_TABLE (PREFIX_0F38F8) },
     { MOD_TABLE (MOD_0F38F9) },
-    { Bad_Opcode },
-    { Bad_Opcode },
+    { PREFIX_TABLE (PREFIX_0F38FA) },
+    { PREFIX_TABLE (PREFIX_0F38FB) },
     { Bad_Opcode },
     { Bad_Opcode },
     { Bad_Opcode },
@@ -8216,6 +8278,23 @@ static const struct dis386 mod_table[][2] = {
     { Bad_Opcode },
     { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
   },
+  {
+    /* MOD_0F38DC_PREFIX_1 */
+    { "aesenc128kl",    { XM, M }, 0 },
+    { "loadiwkey",      { XM, EXx }, 0 },
+  },
+  {
+    /* MOD_0F38DD_PREFIX_1 */
+    { "aesdec128kl",    { XM, M }, 0 },
+  },
+  {
+    /* MOD_0F38DE_PREFIX_1 */
+    { "aesenc256kl",    { XM, M }, 0 },
+  },
+  {
+    /* MOD_0F38DF_PREFIX_1 */
+    { "aesdec256kl",    { XM, M }, 0 },
+  },
   {
     /* MOD_0F38F5 */
     { "wrussK",                { M, Gdq }, PREFIX_DATA },
@@ -8240,6 +8319,16 @@ static const struct dis386 mod_table[][2] = {
     /* MOD_0F38F9 */
     { "movdiri",       { Edq, Gdq }, PREFIX_OPCODE },
   },
+  {
+    /* MOD_0F38FA_PREFIX_1 */
+    { Bad_Opcode },
+    { "encodekey128", { Gd, Ed }, 0 },
+  },
+  {
+    /* MOD_0F38FB_PREFIX_1 */
+    { Bad_Opcode },
+    { "encodekey256", { Gd, Ed }, 0 },
+  },
   {
     /* MOD_62_32BIT */
     { "bound{S|}",     { Gv, Ma }, 0 },
@@ -10637,56 +10726,34 @@ putop (const char *in_template, int sizeflag)
          if (!(rex & REX_W))
            used_prefixes |= (prefixes & PREFIX_DATA);
          break;
-       case '&':
-         if (!intel_syntax
-             && address_mode == mode_64bit
-             && isa64 == intel64)
-           {
-             *obufp++ = 'q';
-             break;
-           }
-         /* Fall through.  */
-       case 'T':
-         if (!intel_syntax
-             && address_mode == mode_64bit
-             && ((sizeflag & DFLAG) || (rex & REX_W)))
+       case '@':
+         if (address_mode == mode_64bit
+             && (isa64 == intel64 || (rex & REX_W)
+                 || !(prefixes & PREFIX_DATA)))
            {
-             *obufp++ = 'q';
+             if (sizeflag & SUFFIX_ALWAYS)
+               *obufp++ = 'q';
              break;
            }
          /* Fall through.  */
-         goto case_P;
        case 'P':
          if (l == 0)
            {
-           case_P:
-             if (intel_syntax)
-               {
-                 if ((rex & REX_W) == 0
-                     && (prefixes & PREFIX_DATA))
-                   {
-                     if ((sizeflag & DFLAG) == 0)
-                       *obufp++ = 'w';
-                     used_prefixes |= (prefixes & PREFIX_DATA);
-                   }
-                 break;
-               }
-             if ((prefixes & PREFIX_DATA)
-                 || (rex & REX_W)
-                 || (sizeflag & SUFFIX_ALWAYS))
+             if (((need_modrm && modrm.mod == 3) || !cond)
+                 && !(sizeflag & SUFFIX_ALWAYS))
+               break;
+         /* Fall through.  */
+       case 'T':
+             if ((!(rex & REX_W) && (prefixes & PREFIX_DATA))
+                 || ((sizeflag & SUFFIX_ALWAYS)
+                     && address_mode != mode_64bit))
                {
-                 USED_REX (REX_W);
-                 if (rex & REX_W)
-                   *obufp++ = 'q';
-                 else
-                   {
-                     if (sizeflag & DFLAG)
-                       *obufp++ = 'l';
-                     else
-                       *obufp++ = 'w';
-                     used_prefixes |= (prefixes & PREFIX_DATA);
-                   }
+                 *obufp++ = (sizeflag & DFLAG) ?
+                            intel_syntax ? 'd' : 'l' : 'w';
+                 used_prefixes |= (prefixes & PREFIX_DATA);
                }
+             else if (sizeflag & SUFFIX_ALWAYS)
+               *obufp++ = 'q';
            }
          else if (l == 1 && last[0] == 'L')
            {
@@ -10710,22 +10777,9 @@ putop (const char *in_template, int sizeflag)
          else
            abort ();
          break;
-       case 'U':
-         if (intel_syntax)
-           break;
-         if (address_mode == mode_64bit
-             && ((sizeflag & DFLAG) || (rex & REX_W)))
-           {
-             if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
-               *obufp++ = 'q';
-             break;
-           }
-         /* Fall through.  */
-         goto case_Q;
        case 'Q':
          if (l == 0)
            {
-           case_Q:
              if (intel_syntax && !alt)
                break;
              USED_REX (REX_W);
@@ -10781,32 +10835,6 @@ putop (const char *in_template, int sizeflag)
          if (!(rex & REX_W))
            used_prefixes |= (prefixes & PREFIX_DATA);
          break;
-       case 'V':
-         if (l == 0)
-           {
-             if (intel_syntax)
-               break;
-             if (address_mode == mode_64bit
-                 && ((sizeflag & DFLAG) || (rex & REX_W)))
-               {
-                 if (sizeflag & SUFFIX_ALWAYS)
-                   *obufp++ = 'q';
-                 break;
-               }
-           }
-         else if (l == 1 && last[0] == 'L')
-           {
-             if (rex & REX_W)
-               {
-                 *obufp++ = 'a';
-                 *obufp++ = 'b';
-                 *obufp++ = 's';
-               }
-           }
-         else
-           abort ();
-         /* Fall through.  */
-         goto case_S;
        case 'S':
          if (l == 0)
            {
@@ -10842,6 +10870,54 @@ putop (const char *in_template, int sizeflag)
          else
            abort ();
          break;
+       case 'V':
+         if (l == 0)
+           abort ();
+         else if (l == 1 && last[0] == 'L')
+           {
+             if (rex & REX_W)
+               {
+                 *obufp++ = 'a';
+                 *obufp++ = 'b';
+                 *obufp++ = 's';
+               }
+           }
+         else
+           abort ();
+         goto case_S;
+       case 'W':
+         if (l == 0)
+           {
+             /* operand size flag for cwtl, cbtw */
+             USED_REX (REX_W);
+             if (rex & REX_W)
+               {
+                 if (intel_syntax)
+                   *obufp++ = 'd';
+                 else
+                   *obufp++ = 'l';
+               }
+             else if (sizeflag & DFLAG)
+               *obufp++ = 'w';
+             else
+               *obufp++ = 'b';
+             if (!(rex & REX_W))
+               used_prefixes |= (prefixes & PREFIX_DATA);
+           }
+         else if (l == 1)
+           {
+             if (!need_vex)
+               abort ();
+             if (last[0] == 'X')
+               *obufp++ = vex.w ? 'd': 's';
+             else if (last[0] == 'B')
+               *obufp++ = vex.w ? 'w': 'b';
+             else
+               abort ();
+           }
+         else
+           abort ();
+         break;
        case 'X':
          if (l != 0)
            abort ();
@@ -10913,39 +10989,6 @@ putop (const char *in_template, int sizeflag)
          else
            abort ();
          break;
-       case 'W':
-         if (l == 0)
-           {
-             /* operand size flag for cwtl, cbtw */
-             USED_REX (REX_W);
-             if (rex & REX_W)
-               {
-                 if (intel_syntax)
-                   *obufp++ = 'd';
-                 else
-                   *obufp++ = 'l';
-               }
-             else if (sizeflag & DFLAG)
-               *obufp++ = 'w';
-             else
-               *obufp++ = 'b';
-             if (!(rex & REX_W))
-               used_prefixes |= (prefixes & PREFIX_DATA);
-           }
-         else if (l == 1)
-           {
-             if (!need_vex)
-               abort ();
-             if (last[0] == 'X')
-               *obufp++ = vex.w ? 'd': 's';
-             else if (last[0] == 'B')
-               *obufp++ = vex.w ? 'w': 'b';
-             else
-               abort ();
-           }
-         else
-           abort ();
-         break;
        case '^':
          if (intel_syntax)
            break;
@@ -10964,20 +11007,6 @@ putop (const char *in_template, int sizeflag)
              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;
        }
 
       if (len == l)
@@ -11972,7 +12001,7 @@ OP_E_memory (int bytemode, int sizeflag)
                {
                  *obufp++ = '-';
                  *obufp = '\0';
-                 disp = - (bfd_signed_vma) disp;
+                 disp = -disp;
                }
 
              if (havedisp)
@@ -12060,7 +12089,7 @@ OP_E_memory (int bytemode, int sizeflag)
                {
                  *obufp++ = '-';
                  *obufp = '\0';
-                 disp = - (bfd_signed_vma) disp;
+                 disp = -disp;
                }
 
              print_displacement (scratchbuf, disp);
@@ -12262,28 +12291,28 @@ get64 (void)
 static bfd_signed_vma
 get32 (void)
 {
-  bfd_signed_vma x = 0;
+  bfd_vma x = 0;
 
   FETCH_DATA (the_info, codep + 4);
-  x = *codep++ & (bfd_signed_vma) 0xff;
-  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
-  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
-  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
+  x = *codep++ & (bfd_vma) 0xff;
+  x |= (*codep++ & (bfd_vma) 0xff) << 8;
+  x |= (*codep++ & (bfd_vma) 0xff) << 16;
+  x |= (*codep++ & (bfd_vma) 0xff) << 24;
   return x;
 }
 
 static bfd_signed_vma
 get32s (void)
 {
-  bfd_signed_vma x = 0;
+  bfd_vma x = 0;
 
   FETCH_DATA (the_info, codep + 4);
-  x = *codep++ & (bfd_signed_vma) 0xff;
-  x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
-  x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
-  x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
+  x = *codep++ & (bfd_vma) 0xff;
+  x |= (*codep++ & (bfd_vma) 0xff) << 8;
+  x |= (*codep++ & (bfd_vma) 0xff) << 16;
+  x |= (*codep++ & (bfd_vma) 0xff) << 24;
 
-  x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
+  x = (x ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
 
   return x;
 }
@@ -12563,9 +12592,7 @@ OP_J (int bytemode, int sizeflag)
        disp -= 0x100;
       break;
     case v_mode:
-      if (isa64 != intel64)
     case dqw_mode:
-       USED_REX (REX_W);
       if ((sizeflag & DFLAG)
          || (address_mode == mode_64bit
              && ((isa64 == intel64 && bytemode != dqw_mode)