aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-i386.c
diff options
context:
space:
mode:
Diffstat (limited to 'gas/config/tc-i386.c')
-rw-r--r--gas/config/tc-i386.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index db50c62..1728e60 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -3534,6 +3534,15 @@ swap_operands (void)
}
}
+static int
+i386_is_register (const expressionS *e, int is_intel_syntax)
+{
+ return (e->X_op == O_register
+ || (is_intel_syntax
+ && e->X_op == O_constant
+ && e->X_md));
+}
+
/* Try to ensure constant immediates are represented in the smallest
opcode possible. */
static void
@@ -6451,6 +6460,7 @@ x86_cons (expressionS *exp, int size)
{
intel_syntax = -intel_syntax;
+ exp->X_md = 0;
if (size == 4 || (object_64bit && size == 8))
{
/* Handle @GOTOFF and the like in an expression. */
@@ -6477,7 +6487,7 @@ x86_cons (expressionS *exp, int size)
if (exp->X_op == O_constant
|| exp->X_op == O_absent
|| exp->X_op == O_illegal
- || exp->X_op == O_register
+ || i386_is_register (exp, intel_syntax)
|| exp->X_op == O_big)
{
char c = *input_line_pointer;
@@ -7956,7 +7966,7 @@ parse_register (char *reg_string, char **end_op)
{
const expressionS *e = symbol_get_value_expression (symbolP);
- know (e->X_op == O_register);
+ know (i386_is_register (e, intel_syntax));
know (e->X_add_number >= 0
&& (valueT) e->X_add_number < i386_regtab_size);
r = i386_regtab + e->X_add_number;
@@ -8863,7 +8873,7 @@ tc_x86_parse_to_dw2regnum (expressionS *exp)
register_chars['.'] = saved_register_dot;
allow_naked_reg = saved_naked_reg;
- if (exp->X_op == O_register && exp->X_add_number >= 0)
+ if (i386_is_register (exp, intel_syntax) && exp->X_add_number >= 0)
{
if ((addressT) exp->X_add_number < i386_regtab_size)
{