From: Jan Beulich Date: Wed, 25 Jul 2012 11:34:49 +0000 (+0000) Subject: MASM accepts ESP/RSP being specified second in a memory address X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9e2934f7999c248f7e8452d0726541ce9ad9edce;p=binutils-gdb.git 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 * 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 445e36d3daf..2d62c413410 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2012-07-24 Jan Beulich + + * 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 * config/tc-i386-intel.c (i386_intel_simplify_register): diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c index 919f27ca300..099cbfcd947 100644 --- a/gas/config/tc-i386-intel.c +++ b/gas/config/tc-i386-intel.c @@ -278,10 +278,24 @@ i386_intel_simplify_register (expressionS *e) } 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) intel_state.base = i386_regtab + reg_num; else if (!intel_state.index) - intel_state.index = i386_regtab + reg_num; + { + if (intel_state.in_scale + || i386_regtab[reg_num].reg_type.bitfield.baseindex) + 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 { /* esp is invalid as index */