From ba61421d583a66b86edcbc7a259875ca61f2ef6e Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 11 Mar 2012 16:37:45 +0000 Subject: [PATCH] Check ptr_mode and use Pmode in ix86_trampoline_init 2012-03-11 H.J. Lu * 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 | 5 +++++ gcc/config/i386/i386.c | 15 +++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5a74c5f875b..a3b13510821 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-03-11 H.J. Lu + + * 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 * config/i386/i386.c (x86_this_parameter): Replace DImode with diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 30dac591aa8..f74914fbe40 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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; -- 2.30.2