2005-10-26  Jan Beulich  <jbeulich@novell.com>

	* config/tc-i386.c (i386_operand): Don't check register prefix here.
	(parse_real_register): Rename from parse_register.
	(parse_register): New.
	(i386_parse_name): New.
	(md_operand): New.
	(intel_e11): Don't tolerate registers in offset expressions anymore.
	(intel_get_token): Don't check register prefix here. Copy the actual
	register token, not the canonical register name.
	* config/tc-i386.h (md_operand): Delete.
	(i386_parse_name): Declare.
	(md_parse_name): Define.

gas/testsuite/
2005-10-26  Jan Beulich  <jbeulich@novell.com>

	* gas/i386/intel.s: Replace register used in offset expression.
	* gas/i386/intel.e: Adjust.
	* gas/i386/intelbad.l: Adjust.
	* gas/i386/equ.[sed]: New.
	* gas/i386/i386.exp: Run new test.
This commit is contained in:
Jan Beulich 2005-10-26 12:29:44 +00:00
parent 3dff57e847
commit 4d1bb7955a
11 changed files with 179 additions and 34 deletions

View File

@ -1,3 +1,17 @@
2005-10-26 Jan Beulich <jbeulich@novell.com>
* config/tc-i386.c (i386_operand): Don't check register prefix here.
(parse_real_register): Rename from parse_register.
(parse_register): New.
(i386_parse_name): New.
(md_operand): New.
(intel_e11): Don't tolerate registers in offset expressions anymore.
(intel_get_token): Don't check register prefix here. Copy the actual
register token, not the canonical register name.
* config/tc-i386.h (md_operand): Delete.
(i386_parse_name): Declare.
(md_parse_name): Define.
2005-10-25 Arnold Metselaar <arnold.metselaar@planet.nl>
* Makefile.am: Add Z80 cpu.

View File

@ -4419,8 +4419,7 @@ i386_operand (operand_string)
}
/* Check if operand is a register. */
if ((*op_string == REGISTER_PREFIX || allow_naked_reg)
&& (r = parse_register (op_string, &end_op)) != NULL)
if ((r = parse_register (op_string, &end_op)) != NULL)
{
/* Check for a segment override by searching for ':' after a
segment register. */
@ -4558,8 +4557,7 @@ i386_operand (operand_string)
++base_string;
if (*base_string == ','
|| ((*base_string == REGISTER_PREFIX || allow_naked_reg)
&& (i.base_reg = parse_register (base_string, &end_op)) != NULL))
|| ((i.base_reg = parse_register (base_string, &end_op)) != NULL))
{
displacement_string_end = temp_string;
@ -4579,8 +4577,7 @@ i386_operand (operand_string)
if (is_space_char (*base_string))
++base_string;
if ((*base_string == REGISTER_PREFIX || allow_naked_reg)
&& (i.index_reg = parse_register (base_string, &end_op)) != NULL)
if ((i.index_reg = parse_register (base_string, &end_op)) != NULL)
{
base_string = end_op;
if (is_space_char (*base_string))
@ -5157,9 +5154,7 @@ output_invalid (c)
/* REG_STRING starts *before* REGISTER_PREFIX. */
static const reg_entry *
parse_register (reg_string, end_op)
char *reg_string;
char **end_op;
parse_real_register (char *reg_string, char **end_op)
{
char *s = reg_string;
char *p;
@ -5226,6 +5221,80 @@ parse_register (reg_string, end_op)
return r;
}
/* REG_STRING starts *before* REGISTER_PREFIX. */
static const reg_entry *
parse_register (char *reg_string, char **end_op)
{
const reg_entry *r;
if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
r = parse_real_register (reg_string, end_op);
else
r = NULL;
if (!r)
{
char *save = input_line_pointer;
char c;
symbolS *symbolP;
input_line_pointer = reg_string;
c = get_symbol_end ();
symbolP = symbol_find (reg_string);
if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
{
const expressionS *e = symbol_get_value_expression (symbolP);
know (e->X_op == O_register);
know (e->X_add_number >= 0 && (valueT) e->X_add_number < ARRAY_SIZE (i386_regtab));
r = i386_regtab + e->X_add_number;
*end_op = input_line_pointer;
}
*input_line_pointer = c;
input_line_pointer = save;
}
return r;
}
int
i386_parse_name (char *name, expressionS *e, char *nextcharP)
{
const reg_entry *r;
char *end = input_line_pointer;
*end = *nextcharP;
r = parse_register (name, &input_line_pointer);
if (r && end <= input_line_pointer)
{
*nextcharP = *input_line_pointer;
*input_line_pointer = 0;
e->X_op = O_register;
e->X_add_number = r - i386_regtab;
return 1;
}
input_line_pointer = end;
*end = 0;
return 0;
}
void
md_operand (expressionS *e)
{
if (*input_line_pointer == REGISTER_PREFIX)
{
char *end;
const reg_entry *r = parse_real_register (input_line_pointer, &end);
if (r)
{
e->X_op = O_register;
e->X_add_number = r - i386_regtab;
input_line_pointer = end;
}
}
}
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
const char *md_shortopts = "kVQ:sqn";
@ -6566,16 +6635,8 @@ intel_e11 ()
i.types[this_operand] |= BaseIndex;
}
/* Offset modifier. Add the register to the displacement string to be
parsed as an immediate expression after we're done. */
else if (intel_parser.in_offset)
{
as_warn (_("Using register names in OFFSET expressions is deprecated"));
strcat (intel_parser.disp, reg->reg_name);
}
/* It's neither base nor index nor offset. */
else if (!intel_parser.is_mem)
/* It's neither base nor index. */
else if (!intel_parser.in_offset && !intel_parser.is_mem)
{
i.types[this_operand] |= reg->reg_type & ~BaseIndex;
i.op[this_operand].regs = reg;
@ -6804,19 +6865,15 @@ intel_get_token ()
new_token.code = T_ID;
}
else if ((*intel_parser.op_string == REGISTER_PREFIX || allow_naked_reg)
&& ((reg = parse_register (intel_parser.op_string, &end_op)) != NULL))
else if ((reg = parse_register (intel_parser.op_string, &end_op)) != NULL)
{
size_t len = end_op - intel_parser.op_string;
new_token.code = T_REG;
new_token.reg = reg;
if (*intel_parser.op_string == REGISTER_PREFIX)
{
new_token.str[0] = REGISTER_PREFIX;
new_token.str[1] = '\0';
}
strcat (new_token.str, reg->reg_name);
memcpy (new_token.str, intel_parser.op_string, len);
new_token.str[len] = '\0';
}
else if (is_identifier_char (*intel_parser.op_string))

View File

@ -434,7 +434,8 @@ extern int tc_i386_fix_adjustable PARAMS ((struct fix *));
|| (FIX)->fx_r_type == BFD_RELOC_386_GOTPC \
|| TC_FORCE_RELOCATION (FIX))
#define md_operand(x)
extern int i386_parse_name (char *, expressionS *, char *);
#define md_parse_name(s, e, m, c) i386_parse_name (s, e, c)
extern const struct relax_type md_relax_table[];
#define TC_GENERIC_RELAX_TABLE md_relax_table

View File

@ -1,3 +1,11 @@
2005-10-26 Jan Beulich <jbeulich@novell.com>
* gas/i386/intel.s: Replace register used in offset expression.
* gas/i386/intel.e: Adjust.
* gas/i386/intelbad.l: Adjust.
* gas/i386/equ.[sed]: New.
* gas/i386/i386.exp: Run new test.
2005-10-26 Hans-Peter Nilsson <hp@bitrange.com>
* gas/z80/z80.exp: Fix misplaced-open-brace typo.

View File

@ -0,0 +1,26 @@
#objdump: -drw
#name: i386 equates
#stderr: equ.e
.*: +file format .*
Disassembly of section .text:
0+000 <_start>:
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+\$0xffffffff,%eax
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+0xffffffff,%eax
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+\$0x0,%eax[ 0-9a-f]+:[ a-zA-Z0-9_]+xtrn
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+0x0,%eax[ 0-9a-f]+:[ a-zA-Z0-9_]+xtrn
[ 0-9a-f]+:[ 0-9a-f]+test[ ]+%ecx,%ecx
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+%fs:\(%ecx,%ecx,4\),%ecx
[ 0-9a-f]+:[ 0-9a-f]+fadd[ ]+%st\(1\),%st
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+\$0xfffffffe,%eax
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+0xfffffffe,%eax
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+\$0x0,%eax[ 0-9a-f]+:[ a-zA-Z0-9_]+xtrn
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+0x0,%eax[ 0-9a-f]+:[ a-zA-Z0-9_]+xtrn
[ 0-9a-f]+:[ 0-9a-f]+test[ ]+%edx,%edx
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+%gs:\(%edx,%edx,8\),%edx
[ 0-9a-f]+:[ 0-9a-f]+mov[ ]+%gs:\(%edx,%edx,8\),%edx
[ 0-9a-f]+:[ 0-9a-f]+fadd[ ]+%st\(1\),%st
[ 0-9a-f]+:[ 0-9a-f]+fadd[ ]+%st\(7\),%st
pass

View File

@ -0,0 +1,2 @@
.*: Assembler messages:
.*:23: Warning: Treating .* as memory reference

View File

@ -0,0 +1,37 @@
.text
_start:
.att_syntax prefix
.equ r, -1
.equ s, -1
movl $r, %eax
movl (r), %eax
.equ r, xtrn; .global r # temporary (hopefully)
movl $r, %eax
movl r, %eax
.equ r, %ecx
.equ s, %fs
testl r, r
movl s:(r,r,4), r
.equ x, %st(1)
fadd x
.intel_syntax noprefix
.equ r, -2
.equ s, -2
mov eax, r
mov eax, [r]
.equ r, xtrn
mov eax, offset r
mov eax, [r]
.equ r, edx
.equ s, gs
test r, r
mov r, s:[r+r*8]
mov r, s:[8*r+r]
fadd x
.equ x, st(7)
fadd x
.equ r, -3
.equ s, -3

View File

@ -63,6 +63,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
run_dump_test "vmx"
run_dump_test "suffix"
run_dump_test "immed32"
run_dump_test "equ"
if {![istarget "*-*-aix*"]
&& (![is_elf_format] || [istarget "*-*-linux*"]

View File

@ -5,4 +5,3 @@
.*:157: Warning: Treating .\[0x90909090\]. as memory reference
.*:492: Warning: Treating .\[0x90909090\]. as memory reference
.*:493: Warning: Treating .\[0x90909090\]. as memory reference
.*:580: Warning: Using register names in OFFSET expressions is deprecated

View File

@ -577,7 +577,7 @@ bar:
call gs_foo
call short_foo
fstp QWORD PTR [eax+edx*8]
mov ecx, OFFSET FLAT:ss
mov ecx, OFFSET FLAT:xyz
mov BYTE PTR [esi+edx], al
mov BYTE PTR [edx+esi], al
mov BYTE PTR [edx*2+esi], al

View File

@ -101,9 +101,9 @@
.*:131: Error: .*
.*:132: Error: .*
.*:133: Error: .*
.*:135: Warning: .*
.*:136: Warning: .*
.*:137: Warning: .*
.*:135: Error: .*
.*:136: Error: .*
.*:137: Error: .*
.*:138: Warning: .*
.*:139: Warning: .*
.*:141: Error: .*