x86: don't attempt to resolve equates and alike from i386_parse_name()

PR gas/28977

Perhaps right from its introduction in 4d1bb7955a it was wrong for
i386_parse_name() to call parse_register(). This being a hook from the
expression parser, it shouldn't be resolving e.g. equated symbols.
That's relevant only for all other callers of parse_register().

To compensate, in Intel syntax mode check_register() needs calling;
perhaps not doing so was an oversight right when the function was
introduced. This is necessary in particular to force EVEX encoding when
VRex registers are used (but of course also to reject bad uses of
registers, i.e. fully matching what parse_register() needs it for).
This commit is contained in:
Jan Beulich 2022-03-23 12:28:53 +01:00
parent 131a355fbc
commit 4faaa10f3f
5 changed files with 39 additions and 2 deletions

View file

@ -289,6 +289,13 @@ i386_intel_simplify_register (expressionS *e)
return 0;
}
if (!check_register (&i386_regtab[reg_num]))
{
as_bad (_("register '%s%s' cannot be used here"),
register_prefix, i386_regtab[reg_num].reg_name);
return 0;
}
if (!intel_state.in_bracket)
{
if (i.op[this_operand].regs)

View file

@ -13000,11 +13000,12 @@ parse_register (char *reg_string, char **end_op)
int
i386_parse_name (char *name, expressionS *e, char *nextcharP)
{
const reg_entry *r;
const reg_entry *r = NULL;
char *end = input_line_pointer;
*end = *nextcharP;
r = parse_register (name, &input_line_pointer);
if (*name == REGISTER_PREFIX || allow_naked_reg)
r = parse_real_register (name, &input_line_pointer);
if (r && end <= input_line_pointer)
{
*nextcharP = *input_line_pointer;

View file

@ -0,0 +1,17 @@
.*: Assembler messages:
.*:8: Error: .*
#...
GAS LISTING .*
[ ]*[0-9]+[ ]+# .*
[ ]*[0-9]+[ ]+equ:
[ ]*[0-9]+[ ]+s = %edx % %ecx
[ ]*[0-9]+[ ]+x = s
[ ]*[0-9]+[ ]+y = s
[ ]*[0-9]+[ ]+z = s
[ ]*[0-9]+[ ]*
[ ]*[0-9]+[ ]+t = %ymm5%%%!%%%%!%%%%%%%%!%ebp%%%%%%%%%%%%%%%%%%M
[ ]*[0-9]+[ ]+a = t
[ ]*[0-9]+[ ]+b = t
[ ]*[0-9]+[ ]+c = t

View file

@ -0,0 +1,11 @@
# PR gas/28977
equ:
s = %edx % %ecx
x = s
y = s
z = s
t = %ymm5%%%!%%%%!%%%%%%%%!%ebp%%%%%%%%%%%%%%%%%%M
a = t
b = t
c = t

View file

@ -99,6 +99,7 @@ if [gas_32_check] then {
run_list_test "suffix-bad"
run_dump_test "immed32"
run_dump_test "equ"
run_list_test "equ-2" "-al"
run_list_test "equ-bad"
run_dump_test "divide"
run_dump_test "quoted"