[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / PowerPC / vec_sldwi.ll
blob01537d1f592723732b3aa075ca79235d8db90b4e
1 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | \
2 ; RUN:   FileCheck %s  -check-prefix=CHECK-LE
3 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | \
4 ; RUN:   FileCheck %s -check-prefix=CHECK-BE
6 ; Possible LE ShuffleVector masks (Case 1):
7 ; ShuffleVector((vector int)a, vector(int)b, 0, 1, 2, 3)
8 ; ShuffleVector((vector int)a, vector(int)b, 7, 0, 1, 2)
9 ; ShuffleVector((vector int)a, vector(int)b, 6, 7, 0, 1)
10 ; ShuffleVector((vector int)a, vector(int)b, 5, 6, 7, 0)
11 ; which targets at:
12 ; xxsldwi a, b, 0
13 ; xxsldwi a, b, 1
14 ; xxsldwi a, b, 2
15 ; xxsldwi a, b, 3
16 ; Possible LE Swap ShuffleVector masks (Case 2):
17 ; ShuffleVector((vector int)a, vector(int)b, 4, 5, 6, 7)
18 ; ShuffleVector((vector int)a, vector(int)b, 3, 4, 5, 6)
19 ; ShuffleVector((vector int)a, vector(int)b, 2, 3, 4, 5)
20 ; ShuffleVector((vector int)a, vector(int)b, 1, 2, 3, 4)
21 ; which targets at:
22 ; xxsldwi b, a, 0
23 ; xxsldwi b, a, 1
24 ; xxsldwi b, a, 2
25 ; xxsldwi b, a, 3
26 ; Possible LE ShuffleVector masks when a == b, b is undef (Case 3):
27 ; ShuffleVector((vector int)a, vector(int)a, 0, 1, 2, 3)
28 ; ShuffleVector((vector int)a, vector(int)a, 3, 0, 1, 2)
29 ; ShuffleVector((vector int)a, vector(int)a, 2, 3, 0, 1)
30 ; ShuffleVector((vector int)a, vector(int)a, 1, 2, 3, 0)
31 ; which targets at:
32 ; xxsldwi a, a, 0
33 ; xxsldwi a, a, 1
34 ; xxsldwi a, a, 2
35 ; xxsldwi a, a, 3
37 ; Possible BE ShuffleVector masks (Case 4):
38 ; ShuffleVector((vector int)a, vector(int)b, 0, 1, 2, 3)
39 ; ShuffleVector((vector int)a, vector(int)b, 1, 2, 3, 4)
40 ; ShuffleVector((vector int)a, vector(int)b, 2, 3, 4, 5)
41 ; ShuffleVector((vector int)a, vector(int)b, 3, 4, 5, 6)
42 ; which targets at:
43 ; xxsldwi b, a, 0
44 ; xxsldwi b, a, 1
45 ; xxsldwi a, a, 2
46 ; xxsldwi a, a, 3
47 ; Possible BE Swap ShuffleVector masks (Case 5):
48 ; ShuffleVector((vector int)a, vector(int)b, 4, 5, 6, 7)
49 ; ShuffleVector((vector int)a, vector(int)b, 5, 6, 7, 0)
50 ; ShuffleVector((vector int)a, vector(int)b, 6, 7, 0, 1)
51 ; ShuffleVector((vector int)a, vector(int)b, 7, 0, 1, 2)
52 ; which targets at:
53 ; xxsldwi b, a, 0
54 ; xxsldwi b, a, 1
55 ; xxsldwi b, a, 2
56 ; xxsldwi b, a, 3
57 ; Possible BE ShuffleVector masks when a == b, b is undef (Case 6):
58 ; ShuffleVector((vector int)a, vector(int)b, 0, 1, 2, 3)
59 ; ShuffleVector((vector int)a, vector(int)a, 1, 2, 3, 0)
60 ; ShuffleVector((vector int)a, vector(int)a, 2, 3, 0, 1)
61 ; ShuffleVector((vector int)a, vector(int)a, 3, 0, 1, 2)
62 ; which targets at:
63 ; xxsldwi a, a, 0
64 ; xxsldwi a, a, 1
65 ; xxsldwi a, a, 2
66 ; xxsldwi a, a, 3
68 define <4 x i32> @check_le_vec_sldwi_va_vb_0(<4 x i32> %VA, <4 x i32> %VB) {
69 entry:
70   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
71   ret <4 x i32> %0
72 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_vb_0
73 ; CHECK-LE: blr
76 define <4 x i32> @check_le_vec_sldwi_va_vb_1(<4 x i32> %VA, <4 x i32> %VB) {
77 entry:
78   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
79   ret <4 x i32> %0
80 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_vb_1
81 ; CHECK-LE: xxsldwi 34, 34, 35, 1
82 ; CHECK-LE: blr
85 define <4 x i32> @check_le_vec_sldwi_va_vb_2(<4 x i32> %VA, <4 x i32> %VB) {
86 entry:
87   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
88   ret <4 x i32> %0
89 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_vb_2
90 ; CHECK-LE: xxsldwi 34, 34, 35, 2
91 ; CHECK-LE: blr
94 define <4 x i32> @check_le_vec_sldwi_va_vb_3(<4 x i32> %VA, <4 x i32> %VB) {
95 entry:
96   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
97   ret <4 x i32> %0
98 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_vb_3
99 ; CHECK-LE: xxsldwi 34, 34, 35, 3
100 ; CHECK-LE: blr
103 define <4 x i32> @check_le_swap_vec_sldwi_va_vb_0(<4 x i32> %VA, <4 x i32> %VB) {
104 entry:
105   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
106   ret <4 x i32> %0
107 ; CHECK-LE-LABEL: @check_le_swap_vec_sldwi_va_vb_0
108 ; CHECK-LE; vmr 2, 3
109 ; CHECK-LE: blr
112 define <4 x i32> @check_le_swap_vec_sldwi_va_vb_1(<4 x i32> %VA, <4 x i32> %VB) {
113 entry:
114   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
115   ret <4 x i32> %0
116 ; CHECK-LE-LABEL: @check_le_swap_vec_sldwi_va_vb_1
117 ; CHECK-LE: xxsldwi 34, 35, 34, 1
118 ; CHECK-LE: blr
121 define <4 x i32> @check_le_swap_vec_sldwi_va_vb_2(<4 x i32> %VA, <4 x i32> %VB) {
122 entry:
123   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
124   ret <4 x i32> %0
125 ; CHECK-LE-LABEL: @check_le_swap_vec_sldwi_va_vb_2
126 ; CHECK-LE: xxsldwi 34, 35, 34, 2
127 ; CHECK-LE: blr
130 define <4 x i32> @check_le_swap_vec_sldwi_va_vb_3(<4 x i32> %VA, <4 x i32> %VB) {
131 entry:
132   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
133   ret <4 x i32> %0
134 ; CHECK-LE-LABEL: @check_le_swap_vec_sldwi_va_vb_3
135 ; CHECK-LE: xxsldwi 34, 35, 34, 3
136 ; CHECK-LE: blr
139 define <4 x i32> @check_le_vec_sldwi_va_undef_0(<4 x i32> %VA) {
140 entry:
141   %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
142   ret <4 x i32> %0
143 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_undef_0
144 ; CHECK-LE: blr
147 define <4 x i32> @check_le_vec_sldwi_va_undef_1(<4 x i32> %VA) {
148 entry:
149   %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
150   ret <4 x i32> %0
151 ; CHECK-BE-LABEL: @check_le_vec_sldwi_va_undef_1
152 ; CHECK-LE: xxsldwi 34, 34, 34, 1
153 ; CHECK-LE: blr
156 define <4 x i32> @check_le_vec_sldwi_va_undef_2(<4 x i32> %VA) {
157 entry:
158   %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
159   ret <4 x i32> %0
160 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_undef_2
161 ; CHECK-LE: xxswapd 34, 34
162 ; CHECK-LE: blr
165 define <4 x i32> @check_le_vec_sldwi_va_undef_3(<4 x i32> %VA) {
166 entry:
167   %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
168   ret <4 x i32> %0
169 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_undef_3
170 ; CHECK-LE: xxsldwi 34, 34, 34, 3
171 ; CHECK-LE: blr
174 define <4 x i32> @check_be_vec_sldwi_va_vb_0(<4 x i32> %VA, <4 x i32> %VB) {
175 entry:
176   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
177   ret <4 x i32> %0
178 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_vb_0
179 ; CHECK-BE: blr
182 define <4 x i32> @check_be_vec_sldwi_va_vb_1(<4 x i32> %VA, <4 x i32> %VB) {
183 entry:
184   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
185   ret <4 x i32> %0
186 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_vb_1
187 ; CHECK-BE: xxsldwi 34, 34, 35, 1
188 ; CHECK-BE: blr
191 define <4 x i32> @check_be_vec_sldwi_va_vb_2(<4 x i32> %VA, <4 x i32> %VB) {
192 entry:
193   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
194   ret <4 x i32> %0
195 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_vb_2
196 ; CHECK-BE: xxsldwi 34, 34, 35, 2
197 ; CHECK-BE: blr
200 define <4 x i32> @check_be_vec_sldwi_va_vb_3(<4 x i32> %VA, <4 x i32> %VB) {
201 entry:
202   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
203   ret <4 x i32> %0
204 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_vb_3
205 ; CHECK-BE: xxsldwi 34, 34, 35, 3
206 ; CHECK-BE: blr
209 define <4 x i32> @check_be_swap_vec_sldwi_va_vb_0(<4 x i32> %VA, <4 x i32> %VB) {
210 entry:
211   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
212   ret <4 x i32> %0
213 ; CHECK-BE-LABEL: @check_be_swap_vec_sldwi_va_vb_0
214 ; CHECK-LE; vmr 2, 3
215 ; CHECK-BE: blr
218 define <4 x i32> @check_be_swap_vec_sldwi_va_vb_1(<4 x i32> %VA, <4 x i32> %VB) {
219 entry:
220   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
221   ret <4 x i32> %0
222 ; CHECK-BE-LABEL: @check_be_swap_vec_sldwi_va_vb_1
223 ; CHECK-BE: xxsldwi 34, 35, 34, 1
224 ; CHECK-BE: blr
227 define <4 x i32> @check_be_swap_vec_sldwi_va_vb_2(<4 x i32> %VA, <4 x i32> %VB) {
228 entry:
229   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
230   ret <4 x i32> %0
231 ; CHECK-BE-LABEL: @check_be_swap_vec_sldwi_va_vb_2
232 ; CHECK-BE: xxsldwi 34, 35, 34, 2
233 ; CHECK-BE: blr
236 define <4 x i32> @check_be_swap_vec_sldwi_va_vb_3(<4 x i32> %VA, <4 x i32> %VB) {
237 entry:
238   %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
239   ret <4 x i32> %0
240 ; CHECK-BE-LABEL: @check_be_swap_vec_sldwi_va_vb_3
241 ; CHECK-BE: xxsldwi 34, 35, 34, 3
242 ; CHECK-BE: blr
245 define <4 x i32> @check_be_vec_sldwi_va_undef_0(<4 x i32> %VA) {
246 entry:
247   %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
248   ret <4 x i32> %0
249 ; CHECK-LE-LABEL: @check_be_vec_sldwi_va_undef_0
250 ; CHECK-BE: blr
253 define <4 x i32> @check_be_vec_sldwi_va_undef_1(<4 x i32> %VA) {
254 entry:
255   %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
256   ret <4 x i32> %0
257 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_undef_1
258 ; CHECK-BE: xxsldwi 34, 34, 34, 1
259 ; CHECK-BE: blr
262 define <4 x i32> @check_be_vec_sldwi_va_undef_2(<4 x i32> %VA) {
263 entry:
264   %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
265   ret <4 x i32> %0
266 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_undef_2
267 ; CHECK-BE: xxswapd 34, 34
268 ; CHECK-BE: blr
271 define <4 x i32> @check_be_vec_sldwi_va_undef_3(<4 x i32> %VA) {
272 entry:
273   %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
274   ret <4 x i32> %0
275 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_undef_3
276 ; CHECK-BE: xxsldwi 34, 34, 34, 3
277 ; CHECK-BE: blr
280 ; More test cases to test different types of vector inputs
281 define <16 x i8> @test_le_vec_sldwi_v16i8_v16i8(<16 x i8> %VA, <16 x i8> %VB) {
282      entry:
283       %0 = shufflevector <16 x i8> %VA, <16 x i8> %VB,<16 x i32> <i32 28, i32 29, i32 30, i32 31,i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>
284       ret <16 x i8> %0
285 ; CHECK-LE-LABEL: @test_le_vec_sldwi_v16i8_v16i8
286 ; CHECK-LE: xxsldwi 34, 34, 35, 1
287 ; CHECK-LE: blr
290 define <8 x i16> @test_le_vec_sldwi_v8i16_v8i16(<8 x i16> %VA, <8 x i16> %VB) {
291      entry:
292       %0 = shufflevector <8 x i16> %VA, <8 x i16> %VB,<8 x i32> <i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5>
293       ret <8 x i16> %0
294 ; CHECK-LE-LABEL: @test_le_vec_sldwi_v8i16_v8i16
295 ; CHECK-LE: xxsldwi 34, 34, 35, 1
296 ; CHECK-LE: blr
299 ; Note here xxpermdi 34, 34, 35, 2 <=> xxsldwi 34, 34, 35, 2
300 define <2 x i64> @test_be_vec_sldwi_v2i64_v2i64(<2 x i64> %VA, <2 x i64> %VB) {
301      entry:
302       %0 = shufflevector <2 x i64> %VA, <2 x i64> %VB,<2 x i32> <i32 3, i32 0>
303       ret <2 x i64> %0
304 ; CHECK-LE-LABEL: @test_be_vec_sldwi_v2i64_v2i64
305 ; CHECK-LE: xxpermdi 34, 34, 35, 2
306 ; CHECK-LE: blr