mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-18 12:24:38 +08:00
* config/tc-i386.c (i386_operand): Detect non-segment registers
used as segment prefixes.
This commit is contained in:
parent
9ade226a42
commit
de1d28b669
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
/* 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;
|
||||
|
Loading…
Reference in New Issue
Block a user