On Sat, Jul 9, 2011 at 6:20 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Sat, Jul 9, 2011 at 4:12 PM, Richard Henderson <r...@redhat.com> wrote:
>> On 07/09/2011 04:05 PM, H.J. Lu wrote:
>>>> Is this change actually necessary?  I would think that the
>>>> predicate has already been adjusted...
>>>>
>>>
>>> Since we always use short version for x32, there is no need to call.
>>> x86_64_zext_immediate_operand.
>>
>> Yes, but using the shorter condition, i.e. always calling
>> x86_64_zext_immediate_operand and letting it return true for
>> all x32 symbols, is easier to maintain.
>
> I always updated x86_64_zext_immediate_operand for x32.
> I will remove TARGET_X32.
>
> Thanks.

Here is the updated patch.  OK for trunk?

Thanks.


-- 
H.J.
---
2011-07-10  H.J. Lu  <hongjiu...@intel.com>

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

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 04cb07d..1b02312 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -22721,7 +23034,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
@@ -22750,11 +23063,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.  */

Reply via email to