mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-25 13:27:26 +08:00
MASM accepts ESP/RSP being specified second in a memory address
operand, by silently making it the base register despite not being specified first. Consequently, we also permit an xmm/ymm index to be specified first (possibly alone), nevertheless putting it in as index register. 2012-07-24 Jan Beulich <jbeulich@suse.com> * config/tc-i386-intel.c (i386_intel_simplify_register): Handle xmm/ymm index register being specified first as well as esp/rsp base register being specified last in a memory operand.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2012-07-24 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
* config/tc-i386-intel.c (i386_intel_simplify_register): Handle
|
||||||
|
xmm/ymm index register being specified first as well as esp/rsp
|
||||||
|
base register being specified last in a memory operand.
|
||||||
|
|
||||||
2012-07-24 Jan Beulich <jbeulich@suse.com>
|
2012-07-24 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
* config/tc-i386-intel.c (i386_intel_simplify_register):
|
* config/tc-i386-intel.c (i386_intel_simplify_register):
|
||||||
|
@ -278,10 +278,24 @@ i386_intel_simplify_register (expressionS *e)
|
|||||||
}
|
}
|
||||||
i.op[this_operand].regs = i386_regtab + reg_num;
|
i.op[this_operand].regs = i386_regtab + reg_num;
|
||||||
}
|
}
|
||||||
|
else if (!intel_state.index
|
||||||
|
&& (i386_regtab[reg_num].reg_type.bitfield.regxmm
|
||||||
|
|| i386_regtab[reg_num].reg_type.bitfield.regymm))
|
||||||
|
intel_state.index = i386_regtab + reg_num;
|
||||||
else if (!intel_state.base && !intel_state.in_scale)
|
else if (!intel_state.base && !intel_state.in_scale)
|
||||||
intel_state.base = i386_regtab + reg_num;
|
intel_state.base = i386_regtab + reg_num;
|
||||||
else if (!intel_state.index)
|
else if (!intel_state.index)
|
||||||
|
{
|
||||||
|
if (intel_state.in_scale
|
||||||
|
|| i386_regtab[reg_num].reg_type.bitfield.baseindex)
|
||||||
intel_state.index = i386_regtab + reg_num;
|
intel_state.index = i386_regtab + reg_num;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Convert base to index and make ESP/RSP the base. */
|
||||||
|
intel_state.index = intel_state.base;
|
||||||
|
intel_state.base = i386_regtab + reg_num;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* esp is invalid as index */
|
/* esp is invalid as index */
|
||||||
|
Reference in New Issue
Block a user