xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/load-store.ll (revision eaf87d32754beb5bec10bab517bf56e25575b48e)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2; RUN: llc --mtriple=loongarch32 --mattr=+d --relocation-model=static < %s | FileCheck %s --check-prefixes=ALL,LA32NOPIC
3; RUN: llc --mtriple=loongarch32 --mattr=+d --relocation-model=pic < %s | FileCheck %s --check-prefixes=ALL,LA32PIC
4; RUN: llc --mtriple=loongarch64 --mattr=+d --relocation-model=static < %s | FileCheck %s --check-prefixes=ALL,LA64NOPIC
5; RUN: llc --mtriple=loongarch64 --mattr=+d --relocation-model=pic < %s | FileCheck %s --check-prefixes=ALL,LA64PIC
6
7;; Check load from and store to global variables.
8@G = dso_local global i32 zeroinitializer, align 4
9@arr = dso_local global [10 x i32] zeroinitializer, align 4
10
11define i32 @load_store_global() nounwind {
12; LA32NOPIC-LABEL: load_store_global:
13; LA32NOPIC:       # %bb.0:
14; LA32NOPIC-NEXT:    pcalau12i $a1, %pc_hi20(G)
15; LA32NOPIC-NEXT:    ld.w $a0, $a1, %pc_lo12(G)
16; LA32NOPIC-NEXT:    addi.w $a0, $a0, 1
17; LA32NOPIC-NEXT:    st.w $a0, $a1, %pc_lo12(G)
18; LA32NOPIC-NEXT:    ret
19;
20; LA32PIC-LABEL: load_store_global:
21; LA32PIC:       # %bb.0:
22; LA32PIC-NEXT:    pcalau12i $a1, %pc_hi20(.LG$local)
23; LA32PIC-NEXT:    ld.w $a0, $a1, %pc_lo12(.LG$local)
24; LA32PIC-NEXT:    addi.w $a0, $a0, 1
25; LA32PIC-NEXT:    st.w $a0, $a1, %pc_lo12(.LG$local)
26; LA32PIC-NEXT:    ret
27;
28; LA64NOPIC-LABEL: load_store_global:
29; LA64NOPIC:       # %bb.0:
30; LA64NOPIC-NEXT:    pcalau12i $a1, %pc_hi20(G)
31; LA64NOPIC-NEXT:    ld.w $a0, $a1, %pc_lo12(G)
32; LA64NOPIC-NEXT:    addi.w $a0, $a0, 1
33; LA64NOPIC-NEXT:    st.w $a0, $a1, %pc_lo12(G)
34; LA64NOPIC-NEXT:    ret
35;
36; LA64PIC-LABEL: load_store_global:
37; LA64PIC:       # %bb.0:
38; LA64PIC-NEXT:    pcalau12i $a1, %pc_hi20(.LG$local)
39; LA64PIC-NEXT:    ld.w $a0, $a1, %pc_lo12(.LG$local)
40; LA64PIC-NEXT:    addi.w $a0, $a0, 1
41; LA64PIC-NEXT:    st.w $a0, $a1, %pc_lo12(.LG$local)
42; LA64PIC-NEXT:    ret
43  %v = load i32, ptr @G
44  %sum = add i32 %v, 1
45  store i32 %sum, ptr @G
46  ret i32 %sum
47}
48
49define i32 @load_store_global_array(i32 %a) nounwind {
50; LA32NOPIC-LABEL: load_store_global_array:
51; LA32NOPIC:       # %bb.0:
52; LA32NOPIC-NEXT:    pcalau12i $a1, %pc_hi20(arr)
53; LA32NOPIC-NEXT:    addi.w $a2, $a1, %pc_lo12(arr)
54; LA32NOPIC-NEXT:    ld.w $a1, $a2, 0
55; LA32NOPIC-NEXT:    st.w $a0, $a2, 0
56; LA32NOPIC-NEXT:    ld.w $zero, $a2, 36
57; LA32NOPIC-NEXT:    st.w $a0, $a2, 36
58; LA32NOPIC-NEXT:    move $a0, $a1
59; LA32NOPIC-NEXT:    ret
60;
61; LA32PIC-LABEL: load_store_global_array:
62; LA32PIC:       # %bb.0:
63; LA32PIC-NEXT:    pcalau12i $a1, %pc_hi20(.Larr$local)
64; LA32PIC-NEXT:    addi.w $a2, $a1, %pc_lo12(.Larr$local)
65; LA32PIC-NEXT:    ld.w $a1, $a2, 0
66; LA32PIC-NEXT:    st.w $a0, $a2, 0
67; LA32PIC-NEXT:    ld.w $zero, $a2, 36
68; LA32PIC-NEXT:    st.w $a0, $a2, 36
69; LA32PIC-NEXT:    move $a0, $a1
70; LA32PIC-NEXT:    ret
71;
72; LA64NOPIC-LABEL: load_store_global_array:
73; LA64NOPIC:       # %bb.0:
74; LA64NOPIC-NEXT:    pcalau12i $a1, %pc_hi20(arr)
75; LA64NOPIC-NEXT:    addi.d $a2, $a1, %pc_lo12(arr)
76; LA64NOPIC-NEXT:    ld.w $a1, $a2, 0
77; LA64NOPIC-NEXT:    st.w $a0, $a2, 0
78; LA64NOPIC-NEXT:    ld.w $zero, $a2, 36
79; LA64NOPIC-NEXT:    st.w $a0, $a2, 36
80; LA64NOPIC-NEXT:    move $a0, $a1
81; LA64NOPIC-NEXT:    ret
82;
83; LA64PIC-LABEL: load_store_global_array:
84; LA64PIC:       # %bb.0:
85; LA64PIC-NEXT:    pcalau12i $a1, %pc_hi20(.Larr$local)
86; LA64PIC-NEXT:    addi.d $a2, $a1, %pc_lo12(.Larr$local)
87; LA64PIC-NEXT:    ld.w $a1, $a2, 0
88; LA64PIC-NEXT:    st.w $a0, $a2, 0
89; LA64PIC-NEXT:    ld.w $zero, $a2, 36
90; LA64PIC-NEXT:    st.w $a0, $a2, 36
91; LA64PIC-NEXT:    move $a0, $a1
92; LA64PIC-NEXT:    ret
93  %1 = load volatile i32, ptr @arr, align 4
94  store i32 %a, ptr @arr, align 4
95  %2 = getelementptr [10 x i32], ptr @arr, i32 0, i32 9
96  %3 = load volatile i32, ptr %2, align 4
97  store i32 %a, ptr %2, align 4
98  ret i32 %1
99}
100
101;; Check indexed and unindexed, sext, zext and anyext loads.
102
103define i64 @ld_b(ptr %a) nounwind {
104; LA32NOPIC-LABEL: ld_b:
105; LA32NOPIC:       # %bb.0:
106; LA32NOPIC-NEXT:    ld.b $a2, $a0, 1
107; LA32NOPIC-NEXT:    ld.b $zero, $a0, 0
108; LA32NOPIC-NEXT:    srai.w $a1, $a2, 31
109; LA32NOPIC-NEXT:    move $a0, $a2
110; LA32NOPIC-NEXT:    ret
111;
112; LA32PIC-LABEL: ld_b:
113; LA32PIC:       # %bb.0:
114; LA32PIC-NEXT:    ld.b $a2, $a0, 1
115; LA32PIC-NEXT:    ld.b $zero, $a0, 0
116; LA32PIC-NEXT:    srai.w $a1, $a2, 31
117; LA32PIC-NEXT:    move $a0, $a2
118; LA32PIC-NEXT:    ret
119;
120; LA64NOPIC-LABEL: ld_b:
121; LA64NOPIC:       # %bb.0:
122; LA64NOPIC-NEXT:    ld.b $a1, $a0, 1
123; LA64NOPIC-NEXT:    ld.b $zero, $a0, 0
124; LA64NOPIC-NEXT:    move $a0, $a1
125; LA64NOPIC-NEXT:    ret
126;
127; LA64PIC-LABEL: ld_b:
128; LA64PIC:       # %bb.0:
129; LA64PIC-NEXT:    ld.b $a1, $a0, 1
130; LA64PIC-NEXT:    ld.b $zero, $a0, 0
131; LA64PIC-NEXT:    move $a0, $a1
132; LA64PIC-NEXT:    ret
133  %1 = getelementptr i8, ptr %a, i64 1
134  %2 = load i8, ptr %1
135  %3 = sext i8 %2 to i64
136  %4 = load volatile i8, ptr %a
137  ret i64 %3
138}
139
140define i64 @ld_h(ptr %a) nounwind {
141; LA32NOPIC-LABEL: ld_h:
142; LA32NOPIC:       # %bb.0:
143; LA32NOPIC-NEXT:    ld.h $a2, $a0, 4
144; LA32NOPIC-NEXT:    ld.h $zero, $a0, 0
145; LA32NOPIC-NEXT:    srai.w $a1, $a2, 31
146; LA32NOPIC-NEXT:    move $a0, $a2
147; LA32NOPIC-NEXT:    ret
148;
149; LA32PIC-LABEL: ld_h:
150; LA32PIC:       # %bb.0:
151; LA32PIC-NEXT:    ld.h $a2, $a0, 4
152; LA32PIC-NEXT:    ld.h $zero, $a0, 0
153; LA32PIC-NEXT:    srai.w $a1, $a2, 31
154; LA32PIC-NEXT:    move $a0, $a2
155; LA32PIC-NEXT:    ret
156;
157; LA64NOPIC-LABEL: ld_h:
158; LA64NOPIC:       # %bb.0:
159; LA64NOPIC-NEXT:    ld.h $a1, $a0, 4
160; LA64NOPIC-NEXT:    ld.h $zero, $a0, 0
161; LA64NOPIC-NEXT:    move $a0, $a1
162; LA64NOPIC-NEXT:    ret
163;
164; LA64PIC-LABEL: ld_h:
165; LA64PIC:       # %bb.0:
166; LA64PIC-NEXT:    ld.h $a1, $a0, 4
167; LA64PIC-NEXT:    ld.h $zero, $a0, 0
168; LA64PIC-NEXT:    move $a0, $a1
169; LA64PIC-NEXT:    ret
170  %1 = getelementptr i16, ptr %a, i64 2
171  %2 = load i16, ptr %1
172  %3 = sext i16 %2 to i64
173  %4 = load volatile i16, ptr %a
174  ret i64 %3
175}
176
177define i64 @ld_w(ptr %a) nounwind {
178; LA32NOPIC-LABEL: ld_w:
179; LA32NOPIC:       # %bb.0:
180; LA32NOPIC-NEXT:    ld.w $a2, $a0, 12
181; LA32NOPIC-NEXT:    ld.w $zero, $a0, 0
182; LA32NOPIC-NEXT:    srai.w $a1, $a2, 31
183; LA32NOPIC-NEXT:    move $a0, $a2
184; LA32NOPIC-NEXT:    ret
185;
186; LA32PIC-LABEL: ld_w:
187; LA32PIC:       # %bb.0:
188; LA32PIC-NEXT:    ld.w $a2, $a0, 12
189; LA32PIC-NEXT:    ld.w $zero, $a0, 0
190; LA32PIC-NEXT:    srai.w $a1, $a2, 31
191; LA32PIC-NEXT:    move $a0, $a2
192; LA32PIC-NEXT:    ret
193;
194; LA64NOPIC-LABEL: ld_w:
195; LA64NOPIC:       # %bb.0:
196; LA64NOPIC-NEXT:    ld.w $a1, $a0, 12
197; LA64NOPIC-NEXT:    ld.w $zero, $a0, 0
198; LA64NOPIC-NEXT:    move $a0, $a1
199; LA64NOPIC-NEXT:    ret
200;
201; LA64PIC-LABEL: ld_w:
202; LA64PIC:       # %bb.0:
203; LA64PIC-NEXT:    ld.w $a1, $a0, 12
204; LA64PIC-NEXT:    ld.w $zero, $a0, 0
205; LA64PIC-NEXT:    move $a0, $a1
206; LA64PIC-NEXT:    ret
207  %1 = getelementptr i32, ptr %a, i64 3
208  %2 = load i32, ptr %1
209  %3 = sext i32 %2 to i64
210  %4 = load volatile i32, ptr %a
211  ret i64 %3
212}
213
214define i64 @ld_d(ptr %a) nounwind {
215; LA32NOPIC-LABEL: ld_d:
216; LA32NOPIC:       # %bb.0:
217; LA32NOPIC-NEXT:    ld.w $a1, $a0, 28
218; LA32NOPIC-NEXT:    ld.w $a2, $a0, 24
219; LA32NOPIC-NEXT:    ld.w $zero, $a0, 4
220; LA32NOPIC-NEXT:    ld.w $zero, $a0, 0
221; LA32NOPIC-NEXT:    move $a0, $a2
222; LA32NOPIC-NEXT:    ret
223;
224; LA32PIC-LABEL: ld_d:
225; LA32PIC:       # %bb.0:
226; LA32PIC-NEXT:    ld.w $a1, $a0, 28
227; LA32PIC-NEXT:    ld.w $a2, $a0, 24
228; LA32PIC-NEXT:    ld.w $zero, $a0, 4
229; LA32PIC-NEXT:    ld.w $zero, $a0, 0
230; LA32PIC-NEXT:    move $a0, $a2
231; LA32PIC-NEXT:    ret
232;
233; LA64NOPIC-LABEL: ld_d:
234; LA64NOPIC:       # %bb.0:
235; LA64NOPIC-NEXT:    ld.d $a1, $a0, 24
236; LA64NOPIC-NEXT:    ld.d $zero, $a0, 0
237; LA64NOPIC-NEXT:    move $a0, $a1
238; LA64NOPIC-NEXT:    ret
239;
240; LA64PIC-LABEL: ld_d:
241; LA64PIC:       # %bb.0:
242; LA64PIC-NEXT:    ld.d $a1, $a0, 24
243; LA64PIC-NEXT:    ld.d $zero, $a0, 0
244; LA64PIC-NEXT:    move $a0, $a1
245; LA64PIC-NEXT:    ret
246  %1 = getelementptr i64, ptr %a, i64 3
247  %2 = load i64, ptr %1
248  %3 = load volatile i64, ptr %a
249  ret i64 %2
250}
251
252define i64 @ld_bu(ptr %a) nounwind {
253; LA32NOPIC-LABEL: ld_bu:
254; LA32NOPIC:       # %bb.0:
255; LA32NOPIC-NEXT:    ld.bu $a1, $a0, 4
256; LA32NOPIC-NEXT:    ld.bu $a0, $a0, 0
257; LA32NOPIC-NEXT:    add.w $a0, $a1, $a0
258; LA32NOPIC-NEXT:    sltu $a1, $a0, $a1
259; LA32NOPIC-NEXT:    ret
260;
261; LA32PIC-LABEL: ld_bu:
262; LA32PIC:       # %bb.0:
263; LA32PIC-NEXT:    ld.bu $a1, $a0, 4
264; LA32PIC-NEXT:    ld.bu $a0, $a0, 0
265; LA32PIC-NEXT:    add.w $a0, $a1, $a0
266; LA32PIC-NEXT:    sltu $a1, $a0, $a1
267; LA32PIC-NEXT:    ret
268;
269; LA64NOPIC-LABEL: ld_bu:
270; LA64NOPIC:       # %bb.0:
271; LA64NOPIC-NEXT:    ld.bu $a1, $a0, 4
272; LA64NOPIC-NEXT:    ld.bu $a0, $a0, 0
273; LA64NOPIC-NEXT:    add.d $a0, $a1, $a0
274; LA64NOPIC-NEXT:    ret
275;
276; LA64PIC-LABEL: ld_bu:
277; LA64PIC:       # %bb.0:
278; LA64PIC-NEXT:    ld.bu $a1, $a0, 4
279; LA64PIC-NEXT:    ld.bu $a0, $a0, 0
280; LA64PIC-NEXT:    add.d $a0, $a1, $a0
281; LA64PIC-NEXT:    ret
282  %1 = getelementptr i8, ptr %a, i64 4
283  %2 = load i8, ptr %1
284  %3 = zext i8 %2 to i64
285  %4 = load volatile i8, ptr %a
286  %5 = zext i8 %4 to i64
287  %6 = add i64 %3, %5
288  ret i64 %6
289}
290
291define i64 @ld_hu(ptr %a) nounwind {
292; LA32NOPIC-LABEL: ld_hu:
293; LA32NOPIC:       # %bb.0:
294; LA32NOPIC-NEXT:    ld.hu $a1, $a0, 10
295; LA32NOPIC-NEXT:    ld.hu $a0, $a0, 0
296; LA32NOPIC-NEXT:    add.w $a0, $a1, $a0
297; LA32NOPIC-NEXT:    sltu $a1, $a0, $a1
298; LA32NOPIC-NEXT:    ret
299;
300; LA32PIC-LABEL: ld_hu:
301; LA32PIC:       # %bb.0:
302; LA32PIC-NEXT:    ld.hu $a1, $a0, 10
303; LA32PIC-NEXT:    ld.hu $a0, $a0, 0
304; LA32PIC-NEXT:    add.w $a0, $a1, $a0
305; LA32PIC-NEXT:    sltu $a1, $a0, $a1
306; LA32PIC-NEXT:    ret
307;
308; LA64NOPIC-LABEL: ld_hu:
309; LA64NOPIC:       # %bb.0:
310; LA64NOPIC-NEXT:    ld.hu $a1, $a0, 10
311; LA64NOPIC-NEXT:    ld.hu $a0, $a0, 0
312; LA64NOPIC-NEXT:    add.d $a0, $a1, $a0
313; LA64NOPIC-NEXT:    ret
314;
315; LA64PIC-LABEL: ld_hu:
316; LA64PIC:       # %bb.0:
317; LA64PIC-NEXT:    ld.hu $a1, $a0, 10
318; LA64PIC-NEXT:    ld.hu $a0, $a0, 0
319; LA64PIC-NEXT:    add.d $a0, $a1, $a0
320; LA64PIC-NEXT:    ret
321  %1 = getelementptr i16, ptr %a, i64 5
322  %2 = load i16, ptr %1
323  %3 = zext i16 %2 to i64
324  %4 = load volatile i16, ptr %a
325  %5 = zext i16 %4 to i64
326  %6 = add i64 %3, %5
327  ret i64 %6
328}
329
330define i64 @ld_wu(ptr %a) nounwind {
331; LA32NOPIC-LABEL: ld_wu:
332; LA32NOPIC:       # %bb.0:
333; LA32NOPIC-NEXT:    ld.w $a1, $a0, 20
334; LA32NOPIC-NEXT:    ld.w $a0, $a0, 0
335; LA32NOPIC-NEXT:    add.w $a0, $a1, $a0
336; LA32NOPIC-NEXT:    sltu $a1, $a0, $a1
337; LA32NOPIC-NEXT:    ret
338;
339; LA32PIC-LABEL: ld_wu:
340; LA32PIC:       # %bb.0:
341; LA32PIC-NEXT:    ld.w $a1, $a0, 20
342; LA32PIC-NEXT:    ld.w $a0, $a0, 0
343; LA32PIC-NEXT:    add.w $a0, $a1, $a0
344; LA32PIC-NEXT:    sltu $a1, $a0, $a1
345; LA32PIC-NEXT:    ret
346;
347; LA64NOPIC-LABEL: ld_wu:
348; LA64NOPIC:       # %bb.0:
349; LA64NOPIC-NEXT:    ld.wu $a1, $a0, 20
350; LA64NOPIC-NEXT:    ld.wu $a0, $a0, 0
351; LA64NOPIC-NEXT:    add.d $a0, $a1, $a0
352; LA64NOPIC-NEXT:    ret
353;
354; LA64PIC-LABEL: ld_wu:
355; LA64PIC:       # %bb.0:
356; LA64PIC-NEXT:    ld.wu $a1, $a0, 20
357; LA64PIC-NEXT:    ld.wu $a0, $a0, 0
358; LA64PIC-NEXT:    add.d $a0, $a1, $a0
359; LA64PIC-NEXT:    ret
360  %1 = getelementptr i32, ptr %a, i64 5
361  %2 = load i32, ptr %1
362  %3 = zext i32 %2 to i64
363  %4 = load volatile i32, ptr %a
364  %5 = zext i32 %4 to i64
365  %6 = add i64 %3, %5
366  ret i64 %6
367}
368
369define i64 @ldx_b(ptr %a, i64 %idx) nounwind {
370; LA32NOPIC-LABEL: ldx_b:
371; LA32NOPIC:       # %bb.0:
372; LA32NOPIC-NEXT:    add.w $a1, $a0, $a1
373; LA32NOPIC-NEXT:    ld.b $a2, $a1, 0
374; LA32NOPIC-NEXT:    ld.b $zero, $a0, 0
375; LA32NOPIC-NEXT:    srai.w $a1, $a2, 31
376; LA32NOPIC-NEXT:    move $a0, $a2
377; LA32NOPIC-NEXT:    ret
378;
379; LA32PIC-LABEL: ldx_b:
380; LA32PIC:       # %bb.0:
381; LA32PIC-NEXT:    add.w $a1, $a0, $a1
382; LA32PIC-NEXT:    ld.b $a2, $a1, 0
383; LA32PIC-NEXT:    ld.b $zero, $a0, 0
384; LA32PIC-NEXT:    srai.w $a1, $a2, 31
385; LA32PIC-NEXT:    move $a0, $a2
386; LA32PIC-NEXT:    ret
387;
388; LA64NOPIC-LABEL: ldx_b:
389; LA64NOPIC:       # %bb.0:
390; LA64NOPIC-NEXT:    ldx.b $a1, $a0, $a1
391; LA64NOPIC-NEXT:    ld.b $zero, $a0, 0
392; LA64NOPIC-NEXT:    move $a0, $a1
393; LA64NOPIC-NEXT:    ret
394;
395; LA64PIC-LABEL: ldx_b:
396; LA64PIC:       # %bb.0:
397; LA64PIC-NEXT:    ldx.b $a1, $a0, $a1
398; LA64PIC-NEXT:    ld.b $zero, $a0, 0
399; LA64PIC-NEXT:    move $a0, $a1
400; LA64PIC-NEXT:    ret
401  %1 = getelementptr i8, ptr %a, i64 %idx
402  %2 = load i8, ptr %1
403  %3 = sext i8 %2 to i64
404  %4 = load volatile i8, ptr %a
405  ret i64 %3
406}
407
408define i64 @ldx_h(ptr %a, i64 %idx) nounwind {
409; LA32NOPIC-LABEL: ldx_h:
410; LA32NOPIC:       # %bb.0:
411; LA32NOPIC-NEXT:    alsl.w $a1, $a1, $a0, 1
412; LA32NOPIC-NEXT:    ld.h $a2, $a1, 0
413; LA32NOPIC-NEXT:    ld.h $zero, $a0, 0
414; LA32NOPIC-NEXT:    srai.w $a1, $a2, 31
415; LA32NOPIC-NEXT:    move $a0, $a2
416; LA32NOPIC-NEXT:    ret
417;
418; LA32PIC-LABEL: ldx_h:
419; LA32PIC:       # %bb.0:
420; LA32PIC-NEXT:    alsl.w $a1, $a1, $a0, 1
421; LA32PIC-NEXT:    ld.h $a2, $a1, 0
422; LA32PIC-NEXT:    ld.h $zero, $a0, 0
423; LA32PIC-NEXT:    srai.w $a1, $a2, 31
424; LA32PIC-NEXT:    move $a0, $a2
425; LA32PIC-NEXT:    ret
426;
427; LA64NOPIC-LABEL: ldx_h:
428; LA64NOPIC:       # %bb.0:
429; LA64NOPIC-NEXT:    slli.d $a1, $a1, 1
430; LA64NOPIC-NEXT:    ldx.h $a1, $a0, $a1
431; LA64NOPIC-NEXT:    ld.h $zero, $a0, 0
432; LA64NOPIC-NEXT:    move $a0, $a1
433; LA64NOPIC-NEXT:    ret
434;
435; LA64PIC-LABEL: ldx_h:
436; LA64PIC:       # %bb.0:
437; LA64PIC-NEXT:    slli.d $a1, $a1, 1
438; LA64PIC-NEXT:    ldx.h $a1, $a0, $a1
439; LA64PIC-NEXT:    ld.h $zero, $a0, 0
440; LA64PIC-NEXT:    move $a0, $a1
441; LA64PIC-NEXT:    ret
442  %1 = getelementptr i16, ptr %a, i64 %idx
443  %2 = load i16, ptr %1
444  %3 = sext i16 %2 to i64
445  %4 = load volatile i16, ptr %a
446  ret i64 %3
447}
448
449define i64 @ldx_w(ptr %a, i64 %idx) nounwind {
450; LA32NOPIC-LABEL: ldx_w:
451; LA32NOPIC:       # %bb.0:
452; LA32NOPIC-NEXT:    alsl.w $a1, $a1, $a0, 2
453; LA32NOPIC-NEXT:    ld.w $a2, $a1, 0
454; LA32NOPIC-NEXT:    ld.w $zero, $a0, 0
455; LA32NOPIC-NEXT:    srai.w $a1, $a2, 31
456; LA32NOPIC-NEXT:    move $a0, $a2
457; LA32NOPIC-NEXT:    ret
458;
459; LA32PIC-LABEL: ldx_w:
460; LA32PIC:       # %bb.0:
461; LA32PIC-NEXT:    alsl.w $a1, $a1, $a0, 2
462; LA32PIC-NEXT:    ld.w $a2, $a1, 0
463; LA32PIC-NEXT:    ld.w $zero, $a0, 0
464; LA32PIC-NEXT:    srai.w $a1, $a2, 31
465; LA32PIC-NEXT:    move $a0, $a2
466; LA32PIC-NEXT:    ret
467;
468; LA64NOPIC-LABEL: ldx_w:
469; LA64NOPIC:       # %bb.0:
470; LA64NOPIC-NEXT:    slli.d $a1, $a1, 2
471; LA64NOPIC-NEXT:    ldx.w $a1, $a0, $a1
472; LA64NOPIC-NEXT:    ld.w $zero, $a0, 0
473; LA64NOPIC-NEXT:    move $a0, $a1
474; LA64NOPIC-NEXT:    ret
475;
476; LA64PIC-LABEL: ldx_w:
477; LA64PIC:       # %bb.0:
478; LA64PIC-NEXT:    slli.d $a1, $a1, 2
479; LA64PIC-NEXT:    ldx.w $a1, $a0, $a1
480; LA64PIC-NEXT:    ld.w $zero, $a0, 0
481; LA64PIC-NEXT:    move $a0, $a1
482; LA64PIC-NEXT:    ret
483  %1 = getelementptr i32, ptr %a, i64 %idx
484  %2 = load i32, ptr %1
485  %3 = sext i32 %2 to i64
486  %4 = load volatile i32, ptr %a
487  ret i64 %3
488}
489
490define i64 @ldx_d(ptr %a, i64 %idx) nounwind {
491; LA32NOPIC-LABEL: ldx_d:
492; LA32NOPIC:       # %bb.0:
493; LA32NOPIC-NEXT:    alsl.w $a1, $a1, $a0, 3
494; LA32NOPIC-NEXT:    ld.w $a2, $a1, 0
495; LA32NOPIC-NEXT:    ld.w $a1, $a1, 4
496; LA32NOPIC-NEXT:    ld.w $zero, $a0, 0
497; LA32NOPIC-NEXT:    ld.w $zero, $a0, 4
498; LA32NOPIC-NEXT:    move $a0, $a2
499; LA32NOPIC-NEXT:    ret
500;
501; LA32PIC-LABEL: ldx_d:
502; LA32PIC:       # %bb.0:
503; LA32PIC-NEXT:    alsl.w $a1, $a1, $a0, 3
504; LA32PIC-NEXT:    ld.w $a2, $a1, 0
505; LA32PIC-NEXT:    ld.w $a1, $a1, 4
506; LA32PIC-NEXT:    ld.w $zero, $a0, 0
507; LA32PIC-NEXT:    ld.w $zero, $a0, 4
508; LA32PIC-NEXT:    move $a0, $a2
509; LA32PIC-NEXT:    ret
510;
511; LA64NOPIC-LABEL: ldx_d:
512; LA64NOPIC:       # %bb.0:
513; LA64NOPIC-NEXT:    slli.d $a1, $a1, 3
514; LA64NOPIC-NEXT:    ldx.d $a1, $a0, $a1
515; LA64NOPIC-NEXT:    ld.d $zero, $a0, 0
516; LA64NOPIC-NEXT:    move $a0, $a1
517; LA64NOPIC-NEXT:    ret
518;
519; LA64PIC-LABEL: ldx_d:
520; LA64PIC:       # %bb.0:
521; LA64PIC-NEXT:    slli.d $a1, $a1, 3
522; LA64PIC-NEXT:    ldx.d $a1, $a0, $a1
523; LA64PIC-NEXT:    ld.d $zero, $a0, 0
524; LA64PIC-NEXT:    move $a0, $a1
525; LA64PIC-NEXT:    ret
526  %1 = getelementptr i64, ptr %a, i64 %idx
527  %2 = load i64, ptr %1
528  %3 = load volatile i64, ptr %a
529  ret i64 %2
530}
531
532define i64 @ldx_bu(ptr %a, i64 %idx) nounwind {
533; LA32NOPIC-LABEL: ldx_bu:
534; LA32NOPIC:       # %bb.0:
535; LA32NOPIC-NEXT:    add.w $a1, $a0, $a1
536; LA32NOPIC-NEXT:    ld.bu $a1, $a1, 0
537; LA32NOPIC-NEXT:    ld.bu $a0, $a0, 0
538; LA32NOPIC-NEXT:    add.w $a0, $a1, $a0
539; LA32NOPIC-NEXT:    sltu $a1, $a0, $a1
540; LA32NOPIC-NEXT:    ret
541;
542; LA32PIC-LABEL: ldx_bu:
543; LA32PIC:       # %bb.0:
544; LA32PIC-NEXT:    add.w $a1, $a0, $a1
545; LA32PIC-NEXT:    ld.bu $a1, $a1, 0
546; LA32PIC-NEXT:    ld.bu $a0, $a0, 0
547; LA32PIC-NEXT:    add.w $a0, $a1, $a0
548; LA32PIC-NEXT:    sltu $a1, $a0, $a1
549; LA32PIC-NEXT:    ret
550;
551; LA64NOPIC-LABEL: ldx_bu:
552; LA64NOPIC:       # %bb.0:
553; LA64NOPIC-NEXT:    ldx.bu $a1, $a0, $a1
554; LA64NOPIC-NEXT:    ld.bu $a0, $a0, 0
555; LA64NOPIC-NEXT:    add.d $a0, $a1, $a0
556; LA64NOPIC-NEXT:    ret
557;
558; LA64PIC-LABEL: ldx_bu:
559; LA64PIC:       # %bb.0:
560; LA64PIC-NEXT:    ldx.bu $a1, $a0, $a1
561; LA64PIC-NEXT:    ld.bu $a0, $a0, 0
562; LA64PIC-NEXT:    add.d $a0, $a1, $a0
563; LA64PIC-NEXT:    ret
564  %1 = getelementptr i8, ptr %a, i64 %idx
565  %2 = load i8, ptr %1
566  %3 = zext i8 %2 to i64
567  %4 = load volatile i8, ptr %a
568  %5 = zext i8 %4 to i64
569  %6 = add i64 %3, %5
570  ret i64 %6
571}
572
573define i64 @ldx_hu(ptr %a, i64 %idx) nounwind {
574; LA32NOPIC-LABEL: ldx_hu:
575; LA32NOPIC:       # %bb.0:
576; LA32NOPIC-NEXT:    alsl.w $a1, $a1, $a0, 1
577; LA32NOPIC-NEXT:    ld.hu $a1, $a1, 0
578; LA32NOPIC-NEXT:    ld.hu $a0, $a0, 0
579; LA32NOPIC-NEXT:    add.w $a0, $a1, $a0
580; LA32NOPIC-NEXT:    sltu $a1, $a0, $a1
581; LA32NOPIC-NEXT:    ret
582;
583; LA32PIC-LABEL: ldx_hu:
584; LA32PIC:       # %bb.0:
585; LA32PIC-NEXT:    alsl.w $a1, $a1, $a0, 1
586; LA32PIC-NEXT:    ld.hu $a1, $a1, 0
587; LA32PIC-NEXT:    ld.hu $a0, $a0, 0
588; LA32PIC-NEXT:    add.w $a0, $a1, $a0
589; LA32PIC-NEXT:    sltu $a1, $a0, $a1
590; LA32PIC-NEXT:    ret
591;
592; LA64NOPIC-LABEL: ldx_hu:
593; LA64NOPIC:       # %bb.0:
594; LA64NOPIC-NEXT:    slli.d $a1, $a1, 1
595; LA64NOPIC-NEXT:    ldx.hu $a1, $a0, $a1
596; LA64NOPIC-NEXT:    ld.hu $a0, $a0, 0
597; LA64NOPIC-NEXT:    add.d $a0, $a1, $a0
598; LA64NOPIC-NEXT:    ret
599;
600; LA64PIC-LABEL: ldx_hu:
601; LA64PIC:       # %bb.0:
602; LA64PIC-NEXT:    slli.d $a1, $a1, 1
603; LA64PIC-NEXT:    ldx.hu $a1, $a0, $a1
604; LA64PIC-NEXT:    ld.hu $a0, $a0, 0
605; LA64PIC-NEXT:    add.d $a0, $a1, $a0
606; LA64PIC-NEXT:    ret
607  %1 = getelementptr i16, ptr %a, i64 %idx
608  %2 = load i16, ptr %1
609  %3 = zext i16 %2 to i64
610  %4 = load volatile i16, ptr %a
611  %5 = zext i16 %4 to i64
612  %6 = add i64 %3, %5
613  ret i64 %6
614}
615
616define i64 @ldx_wu(ptr %a, i64 %idx) nounwind {
617; LA32NOPIC-LABEL: ldx_wu:
618; LA32NOPIC:       # %bb.0:
619; LA32NOPIC-NEXT:    alsl.w $a1, $a1, $a0, 2
620; LA32NOPIC-NEXT:    ld.w $a1, $a1, 0
621; LA32NOPIC-NEXT:    ld.w $a0, $a0, 0
622; LA32NOPIC-NEXT:    add.w $a0, $a1, $a0
623; LA32NOPIC-NEXT:    sltu $a1, $a0, $a1
624; LA32NOPIC-NEXT:    ret
625;
626; LA32PIC-LABEL: ldx_wu:
627; LA32PIC:       # %bb.0:
628; LA32PIC-NEXT:    alsl.w $a1, $a1, $a0, 2
629; LA32PIC-NEXT:    ld.w $a1, $a1, 0
630; LA32PIC-NEXT:    ld.w $a0, $a0, 0
631; LA32PIC-NEXT:    add.w $a0, $a1, $a0
632; LA32PIC-NEXT:    sltu $a1, $a0, $a1
633; LA32PIC-NEXT:    ret
634;
635; LA64NOPIC-LABEL: ldx_wu:
636; LA64NOPIC:       # %bb.0:
637; LA64NOPIC-NEXT:    slli.d $a1, $a1, 2
638; LA64NOPIC-NEXT:    ldx.wu $a1, $a0, $a1
639; LA64NOPIC-NEXT:    ld.wu $a0, $a0, 0
640; LA64NOPIC-NEXT:    add.d $a0, $a1, $a0
641; LA64NOPIC-NEXT:    ret
642;
643; LA64PIC-LABEL: ldx_wu:
644; LA64PIC:       # %bb.0:
645; LA64PIC-NEXT:    slli.d $a1, $a1, 2
646; LA64PIC-NEXT:    ldx.wu $a1, $a0, $a1
647; LA64PIC-NEXT:    ld.wu $a0, $a0, 0
648; LA64PIC-NEXT:    add.d $a0, $a1, $a0
649; LA64PIC-NEXT:    ret
650  %1 = getelementptr i32, ptr %a, i64 %idx
651  %2 = load i32, ptr %1
652  %3 = zext i32 %2 to i64
653  %4 = load volatile i32, ptr %a
654  %5 = zext i32 %4 to i64
655  %6 = add i64 %3, %5
656  ret i64 %6
657}
658
659;; Check indexed and unindexed stores.
660
661define void @st_b(ptr %a, i8 %b) nounwind {
662; ALL-LABEL: st_b:
663; ALL:       # %bb.0:
664; ALL-NEXT:    st.b $a1, $a0, 0
665; ALL-NEXT:    st.b $a1, $a0, 6
666; ALL-NEXT:    ret
667  store i8 %b, ptr %a
668  %1 = getelementptr i8, ptr %a, i64 6
669  store i8 %b, ptr %1
670  ret void
671}
672
673define void @st_h(ptr %a, i16 %b) nounwind {
674; ALL-LABEL: st_h:
675; ALL:       # %bb.0:
676; ALL-NEXT:    st.h $a1, $a0, 0
677; ALL-NEXT:    st.h $a1, $a0, 14
678; ALL-NEXT:    ret
679  store i16 %b, ptr %a
680  %1 = getelementptr i16, ptr %a, i64 7
681  store i16 %b, ptr %1
682  ret void
683}
684
685define void @st_w(ptr %a, i32 %b) nounwind {
686; ALL-LABEL: st_w:
687; ALL:       # %bb.0:
688; ALL-NEXT:    st.w $a1, $a0, 0
689; ALL-NEXT:    st.w $a1, $a0, 28
690; ALL-NEXT:    ret
691  store i32 %b, ptr %a
692  %1 = getelementptr i32, ptr %a, i64 7
693  store i32 %b, ptr %1
694  ret void
695}
696
697define void @st_d(ptr %a, i64 %b) nounwind {
698; LA32NOPIC-LABEL: st_d:
699; LA32NOPIC:       # %bb.0:
700; LA32NOPIC-NEXT:    st.w $a2, $a0, 4
701; LA32NOPIC-NEXT:    st.w $a1, $a0, 0
702; LA32NOPIC-NEXT:    st.w $a2, $a0, 68
703; LA32NOPIC-NEXT:    st.w $a1, $a0, 64
704; LA32NOPIC-NEXT:    ret
705;
706; LA32PIC-LABEL: st_d:
707; LA32PIC:       # %bb.0:
708; LA32PIC-NEXT:    st.w $a2, $a0, 4
709; LA32PIC-NEXT:    st.w $a1, $a0, 0
710; LA32PIC-NEXT:    st.w $a2, $a0, 68
711; LA32PIC-NEXT:    st.w $a1, $a0, 64
712; LA32PIC-NEXT:    ret
713;
714; LA64NOPIC-LABEL: st_d:
715; LA64NOPIC:       # %bb.0:
716; LA64NOPIC-NEXT:    st.d $a1, $a0, 0
717; LA64NOPIC-NEXT:    st.d $a1, $a0, 64
718; LA64NOPIC-NEXT:    ret
719;
720; LA64PIC-LABEL: st_d:
721; LA64PIC:       # %bb.0:
722; LA64PIC-NEXT:    st.d $a1, $a0, 0
723; LA64PIC-NEXT:    st.d $a1, $a0, 64
724; LA64PIC-NEXT:    ret
725  store i64 %b, ptr %a
726  %1 = getelementptr i64, ptr %a, i64 8
727  store i64 %b, ptr %1
728  ret void
729}
730
731define void @stx_b(ptr %dst, i64 %idx, i8 %val) nounwind {
732; LA32NOPIC-LABEL: stx_b:
733; LA32NOPIC:       # %bb.0:
734; LA32NOPIC-NEXT:    add.w $a0, $a0, $a1
735; LA32NOPIC-NEXT:    st.b $a3, $a0, 0
736; LA32NOPIC-NEXT:    ret
737;
738; LA32PIC-LABEL: stx_b:
739; LA32PIC:       # %bb.0:
740; LA32PIC-NEXT:    add.w $a0, $a0, $a1
741; LA32PIC-NEXT:    st.b $a3, $a0, 0
742; LA32PIC-NEXT:    ret
743;
744; LA64NOPIC-LABEL: stx_b:
745; LA64NOPIC:       # %bb.0:
746; LA64NOPIC-NEXT:    stx.b $a2, $a0, $a1
747; LA64NOPIC-NEXT:    ret
748;
749; LA64PIC-LABEL: stx_b:
750; LA64PIC:       # %bb.0:
751; LA64PIC-NEXT:    stx.b $a2, $a0, $a1
752; LA64PIC-NEXT:    ret
753  %1 = getelementptr i8, ptr %dst, i64 %idx
754  store i8 %val, ptr %1
755  ret void
756}
757
758define void @stx_h(ptr %dst, i64 %idx, i16 %val) nounwind {
759; LA32NOPIC-LABEL: stx_h:
760; LA32NOPIC:       # %bb.0:
761; LA32NOPIC-NEXT:    alsl.w $a0, $a1, $a0, 1
762; LA32NOPIC-NEXT:    st.h $a3, $a0, 0
763; LA32NOPIC-NEXT:    ret
764;
765; LA32PIC-LABEL: stx_h:
766; LA32PIC:       # %bb.0:
767; LA32PIC-NEXT:    alsl.w $a0, $a1, $a0, 1
768; LA32PIC-NEXT:    st.h $a3, $a0, 0
769; LA32PIC-NEXT:    ret
770;
771; LA64NOPIC-LABEL: stx_h:
772; LA64NOPIC:       # %bb.0:
773; LA64NOPIC-NEXT:    slli.d $a1, $a1, 1
774; LA64NOPIC-NEXT:    stx.h $a2, $a0, $a1
775; LA64NOPIC-NEXT:    ret
776;
777; LA64PIC-LABEL: stx_h:
778; LA64PIC:       # %bb.0:
779; LA64PIC-NEXT:    slli.d $a1, $a1, 1
780; LA64PIC-NEXT:    stx.h $a2, $a0, $a1
781; LA64PIC-NEXT:    ret
782  %1 = getelementptr i16, ptr %dst, i64 %idx
783  store i16 %val, ptr %1
784  ret void
785}
786
787define void @stx_w(ptr %dst, i64 %idx, i32 %val) nounwind {
788; LA32NOPIC-LABEL: stx_w:
789; LA32NOPIC:       # %bb.0:
790; LA32NOPIC-NEXT:    alsl.w $a0, $a1, $a0, 2
791; LA32NOPIC-NEXT:    st.w $a3, $a0, 0
792; LA32NOPIC-NEXT:    ret
793;
794; LA32PIC-LABEL: stx_w:
795; LA32PIC:       # %bb.0:
796; LA32PIC-NEXT:    alsl.w $a0, $a1, $a0, 2
797; LA32PIC-NEXT:    st.w $a3, $a0, 0
798; LA32PIC-NEXT:    ret
799;
800; LA64NOPIC-LABEL: stx_w:
801; LA64NOPIC:       # %bb.0:
802; LA64NOPIC-NEXT:    slli.d $a1, $a1, 2
803; LA64NOPIC-NEXT:    stx.w $a2, $a0, $a1
804; LA64NOPIC-NEXT:    ret
805;
806; LA64PIC-LABEL: stx_w:
807; LA64PIC:       # %bb.0:
808; LA64PIC-NEXT:    slli.d $a1, $a1, 2
809; LA64PIC-NEXT:    stx.w $a2, $a0, $a1
810; LA64PIC-NEXT:    ret
811  %1 = getelementptr i32, ptr %dst, i64 %idx
812  store i32 %val, ptr %1
813  ret void
814}
815
816define void @stx_d(ptr %dst, i64 %idx, i64 %val) nounwind {
817; LA32NOPIC-LABEL: stx_d:
818; LA32NOPIC:       # %bb.0:
819; LA32NOPIC-NEXT:    alsl.w $a0, $a1, $a0, 3
820; LA32NOPIC-NEXT:    st.w $a4, $a0, 4
821; LA32NOPIC-NEXT:    st.w $a3, $a0, 0
822; LA32NOPIC-NEXT:    ret
823;
824; LA32PIC-LABEL: stx_d:
825; LA32PIC:       # %bb.0:
826; LA32PIC-NEXT:    alsl.w $a0, $a1, $a0, 3
827; LA32PIC-NEXT:    st.w $a4, $a0, 4
828; LA32PIC-NEXT:    st.w $a3, $a0, 0
829; LA32PIC-NEXT:    ret
830;
831; LA64NOPIC-LABEL: stx_d:
832; LA64NOPIC:       # %bb.0:
833; LA64NOPIC-NEXT:    slli.d $a1, $a1, 3
834; LA64NOPIC-NEXT:    stx.d $a2, $a0, $a1
835; LA64NOPIC-NEXT:    ret
836;
837; LA64PIC-LABEL: stx_d:
838; LA64PIC:       # %bb.0:
839; LA64PIC-NEXT:    slli.d $a1, $a1, 3
840; LA64PIC-NEXT:    stx.d $a2, $a0, $a1
841; LA64PIC-NEXT:    ret
842  %1 = getelementptr i64, ptr %dst, i64 %idx
843  store i64 %val, ptr %1
844  ret void
845}
846
847;; Check load from and store to an i1 location.
848define i64 @load_sext_zext_anyext_i1(ptr %a) nounwind {
849; LA32NOPIC-LABEL: load_sext_zext_anyext_i1:
850; LA32NOPIC:       # %bb.0:
851; LA32NOPIC-NEXT:    ld.bu $a1, $a0, 1
852; LA32NOPIC-NEXT:    ld.bu $a3, $a0, 2
853; LA32NOPIC-NEXT:    sub.w $a2, $a3, $a1
854; LA32NOPIC-NEXT:    ld.b $zero, $a0, 0
855; LA32NOPIC-NEXT:    sltu $a0, $a3, $a1
856; LA32NOPIC-NEXT:    sub.w $a1, $zero, $a0
857; LA32NOPIC-NEXT:    move $a0, $a2
858; LA32NOPIC-NEXT:    ret
859;
860; LA32PIC-LABEL: load_sext_zext_anyext_i1:
861; LA32PIC:       # %bb.0:
862; LA32PIC-NEXT:    ld.bu $a1, $a0, 1
863; LA32PIC-NEXT:    ld.bu $a3, $a0, 2
864; LA32PIC-NEXT:    sub.w $a2, $a3, $a1
865; LA32PIC-NEXT:    ld.b $zero, $a0, 0
866; LA32PIC-NEXT:    sltu $a0, $a3, $a1
867; LA32PIC-NEXT:    sub.w $a1, $zero, $a0
868; LA32PIC-NEXT:    move $a0, $a2
869; LA32PIC-NEXT:    ret
870;
871; LA64NOPIC-LABEL: load_sext_zext_anyext_i1:
872; LA64NOPIC:       # %bb.0:
873; LA64NOPIC-NEXT:    ld.bu $a1, $a0, 1
874; LA64NOPIC-NEXT:    ld.bu $a2, $a0, 2
875; LA64NOPIC-NEXT:    ld.b $zero, $a0, 0
876; LA64NOPIC-NEXT:    sub.d $a0, $a2, $a1
877; LA64NOPIC-NEXT:    ret
878;
879; LA64PIC-LABEL: load_sext_zext_anyext_i1:
880; LA64PIC:       # %bb.0:
881; LA64PIC-NEXT:    ld.bu $a1, $a0, 1
882; LA64PIC-NEXT:    ld.bu $a2, $a0, 2
883; LA64PIC-NEXT:    ld.b $zero, $a0, 0
884; LA64PIC-NEXT:    sub.d $a0, $a2, $a1
885; LA64PIC-NEXT:    ret
886  ;; sextload i1
887  %1 = getelementptr i1, ptr %a, i64 1
888  %2 = load i1, ptr %1
889  %3 = sext i1 %2 to i64
890  ;; zextload i1
891  %4 = getelementptr i1, ptr %a, i64 2
892  %5 = load i1, ptr %4
893  %6 = zext i1 %5 to i64
894  %7 = add i64 %3, %6
895  ;; extload i1 (anyext). Produced as the load is unused.
896  %8 = load volatile i1, ptr %a
897  ret i64 %7
898}
899
900define i16 @load_sext_zext_anyext_i1_i16(ptr %a) nounwind {
901; LA32NOPIC-LABEL: load_sext_zext_anyext_i1_i16:
902; LA32NOPIC:       # %bb.0:
903; LA32NOPIC-NEXT:    ld.bu $a1, $a0, 1
904; LA32NOPIC-NEXT:    ld.bu $a2, $a0, 2
905; LA32NOPIC-NEXT:    ld.b $zero, $a0, 0
906; LA32NOPIC-NEXT:    sub.w $a0, $a2, $a1
907; LA32NOPIC-NEXT:    ret
908;
909; LA32PIC-LABEL: load_sext_zext_anyext_i1_i16:
910; LA32PIC:       # %bb.0:
911; LA32PIC-NEXT:    ld.bu $a1, $a0, 1
912; LA32PIC-NEXT:    ld.bu $a2, $a0, 2
913; LA32PIC-NEXT:    ld.b $zero, $a0, 0
914; LA32PIC-NEXT:    sub.w $a0, $a2, $a1
915; LA32PIC-NEXT:    ret
916;
917; LA64NOPIC-LABEL: load_sext_zext_anyext_i1_i16:
918; LA64NOPIC:       # %bb.0:
919; LA64NOPIC-NEXT:    ld.bu $a1, $a0, 1
920; LA64NOPIC-NEXT:    ld.bu $a2, $a0, 2
921; LA64NOPIC-NEXT:    ld.b $zero, $a0, 0
922; LA64NOPIC-NEXT:    sub.d $a0, $a2, $a1
923; LA64NOPIC-NEXT:    ret
924;
925; LA64PIC-LABEL: load_sext_zext_anyext_i1_i16:
926; LA64PIC:       # %bb.0:
927; LA64PIC-NEXT:    ld.bu $a1, $a0, 1
928; LA64PIC-NEXT:    ld.bu $a2, $a0, 2
929; LA64PIC-NEXT:    ld.b $zero, $a0, 0
930; LA64PIC-NEXT:    sub.d $a0, $a2, $a1
931; LA64PIC-NEXT:    ret
932  ;; sextload i1
933  %1 = getelementptr i1, ptr %a, i64 1
934  %2 = load i1, ptr %1
935  %3 = sext i1 %2 to i16
936  ;; zextload i1
937  %4 = getelementptr i1, ptr %a, i64 2
938  %5 = load i1, ptr %4
939  %6 = zext i1 %5 to i16
940  %7 = add i16 %3, %6
941  ;; extload i1 (anyext). Produced as the load is unused.
942  %8 = load volatile i1, ptr %a
943  ret i16 %7
944}
945
946define i64 @ld_sd_constant(i64 %a) nounwind {
947; LA32NOPIC-LABEL: ld_sd_constant:
948; LA32NOPIC:       # %bb.0:
949; LA32NOPIC-NEXT:    lu12i.w $a3, -136485
950; LA32NOPIC-NEXT:    ori $a4, $a3, 3823
951; LA32NOPIC-NEXT:    ld.w $a2, $a4, 0
952; LA32NOPIC-NEXT:    ori $a5, $a3, 3827
953; LA32NOPIC-NEXT:    ld.w $a3, $a5, 0
954; LA32NOPIC-NEXT:    st.w $a0, $a4, 0
955; LA32NOPIC-NEXT:    st.w $a1, $a5, 0
956; LA32NOPIC-NEXT:    move $a0, $a2
957; LA32NOPIC-NEXT:    move $a1, $a3
958; LA32NOPIC-NEXT:    ret
959;
960; LA32PIC-LABEL: ld_sd_constant:
961; LA32PIC:       # %bb.0:
962; LA32PIC-NEXT:    lu12i.w $a3, -136485
963; LA32PIC-NEXT:    ori $a4, $a3, 3823
964; LA32PIC-NEXT:    ld.w $a2, $a4, 0
965; LA32PIC-NEXT:    ori $a5, $a3, 3827
966; LA32PIC-NEXT:    ld.w $a3, $a5, 0
967; LA32PIC-NEXT:    st.w $a0, $a4, 0
968; LA32PIC-NEXT:    st.w $a1, $a5, 0
969; LA32PIC-NEXT:    move $a0, $a2
970; LA32PIC-NEXT:    move $a1, $a3
971; LA32PIC-NEXT:    ret
972;
973; LA64NOPIC-LABEL: ld_sd_constant:
974; LA64NOPIC:       # %bb.0:
975; LA64NOPIC-NEXT:    lu12i.w $a1, -136485
976; LA64NOPIC-NEXT:    ori $a2, $a1, 3823
977; LA64NOPIC-NEXT:    bstrins.d $a2, $a2, 61, 32
978; LA64NOPIC-NEXT:    ld.d $a1, $a2, 0
979; LA64NOPIC-NEXT:    st.d $a0, $a2, 0
980; LA64NOPIC-NEXT:    move $a0, $a1
981; LA64NOPIC-NEXT:    ret
982;
983; LA64PIC-LABEL: ld_sd_constant:
984; LA64PIC:       # %bb.0:
985; LA64PIC-NEXT:    lu12i.w $a1, -136485
986; LA64PIC-NEXT:    ori $a2, $a1, 3823
987; LA64PIC-NEXT:    bstrins.d $a2, $a2, 61, 32
988; LA64PIC-NEXT:    ld.d $a1, $a2, 0
989; LA64PIC-NEXT:    st.d $a0, $a2, 0
990; LA64PIC-NEXT:    move $a0, $a1
991; LA64PIC-NEXT:    ret
992  %1 = inttoptr i64 16045690984833335023 to ptr
993  %2 = load volatile i64, ptr %1
994  store i64 %a, ptr %1
995  ret i64 %2
996}
997
998;; Check load from and store to a float location.
999define float @load_store_float(ptr %a, float %b) nounwind {
1000; ALL-LABEL: load_store_float:
1001; ALL:       # %bb.0:
1002; ALL-NEXT:    fld.s $fa1, $a0, 4
1003; ALL-NEXT:    fst.s $fa0, $a0, 4
1004; ALL-NEXT:    fmov.s $fa0, $fa1
1005; ALL-NEXT:    ret
1006  %1 = getelementptr float, ptr %a, i64 1
1007  %2 = load float, ptr %1
1008  store float %b, ptr %1
1009  ret float %2
1010}
1011
1012;; Check load from and store to a double location.
1013define double @load_store_double(ptr %a, double %b) nounwind {
1014; ALL-LABEL: load_store_double:
1015; ALL:       # %bb.0:
1016; ALL-NEXT:    fld.d $fa1, $a0, 8
1017; ALL-NEXT:    fst.d $fa0, $a0, 8
1018; ALL-NEXT:    fmov.d $fa0, $fa1
1019; ALL-NEXT:    ret
1020  %1 = getelementptr double, ptr %a, i64 1
1021  %2 = load double, ptr %1
1022  store double %b, ptr %1
1023  ret double %2
1024}
1025