2002-03-15 Chris G. Demetriou <cgd@broadcom.com>
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
index 363fe4ef604d2ff93390d427103993ad547b4f3e..7b4b8582e3af26e02b0aaf2cd526956d3adee11c 100644 (file)
@@ -52,7 +52,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
 static void ckprefix PARAMS ((void));
 static const char *prefix_name PARAMS ((int, int));
-static int print_insn_i386 PARAMS ((bfd_vma, disassemble_info *));
+static int print_insn PARAMS ((bfd_vma, disassemble_info *));
 static void dofloat PARAMS ((int));
 static void OP_ST PARAMS ((int, int));
 static void OP_STi  PARAMS ((int, int));
@@ -67,7 +67,7 @@ static bfd_vma get64 PARAMS ((void));
 static bfd_signed_vma get32 PARAMS ((void));
 static bfd_signed_vma get32s PARAMS ((void));
 static int get16 PARAMS ((void));
-static void set_op PARAMS ((unsigned int, int));
+static void set_op PARAMS ((bfd_vma, int));
 static void OP_REG PARAMS ((int, int));
 static void OP_IMREG PARAMS ((int, int));
 static void OP_I PARAMS ((int, int));
@@ -96,12 +96,12 @@ static void OP_SIMD_Suffix PARAMS ((int, int));
 static void SIMD_Fixup PARAMS ((int, int));
 static void BadOp PARAMS ((void));
 
-struct dis_private
-{
+struct dis_private {
   /* Points to first byte not fetched.  */
   bfd_byte *max_fetched;
   bfd_byte the_buffer[MAXLEN];
   bfd_vma insn_start;
+  int orig_sizeflag;
   jmp_buf bailout;
 };
 
@@ -157,7 +157,7 @@ static int used_prefixes;
    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
    on error.  */
 #define FETCH_DATA(info, addr) \
-  ((addr) <= ((struct dis_private *)(info->private_data))->max_fetched \
+  ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
    ? 1 : fetch_data ((info), (addr)))
 
 static int
@@ -166,7 +166,7 @@ fetch_data (info, addr)
      bfd_byte *addr;
 {
   int status;
-  struct dis_private *priv = (struct dis_private *)info->private_data;
+  struct dis_private *priv = (struct dis_private *) info->private_data;
   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
 
   status = (*info->read_memory_func) (start,
@@ -197,7 +197,7 @@ fetch_data (info, addr)
 #define indirEv OP_indirE, v_mode
 #define Ew OP_E, w_mode
 #define Ma OP_E, v_mode
-#define M OP_E, 0              /* lea */
+#define M OP_E, 0              /* lea, lgdt, etc. */
 #define Mp OP_E, 0             /* 32 or 48 bit memory operand for LDS, LES etc */
 #define Gb OP_G, b_mode
 #define Gv OP_G, v_mode
@@ -299,9 +299,7 @@ fetch_data (info, addr)
 #define loop_jcxz_flag NULL, loop_jcxz_mode
 
 /* bits in sizeflag */
-#if 0 /* leave undefined until someone adds the extra flag to objdump */
 #define SUFFIX_ALWAYS 4
-#endif
 #define AFLAG 2
 #define DFLAG 1
 
@@ -443,9 +441,9 @@ struct dis386 {
    'N' => print 'n' if instruction has no wait "prefix"
    'O' => print 'd', or 'o'
    '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.
-   'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always is true
+   .      or suffix_always is true.  print 'q' if rex prefix is present.
+   'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
+   .      is true
    'R' => print 'w', 'l' or 'q' ("wd" or "dq" 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
@@ -773,7 +771,7 @@ static const struct dis386 dis386_twobyte[] = {
   { "(bad)",           XX, XX, XX },
   { GRPAMD },
   { "femms",           XX, XX, XX },
-  { "",                        MX, EM, OPSUF }, /* See OP_3DNowSuffix */
+  { "",                        MX, EM, OPSUF }, /* See OP_3DNowSuffix */
   /* 10 */
   { PREGRP8 },
   { PREGRP9 },
@@ -1132,30 +1130,64 @@ static unsigned char need_modrm;
    need to update onebyte_has_modrm or twobyte_has_modrm.  */
 #define MODRM_CHECK  if (!need_modrm) abort ()
 
-static const char *names64[] = {
-  "%rax","%rcx","%rdx","%rbx", "%rsp","%rbp","%rsi","%rdi",
+static const char **names64;
+static const char **names32;
+static const char **names16;
+static const char **names8;
+static const char **names8rex;
+static const char **names_seg;
+static const char **index16;
+
+static const char *intel_names64[] = {
+  "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
+  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
+};
+static const char *intel_names32[] = {
+  "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
+  "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
+};
+static const char *intel_names16[] = {
+  "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
+  "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
+};
+static const char *intel_names8[] = {
+  "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
+};
+static const char *intel_names8rex[] = {
+  "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
+  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
+};
+static const char *intel_names_seg[] = {
+  "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
+};
+static const char *intel_index16[] = {
+  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
+};
+
+static const char *att_names64[] = {
+  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
 };
-static const char *names32[] = {
-  "%eax","%ecx","%edx","%ebx", "%esp","%ebp","%esi","%edi",
+static const char *att_names32[] = {
+  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
 };
-static const char *names16[] = {
-  "%ax","%cx","%dx","%bx","%sp","%bp","%si","%di",
+static const char *att_names16[] = {
+  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
 };
-static const char *names8[] = {
-  "%al","%cl","%dl","%bl","%ah","%ch","%dh","%bh",
+static const char *att_names8[] = {
+  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
 };
-static const char *names8rex[] = {
-  "%al","%cl","%dl","%bl","%spl", "%bpl", "%sil", "%dil",
+static const char *att_names8rex[] = {
+  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
 };
-static const char *names_seg[] = {
-  "%es","%cs","%ss","%ds","%fs","%gs","%?","%?",
+static const char *att_names_seg[] = {
+  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
 };
-static const char *index16[] = {
-  "%bx,%si","%bx,%di","%bp,%si","%bp,%di","%si","%di","%bp","%bx"
+static const char *att_index16[] = {
+  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
 };
 
 static const struct dis386 grps[][8] = {
@@ -1264,10 +1296,10 @@ static const struct dis386 grps[][8] = {
     { "(bad)", Eb, XX, XX },
     { "notA",  Eb, XX, XX },
     { "negA",  Eb, XX, XX },
-    { "mulB",  AL, Eb, XX },
-    { "imulB", AL, Eb, XX },
-    { "divB",  AL, Eb, XX },
-    { "idivB", AL, Eb, XX }
+    { "mulA",  Eb, XX, XX },   /* Don't print the implicit %al register,  */
+    { "imulA", Eb, XX, XX },   /* to distinguish these opcodes from other */
+    { "divA",  Eb, XX, XX },   /* mul/imul opcodes.  Do the same for div  */
+    { "idivA", Eb, XX, XX }    /* and idiv for consistency.               */
   },
   /* GRP3S */
   {
@@ -1275,10 +1307,10 @@ static const struct dis386 grps[][8] = {
     { "(bad)", XX, XX, XX },
     { "notQ",  Ev, XX, XX },
     { "negQ",  Ev, XX, XX },
-    { "mulS",  eAX, Ev, XX },
-    { "imulS", eAX, Ev, XX },
-    { "divS",  eAX, Ev, XX },
-    { "idivS", eAX, Ev, XX },
+    { "mulQ",  Ev, XX, XX },   /* Don't print the implicit register.  */
+    { "imulQ", Ev, XX, XX },
+    { "divQ",  Ev, XX, XX },
+    { "idivQ", Ev, XX, XX },
   },
   /* GRP4 */
   {
@@ -1304,8 +1336,8 @@ static const struct dis386 grps[][8] = {
   },
   /* GRP6 */
   {
-    { "sldt",  Ew, XX, XX },
-    { "str",   Ew, XX, XX },
+    { "sldtQ", Ev, XX, XX },
+    { "strQ",  Ev, XX, XX },
     { "lldt",  Ew, XX, XX },
     { "ltr",   Ew, XX, XX },
     { "verr",  Ew, XX, XX },
@@ -1315,14 +1347,14 @@ static const struct dis386 grps[][8] = {
   },
   /* GRP7 */
   {
-    { "sgdt", Ew, XX, XX },
-    { "sidt", Ew, XX, XX },
-    { "lgdt", Ew, XX, XX },
-    { "lidt", Ew, XX, XX },
-    { "smsw", Ew, XX, XX },
-    { "(bad)", XX, XX, XX },
-    { "lmsw", Ew, XX, XX },
-    { "invlpg", Ew, XX, XX },
+    { "sgdtQ",  M, XX, XX },
+    { "sidtQ",  M, XX, XX },
+    { "lgdtQ",  M, XX, XX },
+    { "lidtQ",  M, XX, XX },
+    { "smswQ", Ev, XX, XX },
+    { "(bad)", XX, XX, XX },
+    { "lmsw",  Ew, XX, XX },
+    { "invlpg",        Ew, XX, XX },
   },
   /* GRP8 */
   {
@@ -1389,7 +1421,7 @@ static const struct dis386 grps[][8] = {
     { "lfence", None, XX, XX },
     { "mfence", None, XX, XX },
     { "sfence", None, XX, XX },
-    /* FIXME: the sfence with memory operand is clflush! */
+    /* FIXME: the sfence with memory operand is clflush!  */
   },
   /* GRP14 */
   {
@@ -1413,7 +1445,6 @@ static const struct dis386 grps[][8] = {
     { "(bad)", XX, XX, XX },
     { "(bad)", XX, XX, XX },
   }
-
 };
 
 static const struct dis386 prefix_user_table[][4] = {
@@ -1426,7 +1457,7 @@ static const struct dis386 prefix_user_table[][4] = {
   },
   /* PREGRP1 */
   {
-    { "", XM, EX, OPSIMD },    /* See OP_SIMD_SUFFIX */
+    { "", XM, EX, OPSIMD },    /* See OP_SIMD_SUFFIX */
     { "", XM, EX, OPSIMD },
     { "", XM, EX, OPSIMD },
     { "", XM, EX, OPSIMD },
@@ -1786,10 +1817,9 @@ prefix_name (pref, sizeflag)
 
 static char op1out[100], op2out[100], op3out[100];
 static int op_ad, op_index[3];
-static unsigned int op_address[3];
-static unsigned int op_riprel[3];
+static bfd_vma op_address[3];
+static bfd_vma op_riprel[3];
 static bfd_vma start_pc;
-
 \f
 /*
  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
@@ -1806,18 +1836,17 @@ static char close_char;
 static char separator_char;
 static char scale_char;
 
+/* 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.  */
 int
 print_insn_i386_att (pc, info)
      bfd_vma pc;
      disassemble_info *info;
 {
   intel_syntax = 0;
-  open_char = '(';
-  close_char =  ')';
-  separator_char = ',';
-  scale_char = ',';
 
-  return print_insn_i386 (pc, info);
+  return print_insn (pc, info);
 }
 
 int
@@ -1826,18 +1855,24 @@ print_insn_i386_intel (pc, info)
      disassemble_info *info;
 {
   intel_syntax = 1;
-  open_char = '[';
-  close_char = ']';
-  separator_char = '+';
-  scale_char = '*';
 
-  return print_insn_i386 (pc, info);
+  return print_insn (pc, info);
 }
 
-static int
+int
 print_insn_i386 (pc, info)
      bfd_vma pc;
      disassemble_info *info;
+{
+  intel_syntax = -1;
+
+  return print_insn (pc, info);
+}
+
+static int
+print_insn (pc, info)
+     bfd_vma pc;
+     disassemble_info *info;
 {
   const struct dis386 *dp;
   int i;
@@ -1845,25 +1880,102 @@ print_insn_i386 (pc, info)
   char *first, *second, *third;
   int needcomma;
   unsigned char uses_SSE_prefix;
-  VOLATILE int sizeflag;
-  VOLATILE int orig_sizeflag;
-
+  int sizeflag;
+  const char *p;
   struct dis_private priv;
-  bfd_byte *inbuf = priv.the_buffer;
 
   mode_64bit = (info->mach == bfd_mach_x86_64_intel_syntax
                || info->mach == bfd_mach_x86_64);
 
+  if (intel_syntax == -1)
+    intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
+                   || info->mach == bfd_mach_x86_64_intel_syntax);
+
   if (info->mach == bfd_mach_i386_i386
       || info->mach == bfd_mach_x86_64
       || info->mach == bfd_mach_i386_i386_intel_syntax
       || info->mach == bfd_mach_x86_64_intel_syntax)
-    sizeflag = AFLAG|DFLAG;
+    priv.orig_sizeflag = AFLAG | DFLAG;
   else if (info->mach == bfd_mach_i386_i8086)
-    sizeflag = 0;
+    priv.orig_sizeflag = 0;
   else
     abort ();
-  orig_sizeflag = sizeflag;
+
+  for (p = info->disassembler_options; p != NULL; )
+    {
+      if (strncmp (p, "x86-64", 6) == 0)
+       {
+         mode_64bit = 1;
+         priv.orig_sizeflag = AFLAG | DFLAG;
+       }
+      else if (strncmp (p, "i386", 4) == 0)
+       {
+         mode_64bit = 0;
+         priv.orig_sizeflag = AFLAG | DFLAG;
+       }
+      else if (strncmp (p, "i8086", 5) == 0)
+       {
+         mode_64bit = 0;
+         priv.orig_sizeflag = 0;
+       }
+      else if (strncmp (p, "intel", 5) == 0)
+       {
+         intel_syntax = 1;
+       }
+      else if (strncmp (p, "att", 3) == 0)
+       {
+         intel_syntax = 0;
+       }
+      else if (strncmp (p, "addr", 4) == 0)
+       {
+         if (p[4] == '1' && p[5] == '6')
+           priv.orig_sizeflag &= ~AFLAG;
+         else if (p[4] == '3' && p[5] == '2')
+           priv.orig_sizeflag |= AFLAG;
+       }
+      else if (strncmp (p, "data", 4) == 0)
+       {
+         if (p[4] == '1' && p[5] == '6')
+           priv.orig_sizeflag &= ~DFLAG;
+         else if (p[4] == '3' && p[5] == '2')
+           priv.orig_sizeflag |= DFLAG;
+       }
+      else if (strncmp (p, "suffix", 6) == 0)
+       priv.orig_sizeflag |= SUFFIX_ALWAYS;
+
+      p = strchr (p, ',');
+      if (p != NULL)
+       p++;
+    }
+
+  if (intel_syntax)
+    {
+      names64 = intel_names64;
+      names32 = intel_names32;
+      names16 = intel_names16;
+      names8 = intel_names8;
+      names8rex = intel_names8rex;
+      names_seg = intel_names_seg;
+      index16 = intel_index16;
+      open_char = '[';
+      close_char = ']';
+      separator_char = '+';
+      scale_char = '*';
+    }
+  else
+    {
+      names64 = att_names64;
+      names32 = att_names32;
+      names16 = att_names16;
+      names8 = att_names8;
+      names8rex = att_names8rex;
+      names_seg = att_names_seg;
+      index16 = att_index16;
+      open_char = '(';
+      close_char =  ')';
+      separator_char = ',';
+      scale_char = ',';
+    }
 
   /* The output looks better if we put 7 bytes on a line, since that
      puts most long word instructions on a single line.  */
@@ -1882,26 +1994,26 @@ print_insn_i386 (pc, info)
 
   the_info = info;
   start_pc = pc;
-  start_codep = inbuf;
-  codep = inbuf;
+  start_codep = priv.the_buffer;
+  codep = priv.the_buffer;
 
   if (setjmp (priv.bailout) != 0)
     {
       const char *name;
 
       /* Getting here means we tried for data but didn't get it.  That
-         means we have an incomplete instruction of some sort.  Just
-         print the first byte as a prefix or a .byte pseudo-op.  */
-      if (codep > inbuf)
+        means we have an incomplete instruction of some sort.  Just
+        print the first byte as a prefix or a .byte pseudo-op.  */
+      if (codep > priv.the_buffer)
        {
-         name = prefix_name (inbuf[0], orig_sizeflag);
+         name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
          if (name != NULL)
            (*info->fprintf_func) (info->stream, "%s", name);
          else
            {
              /* Just print the first byte as a .byte instruction.  */
              (*info->fprintf_func) (info->stream, ".byte 0x%x",
-                                    (unsigned int) inbuf[0]);
+                                    (unsigned int) priv.the_buffer[0]);
            }
 
          return 1;
@@ -1914,6 +2026,7 @@ print_insn_i386 (pc, info)
   ckprefix ();
 
   insn_codep = codep;
+  sizeflag = priv.orig_sizeflag;
 
   FETCH_DATA (info, codep + 1);
   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
@@ -1925,7 +2038,7 @@ print_insn_i386 (pc, info)
 
       /* fwait not followed by floating point instruction.  Print the
          first prefix, which is probably fwait itself.  */
-      name = prefix_name (inbuf[0], orig_sizeflag);
+      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
       if (name == NULL)
        name = INTERNAL_DISASSEMBLER_ERROR;
       (*info->fprintf_func) (info->stream, "%s", name);
@@ -2049,17 +2162,17 @@ print_insn_i386 (pc, info)
          obufp = op1out;
          op_ad = 2;
          if (dp->op1)
-           (*dp->op1)(dp->bytemode1, sizeflag);
+           (*dp->op1) (dp->bytemode1, sizeflag);
 
          obufp = op2out;
          op_ad = 1;
          if (dp->op2)
-           (*dp->op2)(dp->bytemode2, sizeflag);
+           (*dp->op2) (dp->bytemode2, sizeflag);
 
          obufp = op3out;
          op_ad = 0;
          if (dp->op3)
-           (*dp->op3)(dp->bytemode3, sizeflag);
+           (*dp->op3) (dp->bytemode3, sizeflag);
        }
     }
 
@@ -2071,7 +2184,7 @@ print_insn_i386 (pc, info)
     {
       const char *name;
 
-      name = prefix_name (inbuf[0], orig_sizeflag);
+      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
       if (name == NULL)
        name = INTERNAL_DISASSEMBLER_ERROR;
       (*info->fprintf_func) (info->stream, "%s", name);
@@ -2080,7 +2193,7 @@ print_insn_i386 (pc, info)
   if (rex & ~rex_used)
     {
       const char *name;
-      name = prefix_name (rex | 0x40, orig_sizeflag);
+      name = prefix_name (rex | 0x40, priv.orig_sizeflag);
       if (name == NULL)
        name = INTERNAL_DISASSEMBLER_ERROR;
       (*info->fprintf_func) (info->stream, "%s ", name);
@@ -2144,7 +2257,7 @@ print_insn_i386 (pc, info)
        (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
                                                + op_address[op_index[i]]), info);
       }
-  return codep - inbuf;
+  return codep - priv.the_buffer;
 }
 
 static const char *float_mem[] = {
@@ -2340,7 +2453,6 @@ static const struct dis386 float_reg[][8] = {
   },
 };
 
-
 static char *fgrps[][8] = {
   /* d9_2  0 */
   {
@@ -2400,7 +2512,7 @@ dofloat (sizeflag)
 
   if (mod != 3)
     {
-      putop (float_mem[(floatop - 0xd8 ) * 8 + reg], sizeflag);
+      putop (float_mem[(floatop - 0xd8) * 8 + reg], sizeflag);
       obufp = op1out;
       if (floatop == 0xdb)
         OP_E (x_mode, sizeflag);
@@ -2410,7 +2522,7 @@ dofloat (sizeflag)
         OP_E (v_mode, sizeflag);
       return;
     }
-  /* skip mod/rm byte */
+  /* Skip mod/rm byte.  */
   MODRM_CHECK;
   codep++;
 
@@ -2419,7 +2531,7 @@ dofloat (sizeflag)
     {
       putop (fgrps[dp->bytemode1][rm], sizeflag);
 
-      /* instruction fnstsw is only one with strange arg */
+      /* Instruction fnstsw is only one with strange arg.  */
       if (floatop == 0xdf && codep[-1] == 0xe0)
        strcpy (op1out, names16[0]);
     }
@@ -2429,10 +2541,10 @@ dofloat (sizeflag)
 
       obufp = op1out;
       if (dp->op1)
-       (*dp->op1)(dp->bytemode1, sizeflag);
+       (*dp->op1) (dp->bytemode1, sizeflag);
       obufp = op2out;
       if (dp->op2)
-       (*dp->op2)(dp->bytemode2, sizeflag);
+       (*dp->op2) (dp->bytemode2, sizeflag);
     }
 }
 
@@ -2450,10 +2562,10 @@ OP_STi (bytemode, sizeflag)
      int sizeflag ATTRIBUTE_UNUSED;
 {
   sprintf (scratchbuf, "%%st(%d)", rm);
-  oappend (scratchbuf);
+  oappend (scratchbuf + intel_syntax);
 }
 
-/* capital letters in template are macros */
+/* Capital letters in template are macros.  */
 static int
 putop (template, sizeflag)
      const char *template;
@@ -2504,20 +2616,14 @@ putop (template, sizeflag)
        case 'A':
           if (intel_syntax)
             break;
-         if (mod != 3
-#ifdef SUFFIX_ALWAYS
-             || (sizeflag & SUFFIX_ALWAYS)
-#endif
-             )
+         if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
            *obufp++ = 'b';
          break;
        case 'B':
           if (intel_syntax)
             break;
-#ifdef SUFFIX_ALWAYS
          if (sizeflag & SUFFIX_ALWAYS)
            *obufp++ = 'b';
-#endif
          break;
        case 'E':               /* For jcxz/jecxz */
          if (sizeflag & AFLAG)
@@ -2527,11 +2633,7 @@ putop (template, sizeflag)
        case 'F':
           if (intel_syntax)
             break;
-         if ((prefixes & PREFIX_ADDR)
-#ifdef SUFFIX_ALWAYS
-             || (sizeflag & SUFFIX_ALWAYS)
-#endif
-             )
+         if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
            {
              if (sizeflag & AFLAG)
                *obufp++ = 'l';
@@ -2558,10 +2660,8 @@ putop (template, sizeflag)
        case 'L':
           if (intel_syntax)
             break;
-#ifdef SUFFIX_ALWAYS
          if (sizeflag & SUFFIX_ALWAYS)
            *obufp++ = 'l';
-#endif
          break;
        case 'N':
          if ((prefixes & PREFIX_FWAIT) == 0)
@@ -2584,16 +2684,13 @@ putop (template, sizeflag)
              *obufp++ = 'q';
              break;
            }
-         /* Fall through */
+         /* Fall through */
        case 'P':
           if (intel_syntax)
             break;
          if ((prefixes & PREFIX_DATA)
              || (rex & REX_MODE64)
-#ifdef SUFFIX_ALWAYS
-             || (sizeflag & SUFFIX_ALWAYS)
-#endif
-             )
+             || (sizeflag & SUFFIX_ALWAYS))
            {
              USED_REX (REX_MODE64);
              if (rex & REX_MODE64)
@@ -2616,16 +2713,12 @@ putop (template, sizeflag)
              *obufp++ = 'q';
              break;
            }
-         /* Fall through */
+         /* Fall through */
        case 'Q':
           if (intel_syntax)
             break;
          USED_REX (REX_MODE64);
-         if (mod != 3
-#ifdef SUFFIX_ALWAYS
-             || (sizeflag & SUFFIX_ALWAYS)
-#endif
-             )
+         if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
            {
              if (rex & REX_MODE64)
                *obufp++ = 'q';
@@ -2674,7 +2767,6 @@ putop (template, sizeflag)
        case 'S':
           if (intel_syntax)
             break;
-#ifdef SUFFIX_ALWAYS
          if (sizeflag & SUFFIX_ALWAYS)
            {
              if (rex & REX_MODE64)
@@ -2688,7 +2780,6 @@ putop (template, sizeflag)
                  used_prefixes |= (prefixes & PREFIX_DATA);
                }
            }
-#endif
          break;
        case 'X':
          if (prefixes & PREFIX_DATA)
@@ -2755,33 +2846,33 @@ append_seg ()
 {
   if (prefixes & PREFIX_CS)
     {
-      oappend ("%cs:");
       used_prefixes |= PREFIX_CS;
+      oappend ("%cs:" + intel_syntax);
     }
   if (prefixes & PREFIX_DS)
     {
-      oappend ("%ds:");
       used_prefixes |= PREFIX_DS;
+      oappend ("%ds:" + intel_syntax);
     }
   if (prefixes & PREFIX_SS)
     {
-      oappend ("%ss:");
       used_prefixes |= PREFIX_SS;
+      oappend ("%ss:" + intel_syntax);
     }
   if (prefixes & PREFIX_ES)
     {
-      oappend ("%es:");
       used_prefixes |= PREFIX_ES;
+      oappend ("%es:" + intel_syntax);
     }
   if (prefixes & PREFIX_FS)
     {
-      oappend ("%fs:");
       used_prefixes |= PREFIX_FS;
+      oappend ("%fs:" + intel_syntax);
     }
   if (prefixes & PREFIX_GS)
     {
-      oappend ("%gs:");
       used_prefixes |= PREFIX_GS;
+      oappend ("%gs:" + intel_syntax);
     }
 }
 
@@ -2810,7 +2901,7 @@ print_operand_value (buf, hex, disp)
          buf[0] = '0';
          buf[1] = 'x';
          sprintf_vma (tmp, disp);
-         for (i = 0; tmp[i] == '0' && tmp[i+1]; i++);
+         for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
          strcpy (buf + 2, tmp + i);
        }
       else
@@ -2822,7 +2913,7 @@ print_operand_value (buf, hex, disp)
            {
              *(buf++) = '-';
              v = -disp;
-             /* Check for possible overflow on 0x8000000000000000 */
+             /* Check for possible overflow on 0x8000000000000000 */
              if (v < 0)
                {
                  strcpy (buf, "9223372036854775808");
@@ -2839,7 +2930,7 @@ print_operand_value (buf, hex, disp)
          tmp[29] = 0;
          while (v)
            {
-             tmp[28-i] = (v % 10) + '0';
+             tmp[28 - i] = (v % 10) + '0';
              v /= 10;
              i++;
            }
@@ -2867,7 +2958,7 @@ OP_E (bytemode, sizeflag)
   if (rex & REX_EXTZ)
     add += 8;
 
-  /* skip mod/rm byte */
+  /* Skip mod/rm byte.  */
   MODRM_CHECK;
   codep++;
 
@@ -2908,10 +2999,10 @@ OP_E (bytemode, sizeflag)
          used_prefixes |= (prefixes & PREFIX_DATA);
          break;
        case 0:
-         if ( !(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */)
+         if (!(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */)
              && !(codep[-2] == 0xAE && codep[-1] == 0xF0 /* mfence */)
              && !(codep[-2] == 0xAE && codep[-1] == 0xe8 /* lfence */))
-           BadOp();    /* bad sfence,lea,lds,les,lfs,lgs,lss modrm */
+           BadOp ();   /* bad sfence,lea,lds,les,lfs,lgs,lss modrm */
          break;
        default:
          oappend (INTERNAL_DISASSEMBLER_ERROR);
@@ -3036,10 +3127,12 @@ OP_E (bytemode, sizeflag)
                           *obufp++ = separator_char;
                           *obufp = '\0';
                         }
-                      sprintf (scratchbuf, "%s", mode_64bit ? names64[index] : names32[index]);
+                      sprintf (scratchbuf, "%s",
+                              mode_64bit ? names64[index] : names32[index]);
                     }
                   else
-                   sprintf (scratchbuf, ",%s", mode_64bit ? names64[index] : names32[index]);
+                   sprintf (scratchbuf, ",%s",
+                            mode_64bit ? names64[index] : names32[index]);
                  oappend (scratchbuf);
                }
               if (!intel_syntax
@@ -3057,9 +3150,15 @@ OP_E (bytemode, sizeflag)
           if (intel_syntax)
             if (mod != 0 || (base & 7) == 5)
               {
-                /* Don't print zero displacements */
+               /* Don't print zero displacements.  */
                 if (disp != 0)
                   {
+                   if ((bfd_signed_vma) disp > 0)
+                     {
+                       *obufp++ = '+';
+                       *obufp = '\0';
+                     }
+
                    print_operand_value (scratchbuf, 0, disp);
                     oappend (scratchbuf);
                   }
@@ -3077,7 +3176,7 @@ OP_E (bytemode, sizeflag)
                ;
              else
                {
-                 oappend (names_seg[3]);
+                 oappend (names_seg[ds_reg - es_reg]);
                  oappend (":");
                }
              print_operand_value (scratchbuf, 1, disp);
@@ -3190,7 +3289,7 @@ get64 ()
   b |= (*codep++ & 0xff) << 24;
   x = a + ((bfd_vma) b << 32);
 #else
-  abort();
+  abort ();
   x = 0;
 #endif
   return x;
@@ -3238,12 +3337,21 @@ get16 ()
 
 static void
 set_op (op, riprel)
-     unsigned int op;
+     bfd_vma op;
      int riprel;
 {
   op_index[op_ad] = op_ad;
-  op_address[op_ad] = op;
-  op_riprel[op_ad] = riprel;
+  if (mode_64bit)
+    {
+      op_address[op_ad] = op;
+      op_riprel[op_ad] = riprel;
+    }
+  else
+    {
+      /* Mask to get a 32-bit address.  */
+      op_address[op_ad] = op & 0xffffffff;
+      op_riprel[op_ad] = riprel & 0xffffffff;
+    }
 }
 
 static void
@@ -3260,7 +3368,10 @@ OP_REG (code, sizeflag)
   switch (code)
     {
     case indir_dx_reg:
-      s = "(%dx)";
+      if (intel_syntax)
+        s = "[dx]";
+      else
+        s = "(%dx)";
       break;
     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
     case sp_reg: case bp_reg: case si_reg: case di_reg:
@@ -3286,7 +3397,7 @@ OP_REG (code, sizeflag)
          break;
        }
       code += eAX_reg - rAX_reg;
-      /* Fall through */
+      /* Fall through */
     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
       USED_REX (REX_MODE64);
@@ -3315,7 +3426,10 @@ OP_IMREG (code, sizeflag)
   switch (code)
     {
     case indir_dx_reg:
-      s = "(%dx)";
+      if (intel_syntax)
+        s = "[dx]";
+      else
+        s = "(%dx)";
       break;
     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
     case sp_reg: case bp_reg: case si_reg: case di_reg:
@@ -3372,7 +3486,7 @@ OP_I (bytemode, sizeflag)
          op = get32s ();
          break;
        }
-      /* Fall through */
+      /* Fall through */
     case v_mode:
       USED_REX (REX_MODE64);
       if (rex & REX_MODE64)
@@ -3400,8 +3514,8 @@ OP_I (bytemode, sizeflag)
 
   op &= mask;
   scratchbuf[0] = '$';
-  print_operand_value (scratchbuf + !intel_syntax, 1, op);
-  oappend (scratchbuf);
+  print_operand_value (scratchbuf + 1, 1, op);
+  oappend (scratchbuf + intel_syntax);
   scratchbuf[0] = '\0';
 }
 
@@ -3453,8 +3567,8 @@ OP_I64 (bytemode, sizeflag)
 
   op &= mask;
   scratchbuf[0] = '$';
-  print_operand_value (scratchbuf + !intel_syntax, 1, op);
-  oappend (scratchbuf);
+  print_operand_value (scratchbuf + 1, 1, op);
+  oappend (scratchbuf + intel_syntax);
   scratchbuf[0] = '\0';
 }
 
@@ -3487,7 +3601,7 @@ OP_sI (bytemode, sizeflag)
       else
        {
          mask = 0xffffffff;
-         op = get16();
+         op = get16 ();
          if ((op & 0x8000) != 0)
            op -= 0x10000;
        }
@@ -3506,7 +3620,7 @@ OP_sI (bytemode, sizeflag)
 
   scratchbuf[0] = '$';
   print_operand_value (scratchbuf + 1, 1, op);
-  oappend (scratchbuf);
+  oappend (scratchbuf + intel_syntax);
 }
 
 static void
@@ -3515,7 +3629,7 @@ OP_J (bytemode, sizeflag)
      int sizeflag;
 {
   bfd_vma disp;
-  int mask = -1;
+  bfd_vma mask = -1;
 
   switch (bytemode)
     {
@@ -3531,7 +3645,7 @@ OP_J (bytemode, sizeflag)
       else
        {
          disp = get16 ();
-         /* for some reason, a data16 prefix on a jump instruction
+         /* For some reason, a data16 prefix on a jump instruction
             means that the pc is masked to 16 bits after the
             displacement is added!  */
          mask = 0xffff;
@@ -3552,11 +3666,7 @@ OP_SEG (dummy, sizeflag)
      int dummy ATTRIBUTE_UNUSED;
      int sizeflag ATTRIBUTE_UNUSED;
 {
-  static char *sreg[] = {
-    "%es","%cs","%ss","%ds","%fs","%gs","%?","%?",
-  };
-
-  oappend (sreg[reg]);
+  oappend (names_seg[reg]);
 }
 
 static void
@@ -3577,7 +3687,10 @@ OP_DIR (dummy, sizeflag)
       seg = get16 ();
     }
   used_prefixes |= (prefixes & PREFIX_DATA);
-  sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
+  if (intel_syntax)
+    sprintf (scratchbuf, "0x%x,0x%x", seg, offset);
+  else
+    sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
   oappend (scratchbuf);
 }
 
@@ -3600,7 +3713,7 @@ OP_OFF (bytemode, sizeflag)
       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
        {
-         oappend (names_seg[3]);
+         oappend (names_seg[ds_reg - es_reg]);
          oappend (":");
        }
     }
@@ -3623,14 +3736,14 @@ OP_OFF64 (bytemode, sizeflag)
 
   append_seg ();
 
-  off = get64();
+  off = get64 ();
 
   if (intel_syntax)
     {
       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
        {
-         oappend (names_seg[3]);
+         oappend (names_seg[ds_reg - es_reg]);
          oappend (":");
        }
     }
@@ -3644,7 +3757,11 @@ ptr_reg (code, sizeflag)
      int sizeflag;
 {
   const char *s;
-  oappend ("(");
+  if (intel_syntax)
+    oappend ("[");
+  else
+    oappend ("(");
+
   USED_REX (REX_MODE64);
   if (rex & REX_MODE64)
     s = names64[code - eAX_reg];
@@ -3653,7 +3770,10 @@ ptr_reg (code, sizeflag)
   else
     s = names16[code - eAX_reg];
   oappend (s);
-  oappend (")");
+  if (intel_syntax)
+    oappend ("]");
+  else
+    oappend (")");
 }
 
 static void
@@ -3661,7 +3781,7 @@ OP_ESreg (code, sizeflag)
      int code;
      int sizeflag;
 {
-  oappend ("%es:");
+  oappend ("%es:" + intel_syntax);
   ptr_reg (code, sizeflag);
 }
 
@@ -3678,7 +3798,7 @@ OP_DSreg (code, sizeflag)
          | PREFIX_FS
          | PREFIX_GS)) == 0)
     prefixes |= PREFIX_DS;
-  append_seg();
+  append_seg ();
   ptr_reg (code, sizeflag);
 }
 
@@ -3691,8 +3811,8 @@ OP_C (dummy, sizeflag)
   USED_REX (REX_EXTX);
   if (rex & REX_EXTX)
     add = 8;
-  sprintf (scratchbuf, "%%cr%d", reg+add);
-  oappend (scratchbuf);
+  sprintf (scratchbuf, "%%cr%d", reg + add);
+  oappend (scratchbuf + intel_syntax);
 }
 
 static void
@@ -3704,7 +3824,10 @@ OP_D (dummy, sizeflag)
   USED_REX (REX_EXTX);
   if (rex & REX_EXTX)
     add = 8;
-  sprintf (scratchbuf, "%%db%d", reg+add);
+  if (intel_syntax)
+    sprintf (scratchbuf, "db%d", reg + add);
+  else
+    sprintf (scratchbuf, "%%db%d", reg + add);
   oappend (scratchbuf);
 }
 
@@ -3714,7 +3837,7 @@ OP_T (dummy, sizeflag)
      int sizeflag ATTRIBUTE_UNUSED;
 {
   sprintf (scratchbuf, "%%tr%d", reg);
-  oappend (scratchbuf);
+  oappend (scratchbuf + intel_syntax);
 }
 
 static void
@@ -3725,7 +3848,7 @@ OP_Rd (bytemode, sizeflag)
   if (mod == 3)
     OP_E (bytemode, sizeflag);
   else
-    BadOp();
+    BadOp ();
 }
 
 static void
@@ -3742,7 +3865,7 @@ OP_MMX (bytemode, sizeflag)
     sprintf (scratchbuf, "%%xmm%d", reg + add);
   else
     sprintf (scratchbuf, "%%mm%d", reg + add);
-  oappend (scratchbuf);
+  oappend (scratchbuf + intel_syntax);
 }
 
 static void
@@ -3755,7 +3878,7 @@ OP_XMM (bytemode, sizeflag)
   if (rex & REX_EXTX)
     add = 8;
   sprintf (scratchbuf, "%%xmm%d", reg + add);
-  oappend (scratchbuf);
+  oappend (scratchbuf + intel_syntax);
 }
 
 static void
@@ -3773,7 +3896,7 @@ OP_EM (bytemode, sizeflag)
   if (rex & REX_EXTZ)
     add = 8;
 
-  /* skip mod/rm byte */
+  /* Skip mod/rm byte.  */
   MODRM_CHECK;
   codep++;
   used_prefixes |= (prefixes & PREFIX_DATA);
@@ -3781,7 +3904,7 @@ OP_EM (bytemode, sizeflag)
     sprintf (scratchbuf, "%%xmm%d", rm + add);
   else
     sprintf (scratchbuf, "%%mm%d", rm + add);
-  oappend (scratchbuf);
+  oappend (scratchbuf + intel_syntax);
 }
 
 static void
@@ -3799,11 +3922,11 @@ OP_EX (bytemode, sizeflag)
   if (rex & REX_EXTZ)
     add = 8;
 
-  /* skip mod/rm byte */
+  /* Skip mod/rm byte.  */
   MODRM_CHECK;
   codep++;
   sprintf (scratchbuf, "%%xmm%d", rm + add);
-  oappend (scratchbuf);
+  oappend (scratchbuf + intel_syntax);
 }
 
 static void
@@ -3814,7 +3937,7 @@ OP_MS (bytemode, sizeflag)
   if (mod == 3)
     OP_EM (bytemode, sizeflag);
   else
-    BadOp();
+    BadOp ();
 }
 
 static void
@@ -3825,7 +3948,7 @@ OP_XS (bytemode, sizeflag)
   if (mod == 3)
     OP_EX (bytemode, sizeflag);
   else
-    BadOp();
+    BadOp ();
 }
 
 static const char *Suffix3DNow[] = {
@@ -3906,7 +4029,7 @@ OP_3DNowSuffix (bytemode, sizeflag)
   /* AMD 3DNow! instructions are specified by an opcode suffix in the
      place where an 8-bit immediate would normally go.  ie. the last
      byte of the instruction.  */
-  obufp = obuf + strlen(obuf);
+  obufp = obuf + strlen (obuf);
   mnemonic = Suffix3DNow[*codep++ & 0xff];
   if (mnemonic)
     oappend (mnemonic);
@@ -3918,12 +4041,11 @@ OP_3DNowSuffix (bytemode, sizeflag)
         we have a bad opcode.  This necessitates some cleaning up.  */
       op1out[0] = '\0';
       op2out[0] = '\0';
-      BadOp();
+      BadOp ();
     }
 }
 
-
-static const char *simd_cmp_op [] = {
+static const char *simd_cmp_op[] = {
   "eq",
   "lt",
   "le",
@@ -3942,7 +4064,7 @@ OP_SIMD_Suffix (bytemode, sizeflag)
   unsigned int cmp_type;
 
   FETCH_DATA (the_info, codep + 1);
-  obufp = obuf + strlen(obuf);
+  obufp = obuf + strlen (obuf);
   cmp_type = *codep++ & 0xff;
   if (cmp_type < 8)
     {
@@ -3972,7 +4094,7 @@ OP_SIMD_Suffix (bytemode, sizeflag)
       /* We have a bad extension byte.  Clean up.  */
       op1out[0] = '\0';
       op2out[0] = '\0';
-      BadOp();
+      BadOp ();
     }
 }
 
@@ -3985,17 +4107,19 @@ SIMD_Fixup (extrachar, sizeflag)
      forms of these instructions.  */
   if (mod == 3)
     {
-      char *p = obuf + strlen(obuf);
-      *(p+1) = '\0';
-      *p     = *(p-1);
-      *(p-1) = *(p-2);
-      *(p-2) = *(p-3);
-      *(p-3) = extrachar;
+      char *p = obuf + strlen (obuf);
+      *(p + 1) = '\0';
+      *p       = *(p - 1);
+      *(p - 1) = *(p - 2);
+      *(p - 2) = *(p - 3);
+      *(p - 3) = extrachar;
     }
 }
 
-static void BadOp (void)
+static void
+BadOp (void)
 {
-  codep = insn_codep + 1;      /* throw away prefixes and 1st. opcode byte */
+  /* Throw away prefixes and 1st. opcode byte.  */
+  codep = insn_codep + 1;
   oappend ("(bad)");
 }
This page took 0.086975 seconds and 4 git commands to generate.