gas/
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:
parent
3dff57e847
commit
4d1bb7955a
@ -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.
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
26
gas/testsuite/gas/i386/equ.d
Normal file
26
gas/testsuite/gas/i386/equ.d
Normal 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
|
2
gas/testsuite/gas/i386/equ.e
Normal file
2
gas/testsuite/gas/i386/equ.e
Normal file
@ -0,0 +1,2 @@
|
||||
.*: Assembler messages:
|
||||
.*:23: Warning: Treating .* as memory reference
|
37
gas/testsuite/gas/i386/equ.s
Normal file
37
gas/testsuite/gas/i386/equ.s
Normal 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
|
@ -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*"]
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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: .*
|
||||
|
Loading…
Reference in New Issue
Block a user