Check ptr_mode and use Pmode in ix86_trampoline_init
authorH.J. Lu <hongjiu.lu@intel.com>
Sun, 11 Mar 2012 16:37:45 +0000 (16:37 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Sun, 11 Mar 2012 16:37:45 +0000 (09:37 -0700)
2012-03-11  H.J. Lu  <hongjiu.lu@intel.com>

* config/i386/i386.c (ix86_trampoline_init): Use movl for 64bit if
ptr_mode == SImode.  Replace DImode with Pmode or ptr_mode.

From-SVN: r185197

gcc/ChangeLog
gcc/config/i386/i386.c

index 5a74c5f875bd0833183ab65d1072a041a68992a4..a3b135108213bbbb143d88269051e060a4199e97 100644 (file)
@@ -1,3 +1,8 @@
+2012-03-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/i386/i386.c (ix86_trampoline_init): Use movl for 64bit if
+       ptr_mode == SImode.  Replace DImode with Pmode or ptr_mode.
+
 2012-03-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/i386.c (x86_this_parameter): Replace DImode with
index 30dac591aa824f184c1ee66854e4cacff7345f3b..f74914fbe405eb8b97db615bacb2c832565c31a2 100644 (file)
@@ -24309,10 +24309,13 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
       /* Load the function address to r11.  Try to load address using
         the shorter movl instead of movabs.  We may want to support
         movq for kernel mode, but kernel does not use trampolines at
-        the moment.  */
-      if (x86_64_zext_immediate_operand (fnaddr, VOIDmode))
+        the moment.  FNADDR is a 32bit address and may not be in
+        DImode when ptr_mode == SImode.  Always use movl in this
+        case.  */
+      if (ptr_mode == SImode
+         || x86_64_zext_immediate_operand (fnaddr, VOIDmode))
        {
-         fnaddr = copy_to_mode_reg (DImode, fnaddr);
+         fnaddr = copy_to_mode_reg (Pmode, fnaddr);
 
          mem = adjust_address (m_tramp, HImode, offset);
          emit_move_insn (mem, gen_int_mode (0xbb41, HImode));
@@ -24331,9 +24334,9 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
          offset += 10;
        }
 
-      /* Load static chain using movabs to r10.  Use the
-        shorter movl instead of movabs for x32.  */
-      if (TARGET_X32)
+      /* Load static chain using movabs to r10.  Use the shorter movl
+         instead of movabs when ptr_mode == SImode.  */
+      if (ptr_mode == SImode)
        {
          opcode = 0xba41;
          size = 6;