binutils/
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
index 5453a00b31682f992db1da40c4193c7c0e5576c8..b33d1be484749aa56902d1cfa89fd913b96603de 100644 (file)
 #define INFER_ADDR_PREFIX 1
 #endif
 
-#ifndef SCALE1_WHEN_NO_INDEX
-/* Specifying a scale factor besides 1 when there is no index is
-   futile.  eg. `mov (%ebx,2),%al' does exactly the same as
-   `mov (%ebx),%al'.  To slavishly follow what the programmer
-   specified, set SCALE1_WHEN_NO_INDEX to 0.  */
-#define SCALE1_WHEN_NO_INDEX 1
-#endif
-
 #ifndef DEFAULT_ARCH
 #define DEFAULT_ARCH "i386"
 #endif
@@ -66,6 +58,7 @@
 static void set_code_flag (int);
 static void set_16bit_gcc_code_flag (int);
 static void set_intel_syntax (int);
+static void set_allow_index_reg (int);
 static void set_cpu_arch (int);
 #ifdef TE_PE
 static void pe_directive_secrel (int);
@@ -273,7 +266,6 @@ enum flag_code {
        CODE_32BIT,
        CODE_16BIT,
        CODE_64BIT };
-#define NUM_FLAG_CODE ((int) CODE_64BIT + 1)
 
 static enum flag_code flag_code;
 static unsigned int object_64bit;
@@ -294,6 +286,9 @@ static int intel_syntax = 0;
 /* 1 if register prefix % not required.  */
 static int allow_naked_reg = 0;
 
+/* 1 if fake index register, eiz/riz, is allowed .  */
+static int allow_index_reg = 0;
+
 /* Register prefix used for error message.  */
 static const char *register_prefix = "%";
 
@@ -539,6 +534,8 @@ const pseudo_typeS md_pseudo_table[] =
   {"code64", set_code_flag, CODE_64BIT},
   {"intel_syntax", set_intel_syntax, 1},
   {"att_syntax", set_intel_syntax, 0},
+  {"allow_index_reg", set_allow_index_reg, 1},
+  {"disallow_index_reg", set_allow_index_reg, 0},
 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
   {"largecomm", handle_large_common, 0},
 #else
@@ -1098,7 +1095,6 @@ static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
 static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
 static const i386_operand_type anydisp
   = OPERAND_TYPE_ANYDISP;
-static const i386_operand_type baseindex = OPERAND_TYPE_BASEINDEX;
 static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
 static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
 static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
@@ -1508,6 +1504,12 @@ set_intel_syntax (int syntax_flag)
   register_prefix = allow_naked_reg ? "" : "%";
 }
 
+static void
+set_allow_index_reg (int flag)
+{
+  allow_index_reg = flag;
+}
+
 static void
 set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
 {
@@ -2199,7 +2201,7 @@ md_assemble (line)
                  || !i.tm.opcode_modifier.no_wsuf
                  || !i.tm.opcode_modifier.no_lsuf
                  || !i.tm.opcode_modifier.no_ssuf
-                 || !i.tm.opcode_modifier.no_xsuf
+                 || !i.tm.opcode_modifier.no_ldsuf
                  || !i.tm.opcode_modifier.no_qsuf))
            as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
 
@@ -2998,7 +3000,7 @@ match_template (void)
   else if (i.suffix == QWORD_MNEM_SUFFIX)
     suffix_check.no_qsuf = 1;
   else if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
-    suffix_check.no_xsuf = 1;
+    suffix_check.no_ldsuf = 1;
 
   for (t = current_templates->start; t < current_templates->end; t++)
     {
@@ -3009,13 +3011,13 @@ match_template (void)
        continue;
 
       /* Check the suffix, except for some instructions in intel mode.  */
-      if (((t->opcode_modifier.no_bsuf & suffix_check.no_bsuf)
-          || (t->opcode_modifier.no_wsuf & suffix_check.no_wsuf)
-          || (t->opcode_modifier.no_lsuf & suffix_check.no_lsuf)
-          || (t->opcode_modifier.no_ssuf & suffix_check.no_ssuf)
-          || (t->opcode_modifier.no_qsuf & suffix_check.no_qsuf)
-          || (t->opcode_modifier.no_xsuf & suffix_check.no_xsuf))
-         && !(intel_syntax && t->opcode_modifier.ignoresize))
+      if ((!intel_syntax || !t->opcode_modifier.ignoresize)
+         && ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
+             || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
+             || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
+             || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
+             || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
+             || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf)))
        continue;
 
       for (j = 0; j < MAX_OPERANDS; j++)
@@ -3382,7 +3384,11 @@ process_suffix (void)
        }
       else if (i.suffix == QWORD_MNEM_SUFFIX)
        {
-         if (!check_qword_reg ())
+         if (intel_syntax
+             && i.tm.opcode_modifier.ignoresize
+             && i.tm.opcode_modifier.no_qsuf)
+           i.suffix = 0;
+         else if (!check_qword_reg ())
            return 0;
        }
       else if (i.suffix == WORD_MNEM_SUFFIX)
@@ -3486,17 +3492,10 @@ process_suffix (void)
       /* Now select between word & dword operations via the operand
         size prefix, except for instructions that will ignore this
         prefix anyway.  */
-      if (i.tm.base_opcode == 0x0f01
-          && (i.tm.extension_opcode == 0xc8
-              || i.tm.extension_opcode == 0xd8
-              || i.tm.extension_opcode == 0xda
-              || i.tm.extension_opcode == 0xdb
-              || i.tm.extension_opcode == 0xdf))
-       {
-         /* monitor in SSE3 is a very special case. The default size
-            of AX is the size of mode. The address size override
-            prefix will change the size of AX.  It is also true for
-            invlpga, vmload, vmrun and vmsave in SVME.  */
+      if (i.tm.opcode_modifier.addrprefixop0)
+       {
+         /* The address size override prefix changes the size of the
+            first operand.  */
          if ((flag_code == CODE_32BIT
               && i.op->regs[0].reg_type.bitfield.reg16)
              || (flag_code != CODE_32BIT
@@ -3563,16 +3562,8 @@ check_byte_reg (void)
       if (i.types[op].bitfield.reg8)
        continue;
 
-      /* movzx, movsx, pextrb and pinsrb should not generate this
-        warning.  */
-      if (intel_syntax
-         && (i.tm.base_opcode == 0xfb7
-             || i.tm.base_opcode == 0xfb6
-             || i.tm.base_opcode == 0x63
-             || i.tm.base_opcode == 0xfbe
-             || i.tm.base_opcode == 0xfbf
-             || i.tm.base_opcode == 0x660f3a14
-             || i.tm.base_opcode == 0x660f3a20))
+      /* Don't generate this warning if not needed.  */
+      if (intel_syntax && i.tm.opcode_modifier.byteokintel)
        continue;
 
       /* crc32 doesn't generate this warning.  */
@@ -3684,11 +3675,10 @@ check_long_reg (void)
                 || i.tm.operand_types[op].bitfield.acc))
       {
        if (intel_syntax
-           && i.tm.base_opcode == 0xf30f2d
+           && i.tm.opcode_modifier.toqword
            && !i.types[0].bitfield.regxmm)
          {
-           /* cvtss2si converts DWORD memory to Reg64.  We want
-              REX byte. */
+           /* Convert to QWORD.  We want REX byte. */
            i.suffix = QWORD_MNEM_SUFFIX;
          }
        else
@@ -3731,11 +3721,10 @@ check_qword_reg (void)
        /* Prohibit these changes in the 64bit mode, since the
           lowering is more complicated.  */
        if (intel_syntax
-           && i.tm.base_opcode == 0xf20f2d
+           && i.tm.opcode_modifier.todword
            && !i.types[0].bitfield.regxmm)
          {
-           /* cvtsd2si converts QWORD memory to Reg32.  We don't want
-              REX byte. */
+           /* Convert to DWORD.  We don't want REX byte. */
            i.suffix = LONG_MNEM_SUFFIX;
          }
        else
@@ -4222,57 +4211,56 @@ process_operands (void)
       || i.tm.opcode_modifier.drexc)
     process_drex ();
 
-  /* The imul $imm, %reg instruction is converted into
-     imul $imm, %reg, %reg, and the clr %reg instruction
-     is converted into xor %reg, %reg.  */
-  if (i.tm.opcode_modifier.regkludge)
-    {
-       if (i.tm.cpu_flags.bitfield.cpusse4_1)
-        {
-          /* The first operand in instruction blendvpd, blendvps and
-             pblendvb in SSE4.1 is implicit and must be xmm0.  */
-          assert (i.operands == 3
-                  && i.reg_operands >= 2
-                  && UINTS_EQUAL (i.types[0], regxmm));
-          if (i.op[0].regs->reg_num != 0)
-            {
-              if (intel_syntax)
-                as_bad (_("the last operand of `%s' must be `%sxmm0'"),
-                        i.tm.name, register_prefix);
-              else
-                as_bad (_("the first operand of `%s' must be `%sxmm0'"),
-                        i.tm.name, register_prefix);
-              return 0;
-            }
-          i.op[0] = i.op[1];
-          i.op[1] = i.op[2];
-          i.types[0] = i.types[1];
-          i.types[1] = i.types[2];
-          i.operands--;
-          i.reg_operands--;
-
-          /* We need to adjust fields in i.tm since they are used by
-             build_modrm_byte.  */
-          i.tm.operand_types [0] = i.tm.operand_types [1];
-          i.tm.operand_types [1] = i.tm.operand_types [2];
-          i.tm.operands--;
-        }
-       else
-        {
-          unsigned int first_reg_op;
-          
-          if (operand_type_check (i.types[0], reg))
-            first_reg_op = 0;
-          else
-            first_reg_op = 1;
-          /* Pretend we saw the extra register operand.  */
-          assert (i.reg_operands == 1
-                  && i.op[first_reg_op + 1].regs == 0);
-          i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
-          i.types[first_reg_op + 1] = i.types[first_reg_op];
-          i.operands++;
-          i.reg_operands++;
-        }
+  if (i.tm.opcode_modifier.firstxmm0)
+    {
+      unsigned int j;
+
+      /* The first operand is implicit and must be xmm0.  */
+      assert (i.reg_operands && UINTS_EQUAL (i.types[0], regxmm));
+      if (i.op[0].regs->reg_num != 0)
+       {
+         if (intel_syntax)
+           as_bad (_("the last operand of `%s' must be `%sxmm0'"),
+                   i.tm.name, register_prefix);
+         else
+           as_bad (_("the first operand of `%s' must be `%sxmm0'"),
+                   i.tm.name, register_prefix);
+         return 0;
+       }
+
+      for (j = 1; j < i.operands; j++)
+       {
+         i.op[j - 1] = i.op[j];
+         i.types[j - 1] = i.types[j];
+
+         /* We need to adjust fields in i.tm since they are used by
+            build_modrm_byte.  */
+         i.tm.operand_types [j - 1] = i.tm.operand_types [j];
+       }
+
+      i.operands--;
+      i.reg_operands--;
+      i.tm.operands--;
+    }
+  else if (i.tm.opcode_modifier.regkludge)
+    {
+      /* The imul $imm, %reg instruction is converted into
+        imul $imm, %reg, %reg, and the clr %reg instruction
+        is converted into xor %reg, %reg.  */
+
+      unsigned int first_reg_op;
+
+      if (operand_type_check (i.types[0], reg))
+       first_reg_op = 0;
+      else
+       first_reg_op = 1;
+      /* Pretend we saw the extra register operand.  */
+      assert (i.reg_operands == 1
+             && i.op[first_reg_op + 1].regs == 0);
+      i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
+      i.types[first_reg_op + 1] = i.types[first_reg_op];
+      i.operands++;
+      i.reg_operands++;
     }
 
   if (i.tm.opcode_modifier.shortform)
@@ -4413,11 +4401,12 @@ build_modrm_byte (void)
            source = 0;
          break;
        case 4:
-         /* When there are 4 operands, the first two must be immediate
-            operands. The source operand will be the 3rd one.  */
+         /* When there are 4 operands, the first two must be 8bit
+            immediate operands. The source operand will be the 3rd
+            one.  */
          assert (i.imm_operands == 2
-                 && operand_type_check (i.types[0], imm)
-                 && operand_type_check (i.types[1], imm));
+                 && i.types[0].bitfield.imm8
+                 && i.types[1].bitfield.imm8);
          source = 2;
          break;
        default:
@@ -4518,7 +4507,11 @@ build_modrm_byte (void)
                }
              else /* !i.base_reg && i.index_reg  */
                {
-                 i.sib.index = i.index_reg->reg_num;
+                 if (i.index_reg->reg_num == RegEiz
+                     || i.index_reg->reg_num == RegRiz)
+                   i.sib.index = NO_INDEX_REGISTER;
+                 else
+                   i.sib.index = i.index_reg->reg_num;
                  i.sib.base = NO_BASE_REGISTER;
                  i.sib.scale = i.log2_scale_factor;
                  i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
@@ -4541,7 +4534,8 @@ build_modrm_byte (void)
                }
            }
          /* RIP addressing for 64bit mode.  */
-         else if (UINTS_EQUAL (i.base_reg->reg_type, baseindex))
+         else if (i.base_reg->reg_num == RegRip ||
+                  i.base_reg->reg_num == RegEip)
            {
              i.rm.regmem = NO_BASE_REGISTER;
              i.types[op].bitfield.disp8 = 0;
@@ -4626,16 +4620,14 @@ build_modrm_byte (void)
                     Any base register besides %esp will not use the
                     extra modrm byte.  */
                  i.sib.index = NO_INDEX_REGISTER;
-#if !SCALE1_WHEN_NO_INDEX
-                 /* Another case where we force the second modrm
-                    byte.  */
-                 if (i.log2_scale_factor)
-                   i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
-#endif
                }
              else
                {
-                 i.sib.index = i.index_reg->reg_num;
+                 if (i.index_reg->reg_num == RegEiz
+                     || i.index_reg->reg_num == RegRiz)
+                   i.sib.index = NO_INDEX_REGISTER;
+                 else
+                   i.sib.index = i.index_reg->reg_num;
                  i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
                  if ((i.index_reg->reg_flags & RegRex) != 0)
                    i.rex |= REX_X;
@@ -4970,67 +4962,64 @@ output_insn (void)
       /* Output normal instructions here.  */
       char *p;
       unsigned char *q;
+      unsigned int j;
       unsigned int prefix;
-      int opc_3b;
-
-      /* All opcodes on i386 have either 1 or 2 bytes.  SSSE3 and
-        SSE4 and SSE5 instructions have 3 bytes.  We may use one 
-        more higher byte to specify a prefix the instruction 
-        requires. Exclude instructions which are in both SSE4.2 
-        and ABM.  */
-      opc_3b = (i.tm.cpu_flags.bitfield.cpussse3
-               || i.tm.cpu_flags.bitfield.cpusse5
-               || i.tm.cpu_flags.bitfield.cpusse4_1
-               || (i.tm.cpu_flags.bitfield.cpusse4_2
-                   && !i.tm.cpu_flags.bitfield.cpuabm));
-      if (opc_3b)
+
+      switch (i.tm.opcode_length)
        {
+       case 3:
          if (i.tm.base_opcode & 0xff000000)
            {
              prefix = (i.tm.base_opcode >> 24) & 0xff;
              goto check_prefix;
            }
-       }
-      else if ((i.tm.base_opcode & 0xff0000) != 0)
-       {
-         prefix = (i.tm.base_opcode >> 16) & 0xff;
-         if (i.tm.cpu_flags.bitfield.cpupadlock)
+         break;
+       case 2:
+         if ((i.tm.base_opcode & 0xff0000) != 0)
            {
-           check_prefix:
-             if (prefix != REPE_PREFIX_OPCODE
-                 || i.prefix[LOCKREP_PREFIX] != REPE_PREFIX_OPCODE)
+             prefix = (i.tm.base_opcode >> 16) & 0xff;
+             if (i.tm.cpu_flags.bitfield.cpupadlock)
+               {
+check_prefix:
+                 if (prefix != REPE_PREFIX_OPCODE
+                     || i.prefix[LOCKREP_PREFIX] != REPE_PREFIX_OPCODE)
+                   add_prefix (prefix);
+               }
+             else
                add_prefix (prefix);
            }
-         else
-           add_prefix (prefix);
+         break;
+       case 1:
+         break;
+       default:
+         abort ();
        }
 
       /* The prefix bytes.  */
-      for (q = i.prefix;
-          q < i.prefix + sizeof (i.prefix) / sizeof (i.prefix[0]);
-          q++)
-       {
-         if (*q)
-           {
-             p = frag_more (1);
-             md_number_to_chars (p, (valueT) *q, 1);
-           }
-       }
+      for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
+       if (*q)
+         FRAG_APPEND_1_CHAR (*q);
 
       /* Now the opcode; be careful about word order here!  */
-      if (fits_in_unsigned_byte (i.tm.base_opcode))
+      if (i.tm.opcode_length == 1)
        {
          FRAG_APPEND_1_CHAR (i.tm.base_opcode);
        }
       else
        {
-         if (opc_3b)
+         switch (i.tm.opcode_length)
            {
+           case 3:
              p = frag_more (3);
              *p++ = (i.tm.base_opcode >> 16) & 0xff;
+             break;
+           case 2:
+             p = frag_more (2);
+             break;
+           default:
+             abort ();
+             break;
            }
-         else
-           p = frag_more (2);
 
          /* Put out high byte first: can't use md_number_to_chars!  */
          *p++ = (i.tm.base_opcode >> 8) & 0xff;
@@ -5047,12 +5036,9 @@ output_insn (void)
       /* Now the modrm byte and sib byte (if present).  */
       if (i.tm.opcode_modifier.modrm)
        {
-         p = frag_more (1);
-         md_number_to_chars (p,
-                             (valueT) (i.rm.regmem << 0
-                                       | i.rm.reg << 3
-                                       | i.rm.mode << 6),
-                             1);
+         FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
+                              | i.rm.reg << 3
+                              | i.rm.mode << 6));
          /* If i.rm.regmem == ESP (4)
             && i.rm.mode != (Register mode)
             && not 16 bit
@@ -5060,14 +5046,9 @@ output_insn (void)
          if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
              && i.rm.mode != 3
              && !(i.base_reg && i.base_reg->reg_type.bitfield.reg16))
-           {
-             p = frag_more (1);
-             md_number_to_chars (p,
-                                 (valueT) (i.sib.base << 0
-                                           | i.sib.index << 3
-                                           | i.sib.scale << 6),
-                                 1);
-           }
+           FRAG_APPEND_1_CHAR ((i.sib.base << 0
+                                | i.sib.index << 3
+                                | i.sib.scale << 6));
        }
 
       /* Write the DREX byte if needed.  */
@@ -5467,7 +5448,7 @@ lex_got (enum bfd_reloc_code_real *reloc,
     if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
       return NULL;
 
-  for (j = 0; j < sizeof (gotrel) / sizeof (gotrel[0]); j++)
+  for (j = 0; j < ARRAY_SIZE (gotrel); j++)
     {
       int len;
 
@@ -5741,9 +5722,7 @@ i386_scale (char *scale)
     {
       as_warn (_("scale factor of %d without an index register"),
               1 << i.log2_scale_factor);
-#if SCALE1_WHEN_NO_INDEX
       i.log2_scale_factor = 0;
-#endif
     }
   scale = input_line_pointer;
   input_line_pointer = save;
@@ -5977,12 +5956,16 @@ i386_index_check (const char *operand_string)
               || (i.prefix[ADDR_PREFIX]
                   && !i.base_reg->reg_type.bitfield.reg32))
           && (i.index_reg
-              || !UINTS_EQUAL (i.base_reg->reg_type, baseindex)))
+              || i.base_reg->reg_num !=
+                 (i.prefix[ADDR_PREFIX] == 0 ? RegRip : RegEip)))
          || (i.index_reg
              && (!i.index_reg->reg_type.bitfield.baseindex
                  || (i.prefix[ADDR_PREFIX] == 0
-                     && !i.index_reg->reg_type.bitfield.reg64)
+                     && i.index_reg->reg_num != RegRiz
+                     && !i.index_reg->reg_type.bitfield.reg64
+                     )
                  || (i.prefix[ADDR_PREFIX]
+                     && i.index_reg->reg_num != RegEiz
                      && !i.index_reg->reg_type.bitfield.reg32))))
        ok = 0;
     }
@@ -6009,7 +5992,8 @@ i386_index_check (const char *operand_string)
          if ((i.base_reg
               && !i.base_reg->reg_type.bitfield.reg32)
              || (i.index_reg
-                 && (!i.index_reg->reg_type.bitfield.reg32
+                 && ((!i.index_reg->reg_type.bitfield.reg32
+                      && i.index_reg->reg_num != RegEiz)
                      || !i.index_reg->reg_type.bitfield.baseindex)))
            ok = 0;
        }
@@ -6576,41 +6560,6 @@ md_convert_frag (abfd, sec, fragP)
   fragP->fr_fix += extension;
 }
 \f
-/* Size of byte displacement jmp.  */
-int md_short_jump_size = 2;
-
-/* Size of dword displacement jmp.  */
-int md_long_jump_size = 5;
-
-void
-md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
-     char *ptr;
-     addressT from_addr, to_addr;
-     fragS *frag ATTRIBUTE_UNUSED;
-     symbolS *to_symbol ATTRIBUTE_UNUSED;
-{
-  offsetT offset;
-
-  offset = to_addr - (from_addr + 2);
-  /* Opcode for byte-disp jump.  */
-  md_number_to_chars (ptr, (valueT) 0xeb, 1);
-  md_number_to_chars (ptr + 1, (valueT) offset, 1);
-}
-
-void
-md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
-     char *ptr;
-     addressT from_addr, to_addr;
-     fragS *frag ATTRIBUTE_UNUSED;
-     symbolS *to_symbol ATTRIBUTE_UNUSED;
-{
-  offsetT offset;
-
-  offset = to_addr - (from_addr + 5);
-  md_number_to_chars (ptr, (valueT) 0xe9, 1);
-  md_number_to_chars (ptr + 1, (valueT) offset, 4);
-}
-\f
 /* Apply a fixup (fixS) to segment data, once it has been determined
    by our caller that we have all the info we need to fix it up.
 
@@ -6773,58 +6722,12 @@ md_apply_fix (fixP, valP, seg)
   md_number_to_chars (p, value, fixP->fx_size);
 }
 \f
-#define MAX_LITTLENUMS 6
-
-/* Turn the string pointed to by litP into a floating point constant
-   of type TYPE, and emit the appropriate bytes.  The number of
-   LITTLENUMS emitted is stored in *SIZEP.  An error message is
-   returned, or NULL on OK.  */
-
 char *
-md_atof (type, litP, sizeP)
-     int type;
-     char *litP;
-     int *sizeP;
+md_atof (int type, char *litP, int *sizeP)
 {
-  int prec;
-  LITTLENUM_TYPE words[MAX_LITTLENUMS];
-  LITTLENUM_TYPE *wordP;
-  char *t;
-
-  switch (type)
-    {
-    case 'f':
-    case 'F':
-      prec = 2;
-      break;
-
-    case 'd':
-    case 'D':
-      prec = 4;
-      break;
-
-    case 'x':
-    case 'X':
-      prec = 5;
-      break;
-
-    default:
-      *sizeP = 0;
-      return _("Bad call to md_atof ()");
-    }
-  t = atof_ieee (input_line_pointer, type, words);
-  if (t)
-    input_line_pointer = t;
-
-  *sizeP = prec * sizeof (LITTLENUM_TYPE);
-  /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
-     the bigendian 386.  */
-  for (wordP = words + prec - 1; prec--;)
-    {
-      md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
-      litP += sizeof (LITTLENUM_TYPE);
-    }
-  return 0;
+  /* This outputs the LITTLENUMs in REVERSE order;
+     in accord with the bigendian 386.  */
+  return ieee_md_atof (type, litP, sizeP, FALSE);
 }
 \f
 static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
@@ -6905,6 +6808,12 @@ parse_real_register (char *reg_string, char **end_op)
        }
     }
 
+  /* Don't allow fake index register unless allow_index_reg isn't 0. */
+  if (r != NULL
+      && !allow_index_reg
+      && (r->reg_num == RegEiz || r->reg_num == RegRiz))
+    return (const reg_entry *) NULL;
+
   if (r != NULL
       && ((r->reg_flags & (RegRex64 | RegRex))
          || r->reg_type.bitfield.reg64)
This page took 0.031724 seconds and 4 git commands to generate.