MASM accepts ESP/RSP being specified second in a memory address
authorJan Beulich <jbeulich@novell.com>
Wed, 25 Jul 2012 11:34:49 +0000 (11:34 +0000)
committerJan Beulich <jbeulich@novell.com>
Wed, 25 Jul 2012 11:34:49 +0000 (11:34 +0000)
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.

gas/ChangeLog
gas/config/tc-i386-intel.c

index 445e36d..2d62c41 100644 (file)
@@ -1,5 +1,11 @@
 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>
+
        * config/tc-i386-intel.c (i386_intel_simplify_register):
        Replace literal 4 by corresponding ESP_REG_NUM.
 
index 919f27c..099cbfc 100644 (file)
@@ -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 */