xref: /llvm-project/llvm/test/CodeGen/CSKY/ldst-i.ll (revision 423ac3d9ee82ff48da91b35ec80497089bc55b9e)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -csky-no-aliases -mattr=+2e3 < %s -mtriple=csky | FileCheck %s
3; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky  | FileCheck %s --check-prefix=GENERIC
4
5define signext i1 @load_I_bits(ptr nocapture readonly %a) local_unnamed_addr #0 {
6; CHECK-LABEL: load_I_bits:
7; CHECK:       # %bb.0: # %entry
8; CHECK-NEXT:    ld16.b a0, (a0, 3)
9; CHECK-NEXT:    sext32 a0, a0, 0, 0
10; CHECK-NEXT:    rts16
11;
12; GENERIC-LABEL: load_I_bits:
13; GENERIC:       # %bb.0: # %entry
14; GENERIC-NEXT:    .cfi_def_cfa_offset 0
15; GENERIC-NEXT:    subi16 sp, sp, 4
16; GENERIC-NEXT:    .cfi_def_cfa_offset 4
17; GENERIC-NEXT:    ld16.b a0, (a0, 3)
18; GENERIC-NEXT:    lsli16 a0, a0, 7
19; GENERIC-NEXT:    asri16 a0, a0, 7
20; GENERIC-NEXT:    addi16 sp, sp, 4
21; GENERIC-NEXT:    rts16
22entry:
23  %arrayidx = getelementptr inbounds i1, ptr %a, i64 3
24  %0 = load i1, ptr %arrayidx, align 1
25  ret i1 %0
26}
27
28define zeroext i1 @load_I_bit_(ptr nocapture readonly %a) local_unnamed_addr #0 {
29; CHECK-LABEL: load_I_bit_:
30; CHECK:       # %bb.0: # %entry
31; CHECK-NEXT:    ld16.b a0, (a0, 3)
32; CHECK-NEXT:    rts16
33;
34; GENERIC-LABEL: load_I_bit_:
35; GENERIC:       # %bb.0: # %entry
36; GENERIC-NEXT:    .cfi_def_cfa_offset 0
37; GENERIC-NEXT:    subi16 sp, sp, 4
38; GENERIC-NEXT:    .cfi_def_cfa_offset 4
39; GENERIC-NEXT:    ld16.b a0, (a0, 3)
40; GENERIC-NEXT:    addi16 sp, sp, 4
41; GENERIC-NEXT:    rts16
42entry:
43  %arrayidx = getelementptr inbounds i1, ptr %a, i64 3
44  %0 = load i1, ptr %arrayidx, align 1
45  ret i1 %0
46}
47
48define signext i8 @load_I_bs(ptr nocapture readonly %a) local_unnamed_addr #0 {
49; CHECK-LABEL: load_I_bs:
50; CHECK:       # %bb.0: # %entry
51; CHECK-NEXT:    ld32.bs a0, (a0, 3)
52; CHECK-NEXT:    rts16
53;
54; GENERIC-LABEL: load_I_bs:
55; GENERIC:       # %bb.0: # %entry
56; GENERIC-NEXT:    .cfi_def_cfa_offset 0
57; GENERIC-NEXT:    subi16 sp, sp, 4
58; GENERIC-NEXT:    .cfi_def_cfa_offset 4
59; GENERIC-NEXT:    ld16.b a0, (a0, 3)
60; GENERIC-NEXT:    sextb16 a0, a0
61; GENERIC-NEXT:    addi16 sp, sp, 4
62; GENERIC-NEXT:    rts16
63entry:
64  %arrayidx = getelementptr inbounds i8, ptr %a, i64 3
65  %0 = load i8, ptr %arrayidx, align 1
66  ret i8 %0
67}
68
69define zeroext i8 @load_I_b_(ptr nocapture readonly %a) local_unnamed_addr #0 {
70; CHECK-LABEL: load_I_b_:
71; CHECK:       # %bb.0: # %entry
72; CHECK-NEXT:    ld16.b a0, (a0, 3)
73; CHECK-NEXT:    rts16
74;
75; GENERIC-LABEL: load_I_b_:
76; GENERIC:       # %bb.0: # %entry
77; GENERIC-NEXT:    .cfi_def_cfa_offset 0
78; GENERIC-NEXT:    subi16 sp, sp, 4
79; GENERIC-NEXT:    .cfi_def_cfa_offset 4
80; GENERIC-NEXT:    ld16.b a0, (a0, 3)
81; GENERIC-NEXT:    addi16 sp, sp, 4
82; GENERIC-NEXT:    rts16
83entry:
84  %arrayidx = getelementptr inbounds i8, ptr %a, i64 3
85  %0 = load i8, ptr %arrayidx, align 1
86  ret i8 %0
87}
88
89define signext i16 @load_I_hs(ptr nocapture readonly %a) local_unnamed_addr #0 {
90; CHECK-LABEL: load_I_hs:
91; CHECK:       # %bb.0: # %entry
92; CHECK-NEXT:    ld32.hs a0, (a0, 6)
93; CHECK-NEXT:    rts16
94;
95; GENERIC-LABEL: load_I_hs:
96; GENERIC:       # %bb.0: # %entry
97; GENERIC-NEXT:    .cfi_def_cfa_offset 0
98; GENERIC-NEXT:    subi16 sp, sp, 4
99; GENERIC-NEXT:    .cfi_def_cfa_offset 4
100; GENERIC-NEXT:    ld16.h a0, (a0, 6)
101; GENERIC-NEXT:    sexth16 a0, a0
102; GENERIC-NEXT:    addi16 sp, sp, 4
103; GENERIC-NEXT:    rts16
104entry:
105  %arrayidx = getelementptr inbounds i16, ptr %a, i64 3
106  %0 = load i16, ptr %arrayidx, align 2
107  ret i16 %0
108}
109
110define zeroext i16 @load_I_h_(ptr nocapture readonly %a) local_unnamed_addr #0 {
111; CHECK-LABEL: load_I_h_:
112; CHECK:       # %bb.0: # %entry
113; CHECK-NEXT:    ld16.h a0, (a0, 6)
114; CHECK-NEXT:    rts16
115;
116; GENERIC-LABEL: load_I_h_:
117; GENERIC:       # %bb.0: # %entry
118; GENERIC-NEXT:    .cfi_def_cfa_offset 0
119; GENERIC-NEXT:    subi16 sp, sp, 4
120; GENERIC-NEXT:    .cfi_def_cfa_offset 4
121; GENERIC-NEXT:    ld16.h a0, (a0, 6)
122; GENERIC-NEXT:    addi16 sp, sp, 4
123; GENERIC-NEXT:    rts16
124entry:
125  %arrayidx = getelementptr inbounds i16, ptr %a, i64 3
126  %0 = load i16, ptr %arrayidx, align 2
127  ret i16 %0
128}
129
130define i32 @load_I_w(ptr nocapture readonly %a) local_unnamed_addr #0 {
131; CHECK-LABEL: load_I_w:
132; CHECK:       # %bb.0: # %entry
133; CHECK-NEXT:    ld16.w a0, (a0, 12)
134; CHECK-NEXT:    rts16
135;
136; GENERIC-LABEL: load_I_w:
137; GENERIC:       # %bb.0: # %entry
138; GENERIC-NEXT:    .cfi_def_cfa_offset 0
139; GENERIC-NEXT:    subi16 sp, sp, 4
140; GENERIC-NEXT:    .cfi_def_cfa_offset 4
141; GENERIC-NEXT:    ld16.w a0, (a0, 12)
142; GENERIC-NEXT:    addi16 sp, sp, 4
143; GENERIC-NEXT:    rts16
144entry:
145  %arrayidx = getelementptr inbounds i32, ptr %a, i64 3
146  %0 = load i32, ptr %arrayidx, align 4
147  ret i32 %0
148}
149
150define i64 @load_I_d(ptr nocapture readonly %a) local_unnamed_addr #0 {
151; CHECK-LABEL: load_I_d:
152; CHECK:       # %bb.0: # %entry
153; CHECK-NEXT:    ld16.w a2, (a0, 24)
154; CHECK-NEXT:    ld16.w a1, (a0, 28)
155; CHECK-NEXT:    mov16 a0, a2
156; CHECK-NEXT:    rts16
157;
158; GENERIC-LABEL: load_I_d:
159; GENERIC:       # %bb.0: # %entry
160; GENERIC-NEXT:    .cfi_def_cfa_offset 0
161; GENERIC-NEXT:    subi16 sp, sp, 4
162; GENERIC-NEXT:    .cfi_def_cfa_offset 4
163; GENERIC-NEXT:    ld16.w a2, (a0, 24)
164; GENERIC-NEXT:    ld16.w a1, (a0, 28)
165; GENERIC-NEXT:    mov16 a0, a2
166; GENERIC-NEXT:    addi16 sp, sp, 4
167; GENERIC-NEXT:    rts16
168entry:
169  %arrayidx = getelementptr inbounds i64, ptr %a, i64 3
170  %0 = load i64, ptr %arrayidx, align 4
171  ret i64 %0
172}
173
174define i8 @load_I_i8_anyext(ptr %p) {
175; CHECK-LABEL: load_I_i8_anyext:
176; CHECK:       # %bb.0: # %entry
177; CHECK-NEXT:    ld16.b a0, (a0, 0)
178; CHECK-NEXT:    rts16
179;
180; GENERIC-LABEL: load_I_i8_anyext:
181; GENERIC:       # %bb.0: # %entry
182; GENERIC-NEXT:    .cfi_def_cfa_offset 0
183; GENERIC-NEXT:    subi16 sp, sp, 4
184; GENERIC-NEXT:    .cfi_def_cfa_offset 4
185; GENERIC-NEXT:    ld16.b a0, (a0, 0)
186; GENERIC-NEXT:    addi16 sp, sp, 4
187; GENERIC-NEXT:    rts16
188entry:
189  %ret = load i8, ptr %p, align 1
190  ret i8 %ret
191}
192
193define signext i1 @load_R_bits(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 {
194; CHECK-LABEL: load_R_bits:
195; CHECK:       # %bb.0: # %entry
196; CHECK-NEXT:    ldr32.bs a0, (a0, a1 << 0)
197; CHECK-NEXT:    sext32 a0, a0, 0, 0
198; CHECK-NEXT:    rts16
199;
200; GENERIC-LABEL: load_R_bits:
201; GENERIC:       # %bb.0: # %entry
202; GENERIC-NEXT:    .cfi_def_cfa_offset 0
203; GENERIC-NEXT:    subi16 sp, sp, 4
204; GENERIC-NEXT:    .cfi_def_cfa_offset 4
205; GENERIC-NEXT:    addu16 a0, a0, a1
206; GENERIC-NEXT:    ld16.b a0, (a0, 0)
207; GENERIC-NEXT:    lsli16 a0, a0, 7
208; GENERIC-NEXT:    asri16 a0, a0, 7
209; GENERIC-NEXT:    addi16 sp, sp, 4
210; GENERIC-NEXT:    rts16
211entry:
212  %idxprom = sext i32 %b to i64
213  %arrayidx = getelementptr inbounds i1, ptr %a, i64 %idxprom
214  %0 = load i1, ptr %arrayidx, align 1
215  ret i1 %0
216}
217
218define zeroext i1 @load_R_bit_(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 {
219; CHECK-LABEL: load_R_bit_:
220; CHECK:       # %bb.0: # %entry
221; CHECK-NEXT:    ldr32.b a0, (a0, a1 << 0)
222; CHECK-NEXT:    rts16
223;
224; GENERIC-LABEL: load_R_bit_:
225; GENERIC:       # %bb.0: # %entry
226; GENERIC-NEXT:    .cfi_def_cfa_offset 0
227; GENERIC-NEXT:    subi16 sp, sp, 4
228; GENERIC-NEXT:    .cfi_def_cfa_offset 4
229; GENERIC-NEXT:    addu16 a0, a0, a1
230; GENERIC-NEXT:    ld16.b a0, (a0, 0)
231; GENERIC-NEXT:    addi16 sp, sp, 4
232; GENERIC-NEXT:    rts16
233entry:
234  %idxprom = sext i32 %b to i64
235  %arrayidx = getelementptr inbounds i1, ptr %a, i64 %idxprom
236  %0 = load i1, ptr %arrayidx, align 1
237  ret i1 %0
238}
239
240
241define signext i8 @load_R_bs(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 {
242; CHECK-LABEL: load_R_bs:
243; CHECK:       # %bb.0: # %entry
244; CHECK-NEXT:    ldr32.bs a0, (a0, a1 << 0)
245; CHECK-NEXT:    rts16
246;
247; GENERIC-LABEL: load_R_bs:
248; GENERIC:       # %bb.0: # %entry
249; GENERIC-NEXT:    .cfi_def_cfa_offset 0
250; GENERIC-NEXT:    subi16 sp, sp, 4
251; GENERIC-NEXT:    .cfi_def_cfa_offset 4
252; GENERIC-NEXT:    addu16 a0, a0, a1
253; GENERIC-NEXT:    ld16.b a0, (a0, 0)
254; GENERIC-NEXT:    sextb16 a0, a0
255; GENERIC-NEXT:    addi16 sp, sp, 4
256; GENERIC-NEXT:    rts16
257entry:
258  %idxprom = sext i32 %b to i64
259  %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom
260  %0 = load i8, ptr %arrayidx, align 1
261  ret i8 %0
262}
263
264define zeroext i8 @load_R_b_(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 {
265; CHECK-LABEL: load_R_b_:
266; CHECK:       # %bb.0: # %entry
267; CHECK-NEXT:    ldr32.b a0, (a0, a1 << 0)
268; CHECK-NEXT:    rts16
269;
270; GENERIC-LABEL: load_R_b_:
271; GENERIC:       # %bb.0: # %entry
272; GENERIC-NEXT:    .cfi_def_cfa_offset 0
273; GENERIC-NEXT:    subi16 sp, sp, 4
274; GENERIC-NEXT:    .cfi_def_cfa_offset 4
275; GENERIC-NEXT:    addu16 a0, a0, a1
276; GENERIC-NEXT:    ld16.b a0, (a0, 0)
277; GENERIC-NEXT:    addi16 sp, sp, 4
278; GENERIC-NEXT:    rts16
279entry:
280  %idxprom = sext i32 %b to i64
281  %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom
282  %0 = load i8, ptr %arrayidx, align 1
283  ret i8 %0
284}
285
286define signext i16 @load_R_hs(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 {
287; CHECK-LABEL: load_R_hs:
288; CHECK:       # %bb.0: # %entry
289; CHECK-NEXT:    ldr32.hs a0, (a0, a1 << 1)
290; CHECK-NEXT:    rts16
291;
292; GENERIC-LABEL: load_R_hs:
293; GENERIC:       # %bb.0: # %entry
294; GENERIC-NEXT:    .cfi_def_cfa_offset 0
295; GENERIC-NEXT:    subi16 sp, sp, 4
296; GENERIC-NEXT:    .cfi_def_cfa_offset 4
297; GENERIC-NEXT:    lsli16 a1, a1, 1
298; GENERIC-NEXT:    addu16 a0, a0, a1
299; GENERIC-NEXT:    ld16.h a0, (a0, 0)
300; GENERIC-NEXT:    sexth16 a0, a0
301; GENERIC-NEXT:    addi16 sp, sp, 4
302; GENERIC-NEXT:    rts16
303entry:
304  %idxprom = sext i32 %b to i64
305  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom
306  %0 = load i16, ptr %arrayidx, align 2
307  ret i16 %0
308}
309
310define zeroext i16 @load_R_h_(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 {
311; CHECK-LABEL: load_R_h_:
312; CHECK:       # %bb.0: # %entry
313; CHECK-NEXT:    ldr32.h a0, (a0, a1 << 1)
314; CHECK-NEXT:    rts16
315;
316; GENERIC-LABEL: load_R_h_:
317; GENERIC:       # %bb.0: # %entry
318; GENERIC-NEXT:    .cfi_def_cfa_offset 0
319; GENERIC-NEXT:    subi16 sp, sp, 4
320; GENERIC-NEXT:    .cfi_def_cfa_offset 4
321; GENERIC-NEXT:    lsli16 a1, a1, 1
322; GENERIC-NEXT:    addu16 a0, a0, a1
323; GENERIC-NEXT:    ld16.h a0, (a0, 0)
324; GENERIC-NEXT:    addi16 sp, sp, 4
325; GENERIC-NEXT:    rts16
326entry:
327  %idxprom = sext i32 %b to i64
328  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom
329  %0 = load i16, ptr %arrayidx, align 2
330  ret i16 %0
331}
332
333define i32 @load_R_w(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 {
334; CHECK-LABEL: load_R_w:
335; CHECK:       # %bb.0: # %entry
336; CHECK-NEXT:    ldr32.w a0, (a0, a1 << 2)
337; CHECK-NEXT:    rts16
338;
339; GENERIC-LABEL: load_R_w:
340; GENERIC:       # %bb.0: # %entry
341; GENERIC-NEXT:    .cfi_def_cfa_offset 0
342; GENERIC-NEXT:    subi16 sp, sp, 4
343; GENERIC-NEXT:    .cfi_def_cfa_offset 4
344; GENERIC-NEXT:    lsli16 a1, a1, 2
345; GENERIC-NEXT:    addu16 a0, a0, a1
346; GENERIC-NEXT:    ld16.w a0, (a0, 0)
347; GENERIC-NEXT:    addi16 sp, sp, 4
348; GENERIC-NEXT:    rts16
349entry:
350  %idxprom = sext i32 %b to i64
351  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %idxprom
352  %0 = load i32, ptr %arrayidx, align 4
353  ret i32 %0
354}
355
356define i64 @load_R_d(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 {
357; CHECK-LABEL: load_R_d:
358; CHECK:       # %bb.0: # %entry
359; CHECK-NEXT:    ixd32 a2, a0, a1
360; CHECK-NEXT:    ldr32.w a0, (a0, a1 << 3)
361; CHECK-NEXT:    ld16.w a1, (a2, 4)
362; CHECK-NEXT:    rts16
363;
364; GENERIC-LABEL: load_R_d:
365; GENERIC:       # %bb.0: # %entry
366; GENERIC-NEXT:    .cfi_def_cfa_offset 0
367; GENERIC-NEXT:    subi16 sp, sp, 4
368; GENERIC-NEXT:    .cfi_def_cfa_offset 4
369; GENERIC-NEXT:    lsli16 a1, a1, 3
370; GENERIC-NEXT:    addu16 a1, a0, a1
371; GENERIC-NEXT:    ld16.w a0, (a1, 0)
372; GENERIC-NEXT:    ld16.w a1, (a1, 4)
373; GENERIC-NEXT:    addi16 sp, sp, 4
374; GENERIC-NEXT:    rts16
375entry:
376  %idxprom = sext i32 %b to i64
377  %arrayidx = getelementptr inbounds i64, ptr %a, i64 %idxprom
378  %0 = load i64, ptr %arrayidx, align 4
379  ret i64 %0
380}
381
382define i8 @loadR_i8_anyext(ptr %c, i32 %a) {
383; CHECK-LABEL: loadR_i8_anyext:
384; CHECK:       # %bb.0: # %entry
385; CHECK-NEXT:    ldr32.bs a0, (a0, a1 << 0)
386; CHECK-NEXT:    rts16
387;
388; GENERIC-LABEL: loadR_i8_anyext:
389; GENERIC:       # %bb.0: # %entry
390; GENERIC-NEXT:    .cfi_def_cfa_offset 0
391; GENERIC-NEXT:    subi16 sp, sp, 4
392; GENERIC-NEXT:    .cfi_def_cfa_offset 4
393; GENERIC-NEXT:    addu16 a0, a0, a1
394; GENERIC-NEXT:    ld16.b a0, (a0, 0)
395; GENERIC-NEXT:    addi16 sp, sp, 4
396; GENERIC-NEXT:    rts16
397entry:
398  %idxprom = sext i32 %a to i64
399  %arrayidx = getelementptr inbounds i8, ptr %c, i64 %idxprom
400  %0 = load i8, ptr %arrayidx, align 1
401  ret i8 %0
402}
403
404define signext i1 @store_I_bits(ptr  %a, i1 %b) local_unnamed_addr #0 {
405; CHECK-LABEL: store_I_bits:
406; CHECK:       # %bb.0: # %entry
407; CHECK-NEXT:    andi32 a1, a1, 1
408; CHECK-NEXT:    st16.b a1, (a0, 3)
409; CHECK-NEXT:    movi16 a0, 0
410; CHECK-NEXT:    rts16
411;
412; GENERIC-LABEL: store_I_bits:
413; GENERIC:       # %bb.0: # %entry
414; GENERIC-NEXT:    .cfi_def_cfa_offset 0
415; GENERIC-NEXT:    subi16 sp, sp, 4
416; GENERIC-NEXT:    .cfi_def_cfa_offset 4
417; GENERIC-NEXT:    movi16 a2, 1
418; GENERIC-NEXT:    and16 a2, a1
419; GENERIC-NEXT:    st16.b a2, (a0, 3)
420; GENERIC-NEXT:    movi16 a0, 0
421; GENERIC-NEXT:    addi16 sp, sp, 4
422; GENERIC-NEXT:    rts16
423entry:
424  %arrayidx = getelementptr inbounds i1, ptr %a, i64 3
425  store i1 %b,  ptr %arrayidx, align 1
426  ret i1 0
427}
428
429define zeroext i1 @store_I_bit_(ptr  %a, i1 %b) local_unnamed_addr #0 {
430; CHECK-LABEL: store_I_bit_:
431; CHECK:       # %bb.0: # %entry
432; CHECK-NEXT:    andi32 a1, a1, 1
433; CHECK-NEXT:    st16.b a1, (a0, 3)
434; CHECK-NEXT:    movi16 a0, 0
435; CHECK-NEXT:    rts16
436;
437; GENERIC-LABEL: store_I_bit_:
438; GENERIC:       # %bb.0: # %entry
439; GENERIC-NEXT:    .cfi_def_cfa_offset 0
440; GENERIC-NEXT:    subi16 sp, sp, 4
441; GENERIC-NEXT:    .cfi_def_cfa_offset 4
442; GENERIC-NEXT:    movi16 a2, 1
443; GENERIC-NEXT:    and16 a2, a1
444; GENERIC-NEXT:    st16.b a2, (a0, 3)
445; GENERIC-NEXT:    movi16 a0, 0
446; GENERIC-NEXT:    addi16 sp, sp, 4
447; GENERIC-NEXT:    rts16
448entry:
449  %arrayidx = getelementptr inbounds i1, ptr %a, i64 3
450  store i1 %b, ptr %arrayidx, align 1
451  ret i1 0
452}
453
454define signext i8 @store_I_bs(ptr  %a, i8 %b) local_unnamed_addr #0 {
455; CHECK-LABEL: store_I_bs:
456; CHECK:       # %bb.0: # %entry
457; CHECK-NEXT:    st16.b a1, (a0, 3)
458; CHECK-NEXT:    movi16 a0, 0
459; CHECK-NEXT:    rts16
460;
461; GENERIC-LABEL: store_I_bs:
462; GENERIC:       # %bb.0: # %entry
463; GENERIC-NEXT:    .cfi_def_cfa_offset 0
464; GENERIC-NEXT:    subi16 sp, sp, 4
465; GENERIC-NEXT:    .cfi_def_cfa_offset 4
466; GENERIC-NEXT:    st16.b a1, (a0, 3)
467; GENERIC-NEXT:    movi16 a0, 0
468; GENERIC-NEXT:    addi16 sp, sp, 4
469; GENERIC-NEXT:    rts16
470entry:
471  %arrayidx = getelementptr inbounds i8, ptr %a, i64 3
472  store i8 %b, ptr %arrayidx, align 1
473  ret i8 0
474}
475
476define zeroext i8 @store_I_b_(ptr  %a, i8 %b) local_unnamed_addr #0 {
477; CHECK-LABEL: store_I_b_:
478; CHECK:       # %bb.0: # %entry
479; CHECK-NEXT:    st16.b a1, (a0, 3)
480; CHECK-NEXT:    movi16 a0, 0
481; CHECK-NEXT:    rts16
482;
483; GENERIC-LABEL: store_I_b_:
484; GENERIC:       # %bb.0: # %entry
485; GENERIC-NEXT:    .cfi_def_cfa_offset 0
486; GENERIC-NEXT:    subi16 sp, sp, 4
487; GENERIC-NEXT:    .cfi_def_cfa_offset 4
488; GENERIC-NEXT:    st16.b a1, (a0, 3)
489; GENERIC-NEXT:    movi16 a0, 0
490; GENERIC-NEXT:    addi16 sp, sp, 4
491; GENERIC-NEXT:    rts16
492entry:
493  %arrayidx = getelementptr inbounds i8, ptr %a, i64 3
494  store i8 %b, ptr %arrayidx, align 1
495  ret i8 0
496}
497
498define signext i16 @store_I_hs(ptr  %a, i16 %b) local_unnamed_addr #0 {
499; CHECK-LABEL: store_I_hs:
500; CHECK:       # %bb.0: # %entry
501; CHECK-NEXT:    st16.h a1, (a0, 6)
502; CHECK-NEXT:    movi16 a0, 0
503; CHECK-NEXT:    rts16
504;
505; GENERIC-LABEL: store_I_hs:
506; GENERIC:       # %bb.0: # %entry
507; GENERIC-NEXT:    .cfi_def_cfa_offset 0
508; GENERIC-NEXT:    subi16 sp, sp, 4
509; GENERIC-NEXT:    .cfi_def_cfa_offset 4
510; GENERIC-NEXT:    st16.h a1, (a0, 6)
511; GENERIC-NEXT:    movi16 a0, 0
512; GENERIC-NEXT:    addi16 sp, sp, 4
513; GENERIC-NEXT:    rts16
514entry:
515  %arrayidx = getelementptr inbounds i16, ptr %a, i64 3
516  store i16 %b, ptr %arrayidx, align 2
517  ret i16 0
518}
519
520define zeroext i16 @store_I_h_(ptr  %a, i16 %b) local_unnamed_addr #0 {
521; CHECK-LABEL: store_I_h_:
522; CHECK:       # %bb.0: # %entry
523; CHECK-NEXT:    st16.h a1, (a0, 6)
524; CHECK-NEXT:    movi16 a0, 0
525; CHECK-NEXT:    rts16
526;
527; GENERIC-LABEL: store_I_h_:
528; GENERIC:       # %bb.0: # %entry
529; GENERIC-NEXT:    .cfi_def_cfa_offset 0
530; GENERIC-NEXT:    subi16 sp, sp, 4
531; GENERIC-NEXT:    .cfi_def_cfa_offset 4
532; GENERIC-NEXT:    st16.h a1, (a0, 6)
533; GENERIC-NEXT:    movi16 a0, 0
534; GENERIC-NEXT:    addi16 sp, sp, 4
535; GENERIC-NEXT:    rts16
536entry:
537  %arrayidx = getelementptr inbounds i16, ptr %a, i64 3
538  store i16 %b, ptr %arrayidx, align 2
539  ret i16 0
540}
541
542define i32 @store_I_w(ptr  %a, i32 %b) local_unnamed_addr #0 {
543; CHECK-LABEL: store_I_w:
544; CHECK:       # %bb.0: # %entry
545; CHECK-NEXT:    st16.w a1, (a0, 12)
546; CHECK-NEXT:    movi16 a0, 0
547; CHECK-NEXT:    rts16
548;
549; GENERIC-LABEL: store_I_w:
550; GENERIC:       # %bb.0: # %entry
551; GENERIC-NEXT:    .cfi_def_cfa_offset 0
552; GENERIC-NEXT:    subi16 sp, sp, 4
553; GENERIC-NEXT:    .cfi_def_cfa_offset 4
554; GENERIC-NEXT:    st16.w a1, (a0, 12)
555; GENERIC-NEXT:    movi16 a0, 0
556; GENERIC-NEXT:    addi16 sp, sp, 4
557; GENERIC-NEXT:    rts16
558entry:
559  %arrayidx = getelementptr inbounds i32, ptr %a, i64 3
560  store i32 %b, ptr %arrayidx, align 4
561  ret i32 0
562}
563
564define i64 @store_I_d(ptr  %a, i64 %b) local_unnamed_addr #0 {
565; CHECK-LABEL: store_I_d:
566; CHECK:       # %bb.0: # %entry
567; CHECK-NEXT:    st16.w a2, (a0, 28)
568; CHECK-NEXT:    st16.w a1, (a0, 24)
569; CHECK-NEXT:    movi16 a0, 0
570; CHECK-NEXT:    movi16 a1, 0
571; CHECK-NEXT:    rts16
572;
573; GENERIC-LABEL: store_I_d:
574; GENERIC:       # %bb.0: # %entry
575; GENERIC-NEXT:    .cfi_def_cfa_offset 0
576; GENERIC-NEXT:    subi16 sp, sp, 4
577; GENERIC-NEXT:    .cfi_def_cfa_offset 4
578; GENERIC-NEXT:    st16.w a2, (a0, 28)
579; GENERIC-NEXT:    st16.w a1, (a0, 24)
580; GENERIC-NEXT:    movi16 a0, 0
581; GENERIC-NEXT:    movi16 a1, 0
582; GENERIC-NEXT:    addi16 sp, sp, 4
583; GENERIC-NEXT:    rts16
584entry:
585  %arrayidx = getelementptr inbounds i64, ptr %a, i64 3
586  store i64 %b, ptr %arrayidx, align 4
587  ret i64 0
588}
589
590define i8 @store_I_i8_anyext(ptr %p, i8 %b) {
591; CHECK-LABEL: store_I_i8_anyext:
592; CHECK:       # %bb.0: # %entry
593; CHECK-NEXT:    st16.b a1, (a0, 0)
594; CHECK-NEXT:    movi16 a0, 0
595; CHECK-NEXT:    rts16
596;
597; GENERIC-LABEL: store_I_i8_anyext:
598; GENERIC:       # %bb.0: # %entry
599; GENERIC-NEXT:    .cfi_def_cfa_offset 0
600; GENERIC-NEXT:    subi16 sp, sp, 4
601; GENERIC-NEXT:    .cfi_def_cfa_offset 4
602; GENERIC-NEXT:    st16.b a1, (a0, 0)
603; GENERIC-NEXT:    movi16 a0, 0
604; GENERIC-NEXT:    addi16 sp, sp, 4
605; GENERIC-NEXT:    rts16
606entry:
607  store i8 %b, ptr %p, align 1
608  ret i8 0
609}
610
611define signext i1 @store_R_bits(ptr  %a, i32 %b, i1 %c) local_unnamed_addr #0 {
612; CHECK-LABEL: store_R_bits:
613; CHECK:       # %bb.0: # %entry
614; CHECK-NEXT:    andi32 a2, a2, 1
615; CHECK-NEXT:    str32.b a2, (a0, a1 << 0)
616; CHECK-NEXT:    movi16 a0, 0
617; CHECK-NEXT:    rts16
618;
619; GENERIC-LABEL: store_R_bits:
620; GENERIC:       # %bb.0: # %entry
621; GENERIC-NEXT:    .cfi_def_cfa_offset 0
622; GENERIC-NEXT:    subi16 sp, sp, 4
623; GENERIC-NEXT:    .cfi_def_cfa_offset 4
624; GENERIC-NEXT:    addu16 a0, a0, a1
625; GENERIC-NEXT:    movi16 a1, 1
626; GENERIC-NEXT:    and16 a1, a2
627; GENERIC-NEXT:    st16.b a1, (a0, 0)
628; GENERIC-NEXT:    movi16 a0, 0
629; GENERIC-NEXT:    addi16 sp, sp, 4
630; GENERIC-NEXT:    rts16
631entry:
632  %idxprom = sext i32 %b to i64
633  %arrayidx = getelementptr inbounds i1, ptr %a, i64 %idxprom
634  store i1 %c, ptr %arrayidx, align 1
635  ret i1 0
636}
637
638define zeroext i1 @store_R_bit_(ptr  %a, i32 %b, i1 %c) local_unnamed_addr #0 {
639; CHECK-LABEL: store_R_bit_:
640; CHECK:       # %bb.0: # %entry
641; CHECK-NEXT:    andi32 a2, a2, 1
642; CHECK-NEXT:    str32.b a2, (a0, a1 << 0)
643; CHECK-NEXT:    movi16 a0, 0
644; CHECK-NEXT:    rts16
645;
646; GENERIC-LABEL: store_R_bit_:
647; GENERIC:       # %bb.0: # %entry
648; GENERIC-NEXT:    .cfi_def_cfa_offset 0
649; GENERIC-NEXT:    subi16 sp, sp, 4
650; GENERIC-NEXT:    .cfi_def_cfa_offset 4
651; GENERIC-NEXT:    addu16 a0, a0, a1
652; GENERIC-NEXT:    movi16 a1, 1
653; GENERIC-NEXT:    and16 a1, a2
654; GENERIC-NEXT:    st16.b a1, (a0, 0)
655; GENERIC-NEXT:    movi16 a0, 0
656; GENERIC-NEXT:    addi16 sp, sp, 4
657; GENERIC-NEXT:    rts16
658entry:
659  %idxprom = sext i32 %b to i64
660  %arrayidx = getelementptr inbounds i1, ptr %a, i64 %idxprom
661  store i1 %c, ptr %arrayidx, align 1
662  ret i1 0
663}
664
665
666define signext i8 @store_R_bs(ptr  %a, i32 %b, i8 %c) local_unnamed_addr #0 {
667; CHECK-LABEL: store_R_bs:
668; CHECK:       # %bb.0: # %entry
669; CHECK-NEXT:    str32.b a2, (a0, a1 << 0)
670; CHECK-NEXT:    movi16 a0, 0
671; CHECK-NEXT:    rts16
672;
673; GENERIC-LABEL: store_R_bs:
674; GENERIC:       # %bb.0: # %entry
675; GENERIC-NEXT:    .cfi_def_cfa_offset 0
676; GENERIC-NEXT:    subi16 sp, sp, 4
677; GENERIC-NEXT:    .cfi_def_cfa_offset 4
678; GENERIC-NEXT:    addu16 a0, a0, a1
679; GENERIC-NEXT:    st16.b a2, (a0, 0)
680; GENERIC-NEXT:    movi16 a0, 0
681; GENERIC-NEXT:    addi16 sp, sp, 4
682; GENERIC-NEXT:    rts16
683entry:
684  %idxprom = sext i32 %b to i64
685  %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom
686  store i8 %c, ptr %arrayidx, align 1
687  ret i8 0
688}
689
690define zeroext i8 @store_R_b_(ptr  %a, i32 %b, i8 %c) local_unnamed_addr #0 {
691; CHECK-LABEL: store_R_b_:
692; CHECK:       # %bb.0: # %entry
693; CHECK-NEXT:    str32.b a2, (a0, a1 << 0)
694; CHECK-NEXT:    movi16 a0, 0
695; CHECK-NEXT:    rts16
696;
697; GENERIC-LABEL: store_R_b_:
698; GENERIC:       # %bb.0: # %entry
699; GENERIC-NEXT:    .cfi_def_cfa_offset 0
700; GENERIC-NEXT:    subi16 sp, sp, 4
701; GENERIC-NEXT:    .cfi_def_cfa_offset 4
702; GENERIC-NEXT:    addu16 a0, a0, a1
703; GENERIC-NEXT:    st16.b a2, (a0, 0)
704; GENERIC-NEXT:    movi16 a0, 0
705; GENERIC-NEXT:    addi16 sp, sp, 4
706; GENERIC-NEXT:    rts16
707entry:
708  %idxprom = sext i32 %b to i64
709  %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom
710  store i8 %c, ptr %arrayidx, align 1
711  ret i8 0
712}
713
714define signext i16 @store_R_hs(ptr  %a, i32 %b, i16 %c) local_unnamed_addr #0 {
715; CHECK-LABEL: store_R_hs:
716; CHECK:       # %bb.0: # %entry
717; CHECK-NEXT:    str32.h a2, (a0, a1 << 1)
718; CHECK-NEXT:    movi16 a0, 0
719; CHECK-NEXT:    rts16
720;
721; GENERIC-LABEL: store_R_hs:
722; GENERIC:       # %bb.0: # %entry
723; GENERIC-NEXT:    .cfi_def_cfa_offset 0
724; GENERIC-NEXT:    subi16 sp, sp, 4
725; GENERIC-NEXT:    .cfi_def_cfa_offset 4
726; GENERIC-NEXT:    lsli16 a1, a1, 1
727; GENERIC-NEXT:    addu16 a0, a0, a1
728; GENERIC-NEXT:    st16.h a2, (a0, 0)
729; GENERIC-NEXT:    movi16 a0, 0
730; GENERIC-NEXT:    addi16 sp, sp, 4
731; GENERIC-NEXT:    rts16
732entry:
733  %idxprom = sext i32 %b to i64
734  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom
735  store i16 %c, ptr %arrayidx, align 2
736  ret i16 0
737}
738
739define zeroext i16 @store_R_h_(ptr  %a, i32 %b, i16 %c) local_unnamed_addr #0 {
740; CHECK-LABEL: store_R_h_:
741; CHECK:       # %bb.0: # %entry
742; CHECK-NEXT:    str32.h a2, (a0, a1 << 1)
743; CHECK-NEXT:    movi16 a0, 0
744; CHECK-NEXT:    rts16
745;
746; GENERIC-LABEL: store_R_h_:
747; GENERIC:       # %bb.0: # %entry
748; GENERIC-NEXT:    .cfi_def_cfa_offset 0
749; GENERIC-NEXT:    subi16 sp, sp, 4
750; GENERIC-NEXT:    .cfi_def_cfa_offset 4
751; GENERIC-NEXT:    lsli16 a1, a1, 1
752; GENERIC-NEXT:    addu16 a0, a0, a1
753; GENERIC-NEXT:    st16.h a2, (a0, 0)
754; GENERIC-NEXT:    movi16 a0, 0
755; GENERIC-NEXT:    addi16 sp, sp, 4
756; GENERIC-NEXT:    rts16
757entry:
758  %idxprom = sext i32 %b to i64
759  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom
760  store i16 %c, ptr %arrayidx, align 2
761  ret i16 0
762}
763
764define i32 @store_R_w(ptr  %a, i32 %b, i32 %c) local_unnamed_addr #0 {
765; CHECK-LABEL: store_R_w:
766; CHECK:       # %bb.0: # %entry
767; CHECK-NEXT:    str32.w a2, (a0, a1 << 2)
768; CHECK-NEXT:    movi16 a0, 0
769; CHECK-NEXT:    rts16
770;
771; GENERIC-LABEL: store_R_w:
772; GENERIC:       # %bb.0: # %entry
773; GENERIC-NEXT:    .cfi_def_cfa_offset 0
774; GENERIC-NEXT:    subi16 sp, sp, 4
775; GENERIC-NEXT:    .cfi_def_cfa_offset 4
776; GENERIC-NEXT:    lsli16 a1, a1, 2
777; GENERIC-NEXT:    addu16 a0, a0, a1
778; GENERIC-NEXT:    st16.w a2, (a0, 0)
779; GENERIC-NEXT:    movi16 a0, 0
780; GENERIC-NEXT:    addi16 sp, sp, 4
781; GENERIC-NEXT:    rts16
782entry:
783  %idxprom = sext i32 %b to i64
784  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %idxprom
785  store i32 %c, ptr %arrayidx, align 4
786  ret i32 0
787}
788
789define i64 @store_R_d(ptr  %a, i32 %b, i64 %c) local_unnamed_addr #0 {
790; CHECK-LABEL: store_R_d:
791; CHECK:       # %bb.0: # %entry
792; CHECK-NEXT:    ixd32 t0, a0, a1
793; CHECK-NEXT:    str32.w a2, (a0, a1 << 3)
794; CHECK-NEXT:    st32.w a3, (t0, 4)
795; CHECK-NEXT:    movi16 a0, 0
796; CHECK-NEXT:    movi16 a1, 0
797; CHECK-NEXT:    rts16
798;
799; GENERIC-LABEL: store_R_d:
800; GENERIC:       # %bb.0: # %entry
801; GENERIC-NEXT:    .cfi_def_cfa_offset 0
802; GENERIC-NEXT:    subi16 sp, sp, 4
803; GENERIC-NEXT:    .cfi_def_cfa_offset 4
804; GENERIC-NEXT:    lsli16 a1, a1, 3
805; GENERIC-NEXT:    addu16 a0, a0, a1
806; GENERIC-NEXT:    st16.w a3, (a0, 4)
807; GENERIC-NEXT:    st16.w a2, (a0, 0)
808; GENERIC-NEXT:    movi16 a0, 0
809; GENERIC-NEXT:    movi16 a1, 0
810; GENERIC-NEXT:    addi16 sp, sp, 4
811; GENERIC-NEXT:    rts16
812entry:
813  %idxprom = sext i32 %b to i64
814  %arrayidx = getelementptr inbounds i64, ptr %a, i64 %idxprom
815  store i64 %c, ptr %arrayidx, align 4
816  ret i64 0
817}
818
819define i8 @storeR_i8_anyext(ptr %c, i32 %a, i8 %d) {
820; CHECK-LABEL: storeR_i8_anyext:
821; CHECK:       # %bb.0: # %entry
822; CHECK-NEXT:    str32.b a2, (a0, a1 << 0)
823; CHECK-NEXT:    movi16 a0, 0
824; CHECK-NEXT:    rts16
825;
826; GENERIC-LABEL: storeR_i8_anyext:
827; GENERIC:       # %bb.0: # %entry
828; GENERIC-NEXT:    .cfi_def_cfa_offset 0
829; GENERIC-NEXT:    subi16 sp, sp, 4
830; GENERIC-NEXT:    .cfi_def_cfa_offset 4
831; GENERIC-NEXT:    addu16 a0, a0, a1
832; GENERIC-NEXT:    st16.b a2, (a0, 0)
833; GENERIC-NEXT:    movi16 a0, 0
834; GENERIC-NEXT:    addi16 sp, sp, 4
835; GENERIC-NEXT:    rts16
836entry:
837  %idxprom = sext i32 %a to i64
838  %arrayidx = getelementptr inbounds i8, ptr %c, i64 %idxprom
839  store i8 %d, ptr %arrayidx, align 1
840  ret i8 0
841}
842