Use movl instead of movabs for x32.
authorH.J. Lu <hongjiu.lu@intel.com>
Sun, 10 Jul 2011 21:42:08 +0000 (21:42 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Sun, 10 Jul 2011 21:42:08 +0000 (14:42 -0700)
2011-07-10  H.J. Lu  <hongjiu.lu@intel.com>

* config/i386/i386.c (ix86_trampoline_init): Use movl instead
of movabs for x32.

From-SVN: r176129

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

index 6f015ee2d5f4743c3ab6dc77d5872130c52a0dd1..752e252a7138b7e0489fcad8ab5d348e1b996cde 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/i386/i386.c (ix86_trampoline_init): Use movl instead
+       of movabs for x32.
+
 2011-07-10  Richard Henderson  <rth@redhat.com>
 
        * config/i386/i386.c (x86_output_mi_thunk): Generate rtl and
index f948a3282a16ecf3fead5f590eb6e1e6f76b7887..a46101b4f8d8ea3ebf1284821e4ce7bb853c88e1 100644 (file)
@@ -22730,7 +22730,7 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
     }
   else
     {
-      int offset = 0;
+      int offset = 0, size;
 
       /* Load the function address to r11.  Try to load address using
         the shorter movl instead of movabs.  We may want to support
@@ -22759,11 +22759,21 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
 
       /* Load static chain using movabs to r10.  */
       mem = adjust_address (m_tramp, HImode, offset);
-      emit_move_insn (mem, gen_int_mode (0xba49, HImode));
+      /* Use the shorter movl instead of movabs for x32.  */
+      if (TARGET_X32)
+       {
+         size = 6;
+         emit_move_insn (mem, gen_int_mode (0xba41, HImode));
+       }
+      else
+       {
+         size = 10;
+         emit_move_insn (mem, gen_int_mode (0xba49, HImode));
+       }
 
-      mem = adjust_address (m_tramp, DImode, offset + 2);
+      mem = adjust_address (m_tramp, ptr_mode, offset + 2);
       emit_move_insn (mem, chain_value);
-      offset += 10;
+      offset += size;
 
       /* Jump to r11; the last (unused) byte is a nop, only there to
         pad the write out to a single 32-bit store.  */