On 12/7/12 2:53 PM, Chung-Lin Tang wrote: > Finally, what I personally need, the MIPS parts. > > Thanks, > Chung-Lin > > * config/mips/mips.c (mips_get_tp): Add 'target' parameter for > generating to specific reg. > (mips_legitimize_tls_address): Update calls to mips_get_tp(). > (mips_expand_builtin_thread_pointer): Add hook function for > TARGET_EXPAND_BUILTIN_THREAD_POINTER. >
MIPS parts updated to use MD pattern. Thanks, Chung-Lin * config/mips/mips.md (get_thread_pointer<mode>): New pattern. * config/mips/mips-protos.h (mips_expand_thread_pointer): Add extern declaration. * config/mips/mips.c (mips_expand_thread_pointer): Renamed from mips_get_tp. (mips_get_tp): New stub calling mips_expand_thread_pointer.
Index: config/mips/mips.md =================================================================== --- config/mips/mips.md (revision 190742) +++ config/mips/mips.md (working copy) @@ -6886,6 +6886,16 @@ [(set_attr "type" "call") (set_attr "length" "12") (set_attr "mode" "<MODE>")]) + +;; Named pattern for expanding thread pointer reference. +(define_expand "get_thread_pointer<mode>" + [(match_operand:P 0 "register_operand" "=d")] + "HAVE_AS_TLS" +{ + mips_expand_thread_pointer (operands[0]); + DONE; +}) + ;; Synchronization instructions. Index: config/mips/mips-protos.h =================================================================== --- config/mips/mips-protos.h (revision 190742) +++ config/mips/mips-protos.h (working copy) @@ -330,6 +330,8 @@ extern void mips_expand_vec_reduc (rtx, rtx, rtx ( extern void mips_expand_vec_minmax (rtx, rtx, rtx, rtx (*) (rtx, rtx, rtx), bool); +extern rtx mips_expand_thread_pointer (rtx); + extern bool mips_eh_uses (unsigned int); extern bool mips_epilogue_uses (unsigned int); extern void mips_final_prescan_insn (rtx, rtx *, int); Index: config/mips/mips.c =================================================================== --- config/mips/mips.c (revision 190742) +++ config/mips/mips.c (working copy) @@ -2854,12 +2854,11 @@ mips_call_tls_get_addr (rtx sym, enum mips_symbol_ /* Return a pseudo register that contains the current thread pointer. */ -static rtx -mips_get_tp (void) +rtx +mips_expand_thread_pointer (rtx tp) { - rtx tp, fn; + rtx fn; - tp = gen_reg_rtx (Pmode); if (TARGET_MIPS16) { mips_need_mips16_rdhwr_p = true; @@ -2874,6 +2873,12 @@ mips_call_tls_get_addr (rtx sym, enum mips_symbol_ return tp; } +static rtx +mips_get_tp (void) +{ + return mips_expand_thread_pointer (gen_reg_rtx (Pmode)); +} + /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return its address. The return value will be both a valid address and a valid SET_SRC (either a REG or a LO_SUM). */