* config/tc-i386.c (i386_operand): Detect non-segment registers
authorRichard Henderson <rth@redhat.com>
Tue, 8 Sep 1998 22:57:36 +0000 (22:57 +0000)
committerRichard Henderson <rth@redhat.com>
Tue, 8 Sep 1998 22:57:36 +0000 (22:57 +0000)
        used as segment prefixes.

gas/ChangeLog
gas/config/tc-i386.c

index 3acd2c5..a79b21b 100644 (file)
@@ -1,3 +1,8 @@
+Tue Sep  8 15:56:19 1998  Richard Henderson  <rth@cygnus.com>
+
+       * config/tc-i386.c (i386_operand): Detect non-segment registers
+       used as segment prefixes.
+
 Sat Sep  5 19:00:38 1998  Ian Lance Taylor  <ian@cygnus.com>
 
        * ehopt.c (check_eh_frame): Check the size of the FDE, and don't
index 825cdc3..49d2a7f 100644 (file)
@@ -2283,51 +2283,63 @@ i386_operand (operand_string)
       op_string = end_op;
       if (is_space_char (*op_string))
        ++op_string;
-      if ((r->reg_type & (SReg2 | SReg3)) && *op_string == ':')
+      if (*op_string)
        {
-         switch (r->reg_num)
+         if (r->reg_type & (SReg2 | SReg3))
            {
-           case 0:
-             i.seg[i.mem_operands] = &es;
-             break;
-           case 1:
-             i.seg[i.mem_operands] = &cs;
-             break;
-           case 2:
-             i.seg[i.mem_operands] = &ss;
-             break;
-           case 3:
-             i.seg[i.mem_operands] = &ds;
-             break;
-           case 4:
-             i.seg[i.mem_operands] = &fs;
-             break;
-           case 5:
-             i.seg[i.mem_operands] = &gs;
-             break;
-           }
-
-         /* Skip the ':' and whitespace.  */
-         ++op_string;
-         if (is_space_char (*op_string))
-           ++op_string;
+             switch (r->reg_num)
+               {
+               case 0:
+                 i.seg[i.mem_operands] = &es;
+                 break;
+               case 1:
+                 i.seg[i.mem_operands] = &cs;
+                 break;
+               case 2:
+                 i.seg[i.mem_operands] = &ss;
+                 break;
+               case 3:
+                 i.seg[i.mem_operands] = &ds;
+                 break;
+               case 4:
+                 i.seg[i.mem_operands] = &fs;
+                 break;
+               case 5:
+                 i.seg[i.mem_operands] = &gs;
+                 break;
+               }
 
-         operand_string = op_string;   /* Pretend given string starts here. */
-         if (!is_digit_char (*op_string) && !is_identifier_char (*op_string)
-             && *op_string != '(' && *op_string != ABSOLUTE_PREFIX)
-           {
-             as_bad (_("bad memory operand `%s'"), op_string);
-             return 0;
-           }
-         /* Handle case of %es:*foo. */
-         if (*op_string == ABSOLUTE_PREFIX)
-           {
+             /* Skip the ':' and whitespace.  */
              ++op_string;
              if (is_space_char (*op_string))
                ++op_string;
-             i.types[this_operand] |= JumpAbsolute;
+
+             /* Pretend given string starts here. */
+             operand_string = op_string;
+             if (!is_digit_char (*op_string)
+                 && !is_identifier_char (*op_string)
+                 && *op_string != '('
+                 && *op_string != ABSOLUTE_PREFIX)
+               {
+                 as_bad (_("bad memory operand `%s'"), op_string);
+                 return 0;
+               }
+             /* Handle case of %es:*foo. */
+             if (*op_string == ABSOLUTE_PREFIX)
+               {
+                 ++op_string;
+                 if (is_space_char (*op_string))
+                   ++op_string;
+                 i.types[this_operand] |= JumpAbsolute;
+               }
+             goto do_memory_reference;
+           }
+         else
+           {
+             as_bad (_("bad segment prefix `%c%s'"),
+                     REGISTER_PREFIX, r->reg_name);
+             return 0;
            }
-         goto do_memory_reference;
        }
       i.types[this_operand] |= r->reg_type & ~BaseIndex;
       i.regs[this_operand] = r;