2008-02-13  Jan Beulich  <jbeulich@novell.com>

	* config/tc-i386.c (parse_real_register): Don't return 'FLAT'
	if not in Intel mode.
	(i386_intel_operand): Ignore segment overrides in immediate and
	offset operands.
	(intel_e11): Range-check i.mem_operands before use as array
	index. Filter out FLAT for uses other than as segment override.
	(intel_get_token): Remove broken promotion of "FLAT:" to mean
	"offset FLAT:".

gas/testsuite/
2008-02-13  Jan Beulich  <jbeulich@novell.com>

	* gas/i386/intelok.s: Replace invalid offset expression with
	valid ones.
	* gas/i386/x86_64.s: Likewise.

opcodes/
2008-02-13  Jan Beulich  <jbeulich@novell.com>

	* i386-opc.h (RegFlat): New.
	* i386-reg.tbl (flat): Add.
	* i386-tbl.h: Re-generate.
This commit is contained in:
Jan Beulich
2008-02-13 13:41:26 +00:00
parent 34b772a651
commit b7240065b3
9 changed files with 57 additions and 17 deletions

View File

@@ -7076,6 +7076,9 @@ parse_real_register (char *reg_string, char **end_op)
&& flag_code != CODE_64BIT)
return (const reg_entry *) NULL;
if (r->reg_type.bitfield.sreg3 && r->reg_num == RegFlat && !intel_syntax)
return (const reg_entry *) NULL;
return r;
}
@@ -8133,7 +8136,15 @@ i386_intel_operand (char *operand_string, int got_a_float)
/* Constant and OFFSET expressions are handled by i386_immediate. */
else if ((intel_parser.op_modifier & (1 << T_OFFSET))
|| intel_parser.reg == NULL)
ret = i386_immediate (intel_parser.disp);
{
if (i.mem_operands < 2 && i.seg[i.mem_operands])
{
if (!(intel_parser.op_modifier & (1 << T_OFFSET)))
as_warn (_("Segment override ignored"));
i.seg[i.mem_operands] = NULL;
}
ret = i386_immediate (intel_parser.disp);
}
if (intel_parser.next_operand && this_operand >= MAX_OPERANDS - 1)
ret = 0;
@@ -8667,6 +8678,8 @@ intel_e11 (void)
reg->reg_name);
return 0;
}
else if (i.mem_operands >= 2)
as_warn (_("Segment override ignored"));
else if (i.seg[i.mem_operands])
as_warn (_("Extra segment override ignored"));
else
@@ -8697,6 +8710,12 @@ intel_e11 (void)
}
}
else if (reg->reg_type.bitfield.sreg3 && reg->reg_num == RegFlat)
{
as_bad (_("cannot use `FLAT' here"));
return 0;
}
/* Not a segment register. Check for register scaling. */
else if (cur_token.code == '*')
{
@@ -9088,16 +9107,6 @@ intel_get_token (void)
strcat (new_token.str, " FLAT:");
}
/* ??? This is not mentioned in the MASM grammar. */
else if (strcasecmp (new_token.str, "FLAT") == 0)
{
new_token.code = T_OFFSET;
if (*q == ':')
strcat (new_token.str, ":");
else
as_bad (_("`:' expected"));
}
else
new_token.code = T_ID;
}