x86-64: Intel64 adjustments for insns dealing with far pointers
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
index efa43650928ab70f5fd8c6f02fee8a1031277478..ac141b84d0b6ee914ab5ed67bdf094da367efeac 100644 (file)
 #endif
 #endif
 
-#ifndef REGISTER_WARNINGS
-#define REGISTER_WARNINGS 1
-#endif
-
 #ifndef INFER_ADDR_PREFIX
 #define INFER_ADDR_PREFIX 1
 #endif
@@ -354,6 +350,9 @@ struct _i386_insn
     unsigned int prefixes;
     unsigned char prefix[MAX_PREFIXES];
 
+    /* Register is in low 3 bits of opcode.  */
+    bfd_boolean short_form;
+
     /* The operand to a branch insn indicates an absolute branch.  */
     bfd_boolean jumpabsolute;
 
@@ -419,7 +418,7 @@ struct _i386_insn
     enum
       {
        vex_encoding_default = 0,
-       vex_encoding_vex2,
+       vex_encoding_vex,
        vex_encoding_vex3,
        vex_encoding_evex
       } vec_encoding;
@@ -598,9 +597,11 @@ static int shared = 0;
    0 if att syntax.  */
 static int intel_syntax = 0;
 
-/* 1 for Intel64 ISA,
-   0 if AMD64 ISA.  */
-static int intel64;
+static enum x86_64_isa
+{
+  amd64 = 1,   /* AMD64 ISA.  */
+  intel64      /* Intel64 ISA.  */
+} isa64;
 
 /* 1 for intel mnemonic,
    0 if att mnemonic.  */
@@ -2243,8 +2244,7 @@ mismatch:
 
 /* If given types g0 and g1 are registers they must be of the same type
    unless the expected operand type register overlap is null.
-   Memory operand size of certain SIMD instructions is also being checked
-   here.  */
+   Some Intel syntax memory operand size checking also happens here.  */
 
 static INLINE int
 operand_type_register_match (i386_operand_type g0,
@@ -2256,14 +2256,16 @@ operand_type_register_match (i386_operand_type g0,
       && g0.bitfield.class != RegSIMD
       && (!operand_type_check (g0, anymem)
          || g0.bitfield.unspecified
-         || t0.bitfield.class != RegSIMD))
+         || (t0.bitfield.class != Reg
+             && t0.bitfield.class != RegSIMD)))
     return 1;
 
   if (g1.bitfield.class != Reg
       && g1.bitfield.class != RegSIMD
       && (!operand_type_check (g1, anymem)
          || g1.bitfield.unspecified
-         || t1.bitfield.class != RegSIMD))
+         || (t1.bitfield.class != Reg
+             && t1.bitfield.class != RegSIMD)))
     return 1;
 
   if (g0.bitfield.byte == g1.bitfield.byte
@@ -3990,13 +3992,13 @@ optimize_encoding (void)
   unsigned int j;
 
   if (optimize_for_space
+      && !is_any_vex_encoding (&i.tm)
       && i.reg_operands == 1
       && i.imm_operands == 1
       && !i.types[1].bitfield.byte
       && i.op[0].imms->X_op == O_constant
       && fits_in_imm7 (i.op[0].imms->X_add_number)
-      && ((i.tm.base_opcode == 0xa8
-          && i.tm.extension_opcode == None)
+      && (i.tm.base_opcode == 0xa8
          || (i.tm.base_opcode == 0xf6
              && i.tm.extension_opcode == 0x0)))
     {
@@ -4022,6 +4024,7 @@ optimize_encoding (void)
        }
     }
   else if (flag_code == CODE_64BIT
+          && !is_any_vex_encoding (&i.tm)
           && ((i.types[1].bitfield.qword
                && i.reg_operands == 1
                && i.imm_operands == 1
@@ -4030,9 +4033,8 @@ optimize_encoding (void)
                     && i.tm.extension_opcode == None
                     && fits_in_unsigned_long (i.op[0].imms->X_add_number))
                    || (fits_in_imm31 (i.op[0].imms->X_add_number)
-                       && (((i.tm.base_opcode == 0x24
-                             || i.tm.base_opcode == 0xa8)
-                            && i.tm.extension_opcode == None)
+                       && ((i.tm.base_opcode == 0x24
+                            || i.tm.base_opcode == 0xa8)
                            || (i.tm.base_opcode == 0x80
                                && i.tm.extension_opcode == 0x4)
                            || ((i.tm.base_opcode == 0xf6
@@ -4044,13 +4046,11 @@ optimize_encoding (void)
               || (i.types[0].bitfield.qword
                   && ((i.reg_operands == 2
                        && i.op[0].regs == i.op[1].regs
-                       && ((i.tm.base_opcode == 0x30
-                            || i.tm.base_opcode == 0x28)
-                           && i.tm.extension_opcode == None))
+                       && (i.tm.base_opcode == 0x30
+                           || i.tm.base_opcode == 0x28))
                       || (i.reg_operands == 1
                           && i.operands == 1
-                          && i.tm.base_opcode == 0x30
-                          && i.tm.extension_opcode == None)))))
+                          && i.tm.base_opcode == 0x30)))))
     {
       /* Optimize: -O:
           andq $imm31, %r64   -> andl $imm31, %r32
@@ -4084,13 +4084,13 @@ optimize_encoding (void)
              i.tm.base_opcode = 0xb8;
              i.tm.extension_opcode = None;
              i.tm.opcode_modifier.w = 0;
-             i.tm.opcode_modifier.shortform = 1;
              i.tm.opcode_modifier.modrm = 0;
            }
        }
     }
   else if (optimize > 1
           && !optimize_for_space
+          && !is_any_vex_encoding (&i.tm)
           && i.reg_operands == 2
           && i.op[0].regs == i.op[1].regs
           && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
@@ -4574,6 +4574,7 @@ md_assemble (char *line)
          if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
              && (i.op[x].regs->reg_flags & RegRex64) == 0)
            {
+             gas_assert (!(i.op[x].regs->reg_flags & RegRex));
              /* In case it is "hi" register, give up.  */
              if (i.op[x].regs->reg_num > 3)
                as_bad (_("can't encode register '%s%s' in an "
@@ -4592,7 +4593,7 @@ md_assemble (char *line)
   if (i.rex == 0 && i.rex_encoding)
     {
       /* Check if we can add a REX_OPCODE byte.  Look for 8 bit operand
-         that uses legacy register.  If it is "hi" register, don't add
+        that uses legacy register.  If it is "hi" register, don't add
         the REX_OPCODE byte.  */
       int x;
       for (x = 0; x < 2; x++)
@@ -4601,6 +4602,7 @@ md_assemble (char *line)
            && (i.op[x].regs->reg_flags & RegRex64) == 0
            && i.op[x].regs->reg_num > 3)
          {
+           gas_assert (!(i.op[x].regs->reg_flags & RegRex));
            i.rex_encoding = FALSE;
            break;
          }
@@ -4721,8 +4723,8 @@ parse_insn (char *line, char *mnemonic)
                  i.dir_encoding = dir_encoding_store;
                  break;
                case 0x4:
-                 /* {vex2} */
-                 i.vec_encoding = vex_encoding_vex2;
+                 /* {vex} */
+                 i.vec_encoding = vex_encoding_vex;
                  break;
                case 0x5:
                  /* {vex3} */
@@ -5744,9 +5746,7 @@ match_template (char mnem_suffix)
   i386_opcode_modifier suffix_check;
   i386_operand_type operand_types [MAX_OPERANDS];
   int addr_prefix_disp;
-  unsigned int j;
-  unsigned int found_cpu_match, size_match;
-  unsigned int check_register;
+  unsigned int j, size_match, check_register;
   enum i386_error specific_error = 0;
 
 #if MAX_OPERANDS != 5
@@ -5798,9 +5798,7 @@ match_template (char mnem_suffix)
 
       /* Check processor support.  */
       i.error = unsupported;
-      found_cpu_match = (cpu_flags_match (t)
-                        == CPU_FLAGS_PERFECT_MATCH);
-      if (!found_cpu_match)
+      if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
        continue;
 
       /* Check AT&T mnemonic.   */
@@ -5808,14 +5806,32 @@ match_template (char mnem_suffix)
       if (intel_mnemonic && t->opcode_modifier.attmnemonic)
        continue;
 
-      /* Check AT&T/Intel syntax and Intel64/AMD64 ISA.   */
+      /* Check AT&T/Intel syntax.  */
       i.error = unsupported_syntax;
       if ((intel_syntax && t->opcode_modifier.attsyntax)
-         || (!intel_syntax && t->opcode_modifier.intelsyntax)
-         || (intel64 && t->opcode_modifier.amd64)
-         || (!intel64 && t->opcode_modifier.intel64))
+         || (!intel_syntax && t->opcode_modifier.intelsyntax))
        continue;
 
+      /* Check Intel64/AMD64 ISA.   */
+      switch (isa64)
+       {
+       default:
+         /* Default: Don't accept Intel64.  */
+         if (t->opcode_modifier.isa64 == INTEL64)
+           continue;
+         break;
+       case amd64:
+         /* -mamd64: Don't accept Intel64 and Intel64 only.  */
+         if (t->opcode_modifier.isa64 >= INTEL64)
+           continue;
+         break;
+       case intel64:
+         /* -mintel64: Don't accept AMD64.  */
+         if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
+           continue;
+         break;
+       }
+
       /* Check the suffix.  */
       i.error = invalid_instruction_suffix;
       if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
@@ -6123,8 +6139,6 @@ check_reverse:
          /* Found either forward/reverse 2, 3 or 4 operand match here:
             slip through to break.  */
        }
-      if (!found_cpu_match)
-       continue;
 
       /* Check if vector and VEX operands are valid.  */
       if (check_VecOperands (t) || VEX_check_operands (t))
@@ -6306,50 +6320,26 @@ process_suffix (void)
             Destination register type is more significant than source
             register type.  crc32 in SSE4.2 prefers source register
             type. */
-         if (i.tm.base_opcode == 0xf20f38f0
-             && i.types[0].bitfield.class == Reg)
-           {
-             if (i.types[0].bitfield.byte)
-               i.suffix = BYTE_MNEM_SUFFIX;
-             else if (i.types[0].bitfield.word)
-               i.suffix = WORD_MNEM_SUFFIX;
-             else if (i.types[0].bitfield.dword)
-               i.suffix = LONG_MNEM_SUFFIX;
-             else if (i.types[0].bitfield.qword)
-               i.suffix = QWORD_MNEM_SUFFIX;
-           }
-
-         if (!i.suffix)
-           {
-             int op;
-
-             if (i.tm.base_opcode == 0xf20f38f0)
-               {
-                 /* We have to know the operand size for crc32.  */
-                 as_bad (_("ambiguous memory operand size for `%s`"),
-                         i.tm.name);
-                 return 0;
-               }
+         unsigned int op = i.tm.base_opcode != 0xf20f38f0 ? i.operands : 1;
 
-             for (op = i.operands; --op >= 0;)
-               if (i.tm.operand_types[op].bitfield.instance == InstanceNone
-                   || i.tm.operand_types[op].bitfield.instance == Accum)
-                 {
-                   if (i.types[op].bitfield.class != Reg)
-                     continue;
-                   if (i.types[op].bitfield.byte)
-                     i.suffix = BYTE_MNEM_SUFFIX;
-                   else if (i.types[op].bitfield.word)
-                     i.suffix = WORD_MNEM_SUFFIX;
-                   else if (i.types[op].bitfield.dword)
-                     i.suffix = LONG_MNEM_SUFFIX;
-                   else if (i.types[op].bitfield.qword)
-                     i.suffix = QWORD_MNEM_SUFFIX;
-                   else
-                     continue;
-                   break;
-                 }
-           }
+         while (op--)
+           if (i.tm.operand_types[op].bitfield.instance == InstanceNone
+               || i.tm.operand_types[op].bitfield.instance == Accum)
+             {
+               if (i.types[op].bitfield.class != Reg)
+                 continue;
+               if (i.types[op].bitfield.byte)
+                 i.suffix = BYTE_MNEM_SUFFIX;
+               else if (i.types[op].bitfield.word)
+                 i.suffix = WORD_MNEM_SUFFIX;
+               else if (i.types[op].bitfield.dword)
+                 i.suffix = LONG_MNEM_SUFFIX;
+               else if (i.types[op].bitfield.qword)
+                 i.suffix = QWORD_MNEM_SUFFIX;
+               else
+                 continue;
+               break;
+             }
        }
       else if (i.suffix == BYTE_MNEM_SUFFIX)
        {
@@ -6397,12 +6387,7 @@ process_suffix (void)
       else
        abort ();
     }
-  else if (i.tm.opcode_modifier.defaultsize
-          && !i.suffix
-          /* exclude fldenv/frstor/fsave/fstenv */
-          && i.tm.opcode_modifier.no_ssuf
-          /* exclude sysret */
-          && i.tm.base_opcode != 0x0f07)
+  else if (i.tm.opcode_modifier.defaultsize && !i.suffix)
     {
       i.suffix = stackop_size;
       if (stackop_size == LONG_MNEM_SUFFIX)
@@ -6423,8 +6408,7 @@ process_suffix (void)
                     i.tm.name);
        }
     }
-  else if (intel_syntax
-          && !i.suffix
+  else if (!i.suffix
           && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
               || i.tm.opcode_modifier.jump == JUMP_BYTE
               || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
@@ -6451,45 +6435,69 @@ process_suffix (void)
        }
     }
 
-  if (!i.suffix)
+  if (!i.suffix
+      && (!i.tm.opcode_modifier.defaultsize
+         /* Also cover lret/retf/iret in 64-bit mode.  */
+         || (flag_code == CODE_64BIT
+             && !i.tm.opcode_modifier.no_lsuf
+             && !i.tm.opcode_modifier.no_qsuf))
+      && !i.tm.opcode_modifier.ignoresize
+      /* Accept FLDENV et al without suffix.  */
+      && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
     {
-      if (!intel_syntax)
+      unsigned int suffixes;
+
+      suffixes = !i.tm.opcode_modifier.no_bsuf;
+      if (!i.tm.opcode_modifier.no_wsuf)
+       suffixes |= 1 << 1;
+      if (!i.tm.opcode_modifier.no_lsuf)
+       suffixes |= 1 << 2;
+      if (!i.tm.opcode_modifier.no_ldsuf)
+       suffixes |= 1 << 3;
+      if (!i.tm.opcode_modifier.no_ssuf)
+       suffixes |= 1 << 4;
+      if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
+       suffixes |= 1 << 5;
+
+      /* Are multiple suffixes allowed?  */
+      if (suffixes & (suffixes - 1))
        {
-         if (i.tm.opcode_modifier.w)
+         if (intel_syntax
+             && (!i.tm.opcode_modifier.defaultsize
+                 || operand_check == check_error))
            {
-             as_bad (_("no instruction mnemonic suffix given and "
-                       "no register operands; can't size instruction"));
+             as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
              return 0;
            }
-       }
-      else
-       {
-         unsigned int suffixes;
-
-         suffixes = !i.tm.opcode_modifier.no_bsuf;
-         if (!i.tm.opcode_modifier.no_wsuf)
-           suffixes |= 1 << 1;
-         if (!i.tm.opcode_modifier.no_lsuf)
-           suffixes |= 1 << 2;
-         if (!i.tm.opcode_modifier.no_ldsuf)
-           suffixes |= 1 << 3;
-         if (!i.tm.opcode_modifier.no_ssuf)
-           suffixes |= 1 << 4;
-         if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
-           suffixes |= 1 << 5;
-
-         /* There are more than suffix matches.  */
-         if (i.tm.opcode_modifier.w
-             || ((suffixes & (suffixes - 1))
-                 && !i.tm.opcode_modifier.defaultsize
-                 && !i.tm.opcode_modifier.ignoresize))
+         if (operand_check == check_error)
            {
-             as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
+             as_bad (_("no instruction mnemonic suffix given and "
+                       "no register operands; can't size `%s'"), i.tm.name);
              return 0;
            }
+         if (operand_check == check_warning)
+           as_warn (_("%s; using default for `%s'"),
+                      intel_syntax
+                      ? _("ambiguous operand size")
+                      : _("no instruction mnemonic suffix given and "
+                          "no register operands"),
+                      i.tm.name);
+
+         if (i.tm.opcode_modifier.floatmf)
+           i.suffix = SHORT_MNEM_SUFFIX;
+         else if (flag_code == CODE_16BIT)
+           i.suffix = WORD_MNEM_SUFFIX;
+         else if (!i.tm.opcode_modifier.no_lsuf)
+           i.suffix = LONG_MNEM_SUFFIX;
+         else
+           i.suffix = QWORD_MNEM_SUFFIX;
        }
     }
 
+  if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
+    i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
+                  != (i.tm.operand_types[1].bitfield.class == Reg);
+
   /* Change the opcode based on the operand size given by i.suffix.  */
   switch (i.suffix)
     {
@@ -6506,7 +6514,7 @@ process_suffix (void)
       /* It's not a byte, select word/dword operation.  */
       if (i.tm.opcode_modifier.w)
        {
-         if (i.tm.opcode_modifier.shortform)
+         if (i.short_form)
            i.tm.base_opcode |= 8;
          else
            i.tm.base_opcode |= 1;
@@ -6626,31 +6634,10 @@ check_byte_reg (void)
          && i.tm.operand_types[op].bitfield.word)
        continue;
 
-      /* crc32 doesn't generate this warning.  */
-      if (i.tm.base_opcode == 0xf20f38f0)
+      /* crc32 only wants its source operand checked here.  */
+      if (i.tm.base_opcode == 0xf20f38f0 && op)
        continue;
 
-      if ((i.types[op].bitfield.word
-          || i.types[op].bitfield.dword
-          || i.types[op].bitfield.qword)
-         && i.op[op].regs->reg_num < 4
-         /* Prohibit these changes in 64bit mode, since the lowering
-            would be more complicated.  */
-         && flag_code != CODE_64BIT)
-       {
-#if REGISTER_WARNINGS
-         if (!quiet_warnings)
-           as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
-                    register_prefix,
-                    (i.op[op].regs + (i.types[op].bitfield.word
-                                      ? REGNAM_AL - REGNAM_AX
-                                      : REGNAM_AL - REGNAM_EAX))->reg_name,
-                    register_prefix,
-                    i.op[op].regs->reg_name,
-                    i.suffix);
-#endif
-         continue;
-       }
       /* Any other register is bad.  */
       if (i.types[op].bitfield.class == Reg
          || i.types[op].bitfield.class == RegMMX
@@ -6695,28 +6682,16 @@ check_long_reg (void)
                i.suffix);
        return 0;
       }
-    /* Warn if the e prefix on a general reg is missing.  */
-    else if ((!quiet_warnings || flag_code == CODE_64BIT)
-            && i.types[op].bitfield.word
+    /* Error if the e prefix on a general reg is missing.  */
+    else if (i.types[op].bitfield.word
             && (i.tm.operand_types[op].bitfield.class == Reg
                 || i.tm.operand_types[op].bitfield.instance == Accum)
             && i.tm.operand_types[op].bitfield.dword)
       {
-       /* Prohibit these changes in the 64bit mode, since the
-          lowering is more complicated.  */
-       if (flag_code == CODE_64BIT)
-         {
-           as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
-                   register_prefix, i.op[op].regs->reg_name,
-                   i.suffix);
-           return 0;
-         }
-#if REGISTER_WARNINGS
-       as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
-                register_prefix,
-                (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
-                register_prefix, i.op[op].regs->reg_name, i.suffix);
-#endif
+       as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
+               register_prefix, i.op[op].regs->reg_name,
+               i.suffix);
+       return 0;
       }
     /* Warn if the r prefix on a general reg is present.  */
     else if (i.types[op].bitfield.qword
@@ -6725,7 +6700,9 @@ check_long_reg (void)
             && i.tm.operand_types[op].bitfield.dword)
       {
        if (intel_syntax
-           && i.tm.opcode_modifier.toqword
+           && (i.tm.opcode_modifier.toqword
+               /* Also convert to QWORD for MOVSXD.  */
+               || i.tm.base_opcode == 0x63)
            && i.types[0].bitfield.class != RegSIMD)
          {
            /* Convert to QWORD.  We want REX byte. */
@@ -6816,29 +6793,17 @@ check_word_reg (void)
                i.suffix);
        return 0;
       }
-    /* Warn if the e or r prefix on a general reg is present.  */
-    else if ((!quiet_warnings || flag_code == CODE_64BIT)
-            && (i.types[op].bitfield.dword
+    /* Error if the e or r prefix on a general reg is present.  */
+    else if ((i.types[op].bitfield.dword
                 || i.types[op].bitfield.qword)
             && (i.tm.operand_types[op].bitfield.class == Reg
                 || i.tm.operand_types[op].bitfield.instance == Accum)
             && i.tm.operand_types[op].bitfield.word)
       {
-       /* Prohibit these changes in the 64bit mode, since the
-          lowering is more complicated.  */
-       if (flag_code == CODE_64BIT)
-         {
-           as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
-                   register_prefix, i.op[op].regs->reg_name,
-                   i.suffix);
-           return 0;
-         }
-#if REGISTER_WARNINGS
-       as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
-                register_prefix,
-                (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
-                register_prefix, i.op[op].regs->reg_name, i.suffix);
-#endif
+       as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
+               register_prefix, i.op[op].regs->reg_name,
+               i.suffix);
+       return 0;
       }
   return 1;
 }
@@ -7114,7 +7079,7 @@ duplicate:
         on one of their operands, the default segment is ds.  */
       default_seg = &ds;
     }
-  else if (i.tm.opcode_modifier.shortform)
+  else if (i.short_form)
     {
       /* The register or float register operand is in operand
         0 or 1.  */
@@ -8718,10 +8683,13 @@ output_insn (void)
 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
          /* For x32, add a dummy REX_OPCODE prefix for mov/add with
             R_X86_64_GOTTPOFF relocation so that linker can safely
-            perform IE->LE optimization.  */
+            perform IE->LE optimization.  A dummy REX_OPCODE prefix
+            is also needed for lea with R_X86_64_GOTPC32_TLSDESC
+            relocation for GDesc -> IE/LE optimization.  */
          if (x86_elf_abi == X86_64_X32_ABI
              && i.operands == 2
-             && i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
+             && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
+                 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
              && i.prefix[REX_PREFIX] == 0)
            add_prefix (REX_OPCODE);
 #endif
@@ -9083,13 +9051,14 @@ output_disp (fragS *insn_start_frag, offsetT insn_start_off)
                          && i.rm.regmem == 5))
                  && (i.rm.mode == 2
                      || (i.rm.mode == 0 && i.rm.regmem == 5))
+                 && !is_any_vex_encoding(&i.tm)
                  && ((i.operands == 1
                       && i.tm.base_opcode == 0xff
                       && (i.rm.reg == 2 || i.rm.reg == 4))
                      || (i.operands == 2
                          && (i.tm.base_opcode == 0x8b
                              || i.tm.base_opcode == 0x85
-                             || (i.tm.base_opcode & 0xc7) == 0x03))))
+                             || (i.tm.base_opcode & ~0x38) == 0x03))))
                {
                  if (object_64bit)
                    {
@@ -9984,7 +9953,7 @@ i386_displacement (char *disp_start, char *disp_end)
          if (t->opcode_modifier.jump
              != current_templates->start->opcode_modifier.jump)
            break;
-         if (t->opcode_modifier.intel64)
+         if ((t->opcode_modifier.isa64 >= INTEL64))
            has_intel64 = TRUE;
        }
       if (t < current_templates->end)
@@ -12546,11 +12515,11 @@ md_parse_option (int c, const char *arg)
       break;
 
     case OPTION_MAMD64:
-      intel64 = 0;
+      isa64 = amd64;
       break;
 
     case OPTION_MINTEL64:
-      intel64 = 1;
+      isa64 = intel64;
       break;
 
     case 'O':
This page took 0.032674 seconds and 4 git commands to generate.