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)
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)
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)
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)
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)
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)
68 define <4 x i32> @check_le_vec_sldwi_va_vb_0(<4 x i32> %VA, <4 x i32> %VB) {
70 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
72 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_vb_0
76 define <4 x i32> @check_le_vec_sldwi_va_vb_1(<4 x i32> %VA, <4 x i32> %VB) {
78 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
80 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_vb_1
81 ; CHECK-LE: xxsldwi 34, 34, 35, 1
85 define <4 x i32> @check_le_vec_sldwi_va_vb_2(<4 x i32> %VA, <4 x i32> %VB) {
87 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
89 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_vb_2
90 ; CHECK-LE: xxsldwi 34, 34, 35, 2
94 define <4 x i32> @check_le_vec_sldwi_va_vb_3(<4 x i32> %VA, <4 x i32> %VB) {
96 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
98 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_vb_3
99 ; CHECK-LE: xxsldwi 34, 34, 35, 3
103 define <4 x i32> @check_le_swap_vec_sldwi_va_vb_0(<4 x i32> %VA, <4 x i32> %VB) {
105 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
107 ; CHECK-LE-LABEL: @check_le_swap_vec_sldwi_va_vb_0
112 define <4 x i32> @check_le_swap_vec_sldwi_va_vb_1(<4 x i32> %VA, <4 x i32> %VB) {
114 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
116 ; CHECK-LE-LABEL: @check_le_swap_vec_sldwi_va_vb_1
117 ; CHECK-LE: xxsldwi 34, 35, 34, 1
121 define <4 x i32> @check_le_swap_vec_sldwi_va_vb_2(<4 x i32> %VA, <4 x i32> %VB) {
123 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
125 ; CHECK-LE-LABEL: @check_le_swap_vec_sldwi_va_vb_2
126 ; CHECK-LE: xxsldwi 34, 35, 34, 2
130 define <4 x i32> @check_le_swap_vec_sldwi_va_vb_3(<4 x i32> %VA, <4 x i32> %VB) {
132 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
134 ; CHECK-LE-LABEL: @check_le_swap_vec_sldwi_va_vb_3
135 ; CHECK-LE: xxsldwi 34, 35, 34, 3
139 define <4 x i32> @check_le_vec_sldwi_va_undef_0(<4 x i32> %VA) {
141 %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
143 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_undef_0
147 define <4 x i32> @check_le_vec_sldwi_va_undef_1(<4 x i32> %VA) {
149 %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
151 ; CHECK-BE-LABEL: @check_le_vec_sldwi_va_undef_1
152 ; CHECK-LE: xxsldwi 34, 34, 34, 1
156 define <4 x i32> @check_le_vec_sldwi_va_undef_2(<4 x i32> %VA) {
158 %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
160 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_undef_2
161 ; CHECK-LE: xxswapd 34, 34
165 define <4 x i32> @check_le_vec_sldwi_va_undef_3(<4 x i32> %VA) {
167 %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
169 ; CHECK-LE-LABEL: @check_le_vec_sldwi_va_undef_3
170 ; CHECK-LE: xxsldwi 34, 34, 34, 3
174 define <4 x i32> @check_be_vec_sldwi_va_vb_0(<4 x i32> %VA, <4 x i32> %VB) {
176 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
178 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_vb_0
182 define <4 x i32> @check_be_vec_sldwi_va_vb_1(<4 x i32> %VA, <4 x i32> %VB) {
184 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
186 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_vb_1
187 ; CHECK-BE: xxsldwi 34, 34, 35, 1
191 define <4 x i32> @check_be_vec_sldwi_va_vb_2(<4 x i32> %VA, <4 x i32> %VB) {
193 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
195 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_vb_2
196 ; CHECK-BE: xxsldwi 34, 34, 35, 2
200 define <4 x i32> @check_be_vec_sldwi_va_vb_3(<4 x i32> %VA, <4 x i32> %VB) {
202 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
204 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_vb_3
205 ; CHECK-BE: xxsldwi 34, 34, 35, 3
209 define <4 x i32> @check_be_swap_vec_sldwi_va_vb_0(<4 x i32> %VA, <4 x i32> %VB) {
211 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
213 ; CHECK-BE-LABEL: @check_be_swap_vec_sldwi_va_vb_0
218 define <4 x i32> @check_be_swap_vec_sldwi_va_vb_1(<4 x i32> %VA, <4 x i32> %VB) {
220 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
222 ; CHECK-BE-LABEL: @check_be_swap_vec_sldwi_va_vb_1
223 ; CHECK-BE: xxsldwi 34, 35, 34, 1
227 define <4 x i32> @check_be_swap_vec_sldwi_va_vb_2(<4 x i32> %VA, <4 x i32> %VB) {
229 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
231 ; CHECK-BE-LABEL: @check_be_swap_vec_sldwi_va_vb_2
232 ; CHECK-BE: xxsldwi 34, 35, 34, 2
236 define <4 x i32> @check_be_swap_vec_sldwi_va_vb_3(<4 x i32> %VA, <4 x i32> %VB) {
238 %0 = shufflevector <4 x i32> %VA, <4 x i32> %VB, <4 x i32> <i32 7, i32 0, i32 1, i32 2>
240 ; CHECK-BE-LABEL: @check_be_swap_vec_sldwi_va_vb_3
241 ; CHECK-BE: xxsldwi 34, 35, 34, 3
245 define <4 x i32> @check_be_vec_sldwi_va_undef_0(<4 x i32> %VA) {
247 %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
249 ; CHECK-LE-LABEL: @check_be_vec_sldwi_va_undef_0
253 define <4 x i32> @check_be_vec_sldwi_va_undef_1(<4 x i32> %VA) {
255 %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
257 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_undef_1
258 ; CHECK-BE: xxsldwi 34, 34, 34, 1
262 define <4 x i32> @check_be_vec_sldwi_va_undef_2(<4 x i32> %VA) {
264 %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
266 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_undef_2
267 ; CHECK-BE: xxswapd 34, 34
271 define <4 x i32> @check_be_vec_sldwi_va_undef_3(<4 x i32> %VA) {
273 %0 = shufflevector <4 x i32> %VA, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
275 ; CHECK-BE-LABEL: @check_be_vec_sldwi_va_undef_3
276 ; CHECK-BE: xxsldwi 34, 34, 34, 3
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) {
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>
285 ; CHECK-LE-LABEL: @test_le_vec_sldwi_v16i8_v16i8
286 ; CHECK-LE: xxsldwi 34, 34, 35, 1
290 define <8 x i16> @test_le_vec_sldwi_v8i16_v8i16(<8 x i16> %VA, <8 x i16> %VB) {
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>
294 ; CHECK-LE-LABEL: @test_le_vec_sldwi_v8i16_v8i16
295 ; CHECK-LE: xxsldwi 34, 34, 35, 1
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) {
302 %0 = shufflevector <2 x i64> %VA, <2 x i64> %VB,<2 x i32> <i32 3, i32 0>
304 ; CHECK-LE-LABEL: @test_be_vec_sldwi_v2i64_v2i64
305 ; CHECK-LE: xxpermdi 34, 34, 35, 2