Skip to content

Commit 22eef90

Browse files
committed
[AArch64][SVE][NFC] Add streaming mode SVE tests
Add sve-fixed-length testing files and enable streaming mode flag for: and-combine.ll bitcast.ll reshuffle.ll rev.ll sdiv-pow2.ll splat-vector.ll int-extends.ll Differential Revision: https://reviews.llvm.org/D137093
1 parent f76d3f3 commit 22eef90

7 files changed

+2670
-0
lines changed
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -force-streaming-compatible-sve < %s | FileCheck %s
3+
4+
target triple = "aarch64-unknown-linux-gnu"
5+
6+
; i8
7+
define <4 x i8> @vls_sve_and_4xi8(<4 x i8> %b) nounwind #0 {
8+
; CHECK-LABEL: vls_sve_and_4xi8:
9+
; CHECK: // %bb.0:
10+
; CHECK-NEXT: adrp x8, .LCPI0_0
11+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
12+
; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI0_0]
13+
; CHECK-NEXT: and z0.d, z0.d, z1.d
14+
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
15+
; CHECK-NEXT: ret
16+
%c = and <4 x i8> %b, <i8 0, i8 255, i8 0, i8 255>
17+
ret <4 x i8> %c
18+
}
19+
20+
define <8 x i8> @vls_sve_and_8xi8(<8 x i8> %b) nounwind #0 {
21+
; CHECK-LABEL: vls_sve_and_8xi8:
22+
; CHECK: // %bb.0:
23+
; CHECK-NEXT: adrp x8, .LCPI1_0
24+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
25+
; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI1_0]
26+
; CHECK-NEXT: and z0.d, z0.d, z1.d
27+
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
28+
; CHECK-NEXT: ret
29+
%c = and <8 x i8> %b, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
30+
ret <8 x i8> %c
31+
}
32+
33+
define <16 x i8> @vls_sve_and_16xi8(<16 x i8> %b) nounwind #0 {
34+
; CHECK-LABEL: vls_sve_and_16xi8:
35+
; CHECK: // %bb.0:
36+
; CHECK-NEXT: adrp x8, .LCPI2_0
37+
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
38+
; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI2_0]
39+
; CHECK-NEXT: and z0.d, z0.d, z1.d
40+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
41+
; CHECK-NEXT: ret
42+
%c = and <16 x i8> %b, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
43+
ret <16 x i8> %c
44+
}
45+
46+
define <32 x i8> @vls_sve_and_32xi8(<32 x i8> %ap) nounwind #0 {
47+
; CHECK-LABEL: vls_sve_and_32xi8:
48+
; CHECK: // %bb.0:
49+
; CHECK-NEXT: adrp x8, .LCPI3_0
50+
; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
51+
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
52+
; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI3_0]
53+
; CHECK-NEXT: and z0.d, z0.d, z2.d
54+
; CHECK-NEXT: and z1.d, z1.d, z2.d
55+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
56+
; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1
57+
; CHECK-NEXT: ret
58+
%b = and <32 x i8> %ap, <i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255,
59+
i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255, i8 0, i8 255>
60+
ret <32 x i8> %b
61+
}
62+
63+
; i16
64+
define <2 x i16> @vls_sve_and_2xi16(<2 x i16> %b) nounwind #0 {
65+
; CHECK-LABEL: vls_sve_and_2xi16:
66+
; CHECK: // %bb.0:
67+
; CHECK-NEXT: sub sp, sp, #16
68+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
69+
; CHECK-NEXT: mov z0.s, z0.s[1]
70+
; CHECK-NEXT: fmov w8, s0
71+
; CHECK-NEXT: stp wzr, w8, [sp, #8]
72+
; CHECK-NEXT: ldr d0, [sp, #8]
73+
; CHECK-NEXT: add sp, sp, #16
74+
; CHECK-NEXT: ret
75+
%c = and <2 x i16> %b, <i16 0, i16 65535>
76+
ret <2 x i16> %c
77+
}
78+
79+
define <4 x i16> @vls_sve_and_4xi16(<4 x i16> %b) nounwind #0 {
80+
; CHECK-LABEL: vls_sve_and_4xi16:
81+
; CHECK: // %bb.0:
82+
; CHECK-NEXT: adrp x8, .LCPI5_0
83+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
84+
; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI5_0]
85+
; CHECK-NEXT: and z0.d, z0.d, z1.d
86+
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
87+
; CHECK-NEXT: ret
88+
%c = and <4 x i16> %b, <i16 0, i16 65535, i16 0, i16 65535>
89+
ret <4 x i16> %c
90+
}
91+
92+
define <8 x i16> @vls_sve_and_8xi16(<8 x i16> %b) nounwind #0 {
93+
; CHECK-LABEL: vls_sve_and_8xi16:
94+
; CHECK: // %bb.0:
95+
; CHECK-NEXT: adrp x8, .LCPI6_0
96+
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
97+
; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI6_0]
98+
; CHECK-NEXT: and z0.d, z0.d, z1.d
99+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
100+
; CHECK-NEXT: ret
101+
%c = and <8 x i16> %b, <i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535>
102+
ret <8 x i16> %c
103+
}
104+
105+
define <16 x i16> @vls_sve_and_16xi16(<16 x i16> %b) nounwind #0 {
106+
; CHECK-LABEL: vls_sve_and_16xi16:
107+
; CHECK: // %bb.0:
108+
; CHECK-NEXT: adrp x8, .LCPI7_0
109+
; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
110+
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
111+
; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI7_0]
112+
; CHECK-NEXT: and z0.d, z0.d, z2.d
113+
; CHECK-NEXT: and z1.d, z1.d, z2.d
114+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
115+
; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1
116+
; CHECK-NEXT: ret
117+
%c = and <16 x i16> %b, <i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535, i16 0, i16 65535>
118+
ret <16 x i16> %c
119+
}
120+
121+
; i32
122+
define <2 x i32> @vls_sve_and_2xi32(<2 x i32> %b) nounwind #0 {
123+
; CHECK-LABEL: vls_sve_and_2xi32:
124+
; CHECK: // %bb.0:
125+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
126+
; CHECK-NEXT: index z1.s, #0, #-1
127+
; CHECK-NEXT: and z0.d, z0.d, z1.d
128+
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
129+
; CHECK-NEXT: ret
130+
%c = and <2 x i32> %b, <i32 0, i32 4294967295>
131+
ret <2 x i32> %c
132+
}
133+
134+
define <4 x i32> @vls_sve_and_4xi32(<4 x i32> %b) nounwind #0 {
135+
; CHECK-LABEL: vls_sve_and_4xi32:
136+
; CHECK: // %bb.0:
137+
; CHECK-NEXT: adrp x8, .LCPI9_0
138+
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
139+
; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI9_0]
140+
; CHECK-NEXT: and z0.d, z0.d, z1.d
141+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
142+
; CHECK-NEXT: ret
143+
%c = and <4 x i32> %b, <i32 0, i32 4294967295, i32 0, i32 4294967295>
144+
ret <4 x i32> %c
145+
}
146+
147+
define <8 x i32> @vls_sve_and_8xi32(<8 x i32> %b) nounwind #0 {
148+
; CHECK-LABEL: vls_sve_and_8xi32:
149+
; CHECK: // %bb.0:
150+
; CHECK-NEXT: adrp x8, .LCPI10_0
151+
; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
152+
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
153+
; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI10_0]
154+
; CHECK-NEXT: and z0.d, z0.d, z2.d
155+
; CHECK-NEXT: and z1.d, z1.d, z2.d
156+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
157+
; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1
158+
; CHECK-NEXT: ret
159+
%c = and <8 x i32> %b, <i32 0, i32 4294967295, i32 0, i32 4294967295, i32 0, i32 4294967295, i32 0, i32 4294967295>
160+
ret <8 x i32> %c
161+
}
162+
163+
; i64
164+
define <2 x i64> @vls_sve_and_2xi64(<2 x i64> %b) nounwind #0 {
165+
; CHECK-LABEL: vls_sve_and_2xi64:
166+
; CHECK: // %bb.0:
167+
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
168+
; CHECK-NEXT: index z1.d, #0, #-1
169+
; CHECK-NEXT: and z0.d, z0.d, z1.d
170+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
171+
; CHECK-NEXT: ret
172+
%c = and <2 x i64> %b, <i64 0, i64 18446744073709551615>
173+
ret <2 x i64> %c
174+
}
175+
176+
define <4 x i64> @vls_sve_and_4xi64(<4 x i64> %b) nounwind #0 {
177+
; CHECK-LABEL: vls_sve_and_4xi64:
178+
; CHECK: // %bb.0:
179+
; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
180+
; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
181+
; CHECK-NEXT: index z2.d, #0, #-1
182+
; CHECK-NEXT: and z0.d, z0.d, z2.d
183+
; CHECK-NEXT: and z1.d, z1.d, z2.d
184+
; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
185+
; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1
186+
; CHECK-NEXT: ret
187+
%c = and <4 x i64> %b, <i64 0, i64 18446744073709551615, i64 0, i64 18446744073709551615>
188+
ret <4 x i64> %c
189+
}
190+
191+
attributes #0 = { "target-features"="+sve" }
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -force-streaming-compatible-sve < %s | FileCheck %s
3+
4+
target triple = "aarch64-unknown-linux-gnu"
5+
6+
define void @bitcast_v4i8(<4 x i8> *%a, <4 x i8>* %b) #0 {
7+
; CHECK-LABEL: bitcast_v4i8:
8+
; CHECK: // %bb.0:
9+
; CHECK-NEXT: ldr s0, [x0]
10+
; CHECK-NEXT: ptrue p0.h, vl4
11+
; CHECK-NEXT: uunpklo z0.h, z0.b
12+
; CHECK-NEXT: st1b { z0.h }, p0, [x1]
13+
; CHECK-NEXT: ret
14+
%load = load volatile <4 x i8>, <4 x i8>* %a
15+
%cast = bitcast <4 x i8> %load to <4 x i8>
16+
store volatile <4 x i8> %cast, <4 x i8>* %b
17+
ret void
18+
}
19+
20+
define void @bitcast_v8i8(<8 x i8> *%a, <8 x i8>* %b) #0 {
21+
; CHECK-LABEL: bitcast_v8i8:
22+
; CHECK: // %bb.0:
23+
; CHECK-NEXT: ldr d0, [x0]
24+
; CHECK-NEXT: str d0, [x1]
25+
; CHECK-NEXT: ret
26+
%load = load volatile <8 x i8>, <8 x i8>* %a
27+
%cast = bitcast <8 x i8> %load to <8 x i8>
28+
store volatile <8 x i8> %cast, <8 x i8>* %b
29+
ret void
30+
}
31+
32+
define void @bitcast_v16i8(<16 x i8> *%a, <16 x i8>* %b) #0 {
33+
; CHECK-LABEL: bitcast_v16i8:
34+
; CHECK: // %bb.0:
35+
; CHECK-NEXT: ldr q0, [x0]
36+
; CHECK-NEXT: str q0, [x1]
37+
; CHECK-NEXT: ret
38+
%load = load volatile <16 x i8>, <16 x i8>* %a
39+
%cast = bitcast <16 x i8> %load to <16 x i8>
40+
store volatile <16 x i8> %cast, <16 x i8>* %b
41+
ret void
42+
}
43+
44+
define void @bitcast_v32i8(<32 x i8> *%a, <32 x i8>* %b) #0 {
45+
; CHECK-LABEL: bitcast_v32i8:
46+
; CHECK: // %bb.0:
47+
; CHECK-NEXT: ldr q0, [x0]
48+
; CHECK-NEXT: ldr q1, [x0, #16]
49+
; CHECK-NEXT: str q1, [x1, #16]
50+
; CHECK-NEXT: str q0, [x1]
51+
; CHECK-NEXT: ret
52+
%load = load volatile <32 x i8>, <32 x i8>* %a
53+
%cast = bitcast <32 x i8> %load to <32 x i8>
54+
store volatile <32 x i8> %cast, <32 x i8>* %b
55+
ret void
56+
}
57+
58+
define void @bitcast_v2i16(<2 x i16> *%a, <2 x half>* %b) #0 {
59+
; CHECK-LABEL: bitcast_v2i16:
60+
; CHECK: // %bb.0:
61+
; CHECK-NEXT: sub sp, sp, #16
62+
; CHECK-NEXT: .cfi_def_cfa_offset 16
63+
; CHECK-NEXT: ldrh w8, [x0, #2]
64+
; CHECK-NEXT: str w8, [sp, #4]
65+
; CHECK-NEXT: ldrh w8, [x0]
66+
; CHECK-NEXT: str w8, [sp]
67+
; CHECK-NEXT: ldr d0, [sp]
68+
; CHECK-NEXT: mov z1.s, z0.s[1]
69+
; CHECK-NEXT: fmov w8, s0
70+
; CHECK-NEXT: fmov w9, s1
71+
; CHECK-NEXT: strh w8, [sp, #8]
72+
; CHECK-NEXT: strh w9, [sp, #10]
73+
; CHECK-NEXT: ldr d0, [sp, #8]
74+
; CHECK-NEXT: fmov w8, s0
75+
; CHECK-NEXT: str w8, [x1]
76+
; CHECK-NEXT: add sp, sp, #16
77+
; CHECK-NEXT: ret
78+
%load = load volatile <2 x i16>, <2 x i16>* %a
79+
%cast = bitcast <2 x i16> %load to <2 x half>
80+
store volatile <2 x half> %cast, <2 x half>* %b
81+
ret void
82+
}
83+
84+
define void @bitcast_v4i16(<4 x i16> *%a, <4 x half>* %b) #0 {
85+
; CHECK-LABEL: bitcast_v4i16:
86+
; CHECK: // %bb.0:
87+
; CHECK-NEXT: ldr d0, [x0]
88+
; CHECK-NEXT: str d0, [x1]
89+
; CHECK-NEXT: ret
90+
%load = load volatile <4 x i16>, <4 x i16>* %a
91+
%cast = bitcast <4 x i16> %load to <4 x half>
92+
store volatile <4 x half> %cast, <4 x half>* %b
93+
ret void
94+
}
95+
96+
define void @bitcast_v8i16(<8 x i16> *%a, <8 x half>* %b) #0 {
97+
; CHECK-LABEL: bitcast_v8i16:
98+
; CHECK: // %bb.0:
99+
; CHECK-NEXT: ldr q0, [x0]
100+
; CHECK-NEXT: str q0, [x1]
101+
; CHECK-NEXT: ret
102+
%load = load volatile <8 x i16>, <8 x i16>* %a
103+
%cast = bitcast <8 x i16> %load to <8 x half>
104+
store volatile <8 x half> %cast, <8 x half>* %b
105+
ret void
106+
}
107+
108+
define void @bitcast_v16i16(<16 x i16> *%a, <16 x half>* %b) #0 {
109+
; CHECK-LABEL: bitcast_v16i16:
110+
; CHECK: // %bb.0:
111+
; CHECK-NEXT: ldr q0, [x0]
112+
; CHECK-NEXT: ldr q1, [x0, #16]
113+
; CHECK-NEXT: str q1, [x1, #16]
114+
; CHECK-NEXT: str q0, [x1]
115+
; CHECK-NEXT: ret
116+
%load = load volatile <16 x i16>, <16 x i16>* %a
117+
%cast = bitcast <16 x i16> %load to <16 x half>
118+
store volatile <16 x half> %cast, <16 x half>* %b
119+
ret void
120+
}
121+
122+
define void @bitcast_v2i32(<2 x i32> *%a, <2 x float>* %b) #0 {
123+
; CHECK-LABEL: bitcast_v2i32:
124+
; CHECK: // %bb.0:
125+
; CHECK-NEXT: ldr d0, [x0]
126+
; CHECK-NEXT: str d0, [x1]
127+
; CHECK-NEXT: ret
128+
%load = load volatile <2 x i32>, <2 x i32>* %a
129+
%cast = bitcast <2 x i32> %load to <2 x float>
130+
store volatile <2 x float> %cast, <2 x float>* %b
131+
ret void
132+
}
133+
134+
define void @bitcast_v4i32(<4 x i32> *%a, <4 x float>* %b) #0 {
135+
; CHECK-LABEL: bitcast_v4i32:
136+
; CHECK: // %bb.0:
137+
; CHECK-NEXT: ldr q0, [x0]
138+
; CHECK-NEXT: str q0, [x1]
139+
; CHECK-NEXT: ret
140+
%load = load volatile <4 x i32>, <4 x i32>* %a
141+
%cast = bitcast <4 x i32> %load to <4 x float>
142+
store volatile <4 x float> %cast, <4 x float>* %b
143+
ret void
144+
}
145+
146+
define void @bitcast_v8i32(<8 x i32> *%a, <8 x float>* %b) #0 {
147+
; CHECK-LABEL: bitcast_v8i32:
148+
; CHECK: // %bb.0:
149+
; CHECK-NEXT: ldr q0, [x0]
150+
; CHECK-NEXT: ldr q1, [x0, #16]
151+
; CHECK-NEXT: str q1, [x1, #16]
152+
; CHECK-NEXT: str q0, [x1]
153+
; CHECK-NEXT: ret
154+
%load = load volatile <8 x i32>, <8 x i32>* %a
155+
%cast = bitcast <8 x i32> %load to <8 x float>
156+
store volatile <8 x float> %cast, <8 x float>* %b
157+
ret void
158+
}
159+
160+
define void @bitcast_v1i64(<1 x i64> *%a, <1 x double>* %b) #0 {
161+
; CHECK-LABEL: bitcast_v1i64:
162+
; CHECK: // %bb.0:
163+
; CHECK-NEXT: ldr d0, [x0]
164+
; CHECK-NEXT: str d0, [x1]
165+
; CHECK-NEXT: ret
166+
%load = load volatile <1 x i64>, <1 x i64>* %a
167+
%cast = bitcast <1 x i64> %load to <1 x double>
168+
store volatile <1 x double> %cast, <1 x double>* %b
169+
ret void
170+
}
171+
172+
define void @bitcast_v2i64(<2 x i64> *%a, <2 x double>* %b) #0 {
173+
; CHECK-LABEL: bitcast_v2i64:
174+
; CHECK: // %bb.0:
175+
; CHECK-NEXT: ldr q0, [x0]
176+
; CHECK-NEXT: str q0, [x1]
177+
; CHECK-NEXT: ret
178+
%load = load volatile <2 x i64>, <2 x i64>* %a
179+
%cast = bitcast <2 x i64> %load to <2 x double>
180+
store volatile <2 x double> %cast, <2 x double>* %b
181+
ret void
182+
}
183+
184+
define void @bitcast_v4i64(<4 x i64> *%a, <4 x double>* %b) #0 {
185+
; CHECK-LABEL: bitcast_v4i64:
186+
; CHECK: // %bb.0:
187+
; CHECK-NEXT: ldr q0, [x0]
188+
; CHECK-NEXT: ldr q1, [x0, #16]
189+
; CHECK-NEXT: str q1, [x1, #16]
190+
; CHECK-NEXT: str q0, [x1]
191+
; CHECK-NEXT: ret
192+
%load = load volatile <4 x i64>, <4 x i64>* %a
193+
%cast = bitcast <4 x i64> %load to <4 x double>
194+
store volatile <4 x double> %cast, <4 x double>* %b
195+
ret void
196+
}
197+
198+
attributes #0 = { "target-features"="+sve" }

0 commit comments

Comments
 (0)