{
operatorT op_modifier; /* Operand modifier. */
int is_mem; /* 1 if operand is memory reference. */
+ int has_offset; /* 1 if operand has offset. */
unsigned int in_offset; /* >=1 if processing operand of offset. */
unsigned int in_bracket; /* >=1 if processing operand in brackets. */
unsigned int in_scale; /* >=1 if processing multipication operand
/* offset X_add_symbol */
#define O_offset O_md32
+/* offset X_add_symbol */
+#define O_short O_md31
+/* near ptr X_add_symbol */
+#define O_near_ptr O_md30
+/* far ptr X_add_symbol */
+#define O_far_ptr O_md29
/* byte ptr X_add_symbol */
-#define O_byte_ptr O_md31
+#define O_byte_ptr O_md28
/* word ptr X_add_symbol */
-#define O_word_ptr O_md30
+#define O_word_ptr O_md27
/* dword ptr X_add_symbol */
-#define O_dword_ptr O_md29
+#define O_dword_ptr O_md26
/* qword ptr X_add_symbol */
-#define O_qword_ptr O_md28
+#define O_qword_ptr O_md25
/* oword ptr X_add_symbol */
-#define O_oword_ptr O_md27
+#define O_oword_ptr O_md24
/* fword ptr X_add_symbol */
-#define O_fword_ptr O_md26
+#define O_fword_ptr O_md23
/* tbyte ptr X_add_symbol */
-#define O_tbyte_ptr O_md25
+#define O_tbyte_ptr O_md22
/* xmmword ptr X_add_symbol */
-#define O_xmmword_ptr O_md24
+#define O_xmmword_ptr O_md21
/* ymmword ptr X_add_symbol */
-#define O_ymmword_ptr O_md23
-/* near ptr X_add_symbol */
-#define O_near_ptr O_md22
-/* far ptr X_add_symbol */
-#define O_far_ptr O_md21
-/* offset X_add_symbol */
-#define O_short O_md20
+#define O_ymmword_ptr O_md20
static struct
{
const char *name;
- operatorT operator;
+ operatorT op;
unsigned int operands;
}
const i386_operators[] =
static struct
{
const char *name;
- operatorT operator;
+ operatorT op;
unsigned short sz[3];
}
const i386_types[] =
if (i386_operators[j].operands
&& i386_operators[j].operands != operands)
return O_illegal;
- return i386_operators[j].operator;
+ return i386_operators[j].op;
}
for (j = 0; i386_types[j].name; ++j)
*pc = c;
if (intel_syntax > 0 || operands != 1)
return O_illegal;
- return i386_types[j].operator;
+ return i386_types[j].op;
}
*input_line_pointer = c;
break;
case O_offset:
+ intel_state.has_offset = 1;
++intel_state.in_offset;
ret = i386_intel_simplify_symbol (e->X_add_symbol);
--intel_state.in_offset;
/* Initialize state structure. */
intel_state.op_modifier = O_absent;
intel_state.is_mem = 0;
+ intel_state.has_offset = 0;
intel_state.base = NULL;
intel_state.index = NULL;
intel_state.seg = NULL;
operand_type_set (&intel_state.reloc_types, ~0);
- assert (!intel_state.in_offset);
- assert (!intel_state.in_bracket);
- assert (!intel_state.in_scale);
+ gas_assert (!intel_state.in_offset);
+ gas_assert (!intel_state.in_bracket);
+ gas_assert (!intel_state.in_scale);
saved_input_line_pointer = input_line_pointer;
input_line_pointer = buf = xstrdup (operand_string);
+ /* A '$' followed by an identifier char is an identifier. Otherwise,
+ it's operator '.' followed by an expression. */
+ if (*buf == '$' && !is_identifier_char (buf[1]))
+ *buf = '.';
+
intel_syntax = -1;
memset (&exp, 0, sizeof(exp));
exp_seg = expression (&exp);
as_bad (_("invalid expression"));
ret = 0;
}
+ else if (!intel_state.has_offset
+ && input_line_pointer > buf
+ && *(input_line_pointer - 1) == ']')
+ intel_state.is_mem |= 1;
input_line_pointer = saved_input_line_pointer;
free (buf);
- assert (!intel_state.in_offset);
- assert (!intel_state.in_bracket);
- assert (!intel_state.in_scale);
+ gas_assert (!intel_state.in_offset);
+ gas_assert (!intel_state.in_bracket);
+ gas_assert (!intel_state.in_scale);
if (!ret)
return 0;