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.

Reply via email to