1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
3 ; RUN: -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s \
4 ; RUN: -check-prefix=P9-VSX
5 ; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
6 ; RUN: -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs -mattr=-vsx < %s | FileCheck %s \
7 ; RUN: -check-prefix=P9-NOVSX
8 ; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
9 ; RUN: -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s \
10 ; RUN: -check-prefix=P8-VSX
11 ; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
12 ; RUN: -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs -mattr=-vsx < %s | FileCheck %s \
13 ; RUN: -check-prefix=P8-NOVSX
15 define <1 x i128> @rotl_64(<1 x i128> %num) {
16 ; P9-VSX-LABEL: rotl_64:
17 ; P9-VSX: # %bb.0: # %entry
18 ; P9-VSX-NEXT: xxswapd v2, v2
21 ; P9-NOVSX-LABEL: rotl_64:
22 ; P9-NOVSX: # %bb.0: # %entry
23 ; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 8
26 ; P8-VSX-LABEL: rotl_64:
27 ; P8-VSX: # %bb.0: # %entry
28 ; P8-VSX-NEXT: xxswapd v2, v2
31 ; P8-NOVSX-LABEL: rotl_64:
32 ; P8-NOVSX: # %bb.0: # %entry
33 ; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 8
36 %shl = shl <1 x i128> %num, <i128 64>
37 %shr = lshr <1 x i128> %num, <i128 64>
38 %or = or <1 x i128> %shl, %shr
42 define <1 x i128> @rotl_32(<1 x i128> %num) {
43 ; P9-VSX-LABEL: rotl_32:
44 ; P9-VSX: # %bb.0: # %entry
45 ; P9-VSX-NEXT: xxsldwi v2, v2, v2, 3
48 ; P9-NOVSX-LABEL: rotl_32:
49 ; P9-NOVSX: # %bb.0: # %entry
50 ; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 12
53 ; P8-VSX-LABEL: rotl_32:
54 ; P8-VSX: # %bb.0: # %entry
55 ; P8-VSX-NEXT: xxsldwi v2, v2, v2, 3
58 ; P8-NOVSX-LABEL: rotl_32:
59 ; P8-NOVSX: # %bb.0: # %entry
60 ; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 12
63 %shl = shl <1 x i128> %num, <i128 32>
64 %shr = lshr <1 x i128> %num, <i128 96>
65 %or = or <1 x i128> %shl, %shr
69 define <1 x i128> @rotl_96(<1 x i128> %num) {
70 ; P9-VSX-LABEL: rotl_96:
71 ; P9-VSX: # %bb.0: # %entry
72 ; P9-VSX-NEXT: xxsldwi v2, v2, v2, 1
75 ; P9-NOVSX-LABEL: rotl_96:
76 ; P9-NOVSX: # %bb.0: # %entry
77 ; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 4
80 ; P8-VSX-LABEL: rotl_96:
81 ; P8-VSX: # %bb.0: # %entry
82 ; P8-VSX-NEXT: xxsldwi v2, v2, v2, 1
85 ; P8-NOVSX-LABEL: rotl_96:
86 ; P8-NOVSX: # %bb.0: # %entry
87 ; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 4
90 %shl = shl <1 x i128> %num, <i128 96>
91 %shr = lshr <1 x i128> %num, <i128 32>
92 %or = or <1 x i128> %shl, %shr
96 define <1 x i128> @rotl_16(<1 x i128> %num) {
97 ; P9-VSX-LABEL: rotl_16:
98 ; P9-VSX: # %bb.0: # %entry
99 ; P9-VSX-NEXT: vsldoi v2, v2, v2, 14
102 ; P9-NOVSX-LABEL: rotl_16:
103 ; P9-NOVSX: # %bb.0: # %entry
104 ; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 14
107 ; P8-VSX-LABEL: rotl_16:
108 ; P8-VSX: # %bb.0: # %entry
109 ; P8-VSX-NEXT: vsldoi v2, v2, v2, 14
112 ; P8-NOVSX-LABEL: rotl_16:
113 ; P8-NOVSX: # %bb.0: # %entry
114 ; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 14
117 %shl = shl <1 x i128> %num, <i128 16>
118 %shr = lshr <1 x i128> %num, <i128 112>
119 %or = or <1 x i128> %shl, %shr
123 define <1 x i128> @rotl_112(<1 x i128> %num) {
124 ; P9-VSX-LABEL: rotl_112:
125 ; P9-VSX: # %bb.0: # %entry
126 ; P9-VSX-NEXT: vsldoi v2, v2, v2, 2
129 ; P9-NOVSX-LABEL: rotl_112:
130 ; P9-NOVSX: # %bb.0: # %entry
131 ; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 2
134 ; P8-VSX-LABEL: rotl_112:
135 ; P8-VSX: # %bb.0: # %entry
136 ; P8-VSX-NEXT: vsldoi v2, v2, v2, 2
139 ; P8-NOVSX-LABEL: rotl_112:
140 ; P8-NOVSX: # %bb.0: # %entry
141 ; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 2
144 %shl = shl <1 x i128> %num, <i128 112>
145 %shr = lshr <1 x i128> %num, <i128 16>
146 %or = or <1 x i128> %shl, %shr
150 define <1 x i128> @rotl_8(<1 x i128> %num) {
151 ; P9-VSX-LABEL: rotl_8:
152 ; P9-VSX: # %bb.0: # %entry
153 ; P9-VSX-NEXT: vsldoi v2, v2, v2, 15
156 ; P9-NOVSX-LABEL: rotl_8:
157 ; P9-NOVSX: # %bb.0: # %entry
158 ; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 15
161 ; P8-VSX-LABEL: rotl_8:
162 ; P8-VSX: # %bb.0: # %entry
163 ; P8-VSX-NEXT: vsldoi v2, v2, v2, 15
166 ; P8-NOVSX-LABEL: rotl_8:
167 ; P8-NOVSX: # %bb.0: # %entry
168 ; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 15
171 %shl = shl <1 x i128> %num, <i128 8>
172 %shr = lshr <1 x i128> %num, <i128 120>
173 %or = or <1 x i128> %shl, %shr
177 define <1 x i128> @rotl_120(<1 x i128> %num) {
178 ; P9-VSX-LABEL: rotl_120:
179 ; P9-VSX: # %bb.0: # %entry
180 ; P9-VSX-NEXT: vsldoi v2, v2, v2, 1
183 ; P9-NOVSX-LABEL: rotl_120:
184 ; P9-NOVSX: # %bb.0: # %entry
185 ; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 1
188 ; P8-VSX-LABEL: rotl_120:
189 ; P8-VSX: # %bb.0: # %entry
190 ; P8-VSX-NEXT: vsldoi v2, v2, v2, 1
193 ; P8-NOVSX-LABEL: rotl_120:
194 ; P8-NOVSX: # %bb.0: # %entry
195 ; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 1
198 %shl = shl <1 x i128> %num, <i128 120>
199 %shr = lshr <1 x i128> %num, <i128 8>
200 %or = or <1 x i128> %shl, %shr
204 define <1 x i128> @rotl_28(<1 x i128> %num) {
205 ; P9-VSX-LABEL: rotl_28:
206 ; P9-VSX: # %bb.0: # %entry
207 ; P9-VSX-NEXT: mfvsrld r4, v2
208 ; P9-VSX-NEXT: mfvsrd r3, v2
209 ; P9-VSX-NEXT: rotldi r5, r4, 28
210 ; P9-VSX-NEXT: rldimi r5, r3, 28, 0
211 ; P9-VSX-NEXT: rotldi r3, r3, 28
212 ; P9-VSX-NEXT: rldimi r3, r4, 28, 0
213 ; P9-VSX-NEXT: mtvsrdd v2, r5, r3
216 ; P9-NOVSX-LABEL: rotl_28:
217 ; P9-NOVSX: # %bb.0: # %entry
218 ; P9-NOVSX-NEXT: addi r3, r1, -32
219 ; P9-NOVSX-NEXT: stvx v2, 0, r3
220 ; P9-NOVSX-NEXT: ld r4, -32(r1)
221 ; P9-NOVSX-NEXT: ld r3, -24(r1)
222 ; P9-NOVSX-NEXT: rotldi r5, r4, 28
223 ; P9-NOVSX-NEXT: rldimi r5, r3, 28, 0
224 ; P9-NOVSX-NEXT: rotldi r3, r3, 28
225 ; P9-NOVSX-NEXT: rldimi r3, r4, 28, 0
226 ; P9-NOVSX-NEXT: std r5, -8(r1)
227 ; P9-NOVSX-NEXT: std r3, -16(r1)
228 ; P9-NOVSX-NEXT: addi r3, r1, -16
229 ; P9-NOVSX-NEXT: lvx v2, 0, r3
232 ; P8-VSX-LABEL: rotl_28:
233 ; P8-VSX: # %bb.0: # %entry
234 ; P8-VSX-NEXT: xxswapd vs0, v2
235 ; P8-VSX-NEXT: mfvsrd r4, v2
236 ; P8-VSX-NEXT: rotldi r5, r4, 28
237 ; P8-VSX-NEXT: mffprd r3, f0
238 ; P8-VSX-NEXT: rldimi r5, r3, 28, 0
239 ; P8-VSX-NEXT: rotldi r3, r3, 28
240 ; P8-VSX-NEXT: rldimi r3, r4, 28, 0
241 ; P8-VSX-NEXT: mtfprd f0, r5
242 ; P8-VSX-NEXT: mtfprd f1, r3
243 ; P8-VSX-NEXT: xxmrghd v2, vs1, vs0
246 ; P8-NOVSX-LABEL: rotl_28:
247 ; P8-NOVSX: # %bb.0: # %entry
248 ; P8-NOVSX-NEXT: addi r3, r1, -32
249 ; P8-NOVSX-NEXT: stvx v2, 0, r3
250 ; P8-NOVSX-NEXT: ld r4, -32(r1)
251 ; P8-NOVSX-NEXT: ld r3, -24(r1)
252 ; P8-NOVSX-NEXT: rotldi r5, r4, 28
253 ; P8-NOVSX-NEXT: rldimi r5, r3, 28, 0
254 ; P8-NOVSX-NEXT: rotldi r3, r3, 28
255 ; P8-NOVSX-NEXT: rldimi r3, r4, 28, 0
256 ; P8-NOVSX-NEXT: std r5, -8(r1)
257 ; P8-NOVSX-NEXT: std r3, -16(r1)
258 ; P8-NOVSX-NEXT: addi r3, r1, -16
259 ; P8-NOVSX-NEXT: lvx v2, 0, r3
262 %shl = shl <1 x i128> %num, <i128 28>
263 %shr = lshr <1 x i128> %num, <i128 100>
264 %or = or <1 x i128> %shl, %shr
268 define <1 x i128> @NO_rotl(<1 x i128> %num) {
269 ; P9-VSX-LABEL: NO_rotl:
270 ; P9-VSX: # %bb.0: # %entry
271 ; P9-VSX-NEXT: addis r3, r2, .LCPI8_0@toc@ha
272 ; P9-VSX-NEXT: addi r3, r3, .LCPI8_0@toc@l
273 ; P9-VSX-NEXT: lxv v3, 0(r3)
274 ; P9-VSX-NEXT: addis r3, r2, .LCPI8_1@toc@ha
275 ; P9-VSX-NEXT: addi r3, r3, .LCPI8_1@toc@l
276 ; P9-VSX-NEXT: vslo v4, v2, v3
277 ; P9-VSX-NEXT: vspltb v3, v3, 15
278 ; P9-VSX-NEXT: vsl v3, v4, v3
279 ; P9-VSX-NEXT: lxv v4, 0(r3)
280 ; P9-VSX-NEXT: vsro v2, v2, v4
281 ; P9-VSX-NEXT: vspltb v4, v4, 15
282 ; P9-VSX-NEXT: vsr v2, v2, v4
283 ; P9-VSX-NEXT: xxlor v2, v3, v2
286 ; P9-NOVSX-LABEL: NO_rotl:
287 ; P9-NOVSX: # %bb.0: # %entry
288 ; P9-NOVSX-NEXT: addis r3, r2, .LCPI8_0@toc@ha
289 ; P9-NOVSX-NEXT: addi r3, r3, .LCPI8_0@toc@l
290 ; P9-NOVSX-NEXT: lvx v3, 0, r3
291 ; P9-NOVSX-NEXT: addis r3, r2, .LCPI8_1@toc@ha
292 ; P9-NOVSX-NEXT: addi r3, r3, .LCPI8_1@toc@l
293 ; P9-NOVSX-NEXT: vslo v4, v2, v3
294 ; P9-NOVSX-NEXT: vspltb v3, v3, 15
295 ; P9-NOVSX-NEXT: vsl v3, v4, v3
296 ; P9-NOVSX-NEXT: lvx v4, 0, r3
297 ; P9-NOVSX-NEXT: vsro v2, v2, v4
298 ; P9-NOVSX-NEXT: vspltb v4, v4, 15
299 ; P9-NOVSX-NEXT: vsr v2, v2, v4
300 ; P9-NOVSX-NEXT: vor v2, v3, v2
303 ; P8-VSX-LABEL: NO_rotl:
304 ; P8-VSX: # %bb.0: # %entry
305 ; P8-VSX-NEXT: xxswapd vs0, v2
306 ; P8-VSX-NEXT: mfvsrd r4, v2
307 ; P8-VSX-NEXT: mffprd r3, f0
308 ; P8-VSX-NEXT: rotldi r5, r3, 20
309 ; P8-VSX-NEXT: sldi r3, r3, 20
310 ; P8-VSX-NEXT: rldimi r5, r4, 20, 0
311 ; P8-VSX-NEXT: mtfprd f0, r3
312 ; P8-VSX-NEXT: li r3, 0
313 ; P8-VSX-NEXT: mtfprd f1, r5
314 ; P8-VSX-NEXT: xxmrghd v2, vs1, vs0
315 ; P8-VSX-NEXT: mtfprd f0, r3
316 ; P8-VSX-NEXT: rldicl r3, r4, 28, 36
317 ; P8-VSX-NEXT: mtfprd f1, r3
318 ; P8-VSX-NEXT: xxmrghd v3, vs0, vs1
319 ; P8-VSX-NEXT: xxlor v2, v2, v3
322 ; P8-NOVSX-LABEL: NO_rotl:
323 ; P8-NOVSX: # %bb.0: # %entry
324 ; P8-NOVSX-NEXT: addis r3, r2, .LCPI8_0@toc@ha
325 ; P8-NOVSX-NEXT: addi r3, r3, .LCPI8_0@toc@l
326 ; P8-NOVSX-NEXT: lvx v3, 0, r3
327 ; P8-NOVSX-NEXT: addis r3, r2, .LCPI8_1@toc@ha
328 ; P8-NOVSX-NEXT: addi r3, r3, .LCPI8_1@toc@l
329 ; P8-NOVSX-NEXT: lvx v5, 0, r3
330 ; P8-NOVSX-NEXT: vslo v4, v2, v3
331 ; P8-NOVSX-NEXT: vspltb v3, v3, 15
332 ; P8-NOVSX-NEXT: vsl v3, v4, v3
333 ; P8-NOVSX-NEXT: vsro v2, v2, v5
334 ; P8-NOVSX-NEXT: vspltb v5, v5, 15
335 ; P8-NOVSX-NEXT: vsr v2, v2, v5
336 ; P8-NOVSX-NEXT: vor v2, v3, v2
339 %shl = shl <1 x i128> %num, <i128 20>
340 %shr = lshr <1 x i128> %num, <i128 100>
341 %or = or <1 x i128> %shl, %shr
345 define <1 x i128> @shufflevector(<1 x i128> %num) {
346 ; P9-VSX-LABEL: shufflevector:
347 ; P9-VSX: # %bb.0: # %entry
348 ; P9-VSX-NEXT: xxswapd v2, v2
351 ; P9-NOVSX-LABEL: shufflevector:
352 ; P9-NOVSX: # %bb.0: # %entry
353 ; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 8
356 ; P8-VSX-LABEL: shufflevector:
357 ; P8-VSX: # %bb.0: # %entry
358 ; P8-VSX-NEXT: xxswapd v2, v2
361 ; P8-NOVSX-LABEL: shufflevector:
362 ; P8-NOVSX: # %bb.0: # %entry
363 ; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 8
366 %0 = bitcast <1 x i128> %num to <2 x i64>
367 %vecins2 = shufflevector <2 x i64> %0, <2 x i64> undef, <2 x i32> <i32 1, i32 0>
368 %1 = bitcast <2 x i64> %vecins2 to <1 x i128>