Skip to content

Commit ba69230

Browse files
committed
[AArch64][GlobalISel] Pre-Commit Test for G_STORE v4s8 (#82498)
1 parent 6e41d60 commit ba69230

File tree

1 file changed

+337
-0
lines changed

1 file changed

+337
-0
lines changed

llvm/test/CodeGen/AArch64/store.ll

Lines changed: 337 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,337 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+
; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4+
5+
; CHECK-GI: warning: Instruction selection used fallback path for store_v2i8
6+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for store_v4i8
7+
8+
; ===== Legal Scalars =====
9+
define void @store_i8(i8 %a, ptr %ptr){
10+
; CHECK-LABEL: store_i8:
11+
; CHECK: // %bb.0:
12+
; CHECK-NEXT: strb w0, [x1]
13+
; CHECK-NEXT: ret
14+
store i8 %a, ptr %ptr
15+
ret void
16+
}
17+
18+
define void @store_i16(i16 %a, ptr %ptr){
19+
; CHECK-LABEL: store_i16:
20+
; CHECK: // %bb.0:
21+
; CHECK-NEXT: strh w0, [x1]
22+
; CHECK-NEXT: ret
23+
store i16 %a, ptr %ptr
24+
ret void
25+
}
26+
27+
define void @store_i32(i32 %a, ptr %ptr){
28+
; CHECK-LABEL: store_i32:
29+
; CHECK: // %bb.0:
30+
; CHECK-NEXT: str w0, [x1]
31+
; CHECK-NEXT: ret
32+
store i32 %a, ptr %ptr
33+
ret void
34+
}
35+
36+
define void @store_i64(i64 %a, ptr %ptr){
37+
; CHECK-LABEL: store_i64:
38+
; CHECK: // %bb.0:
39+
; CHECK-NEXT: str x0, [x1]
40+
; CHECK-NEXT: ret
41+
store i64 %a, ptr %ptr
42+
ret void
43+
}
44+
45+
; ===== Legal Vector Types =====
46+
47+
define void @store_v8i8(<8 x i8> %a, ptr %ptr){
48+
; CHECK-LABEL: store_v8i8:
49+
; CHECK: // %bb.0:
50+
; CHECK-NEXT: str d0, [x0]
51+
; CHECK-NEXT: ret
52+
store <8 x i8> %a, ptr %ptr
53+
ret void
54+
}
55+
56+
define void @store_v16i8(<16 x i8> %a, ptr %ptr){
57+
; CHECK-LABEL: store_v16i8:
58+
; CHECK: // %bb.0:
59+
; CHECK-NEXT: str q0, [x0]
60+
; CHECK-NEXT: ret
61+
store <16 x i8> %a, ptr %ptr
62+
ret void
63+
}
64+
65+
define void @store_v4i16(<4 x i16> %a, ptr %ptr){
66+
; CHECK-LABEL: store_v4i16:
67+
; CHECK: // %bb.0:
68+
; CHECK-NEXT: str d0, [x0]
69+
; CHECK-NEXT: ret
70+
store <4 x i16> %a, ptr %ptr
71+
ret void
72+
}
73+
74+
define void @store_v8i16(<8 x i16> %a, ptr %ptr){
75+
; CHECK-LABEL: store_v8i16:
76+
; CHECK: // %bb.0:
77+
; CHECK-NEXT: str q0, [x0]
78+
; CHECK-NEXT: ret
79+
store <8 x i16> %a, ptr %ptr
80+
ret void
81+
}
82+
83+
define void @store_v2i32(<2 x i32> %a, ptr %ptr){
84+
; CHECK-LABEL: store_v2i32:
85+
; CHECK: // %bb.0:
86+
; CHECK-NEXT: str d0, [x0]
87+
; CHECK-NEXT: ret
88+
store <2 x i32> %a, ptr %ptr
89+
ret void
90+
}
91+
92+
define void @store_v4i32(<4 x i32> %a, ptr %ptr){
93+
; CHECK-LABEL: store_v4i32:
94+
; CHECK: // %bb.0:
95+
; CHECK-NEXT: str q0, [x0]
96+
; CHECK-NEXT: ret
97+
store <4 x i32> %a, ptr %ptr
98+
ret void
99+
}
100+
101+
define void @store_v2i64(<2 x i64> %a, ptr %ptr){
102+
; CHECK-LABEL: store_v2i64:
103+
; CHECK: // %bb.0:
104+
; CHECK-NEXT: str q0, [x0]
105+
; CHECK-NEXT: ret
106+
store <2 x i64> %a, ptr %ptr
107+
ret void
108+
}
109+
110+
; ===== Smaller/Larger Width Vectors with Legal Element Sizes =====
111+
112+
define void @store_v2i8(<2 x i8> %a, ptr %ptr){
113+
; CHECK-LABEL: store_v2i8:
114+
; CHECK: // %bb.0:
115+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
116+
; CHECK-NEXT: mov w8, v0.s[1]
117+
; CHECK-NEXT: fmov w9, s0
118+
; CHECK-NEXT: strb w9, [x0]
119+
; CHECK-NEXT: strb w8, [x0, #1]
120+
; CHECK-NEXT: ret
121+
store <2 x i8> %a, ptr %ptr
122+
ret void
123+
}
124+
125+
define void @store_v4i8(i32 %a, ptr %ptr) {
126+
; CHECK-LABEL: store_v4i8:
127+
; CHECK: // %bb.0:
128+
; CHECK-NEXT: str w0, [x1]
129+
; CHECK-NEXT: ret
130+
%c = bitcast i32 %a to <4 x i8>
131+
store <4 x i8> %c, ptr %ptr
132+
ret void
133+
}
134+
135+
define void @store_v32i8(<32 x i8> %a, ptr %ptr){
136+
; CHECK-LABEL: store_v32i8:
137+
; CHECK: // %bb.0:
138+
; CHECK-NEXT: stp q0, q1, [x0]
139+
; CHECK-NEXT: ret
140+
store <32 x i8> %a, ptr %ptr
141+
ret void
142+
}
143+
144+
define void @store_v2i16(<2 x i16> %a, ptr %ptr){
145+
; CHECK-SD-LABEL: store_v2i16:
146+
; CHECK-SD: // %bb.0:
147+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
148+
; CHECK-SD-NEXT: mov w8, v0.s[1]
149+
; CHECK-SD-NEXT: fmov w9, s0
150+
; CHECK-SD-NEXT: strh w9, [x0]
151+
; CHECK-SD-NEXT: strh w8, [x0, #2]
152+
; CHECK-SD-NEXT: ret
153+
;
154+
; CHECK-GI-LABEL: store_v2i16:
155+
; CHECK-GI: // %bb.0:
156+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
157+
; CHECK-GI-NEXT: mov s1, v0.s[1]
158+
; CHECK-GI-NEXT: str h0, [x0]
159+
; CHECK-GI-NEXT: str h1, [x0, #2]
160+
; CHECK-GI-NEXT: ret
161+
store <2 x i16> %a, ptr %ptr
162+
ret void
163+
}
164+
165+
define void @store_v16i16(<16 x i16> %a, ptr %ptr){
166+
; CHECK-LABEL: store_v16i16:
167+
; CHECK: // %bb.0:
168+
; CHECK-NEXT: stp q0, q1, [x0]
169+
; CHECK-NEXT: ret
170+
store <16 x i16> %a, ptr %ptr
171+
ret void
172+
}
173+
174+
define void @store_v1i32(<1 x i32> %a, ptr %ptr){
175+
; CHECK-SD-LABEL: store_v1i32:
176+
; CHECK-SD: // %bb.0:
177+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
178+
; CHECK-SD-NEXT: str s0, [x0]
179+
; CHECK-SD-NEXT: ret
180+
;
181+
; CHECK-GI-LABEL: store_v1i32:
182+
; CHECK-GI: // %bb.0:
183+
; CHECK-GI-NEXT: str s0, [x0]
184+
; CHECK-GI-NEXT: ret
185+
store <1 x i32> %a, ptr %ptr
186+
ret void
187+
}
188+
189+
define void @store_v8i32(<8 x i32> %a, ptr %ptr){
190+
; CHECK-LABEL: store_v8i32:
191+
; CHECK: // %bb.0:
192+
; CHECK-NEXT: stp q0, q1, [x0]
193+
; CHECK-NEXT: ret
194+
store <8 x i32> %a, ptr %ptr
195+
ret void
196+
}
197+
198+
define void @store_v4i64(<4 x i64> %a, ptr %ptr){
199+
; CHECK-LABEL: store_v4i64:
200+
; CHECK: // %bb.0:
201+
; CHECK-NEXT: stp q0, q1, [x0]
202+
; CHECK-NEXT: ret
203+
store <4 x i64> %a, ptr %ptr
204+
ret void
205+
}
206+
207+
; ===== Vectors with Non-Pow 2 Widths =====
208+
209+
define void @store_v3i8(<3 x i8> %a, ptr %ptr){
210+
; CHECK-SD-LABEL: store_v3i8:
211+
; CHECK-SD: // %bb.0:
212+
; CHECK-SD-NEXT: sub sp, sp, #16
213+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
214+
; CHECK-SD-NEXT: fmov s0, w0
215+
; CHECK-SD-NEXT: mov v0.h[1], w1
216+
; CHECK-SD-NEXT: mov v0.h[2], w2
217+
; CHECK-SD-NEXT: xtn v0.8b, v0.8h
218+
; CHECK-SD-NEXT: str s0, [sp, #12]
219+
; CHECK-SD-NEXT: ldrh w8, [sp, #12]
220+
; CHECK-SD-NEXT: strb w2, [x3, #2]
221+
; CHECK-SD-NEXT: strh w8, [x3]
222+
; CHECK-SD-NEXT: add sp, sp, #16
223+
; CHECK-SD-NEXT: ret
224+
;
225+
; CHECK-GI-LABEL: store_v3i8:
226+
; CHECK-GI: // %bb.0:
227+
; CHECK-GI-NEXT: strb w0, [x3]
228+
; CHECK-GI-NEXT: strb w1, [x3, #1]
229+
; CHECK-GI-NEXT: strb w2, [x3, #2]
230+
; CHECK-GI-NEXT: ret
231+
store <3 x i8> %a, ptr %ptr
232+
ret void
233+
}
234+
235+
define void @store_v7i8(<7 x i8> %a, ptr %ptr){
236+
; CHECK-SD-LABEL: store_v7i8:
237+
; CHECK-SD: // %bb.0:
238+
; CHECK-SD-NEXT: add x8, x0, #6
239+
; CHECK-SD-NEXT: add x9, x0, #4
240+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
241+
; CHECK-SD-NEXT: str s0, [x0]
242+
; CHECK-SD-NEXT: st1 { v0.b }[6], [x8]
243+
; CHECK-SD-NEXT: st1 { v0.h }[2], [x9]
244+
; CHECK-SD-NEXT: ret
245+
;
246+
; CHECK-GI-LABEL: store_v7i8:
247+
; CHECK-GI: // %bb.0:
248+
; CHECK-GI-NEXT: add x8, x0, #1
249+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
250+
; CHECK-GI-NEXT: add x9, x0, #2
251+
; CHECK-GI-NEXT: st1 { v0.b }[0], [x0]
252+
; CHECK-GI-NEXT: st1 { v0.b }[1], [x8]
253+
; CHECK-GI-NEXT: add x8, x0, #3
254+
; CHECK-GI-NEXT: st1 { v0.b }[3], [x8]
255+
; CHECK-GI-NEXT: add x8, x0, #4
256+
; CHECK-GI-NEXT: st1 { v0.b }[4], [x8]
257+
; CHECK-GI-NEXT: add x8, x0, #5
258+
; CHECK-GI-NEXT: st1 { v0.b }[5], [x8]
259+
; CHECK-GI-NEXT: add x8, x0, #6
260+
; CHECK-GI-NEXT: st1 { v0.b }[2], [x9]
261+
; CHECK-GI-NEXT: st1 { v0.b }[6], [x8]
262+
; CHECK-GI-NEXT: ret
263+
store <7 x i8> %a, ptr %ptr
264+
ret void
265+
}
266+
267+
define void @store_v3i16(<3 x i16> %a, ptr %ptr){
268+
; CHECK-SD-LABEL: store_v3i16:
269+
; CHECK-SD: // %bb.0:
270+
; CHECK-SD-NEXT: add x8, x0, #4
271+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
272+
; CHECK-SD-NEXT: str s0, [x0]
273+
; CHECK-SD-NEXT: st1 { v0.h }[2], [x8]
274+
; CHECK-SD-NEXT: ret
275+
;
276+
; CHECK-GI-LABEL: store_v3i16:
277+
; CHECK-GI: // %bb.0:
278+
; CHECK-GI-NEXT: add x8, x0, #2
279+
; CHECK-GI-NEXT: add x9, x0, #4
280+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
281+
; CHECK-GI-NEXT: str h0, [x0]
282+
; CHECK-GI-NEXT: st1 { v0.h }[1], [x8]
283+
; CHECK-GI-NEXT: st1 { v0.h }[2], [x9]
284+
; CHECK-GI-NEXT: ret
285+
store <3 x i16> %a, ptr %ptr
286+
ret void
287+
}
288+
289+
define void @store_v7i16(<7 x i16> %a, ptr %ptr){
290+
; CHECK-SD-LABEL: store_v7i16:
291+
; CHECK-SD: // %bb.0:
292+
; CHECK-SD-NEXT: add x8, x0, #12
293+
; CHECK-SD-NEXT: add x9, x0, #8
294+
; CHECK-SD-NEXT: str d0, [x0]
295+
; CHECK-SD-NEXT: st1 { v0.h }[6], [x8]
296+
; CHECK-SD-NEXT: st1 { v0.s }[2], [x9]
297+
; CHECK-SD-NEXT: ret
298+
;
299+
; CHECK-GI-LABEL: store_v7i16:
300+
; CHECK-GI: // %bb.0:
301+
; CHECK-GI-NEXT: add x8, x0, #2
302+
; CHECK-GI-NEXT: add x9, x0, #4
303+
; CHECK-GI-NEXT: str h0, [x0]
304+
; CHECK-GI-NEXT: st1 { v0.h }[1], [x8]
305+
; CHECK-GI-NEXT: add x8, x0, #6
306+
; CHECK-GI-NEXT: st1 { v0.h }[3], [x8]
307+
; CHECK-GI-NEXT: add x8, x0, #8
308+
; CHECK-GI-NEXT: st1 { v0.h }[4], [x8]
309+
; CHECK-GI-NEXT: add x8, x0, #10
310+
; CHECK-GI-NEXT: st1 { v0.h }[5], [x8]
311+
; CHECK-GI-NEXT: add x8, x0, #12
312+
; CHECK-GI-NEXT: st1 { v0.h }[2], [x9]
313+
; CHECK-GI-NEXT: st1 { v0.h }[6], [x8]
314+
; CHECK-GI-NEXT: ret
315+
store <7 x i16> %a, ptr %ptr
316+
ret void
317+
}
318+
319+
define void @store_v3i32(<3 x i32> %a, ptr %ptr){
320+
; CHECK-SD-LABEL: store_v3i32:
321+
; CHECK-SD: // %bb.0:
322+
; CHECK-SD-NEXT: add x8, x0, #8
323+
; CHECK-SD-NEXT: str d0, [x0]
324+
; CHECK-SD-NEXT: st1 { v0.s }[2], [x8]
325+
; CHECK-SD-NEXT: ret
326+
;
327+
; CHECK-GI-LABEL: store_v3i32:
328+
; CHECK-GI: // %bb.0:
329+
; CHECK-GI-NEXT: add x8, x0, #4
330+
; CHECK-GI-NEXT: add x9, x0, #8
331+
; CHECK-GI-NEXT: str s0, [x0]
332+
; CHECK-GI-NEXT: st1 { v0.s }[1], [x8]
333+
; CHECK-GI-NEXT: st1 { v0.s }[2], [x9]
334+
; CHECK-GI-NEXT: ret
335+
store <3 x i32> %a, ptr %ptr
336+
ret void
337+
}

0 commit comments

Comments
 (0)