From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 09AD53858422 for ; Mon, 11 Mar 2024 08:24:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 09AD53858422 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 09AD53858422 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710145515; cv=none; b=sHk+FiBYFpyzKMHnabCcoBbwSriFStuy8udVwetLHE8CPUJhrmq0AFAwjVLgEI0mHOYgcntFKu0ZFDoEKn8P6SMTHPl8/dfVzlO2SKH3x2Izxo95t5bkAVeYdgjdhVAqeU1bM8B23S++jf/jymX1T3/hbOlgrzoEaKM4KDBeHtc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710145515; c=relaxed/simple; bh=zKTuJm2Yk4BlmwsVcOOBc7Q6+jTcSsgf2rZO03nHwr0=; h=Subject:To:From:Message-ID:Date:MIME-Version; b=uZjICZjmR2HlzmtOyg/pyorjI7rJJyln0FZN/Vjz0tHo1OoI2RaQJhDSnKjFayPk/nTsm6xX/eJhE0H7vL9Vf0Nbz7K/WU9aykW3I8sZ1gsHqKefWJq3jApNTfewSzlATl25xghr/k+qGV5zPH4nciUQkrQ6diUdKrGMbmaTqPA= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from loongson.cn (unknown [10.20.4.171]) by gateway (Coremail) with SMTP id _____8BxiejSv+5l3xQXAA--.37496S3; Mon, 11 Mar 2024 16:24:51 +0800 (CST) Received: from [10.20.4.171] (unknown [10.20.4.171]) by localhost.localdomain (Coremail) with SMTP id AQAAf8BxnhPNv+5l4xlWAA--.40902S3; Mon, 11 Mar 2024 16:24:45 +0800 (CST) Subject: Re: [PATCH v3] LoongArch: Add support for TLS descriptors. To: binutils@sourceware.org Cc: xuchenghua@loongson.cn, chenglulu@loongson.cn, liuzhensong@loongson.cn, cailulu@loongson.cn, xry111@xry111.site, i.swmail@xen0n.name, maskray@google.com, luweining@loongson.cn, wanglei@loongson.cn, hejinyang@loongson.cn References: <20240311082010.1393142-1-mengqinggang@loongson.cn> From: mengqinggang Message-ID: Date: Mon, 11 Mar 2024 16:24:45 +0800 User-Agent: Mozilla/5.0 (X11; Linux mips64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20240311082010.1393142-1-mengqinggang@loongson.cn> Content-Type: text/plain; charset=gbk; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-CM-TRANSID:AQAAf8BxnhPNv+5l4xlWAA--.40902S3 X-CM-SenderInfo: 5phqw15lqjwttqj6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBj9fXoW3KrW5CFW7Aw13KF4xGF17urX_yoW8WrWxAo WFyF9Fvr18Gr4Fv3y2yrnxXryDtrnIvw4UAa9ruw1fGFs2vr15Xry7Gw1Yvry3Jas7tFyr A347WanrC34xJrnxl-sFpf9Il3svdjkaLaAFLSUrUUUUbb8apTn2vfkv8UJUUUU8wcxFpf 9Il3svdxBIdaVrn0xqx4xG64xvF2IEw4CE5I8CrVC2j2Jv73VFW2AGmfu7bjvjm3AaLaJ3 UjIYCTnIWjp_UUUYI7kC6x804xWl14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI 8IcIk0rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xG Y2AK021l84ACjcxK6xIIjxv20xvE14v26r4j6ryUM28EF7xvwVC0I7IYx2IY6xkF7I0E14 v26r4j6F4UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAF wI0_Gr1j6F4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc804VCY07AIYIkI8VC2zVCFFI 0UMc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280 aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcVAKI48JMxk0xIA0c2IEe2 xFo4CEbIxvr21l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAq x4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r 43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Gr0_Xr1lIxAIcVC0I7IYx2IY6xkF 7I0E14v26r4j6F4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxV W8JVWxJwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjxU wmhFDUUUU X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,KAM_STOCKGEN,MIME_CHARSET_FARAWAY,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: I'm sorry, this patch is for gcc. ÔÚ 2024/3/11 ÏÂÎç4:20, mengqinggang дµÀ: > Add support for TLS descriptors on normal code model and extreme code model. > > Normal code model instruction sequence: > -mno-explicit-relocs: > la.tls.desc $r4, s > add.d $r12, $r4, $r2 > -mexplicit-relocs: > pcalau12i $r4,%desc_pc_hi20(s) > addi.d $r4,$r4,%desc_pc_lo12(s) > ld.d $r1,$r4,%desc_ld(s) > jirl $r1,$r1,%desc_call(s)" > add.d $r12, $r4, $r2 > > Extreme code model instruction sequence: > -mno-explicit-relocs: > la.tls.desc $r4, $r12, s > add.d $r12, $r4, $r2 > -mexplicit-relocs: > pcalau12i $r4,%desc_pc_hi20(s) > addi.d $r12,$r0,%desc_pc_lo12(s) > lu32i.d $r12,%desc64_pc_lo20(s) > lu52i.d $r12,$r12,%desc64_pc_hi12(s) > add.d $r4,$r4,$r12 > ld.d $r1,$r4,%desc_ld(s) > jirl $r1,$r1,%desc_call(s) > add.d $r12, $r4, $r2 > > The default is still traditional TLS model, but can be configured with > --with-tls={trad,desc}. The default can change to TLS descriptors once > libc and LLVM support this. > > gcc/ChangeLog: > > * config.gcc: Add --with-tls option to change TLS flavor. > * config/loongarch/genopts/loongarch.opt.in: Add -mtls-dialect to > configure TLS flavor. > * config/loongarch/loongarch-def.h (struct loongarch_target): Add > tls_dialect. > * config/loongarch/loongarch-driver.cc (la_driver_init): Add tls > flavor. > * config/loongarch/loongarch-opts.cc (loongarch_init_target): Add > tls_dialect. > (loongarch_config_target): Ditto. > (loongarch_update_gcc_opt_status): Ditto. > * config/loongarch/loongarch-opts.h (loongarch_init_target):Ditto. > (TARGET_TLS_DESC): New define. > * config/loongarch/loongarch.cc (loongarch_symbol_insns): Add TLS DESC > instructions sequence length. > (loongarch_legitimize_tls_address): New TLS DESC instruction sequence. > (loongarch_option_override_internal): Add la_opt_tls_dialect. > (loongarch_option_restore): Add la_target.tls_dialect. > * config/loongarch/loongarch.md (@got_load_tls_desc): Normal > code model for TLS DESC. > (got_load_tls_desc_off64): Extreme code model for TLS DESC. > * config/loongarch/loongarch.opt: Regenerated. > --- > Changes v2 -> v3: > - Set default to traditional TLS model. > - Add support for -mexplicit-relocs and extreme code model. > > Changes v1 -> v2: > - Clobber fcc0-fcc7 registers in got_load_tls_desc template. > - Support --with-tls in configure. > > v2 link: https://sourceware.org/pipermail/gcc-patches/2024-February/646817.html > v1 link: https://sourceware.org/pipermail/gcc-patches/2023-December/638907.html > > gcc/config.gcc | 19 +++++- > gcc/config/loongarch/genopts/loongarch.opt.in | 14 ++++ > gcc/config/loongarch/loongarch-def.h | 7 ++ > gcc/config/loongarch/loongarch-driver.cc | 2 +- > gcc/config/loongarch/loongarch-opts.cc | 12 +++- > gcc/config/loongarch/loongarch-opts.h | 2 + > gcc/config/loongarch/loongarch.cc | 48 +++++++++---- > gcc/config/loongarch/loongarch.md | 68 +++++++++++++++++++ > gcc/config/loongarch/loongarch.opt | 14 ++++ > 9 files changed, 170 insertions(+), 16 deletions(-) > > diff --git a/gcc/config.gcc b/gcc/config.gcc > index 624e0dae191..baebafdbf5d 100644 > --- a/gcc/config.gcc > +++ b/gcc/config.gcc > @@ -4991,7 +4991,7 @@ case "${target}" in > ;; > > loongarch*-*) > - supported_defaults="abi arch tune fpu simd multilib-default strict-align-lib" > + supported_defaults="abi arch tune fpu simd multilib-default strict-align-lib tls" > > # Local variables > unset \ > @@ -5249,6 +5249,18 @@ case "${target}" in > with_multilib_list="${abi_base}/${abi_ext}" > fi > > + # Handle --with-tls. > + case "$with_tls" in > + "" \ > + | trad | desc) > + # OK > + ;; > + *) > + echo "Unknown TLS method used in --with-tls=$with_tls" 1>&2 > + exit 1 > + ;; > + esac > + > # Check if the configured default ABI combination is included in > # ${with_multilib_list}. > loongarch_multilib_list_sane=no > @@ -5914,6 +5926,11 @@ case ${target} in > lasx) tm_defines="$tm_defines DEFAULT_ISA_EXT_SIMD=ISA_EXT_SIMD_LASX" ;; > esac > > + case ${with_tls} in > + "" | trad) tm_defines="$tm_defines DEFAULT_TLS_TYPE=TLS_TRADITIONAL" ;; > + desc) tm_defines="$tm_defines DEFAULT_TLS_TYPE=TLS_DESCRIPTORS" ;; > + esac > + > tmake_file="loongarch/t-loongarch $tmake_file" > ;; > > diff --git a/gcc/config/loongarch/genopts/loongarch.opt.in b/gcc/config/loongarch/genopts/loongarch.opt.in > index 02f918053f5..7de107c3e3d 100644 > --- a/gcc/config/loongarch/genopts/loongarch.opt.in > +++ b/gcc/config/loongarch/genopts/loongarch.opt.in > @@ -262,3 +262,17 @@ default value is 4. > ; CPUCFG independently, so we use bit flags to specify them. > TargetVariable > HOST_WIDE_INT la_isa_evolution = 0 > + > +Enum > +Name(tls_type) Type(int) > +The possible TLS dialects: > + > +EnumValue > +Enum(tls_type) String(trad) Value(TLS_TRADITIONAL) > + > +EnumValue > +Enum(tls_type) String(desc) Value(TLS_DESCRIPTORS) > + > +mtls-dialect= > +Target RejectNegative Joined Enum(tls_type) Var(la_opt_tls_dialect) Init(M_OPT_UNSET) Save > +Specify TLS dialect. > diff --git a/gcc/config/loongarch/loongarch-def.h b/gcc/config/loongarch/loongarch-def.h > index 2dbf006d013..48d60e2b456 100644 > --- a/gcc/config/loongarch/loongarch-def.h > +++ b/gcc/config/loongarch/loongarch-def.h > @@ -175,6 +175,7 @@ struct loongarch_target > int cpu_arch; /* CPU_ */ > int cpu_tune; /* same */ > int cmodel; /* CMODEL_ */ > + int tls_dialect; /* TLS_ */ > }; > > /* CPU model */ > @@ -188,6 +189,12 @@ enum { > N_TUNE_TYPES = 5 > }; > > +/* TLS types. */ > +enum { > + TLS_TRADITIONAL = 0, > + TLS_DESCRIPTORS = 1 > +}; > + > /* CPU model properties */ > extern loongarch_def_array > loongarch_cpu_strings; > diff --git a/gcc/config/loongarch/loongarch-driver.cc b/gcc/config/loongarch/loongarch-driver.cc > index 62658f531ad..8c4ed34698b 100644 > --- a/gcc/config/loongarch/loongarch-driver.cc > +++ b/gcc/config/loongarch/loongarch-driver.cc > @@ -45,7 +45,7 @@ la_driver_init (int argc ATTRIBUTE_UNUSED, const char **argv ATTRIBUTE_UNUSED) > /* Initialize all fields of la_target. */ > loongarch_init_target (&la_target, M_OPT_UNSET, M_OPT_UNSET, M_OPT_UNSET, > M_OPT_UNSET, M_OPT_UNSET, M_OPT_UNSET, M_OPT_UNSET, > - 0, 0); > + M_OPT_UNSET, 0, 0); > return ""; > } > > diff --git a/gcc/config/loongarch/loongarch-opts.cc b/gcc/config/loongarch/loongarch-opts.cc > index 7eeac43ed2f..ec929aa7f29 100644 > --- a/gcc/config/loongarch/loongarch-opts.cc > +++ b/gcc/config/loongarch/loongarch-opts.cc > @@ -139,6 +139,7 @@ void > loongarch_init_target (struct loongarch_target *target, > int cpu_arch, int cpu_tune, int fpu, int simd, > int abi_base, int abi_ext, int cmodel, > + int tls_dialect, > HOST_WIDE_INT isa_evolution, > HOST_WIDE_INT isa_evolution_set) > { > @@ -153,6 +154,7 @@ loongarch_init_target (struct loongarch_target *target, > target->abi.base = abi_base; > target->abi.ext = abi_ext; > target->cmodel = cmodel; > + target->tls_dialect = tls_dialect; > } > > > @@ -174,7 +176,8 @@ loongarch_config_target (struct loongarch_target *target, > obstack_init (&msg_obstack); > > struct { > - int arch, tune, fpu, simd, abi_base, abi_ext, cmodel, abi_flt; > + int arch, tune, fpu, simd, abi_base, abi_ext, cmodel, > + tls_dialect, abi_flt; > } constrained = { > M_OPT_ABSENT (target->cpu_arch) ? 0 : 1, > M_OPT_ABSENT (target->cpu_tune) ? 0 : 1, > @@ -183,6 +186,7 @@ loongarch_config_target (struct loongarch_target *target, > M_OPT_ABSENT (target->abi.base) ? 0 : 1, > M_OPT_ABSENT (target->abi.ext) ? 0 : 1, > M_OPT_ABSENT (target->cmodel) ? 0 : 1, > + M_OPT_ABSENT (target->tls_dialect) ? 0 : 1, > M_OPT_ABSENT (target->abi.base) ? 0 : 1, > }; > > @@ -551,6 +555,9 @@ fallback: > gcc_unreachable (); > } > > + t.tls_dialect = constrained.tls_dialect ? target->tls_dialect > + : DEFAULT_TLS_TYPE; > + > /* Cleanup and return. */ > obstack_free (&msg_obstack, NULL); > *target = t; > @@ -786,6 +793,9 @@ loongarch_update_gcc_opt_status (struct loongarch_target *target, > /* status of -mcmodel */ > opts->x_la_opt_cmodel = target->cmodel; > > + /* status of -mtls-dialect */ > + opts->x_la_opt_tls_dialect = target->tls_dialect; > + > /* status of -mfpu */ > opts->x_la_opt_fpu = target->isa.fpu; > > diff --git a/gcc/config/loongarch/loongarch-opts.h b/gcc/config/loongarch/loongarch-opts.h > index 586e67e65ee..88e23fcee4b 100644 > --- a/gcc/config/loongarch/loongarch-opts.h > +++ b/gcc/config/loongarch/loongarch-opts.h > @@ -35,6 +35,7 @@ void > loongarch_init_target (struct loongarch_target *target, > int cpu_arch, int cpu_tune, int fpu, int simd, > int abi_base, int abi_ext, int cmodel, > + int tls_dialect, > HOST_WIDE_INT isa_evolutions, > HOST_WIDE_INT isa_evolutions_set); > > @@ -83,6 +84,7 @@ struct loongarch_flags { > #define TARGET_ABI_LP64 (la_target.abi.base == ABI_BASE_LP64D \ > || la_target.abi.base == ABI_BASE_LP64F \ > || la_target.abi.base == ABI_BASE_LP64S) > +#define TARGET_TLS_DESC (la_target.tls_dialect == TLS_DESCRIPTORS) > > #define ISA_HAS_LSX \ > (la_target.isa.simd == ISA_EXT_SIMD_LSX \ > diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc > index 70e31bb831c..303666bf6d5 100644 > --- a/gcc/config/loongarch/loongarch.cc > +++ b/gcc/config/loongarch/loongarch.cc > @@ -2028,7 +2028,7 @@ loongarch_symbol_insns (enum loongarch_symbol_type type, machine_mode mode) > > case SYMBOL_TLSGD: > case SYMBOL_TLSLDM: > - return 3; > + return TARGET_TLS_DESC ? 4 : 3; > > case SYMBOL_PCREL64: > return 5; > @@ -2930,24 +2930,44 @@ loongarch_call_tls_get_addr (rtx sym, enum loongarch_symbol_type type, rtx v0) > static rtx > loongarch_legitimize_tls_address (rtx loc) > { > - rtx dest, tp, tmp, tmp1, tmp2, tmp3; > + rtx dest, tp, tmp, tmp1, tmp2, tmp3, a0; > enum tls_model model = SYMBOL_REF_TLS_MODEL (loc); > rtx_insn *insn; > > switch (model) > { > case TLS_MODEL_LOCAL_DYNAMIC: > - tmp = gen_rtx_REG (Pmode, GP_RETURN); > - dest = gen_reg_rtx (Pmode); > - insn = loongarch_call_tls_get_addr (loc, SYMBOL_TLSLDM, tmp); > - emit_libcall_block (insn, dest, tmp, loc); > - break; > - > + if (!TARGET_TLS_DESC) > + { > + tmp = gen_rtx_REG (Pmode, GP_RETURN); > + dest = gen_reg_rtx (Pmode); > + insn = loongarch_call_tls_get_addr (loc, SYMBOL_TLSLDM, tmp); > + emit_libcall_block (insn, dest, tmp, loc); > + break; > + } > + /* Fall through. */ > case TLS_MODEL_GLOBAL_DYNAMIC: > - tmp = gen_rtx_REG (Pmode, GP_RETURN); > - dest = gen_reg_rtx (Pmode); > - insn = loongarch_call_tls_get_addr (loc, SYMBOL_TLSGD, tmp); > - emit_libcall_block (insn, dest, tmp, loc); > + if (TARGET_TLS_DESC) > + { > + a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST); > + dest = gen_reg_rtx (Pmode); > + tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM); > + > + if (TARGET_CMODEL_EXTREME) > + emit_insn (gen_got_load_tls_desc_off64 (a0, loc, > + gen_reg_rtx (DImode))); > + else > + emit_insn (gen_got_load_tls_desc (Pmode, a0, loc)); > + > + emit_insn (gen_add3_insn (dest, a0, tp)); > + } > + else > + { > + tmp = gen_rtx_REG (Pmode, GP_RETURN); > + dest = gen_reg_rtx (Pmode); > + insn = loongarch_call_tls_get_addr (loc, SYMBOL_TLSGD, tmp); > + emit_libcall_block (insn, dest, tmp, loc); > + } > break; > > case TLS_MODEL_INITIAL_EXEC: > @@ -7660,7 +7680,8 @@ loongarch_option_override_internal (struct gcc_options *opts, > loongarch_init_target (&la_target, > la_opt_cpu_arch, la_opt_cpu_tune, la_opt_fpu, > la_opt_simd, la_opt_abi_base, la_opt_abi_ext, > - la_opt_cmodel, opts->x_la_isa_evolution, > + la_opt_cmodel, la_opt_tls_dialect, > + opts->x_la_isa_evolution, > opts_set->x_la_isa_evolution); > > /* Handle target-specific options: compute defaults/conflicts etc. */ > @@ -7873,6 +7894,7 @@ loongarch_option_restore (struct gcc_options *, > la_target.isa.evolution = ptr->x_la_isa_evolution; > > la_target.cmodel = ptr->x_la_opt_cmodel; > + la_target.tls_dialect = ptr->x_la_opt_tls_dialect; > } > > /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */ > diff --git a/gcc/config/loongarch/loongarch.md b/gcc/config/loongarch/loongarch.md > index 525e1e82183..0a1a6a24f61 100644 > --- a/gcc/config/loongarch/loongarch.md > +++ b/gcc/config/loongarch/loongarch.md > @@ -52,6 +52,8 @@ (define_c_enum "unspec" [ > > ;; TLS > UNSPEC_TLS > + UNSPEC_TLS_DESC > + UNSPEC_TLS_DESC_OFF64 > > ;; Stack tie > UNSPEC_TIE > @@ -127,6 +129,15 @@ (define_constants > (T1_REGNUM 13) > (S0_REGNUM 23) > > + (FCC0_REGNUM 64) > + (FCC1_REGNUM 65) > + (FCC2_REGNUM 66) > + (FCC3_REGNUM 67) > + (FCC4_REGNUM 68) > + (FCC5_REGNUM 69) > + (FCC6_REGNUM 70) > + (FCC7_REGNUM 71) > + > ;; Return path styles > (NORMAL_RETURN 0) > (SIBCALL_RETURN 1) > @@ -2760,6 +2771,63 @@ (define_insn "store_word" > > ;; Thread-Local Storage > > +(define_insn "@got_load_tls_desc" > + [(set (match_operand:P 0 "register_operand" "=r") > + (unspec:P > + [(match_operand:P 1 "symbolic_operand" "")] > + UNSPEC_TLS_DESC)) > + (clobber (reg:SI FCC0_REGNUM)) > + (clobber (reg:SI FCC1_REGNUM)) > + (clobber (reg:SI FCC2_REGNUM)) > + (clobber (reg:SI FCC3_REGNUM)) > + (clobber (reg:SI FCC4_REGNUM)) > + (clobber (reg:SI FCC5_REGNUM)) > + (clobber (reg:SI FCC6_REGNUM)) > + (clobber (reg:SI FCC7_REGNUM)) > + (clobber (reg:SI RETURN_ADDR_REGNUM))] > + "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"; > +} > + [(set_attr "got" "load") > + (set_attr "mode" "") > + (set_attr "length" "16")]) > + > +(define_insn "got_load_tls_desc_off64" > + [(set (match_operand:DI 0 "register_operand" "=r") > + (unspec:DI > + [(match_operand:DI 1 "symbolic_operand" "")] > + UNSPEC_TLS_DESC_OFF64)) > + (clobber (reg:SI FCC0_REGNUM)) > + (clobber (reg:SI FCC1_REGNUM)) > + (clobber (reg:SI FCC2_REGNUM)) > + (clobber (reg:SI FCC3_REGNUM)) > + (clobber (reg:SI FCC4_REGNUM)) > + (clobber (reg:SI FCC5_REGNUM)) > + (clobber (reg:SI FCC6_REGNUM)) > + (clobber (reg:SI FCC7_REGNUM)) > + (clobber (reg:SI RETURN_ADDR_REGNUM)) > + (clobber (match_operand:DI 2 "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"; > +} > + [(set_attr "got" "load") > + (set_attr "length" "28")]) > + > (define_insn "@load_tls" > [(set (match_operand:P 0 "register_operand" "=r") > (unspec:P > diff --git a/gcc/config/loongarch/loongarch.opt b/gcc/config/loongarch/loongarch.opt > index f10fcdd968c..1c54ab6ae43 100644 > --- a/gcc/config/loongarch/loongarch.opt > +++ b/gcc/config/loongarch/loongarch.opt > @@ -271,6 +271,20 @@ default value is 4. > TargetVariable > HOST_WIDE_INT la_isa_evolution = 0 > > +Enum > +Name(tls_type) Type(int) > +The possible TLS dialects: > + > +EnumValue > +Enum(tls_type) String(trad) Value(TLS_TRADITIONAL) > + > +EnumValue > +Enum(tls_type) String(desc) Value(TLS_DESCRIPTORS) > + > +mtls-dialect= > +Target RejectNegative Joined Enum(tls_type) Var(la_opt_tls_dialect) Init(M_OPT_UNSET) Save > +Specify TLS dialect. > + > mfrecipe > Target Mask(ISA_FRECIPE) Var(la_isa_evolution) > Support frecipe.{s/d} and frsqrte.{s/d} instructions.