* config/tc-i386.c (i386_operand): Detect non-segment registers

used as segment prefixes.
This commit is contained in:
Richard Henderson
1998-09-08 22:57:36 +00:00
parent 9ade226a42
commit de1d28b669
2 changed files with 55 additions and 38 deletions

View 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> 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 * ehopt.c (check_eh_frame): Check the size of the FDE, and don't

View File

@ -2283,51 +2283,63 @@ i386_operand (operand_string)
op_string = end_op; op_string = end_op;
if (is_space_char (*op_string)) if (is_space_char (*op_string))
++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: switch (r->reg_num)
i.seg[i.mem_operands] = &es; {
break; case 0:
case 1: i.seg[i.mem_operands] = &es;
i.seg[i.mem_operands] = &cs; break;
break; case 1:
case 2: i.seg[i.mem_operands] = &cs;
i.seg[i.mem_operands] = &ss; break;
break; case 2:
case 3: i.seg[i.mem_operands] = &ss;
i.seg[i.mem_operands] = &ds; break;
break; case 3:
case 4: i.seg[i.mem_operands] = &ds;
i.seg[i.mem_operands] = &fs; break;
break; case 4:
case 5: i.seg[i.mem_operands] = &fs;
i.seg[i.mem_operands] = &gs; break;
break; case 5:
} i.seg[i.mem_operands] = &gs;
break;
}
/* Skip the ':' and whitespace. */ /* Skip the ':' and whitespace. */
++op_string;
if (is_space_char (*op_string))
++op_string;
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)
{
++op_string; ++op_string;
if (is_space_char (*op_string)) if (is_space_char (*op_string))
++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.types[this_operand] |= r->reg_type & ~BaseIndex;
i.regs[this_operand] = r; i.regs[this_operand] = r;