On Mon, Mar 12, 2012 at 12:26 AM, H.J. Lu <hongjiu...@intel.com> wrote:
> Pmode may be DImode for x32. This patch calls > gen_tls_global_dynamic_64_<mode> and gen_tls_local_dynamic_base_64_<mode>, > depending on Pmode. Tested on Linux/x86-64. OK for trunk? > > 2012-03-11 H.J. Lu <hongjiu...@intel.com> > > * config/i386/i386.c (legitimize_tls_address): Call > gen_tls_global_dynamic_64_<mode> and > gen_tls_local_dynamic_base_64_<mode>, depending on Pmode. > > * config/i386/i386.md (*tls_global_dynamic_64): Renamed to ... > (*tls_global_dynamic_64_<mode>): This. > (tls_global_dynamic_64): Renamed to ... > (tls_global_dynamic_64_<mode>): This. > (*tls_local_dynamic_base_64): Renamed to ... > (*tls_local_dynamic_base_64<mode>): This. > (tls_local_dynamic_base_64): Renamed to ... > (tls_local_dynamic_base_64<mode>): This. > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index d673101..fc8fa12 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -12533,7 +12543,12 @@ legitimize_tls_address (rtx x, enum tls_model model, > bool for_mov) > rtx rax = gen_rtx_REG (Pmode, AX_REG), insns; > > start_sequence (); > - emit_call_insn (gen_tls_global_dynamic_64 (rax, x, caddr)); > + if (Pmode == DImode) > + emit_call_insn (gen_tls_global_dynamic_64_di (rax, x, > + caddr)); > + else > + emit_call_insn (gen_tls_global_dynamic_64_si (rax, x, > + caddr)); > insns = get_insns (); > end_sequence (); > > @@ -12581,7 +12596,12 @@ legitimize_tls_address (rtx x, enum tls_model model, > bool for_mov) > rtx rax = gen_rtx_REG (Pmode, AX_REG), insns, eqv; > > start_sequence (); > - emit_call_insn (gen_tls_local_dynamic_base_64 (rax, caddr)); > + if (Pmode == DImode) > + emit_call_insn (gen_tls_local_dynamic_base_64_di (rax, > + caddr)); > + else > + emit_call_insn (gen_tls_local_dynamic_base_64_si (rax, > + caddr)); > insns = get_insns (); > end_sequence (); Please use indirect functions here, see many examples in the code. OK with this change. Thanks, Uros.