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. */