On Mon, Mar 12, 2012 at 9:50 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Mon, Mar 12, 2012 at 12:46 AM, Uros Bizjak <ubiz...@gmail.com> wrote: >> 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. > > This is the patch I checked in. > > Thanks. > > > -- > H.J. > --- > 2012-03-12 H.J. Lu <hongjiu...@intel.com> > > * config/i386/i386.c (ix86_gen_tls_global_dynamic_64): New. > (ix86_gen_tls_local_dynamic_base_64): Likewise. > (ix86_option_override_internal): Set ix86_gen_tls_global_dynamic_64 > and ix86_gen_tls_local_dynamic_base_64. > (legitimize_tls_address): Use ix86_gen_tls_global_dynamic_64 and > ix86_gen_tls_local_dynamic_base_64. > > * 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.
This patch caused x32 libgcc build failure: ../../../../src-trunk/libgcc/generic-morestack-thread.c: In function 'stack_split_initialize_thread': ../../../../src-trunk/libgcc/generic-morestack-thread.c:128:1: error: unrecognizable insn: (call_insn/u 8 7 9 3 (parallel [ (set (reg:DI 0 ax) (call:DI (mem:QI (symbol_ref:DI ("__tls_get_addr")) [0 S1 A8]) (const_int 0 [0]))) (unspec:DI [ (symbol_ref:SI ("__morestack_segments") [flags 0x50] <var_decl 0x7ffff7725780 __morestack_segments>) ] UNSPEC_TLS_GD) ]) ../../../../src-trunk/libgcc/generic-morestack-thread.c:117 -1 (expr_list:REG_EH_REGION (const_int -2147483648 [0xffffffff80000000]) (nil)) (nil)) ../../../../src-trunk/libgcc/generic-morestack-thread.c:128:1: internal compiler error: in extract_insn, at recog.c:2123 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. make[8]: *** [generic-morestack-thread.o] Error 1 make[8]: *** Waiting for unfinished jobs.... __morestack_segments is always in SImode for x32. Adding :P to (unspec:P [(match_operand 1 "tls_symbolic_operand" "")] causes it to fail when Pmode == DImode I checked in this patch to revert the part of that change. Sorry for that. -- H.J. --- Index: ChangeLog =================================================================== --- ChangeLog (revision 185259) +++ ChangeLog (working copy) @@ -1,3 +1,9 @@ +2012-03-12 H.J. Lu <hongjiu...@intel.com> + + * config/i386/i386.md (*tls_global_dynamic_64_<mode>): Remove :P + on tls_symbolic_operand. + (tls_global_dynamic_64_<mode>): Likewise. + 2012-03-12 Georg-Johann Lay <a...@gjlay.de> PR other/52545 Index: config/i386/i386.md =================================================================== --- config/i386/i386.md (revision 185259) +++ config/i386/i386.md (working copy) @@ -12628,7 +12628,7 @@ (call:P (mem:QI (match_operand:P 2 "constant_call_address_operand" "z")) (match_operand:P 3 "" ""))) - (unspec:P [(match_operand:P 1 "tls_symbolic_operand" "")] + (unspec:P [(match_operand 1 "tls_symbolic_operand" "")] UNSPEC_TLS_GD)] "TARGET_64BIT" { @@ -12652,7 +12652,7 @@ (call:P (mem:QI (match_operand:P 2 "constant_call_address_operand" "")) (const_int 0))) - (unspec:P [(match_operand:P 1 "tls_symbolic_operand" "")] + (unspec:P [(match_operand 1 "tls_symbolic_operand" "")] UNSPEC_TLS_GD)])] "TARGET_64BIT")