On Wed, 2024-03-13 at 06:56 +0800, Xi Ruoyao wrote: > On Wed, 2024-03-13 at 06:15 +0800, Xi Ruoyao wrote: > > > +(define_insn "@got_load_tls_desc<mode>" > > > + [(set (match_operand:P 0 "register_operand" "=r") > > Hmm, and it looks like we should use (reg:P 4) instead of match_operand > here, because the instruction does not work for a different register: > with TARGET_EXPLICIT_RELOCS we are hard coding r4, and without > TARGET_EXPLICIT_RELOCS the TLS desc function still only puts the return > value in r4.
Suggested changes: diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 303666bf6d5..8f4d3f36c26 100644 --- a/gcc/config/loongarch/loongarch.cc +++ b/gcc/config/loongarch/loongarch.cc @@ -2954,10 +2954,10 @@ loongarch_legitimize_tls_address (rtx loc) tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM); if (TARGET_CMODEL_EXTREME) - emit_insn (gen_got_load_tls_desc_off64 (a0, loc, + emit_insn (gen_got_load_tls_desc_off64 (loc, gen_reg_rtx (DImode))); else - emit_insn (gen_got_load_tls_desc (Pmode, a0, loc)); + emit_insn (gen_got_load_tls_desc (Pmode, loc)); emit_insn (gen_add3_insn (dest, a0, tp)); } diff --git a/gcc/config/loongarch/loongarch.md b/gcc/config/loongarch/loongarch.md index 0a1a6a24f61..8e8f1012344 100644 --- a/gcc/config/loongarch/loongarch.md +++ b/gcc/config/loongarch/loongarch.md @@ -2772,9 +2772,9 @@ (define_insn "store_word<mode>" ;; Thread-Local Storage (define_insn "@got_load_tls_desc<mode>" - [(set (match_operand:P 0 "register_operand" "=r") + [(set (reg:P 4) (unspec:P - [(match_operand:P 1 "symbolic_operand" "")] + [(match_operand:P 0 "symbolic_operand" "")] UNSPEC_TLS_DESC)) (clobber (reg:SI FCC0_REGNUM)) (clobber (reg:SI FCC1_REGNUM)) @@ -2788,20 +2788,20 @@ (define_insn "@got_load_tls_desc<mode>" "TARGET_TLS_DESC" { return TARGET_EXPLICIT_RELOCS - ? "pcalau12i\t$r4,%%desc_pc_hi20(%1)\n\ - \taddi.d\t$r4,$r4,%%desc_pc_lo12(%1)\n\ - \tld.d\t$r1,$r4,%%desc_ld(%1)\n\ - \tjirl\t$r1,$r1,%%desc_call(%1)" - : "la.tls.desc\t%0,%1"; + ? "pcalau12i\t$r4,%%desc_pc_hi20(%0)\n\t" + "addi.d\t$r4,$r4,%%desc_pc_lo12(%0)\n\t" + "ld.d\t$r1,$r4,%%desc_ld(%0)\n\t" + "jirl\t$r1,$r1,%%desc_call(%0)" + : "la.tls.desc\t$r4,%0"; } [(set_attr "got" "load") (set_attr "mode" "<MODE>") (set_attr "length" "16")]) (define_insn "got_load_tls_desc_off64" - [(set (match_operand:DI 0 "register_operand" "=r") + [(set (reg:DI 4) (unspec:DI - [(match_operand:DI 1 "symbolic_operand" "")] + [(match_operand:DI 0 "symbolic_operand" "")] UNSPEC_TLS_DESC_OFF64)) (clobber (reg:SI FCC0_REGNUM)) (clobber (reg:SI FCC1_REGNUM)) @@ -2812,18 +2812,18 @@ (define_insn "got_load_tls_desc_off64" (clobber (reg:SI FCC6_REGNUM)) (clobber (reg:SI FCC7_REGNUM)) (clobber (reg:SI RETURN_ADDR_REGNUM)) - (clobber (match_operand:DI 2 "register_operand" "=&r"))] + (clobber (match_operand:DI 1 "register_operand" "=&r"))] "TARGET_TLS_DESC && TARGET_CMODEL_EXTREME" { return TARGET_EXPLICIT_RELOCS - ? "pcalau12i\t$r4,%%desc_pc_hi20(%1)\n\ - \taddi.d\t%2,$r0,%%desc_pc_lo12(%1)\n\ - \tlu32i.d\t%2,%%desc64_pc_lo20(%1)\n\ - \tlu52i.d\t%2,%2,%%desc64_pc_hi12(%1)\n\ - \tadd.d\t$r4,$r4,%2\n\ - \tld.d\t$r1,$r4,%%desc_ld(%1)\n\ - \tjirl\t$r1,$r1,%%desc_call(%1)" - : "la.tls.desc\t%0,%2,%1"; + ? "pcalau12i\t$r4,%%desc_pc_hi20(%0)\n\t" + "addi.d\t%1,$r0,%%desc_pc_lo12(%0)\n\t" + "lu32i.d\t%1,%%desc64_pc_lo20(%0)\n\t" + "lu52i.d\t%1,%2,%%desc64_pc_hi12(%0)\n\t" + "add.d\t$r4,$r4,%1\n\t" + "ld.d\t$r1,$r4,%%desc_ld(%0)\n\t" + "jirl\t$r1,$r1,%%desc_call(%0)" + : "la.tls.desc\t$r4,%1,%0"; } [(set_attr "got" "load") (set_attr "length" "28")]) -- Xi Ruoyao <xry...@xry111.site> School of Aerospace Science and Technology, Xidian University