Skip to content

Commit 3eef7a5

Browse files
committed
[AArch64][GlobalISel] Pre-Commit Test for G_STORE v4s8
1 parent 0fb3d42 commit 3eef7a5

File tree

1 file changed

+323
-0
lines changed

1 file changed

+323
-0
lines changed

llvm/test/CodeGen/AArch64/store.ll

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

0 commit comments

Comments
 (0)