xref: /llvm-project/llvm/test/CodeGen/LoongArch/tls-models.ll (revision b53866fec80d8676705409140b8ed2147ec44fad)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d --relocation-model=pic < %s | FileCheck %s --check-prefix=LA32PIC
3; RUN: llc --mtriple=loongarch64 -mattr=+d --relocation-model=pic < %s | FileCheck %s --check-prefix=LA64PIC
4; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large --relocation-model=pic < %s | FileCheck %s --check-prefix=LA64LARGEPIC
5; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32NOPIC
6; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64NOPIC
7; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large < %s | FileCheck %s --check-prefix=LA64LARGENOPIC
8; RUN: llc --mtriple=loongarch32 -mattr=+d --relocation-model=pic --enable-tlsdesc < %s \
9; RUN:     | FileCheck %s --check-prefix=LA32DESC
10; RUN: llc --mtriple=loongarch64 -mattr=+d --relocation-model=pic --enable-tlsdesc < %s \
11; RUN:     | FileCheck %s --check-prefix=LA64DESC
12; RUN: llc --mtriple=loongarch64 -mattr=+d --relocation-model=pic --enable-tlsdesc \
13; RUN:     --code-model=large < %s | FileCheck %s --check-prefix=DESC64
14
15;; Check that TLS symbols are lowered correctly based on the specified
16;; model. Make sure they're external to avoid them all being optimised to Local
17;; Exec for the executable.
18
19@unspecified = external thread_local global i32
20@ld = external thread_local(localdynamic) global i32
21@ie = external thread_local(initialexec) global i32
22@le = external thread_local(localexec) global i32
23
24;; No model specified (global dynamic)
25
26define ptr @f1() nounwind {
27; LA32PIC-LABEL: f1:
28; LA32PIC:       # %bb.0: # %entry
29; LA32PIC-NEXT:    addi.w $sp, $sp, -16
30; LA32PIC-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
31; LA32PIC-NEXT:    pcalau12i $a0, %gd_pc_hi20(unspecified)
32; LA32PIC-NEXT:    addi.w $a0, $a0, %got_pc_lo12(unspecified)
33; LA32PIC-NEXT:    bl %plt(__tls_get_addr)
34; LA32PIC-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
35; LA32PIC-NEXT:    addi.w $sp, $sp, 16
36; LA32PIC-NEXT:    ret
37;
38; LA64PIC-LABEL: f1:
39; LA64PIC:       # %bb.0: # %entry
40; LA64PIC-NEXT:    addi.d $sp, $sp, -16
41; LA64PIC-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
42; LA64PIC-NEXT:    pcalau12i $a0, %gd_pc_hi20(unspecified)
43; LA64PIC-NEXT:    addi.d $a0, $a0, %got_pc_lo12(unspecified)
44; LA64PIC-NEXT:    bl %plt(__tls_get_addr)
45; LA64PIC-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
46; LA64PIC-NEXT:    addi.d $sp, $sp, 16
47; LA64PIC-NEXT:    ret
48;
49; LA64LARGEPIC-LABEL: f1:
50; LA64LARGEPIC:       # %bb.0: # %entry
51; LA64LARGEPIC-NEXT:    addi.d $sp, $sp, -16
52; LA64LARGEPIC-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
53; LA64LARGEPIC-NEXT:    pcalau12i $a0, %gd_pc_hi20(unspecified)
54; LA64LARGEPIC-NEXT:    addi.d $a1, $zero, %got_pc_lo12(unspecified)
55; LA64LARGEPIC-NEXT:    lu32i.d $a1, %got64_pc_lo20(unspecified)
56; LA64LARGEPIC-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(unspecified)
57; LA64LARGEPIC-NEXT:    add.d $a0, $a1, $a0
58; LA64LARGEPIC-NEXT:    pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
59; LA64LARGEPIC-NEXT:    addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
60; LA64LARGEPIC-NEXT:    lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
61; LA64LARGEPIC-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
62; LA64LARGEPIC-NEXT:    ldx.d $ra, $ra, $a1
63; LA64LARGEPIC-NEXT:    jirl $ra, $ra, 0
64; LA64LARGEPIC-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
65; LA64LARGEPIC-NEXT:    addi.d $sp, $sp, 16
66; LA64LARGEPIC-NEXT:    ret
67;
68; LA32NOPIC-LABEL: f1:
69; LA32NOPIC:       # %bb.0: # %entry
70; LA32NOPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(unspecified)
71; LA32NOPIC-NEXT:    ld.w $a0, $a0, %ie_pc_lo12(unspecified)
72; LA32NOPIC-NEXT:    add.w $a0, $a0, $tp
73; LA32NOPIC-NEXT:    ret
74;
75; LA64NOPIC-LABEL: f1:
76; LA64NOPIC:       # %bb.0: # %entry
77; LA64NOPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(unspecified)
78; LA64NOPIC-NEXT:    ld.d $a0, $a0, %ie_pc_lo12(unspecified)
79; LA64NOPIC-NEXT:    add.d $a0, $a0, $tp
80; LA64NOPIC-NEXT:    ret
81;
82; LA64LARGENOPIC-LABEL: f1:
83; LA64LARGENOPIC:       # %bb.0: # %entry
84; LA64LARGENOPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(unspecified)
85; LA64LARGENOPIC-NEXT:    addi.d $a1, $zero, %ie_pc_lo12(unspecified)
86; LA64LARGENOPIC-NEXT:    lu32i.d $a1, %ie64_pc_lo20(unspecified)
87; LA64LARGENOPIC-NEXT:    lu52i.d $a1, $a1, %ie64_pc_hi12(unspecified)
88; LA64LARGENOPIC-NEXT:    ldx.d $a0, $a1, $a0
89; LA64LARGENOPIC-NEXT:    add.d $a0, $a0, $tp
90; LA64LARGENOPIC-NEXT:    ret
91;
92; LA32DESC-LABEL: f1:
93; LA32DESC:       # %bb.0: # %entry
94; LA32DESC-NEXT:    addi.w $sp, $sp, -16
95; LA32DESC-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
96; LA32DESC-NEXT:    pcalau12i $a0, %desc_pc_hi20(unspecified)
97; LA32DESC-NEXT:    addi.w $a0, $a0, %desc_pc_lo12(unspecified)
98; LA32DESC-NEXT:    ld.w $ra, $a0, %desc_ld(unspecified)
99; LA32DESC-NEXT:    jirl $ra, $ra, %desc_call(unspecified)
100; LA32DESC-NEXT:    add.w $a0, $a0, $tp
101; LA32DESC-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
102; LA32DESC-NEXT:    addi.w $sp, $sp, 16
103; LA32DESC-NEXT:    ret
104;
105; LA64DESC-LABEL: f1:
106; LA64DESC:       # %bb.0: # %entry
107; LA64DESC-NEXT:    addi.d $sp, $sp, -16
108; LA64DESC-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
109; LA64DESC-NEXT:    pcalau12i $a0, %desc_pc_hi20(unspecified)
110; LA64DESC-NEXT:    addi.d $a0, $a0, %desc_pc_lo12(unspecified)
111; LA64DESC-NEXT:    ld.d $ra, $a0, %desc_ld(unspecified)
112; LA64DESC-NEXT:    jirl $ra, $ra, %desc_call(unspecified)
113; LA64DESC-NEXT:    add.d $a0, $a0, $tp
114; LA64DESC-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
115; LA64DESC-NEXT:    addi.d $sp, $sp, 16
116; LA64DESC-NEXT:    ret
117;
118; DESC64-LABEL: f1:
119; DESC64:       # %bb.0: # %entry
120; DESC64-NEXT:    addi.d $sp, $sp, -16
121; DESC64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
122; DESC64-NEXT:    pcalau12i $a0, %desc_pc_hi20(unspecified)
123; DESC64-NEXT:    addi.d $a1, $zero, %desc_pc_lo12(unspecified)
124; DESC64-NEXT:    lu32i.d $a1, %desc64_pc_lo20(unspecified)
125; DESC64-NEXT:    lu52i.d $a1, $a1, %desc64_pc_hi12(unspecified)
126; DESC64-NEXT:    add.d $a0, $a0, $a1
127; DESC64-NEXT:    ld.d $ra, $a0, %desc_ld(unspecified)
128; DESC64-NEXT:    jirl $ra, $ra, %desc_call(unspecified)
129; DESC64-NEXT:    add.d $a0, $a0, $tp
130; DESC64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
131; DESC64-NEXT:    addi.d $sp, $sp, 16
132; DESC64-NEXT:    ret
133entry:
134  ret ptr @unspecified
135}
136
137;; localdynamic specified
138
139define ptr @f2() nounwind {
140; LA32PIC-LABEL: f2:
141; LA32PIC:       # %bb.0: # %entry
142; LA32PIC-NEXT:    addi.w $sp, $sp, -16
143; LA32PIC-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
144; LA32PIC-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
145; LA32PIC-NEXT:    addi.w $a0, $a0, %got_pc_lo12(ld)
146; LA32PIC-NEXT:    bl %plt(__tls_get_addr)
147; LA32PIC-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
148; LA32PIC-NEXT:    addi.w $sp, $sp, 16
149; LA32PIC-NEXT:    ret
150;
151; LA64PIC-LABEL: f2:
152; LA64PIC:       # %bb.0: # %entry
153; LA64PIC-NEXT:    addi.d $sp, $sp, -16
154; LA64PIC-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
155; LA64PIC-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
156; LA64PIC-NEXT:    addi.d $a0, $a0, %got_pc_lo12(ld)
157; LA64PIC-NEXT:    bl %plt(__tls_get_addr)
158; LA64PIC-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
159; LA64PIC-NEXT:    addi.d $sp, $sp, 16
160; LA64PIC-NEXT:    ret
161;
162; LA64LARGEPIC-LABEL: f2:
163; LA64LARGEPIC:       # %bb.0: # %entry
164; LA64LARGEPIC-NEXT:    addi.d $sp, $sp, -16
165; LA64LARGEPIC-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
166; LA64LARGEPIC-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
167; LA64LARGEPIC-NEXT:    addi.d $a1, $zero, %got_pc_lo12(ld)
168; LA64LARGEPIC-NEXT:    lu32i.d $a1, %got64_pc_lo20(ld)
169; LA64LARGEPIC-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(ld)
170; LA64LARGEPIC-NEXT:    add.d $a0, $a1, $a0
171; LA64LARGEPIC-NEXT:    pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
172; LA64LARGEPIC-NEXT:    addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
173; LA64LARGEPIC-NEXT:    lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
174; LA64LARGEPIC-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
175; LA64LARGEPIC-NEXT:    ldx.d $ra, $ra, $a1
176; LA64LARGEPIC-NEXT:    jirl $ra, $ra, 0
177; LA64LARGEPIC-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
178; LA64LARGEPIC-NEXT:    addi.d $sp, $sp, 16
179; LA64LARGEPIC-NEXT:    ret
180;
181; LA32NOPIC-LABEL: f2:
182; LA32NOPIC:       # %bb.0: # %entry
183; LA32NOPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ld)
184; LA32NOPIC-NEXT:    ld.w $a0, $a0, %ie_pc_lo12(ld)
185; LA32NOPIC-NEXT:    add.w $a0, $a0, $tp
186; LA32NOPIC-NEXT:    ret
187;
188; LA64NOPIC-LABEL: f2:
189; LA64NOPIC:       # %bb.0: # %entry
190; LA64NOPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ld)
191; LA64NOPIC-NEXT:    ld.d $a0, $a0, %ie_pc_lo12(ld)
192; LA64NOPIC-NEXT:    add.d $a0, $a0, $tp
193; LA64NOPIC-NEXT:    ret
194;
195; LA64LARGENOPIC-LABEL: f2:
196; LA64LARGENOPIC:       # %bb.0: # %entry
197; LA64LARGENOPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ld)
198; LA64LARGENOPIC-NEXT:    addi.d $a1, $zero, %ie_pc_lo12(ld)
199; LA64LARGENOPIC-NEXT:    lu32i.d $a1, %ie64_pc_lo20(ld)
200; LA64LARGENOPIC-NEXT:    lu52i.d $a1, $a1, %ie64_pc_hi12(ld)
201; LA64LARGENOPIC-NEXT:    ldx.d $a0, $a1, $a0
202; LA64LARGENOPIC-NEXT:    add.d $a0, $a0, $tp
203; LA64LARGENOPIC-NEXT:    ret
204;
205; LA32DESC-LABEL: f2:
206; LA32DESC:       # %bb.0: # %entry
207; LA32DESC-NEXT:    addi.w $sp, $sp, -16
208; LA32DESC-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
209; LA32DESC-NEXT:    pcalau12i $a0, %desc_pc_hi20(ld)
210; LA32DESC-NEXT:    addi.w $a0, $a0, %desc_pc_lo12(ld)
211; LA32DESC-NEXT:    ld.w $ra, $a0, %desc_ld(ld)
212; LA32DESC-NEXT:    jirl $ra, $ra, %desc_call(ld)
213; LA32DESC-NEXT:    add.w $a0, $a0, $tp
214; LA32DESC-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
215; LA32DESC-NEXT:    addi.w $sp, $sp, 16
216; LA32DESC-NEXT:    ret
217;
218; LA64DESC-LABEL: f2:
219; LA64DESC:       # %bb.0: # %entry
220; LA64DESC-NEXT:    addi.d $sp, $sp, -16
221; LA64DESC-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
222; LA64DESC-NEXT:    pcalau12i $a0, %desc_pc_hi20(ld)
223; LA64DESC-NEXT:    addi.d $a0, $a0, %desc_pc_lo12(ld)
224; LA64DESC-NEXT:    ld.d $ra, $a0, %desc_ld(ld)
225; LA64DESC-NEXT:    jirl $ra, $ra, %desc_call(ld)
226; LA64DESC-NEXT:    add.d $a0, $a0, $tp
227; LA64DESC-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
228; LA64DESC-NEXT:    addi.d $sp, $sp, 16
229; LA64DESC-NEXT:    ret
230;
231; DESC64-LABEL: f2:
232; DESC64:       # %bb.0: # %entry
233; DESC64-NEXT:    addi.d $sp, $sp, -16
234; DESC64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
235; DESC64-NEXT:    pcalau12i $a0, %desc_pc_hi20(ld)
236; DESC64-NEXT:    addi.d $a1, $zero, %desc_pc_lo12(ld)
237; DESC64-NEXT:    lu32i.d $a1, %desc64_pc_lo20(ld)
238; DESC64-NEXT:    lu52i.d $a1, $a1, %desc64_pc_hi12(ld)
239; DESC64-NEXT:    add.d $a0, $a0, $a1
240; DESC64-NEXT:    ld.d $ra, $a0, %desc_ld(ld)
241; DESC64-NEXT:    jirl $ra, $ra, %desc_call(ld)
242; DESC64-NEXT:    add.d $a0, $a0, $tp
243; DESC64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
244; DESC64-NEXT:    addi.d $sp, $sp, 16
245; DESC64-NEXT:    ret
246entry:
247  ret ptr @ld
248}
249
250;; initialexec specified
251
252define ptr @f3() nounwind {
253; LA32PIC-LABEL: f3:
254; LA32PIC:       # %bb.0: # %entry
255; LA32PIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
256; LA32PIC-NEXT:    ld.w $a0, $a0, %ie_pc_lo12(ie)
257; LA32PIC-NEXT:    add.w $a0, $a0, $tp
258; LA32PIC-NEXT:    ret
259;
260; LA64PIC-LABEL: f3:
261; LA64PIC:       # %bb.0: # %entry
262; LA64PIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
263; LA64PIC-NEXT:    ld.d $a0, $a0, %ie_pc_lo12(ie)
264; LA64PIC-NEXT:    add.d $a0, $a0, $tp
265; LA64PIC-NEXT:    ret
266;
267; LA64LARGEPIC-LABEL: f3:
268; LA64LARGEPIC:       # %bb.0: # %entry
269; LA64LARGEPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
270; LA64LARGEPIC-NEXT:    addi.d $a1, $zero, %ie_pc_lo12(ie)
271; LA64LARGEPIC-NEXT:    lu32i.d $a1, %ie64_pc_lo20(ie)
272; LA64LARGEPIC-NEXT:    lu52i.d $a1, $a1, %ie64_pc_hi12(ie)
273; LA64LARGEPIC-NEXT:    ldx.d $a0, $a1, $a0
274; LA64LARGEPIC-NEXT:    add.d $a0, $a0, $tp
275; LA64LARGEPIC-NEXT:    ret
276;
277; LA32NOPIC-LABEL: f3:
278; LA32NOPIC:       # %bb.0: # %entry
279; LA32NOPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
280; LA32NOPIC-NEXT:    ld.w $a0, $a0, %ie_pc_lo12(ie)
281; LA32NOPIC-NEXT:    add.w $a0, $a0, $tp
282; LA32NOPIC-NEXT:    ret
283;
284; LA64NOPIC-LABEL: f3:
285; LA64NOPIC:       # %bb.0: # %entry
286; LA64NOPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
287; LA64NOPIC-NEXT:    ld.d $a0, $a0, %ie_pc_lo12(ie)
288; LA64NOPIC-NEXT:    add.d $a0, $a0, $tp
289; LA64NOPIC-NEXT:    ret
290;
291; LA64LARGENOPIC-LABEL: f3:
292; LA64LARGENOPIC:       # %bb.0: # %entry
293; LA64LARGENOPIC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
294; LA64LARGENOPIC-NEXT:    addi.d $a1, $zero, %ie_pc_lo12(ie)
295; LA64LARGENOPIC-NEXT:    lu32i.d $a1, %ie64_pc_lo20(ie)
296; LA64LARGENOPIC-NEXT:    lu52i.d $a1, $a1, %ie64_pc_hi12(ie)
297; LA64LARGENOPIC-NEXT:    ldx.d $a0, $a1, $a0
298; LA64LARGENOPIC-NEXT:    add.d $a0, $a0, $tp
299; LA64LARGENOPIC-NEXT:    ret
300;
301; LA32DESC-LABEL: f3:
302; LA32DESC:       # %bb.0: # %entry
303; LA32DESC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
304; LA32DESC-NEXT:    ld.w $a0, $a0, %ie_pc_lo12(ie)
305; LA32DESC-NEXT:    add.w $a0, $a0, $tp
306; LA32DESC-NEXT:    ret
307;
308; LA64DESC-LABEL: f3:
309; LA64DESC:       # %bb.0: # %entry
310; LA64DESC-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
311; LA64DESC-NEXT:    ld.d $a0, $a0, %ie_pc_lo12(ie)
312; LA64DESC-NEXT:    add.d $a0, $a0, $tp
313; LA64DESC-NEXT:    ret
314;
315; DESC64-LABEL: f3:
316; DESC64:       # %bb.0: # %entry
317; DESC64-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
318; DESC64-NEXT:    addi.d $a1, $zero, %ie_pc_lo12(ie)
319; DESC64-NEXT:    lu32i.d $a1, %ie64_pc_lo20(ie)
320; DESC64-NEXT:    lu52i.d $a1, $a1, %ie64_pc_hi12(ie)
321; DESC64-NEXT:    ldx.d $a0, $a1, $a0
322; DESC64-NEXT:    add.d $a0, $a0, $tp
323; DESC64-NEXT:    ret
324entry:
325  ret ptr @ie
326}
327
328;; localexec specified
329
330define ptr @f4() nounwind {
331; LA32PIC-LABEL: f4:
332; LA32PIC:       # %bb.0: # %entry
333; LA32PIC-NEXT:    lu12i.w $a0, %le_hi20_r(le)
334; LA32PIC-NEXT:    add.w $a0, $a0, $tp, %le_add_r(le)
335; LA32PIC-NEXT:    addi.w $a0, $a0, %le_lo12_r(le)
336; LA32PIC-NEXT:    ret
337;
338; LA64PIC-LABEL: f4:
339; LA64PIC:       # %bb.0: # %entry
340; LA64PIC-NEXT:    lu12i.w $a0, %le_hi20_r(le)
341; LA64PIC-NEXT:    add.d $a0, $a0, $tp, %le_add_r(le)
342; LA64PIC-NEXT:    addi.d $a0, $a0, %le_lo12_r(le)
343; LA64PIC-NEXT:    ret
344;
345; LA64LARGEPIC-LABEL: f4:
346; LA64LARGEPIC:       # %bb.0: # %entry
347; LA64LARGEPIC-NEXT:    lu12i.w $a0, %le_hi20(le)
348; LA64LARGEPIC-NEXT:    ori $a0, $a0, %le_lo12(le)
349; LA64LARGEPIC-NEXT:    lu32i.d $a0, %le64_lo20(le)
350; LA64LARGEPIC-NEXT:    lu52i.d $a0, $a0, %le64_hi12(le)
351; LA64LARGEPIC-NEXT:    add.d $a0, $a0, $tp
352; LA64LARGEPIC-NEXT:    ret
353;
354; LA32NOPIC-LABEL: f4:
355; LA32NOPIC:       # %bb.0: # %entry
356; LA32NOPIC-NEXT:    lu12i.w $a0, %le_hi20_r(le)
357; LA32NOPIC-NEXT:    add.w $a0, $a0, $tp, %le_add_r(le)
358; LA32NOPIC-NEXT:    addi.w $a0, $a0, %le_lo12_r(le)
359; LA32NOPIC-NEXT:    ret
360;
361; LA64NOPIC-LABEL: f4:
362; LA64NOPIC:       # %bb.0: # %entry
363; LA64NOPIC-NEXT:    lu12i.w $a0, %le_hi20_r(le)
364; LA64NOPIC-NEXT:    add.d $a0, $a0, $tp, %le_add_r(le)
365; LA64NOPIC-NEXT:    addi.d $a0, $a0, %le_lo12_r(le)
366; LA64NOPIC-NEXT:    ret
367;
368; LA64LARGENOPIC-LABEL: f4:
369; LA64LARGENOPIC:       # %bb.0: # %entry
370; LA64LARGENOPIC-NEXT:    lu12i.w $a0, %le_hi20(le)
371; LA64LARGENOPIC-NEXT:    ori $a0, $a0, %le_lo12(le)
372; LA64LARGENOPIC-NEXT:    lu32i.d $a0, %le64_lo20(le)
373; LA64LARGENOPIC-NEXT:    lu52i.d $a0, $a0, %le64_hi12(le)
374; LA64LARGENOPIC-NEXT:    add.d $a0, $a0, $tp
375; LA64LARGENOPIC-NEXT:    ret
376;
377; LA32DESC-LABEL: f4:
378; LA32DESC:       # %bb.0: # %entry
379; LA32DESC-NEXT:    lu12i.w $a0, %le_hi20_r(le)
380; LA32DESC-NEXT:    add.w $a0, $a0, $tp, %le_add_r(le)
381; LA32DESC-NEXT:    addi.w $a0, $a0, %le_lo12_r(le)
382; LA32DESC-NEXT:    ret
383;
384; LA64DESC-LABEL: f4:
385; LA64DESC:       # %bb.0: # %entry
386; LA64DESC-NEXT:    lu12i.w $a0, %le_hi20_r(le)
387; LA64DESC-NEXT:    add.d $a0, $a0, $tp, %le_add_r(le)
388; LA64DESC-NEXT:    addi.d $a0, $a0, %le_lo12_r(le)
389; LA64DESC-NEXT:    ret
390;
391; DESC64-LABEL: f4:
392; DESC64:       # %bb.0: # %entry
393; DESC64-NEXT:    lu12i.w $a0, %le_hi20(le)
394; DESC64-NEXT:    ori $a0, $a0, %le_lo12(le)
395; DESC64-NEXT:    lu32i.d $a0, %le64_lo20(le)
396; DESC64-NEXT:    lu52i.d $a0, $a0, %le64_hi12(le)
397; DESC64-NEXT:    add.d $a0, $a0, $tp
398; DESC64-NEXT:    ret
399entry:
400  ret ptr @le
401}
402