22; RUN: llc < %s -mtriple=ppc32-- | FileCheck %s --check-prefixes=CHECK,CHECK32,CHECK32_32
33; RUN: llc < %s -mtriple=ppc32-- -mcpu=ppc64 | FileCheck %s --check-prefixes=CHECK,CHECK32,CHECK32_64
44; RUN: llc < %s -mtriple=powerpc64le-- | FileCheck %s --check-prefixes=CHECK,CHECK64
5+ ; RUN: llc < %s -mcpu=future -mtriple=powerpc64le-- | FileCheck %s --check-prefix=FUTURE
56
67declare i8 @llvm.fshl.i8 (i8 , i8 , i8 )
78declare i16 @llvm.fshl.i16 (i16 , i16 , i16 )
@@ -24,6 +25,13 @@ define i8 @rotl_i8_const_shift(i8 %x) {
2425; CHECK-NEXT: rlwimi 4, 3, 3, 0, 28
2526; CHECK-NEXT: mr 3, 4
2627; CHECK-NEXT: blr
28+ ;
29+ ; FUTURE-LABEL: rotl_i8_const_shift:
30+ ; FUTURE: # %bb.0:
31+ ; FUTURE-NEXT: rotlwi 4, 3, 27
32+ ; FUTURE-NEXT: rlwimi 4, 3, 3, 0, 28
33+ ; FUTURE-NEXT: mr 3, 4
34+ ; FUTURE-NEXT: blr
2735 %f = call i8 @llvm.fshl.i8 (i8 %x , i8 %x , i8 3 )
2836 ret i8 %f
2937}
@@ -43,6 +51,11 @@ define i64 @rotl_i64_const_shift(i64 %x) {
4351; CHECK64: # %bb.0:
4452; CHECK64-NEXT: rotldi 3, 3, 3
4553; CHECK64-NEXT: blr
54+ ;
55+ ; FUTURE-LABEL: rotl_i64_const_shift:
56+ ; FUTURE: # %bb.0:
57+ ; FUTURE-NEXT: rotldi 3, 3, 3
58+ ; FUTURE-NEXT: blr
4659 %f = call i64 @llvm.fshl.i64 (i64 %x , i64 %x , i64 3 )
4760 ret i64 %f
4861}
@@ -60,6 +73,17 @@ define i16 @rotl_i16(i16 %x, i16 %z) {
6073; CHECK-NEXT: srw 4, 5, 4
6174; CHECK-NEXT: or 3, 3, 4
6275; CHECK-NEXT: blr
76+ ;
77+ ; FUTURE-LABEL: rotl_i16:
78+ ; FUTURE: # %bb.0:
79+ ; FUTURE-NEXT: clrlwi 6, 4, 28
80+ ; FUTURE-NEXT: neg 4, 4
81+ ; FUTURE-NEXT: clrlwi 5, 3, 16
82+ ; FUTURE-NEXT: clrlwi 4, 4, 28
83+ ; FUTURE-NEXT: slw 3, 3, 6
84+ ; FUTURE-NEXT: srw 4, 5, 4
85+ ; FUTURE-NEXT: or 3, 3, 4
86+ ; FUTURE-NEXT: blr
6387 %f = call i16 @llvm.fshl.i16 (i16 %x , i16 %x , i16 %z )
6488 ret i16 %f
6589}
@@ -69,6 +93,11 @@ define i32 @rotl_i32(i32 %x, i32 %z) {
6993; CHECK: # %bb.0:
7094; CHECK-NEXT: rotlw 3, 3, 4
7195; CHECK-NEXT: blr
96+ ;
97+ ; FUTURE-LABEL: rotl_i32:
98+ ; FUTURE: # %bb.0:
99+ ; FUTURE-NEXT: rotlw 3, 3, 4
100+ ; FUTURE-NEXT: blr
72101 %f = call i32 @llvm.fshl.i32 (i32 %x , i32 %x , i32 %z )
73102 ret i32 %f
74103}
@@ -100,6 +129,11 @@ define i64 @rotl_i64(i64 %x, i64 %z) {
100129; CHECK64: # %bb.0:
101130; CHECK64-NEXT: rotld 3, 3, 4
102131; CHECK64-NEXT: blr
132+ ;
133+ ; FUTURE-LABEL: rotl_i64:
134+ ; FUTURE: # %bb.0:
135+ ; FUTURE-NEXT: rotld 3, 3, 4
136+ ; FUTURE-NEXT: blr
103137 %f = call i64 @llvm.fshl.i64 (i64 %x , i64 %x , i64 %z )
104138 ret i64 %f
105139}
@@ -124,6 +158,11 @@ define <4 x i32> @rotl_v4i32(<4 x i32> %x, <4 x i32> %z) {
124158; CHECK64: # %bb.0:
125159; CHECK64-NEXT: vrlw 2, 2, 3
126160; CHECK64-NEXT: blr
161+ ;
162+ ; FUTURE-LABEL: rotl_v4i32:
163+ ; FUTURE: # %bb.0:
164+ ; FUTURE-NEXT: xvrlw 34, 34, 35
165+ ; FUTURE-NEXT: blr
127166 %f = call <4 x i32 > @llvm.fshl.v4i32 (<4 x i32 > %x , <4 x i32 > %x , <4 x i32 > %z )
128167 ret <4 x i32 > %f
129168}
@@ -150,6 +189,12 @@ define <4 x i32> @rotl_v4i32_const_shift(<4 x i32> %x) {
150189; CHECK64-NEXT: vspltisw 3, 3
151190; CHECK64-NEXT: vrlw 2, 2, 3
152191; CHECK64-NEXT: blr
192+ ;
193+ ; FUTURE-LABEL: rotl_v4i32_const_shift:
194+ ; FUTURE: # %bb.0:
195+ ; FUTURE-NEXT: vspltisw 3, 3
196+ ; FUTURE-NEXT: xvrlw 34, 34, 35
197+ ; FUTURE-NEXT: blr
153198 %f = call <4 x i32 > @llvm.fshl.v4i32 (<4 x i32 > %x , <4 x i32 > %x , <4 x i32 > <i32 3 , i32 3 , i32 3 , i32 3 >)
154199 ret <4 x i32 > %f
155200}
@@ -163,6 +208,13 @@ define i8 @rotr_i8_const_shift(i8 %x) {
163208; CHECK-NEXT: rlwimi 4, 3, 5, 0, 26
164209; CHECK-NEXT: mr 3, 4
165210; CHECK-NEXT: blr
211+ ;
212+ ; FUTURE-LABEL: rotr_i8_const_shift:
213+ ; FUTURE: # %bb.0:
214+ ; FUTURE-NEXT: rotlwi 4, 3, 29
215+ ; FUTURE-NEXT: rlwimi 4, 3, 5, 0, 26
216+ ; FUTURE-NEXT: mr 3, 4
217+ ; FUTURE-NEXT: blr
166218 %f = call i8 @llvm.fshr.i8 (i8 %x , i8 %x , i8 3 )
167219 ret i8 %f
168220}
@@ -172,6 +224,11 @@ define i32 @rotr_i32_const_shift(i32 %x) {
172224; CHECK: # %bb.0:
173225; CHECK-NEXT: rotlwi 3, 3, 29
174226; CHECK-NEXT: blr
227+ ;
228+ ; FUTURE-LABEL: rotr_i32_const_shift:
229+ ; FUTURE: # %bb.0:
230+ ; FUTURE-NEXT: rotlwi 3, 3, 29
231+ ; FUTURE-NEXT: blr
175232 %f = call i32 @llvm.fshr.i32 (i32 %x , i32 %x , i32 3 )
176233 ret i32 %f
177234}
@@ -189,6 +246,17 @@ define i16 @rotr_i16(i16 %x, i16 %z) {
189246; CHECK-NEXT: slw 3, 3, 4
190247; CHECK-NEXT: or 3, 5, 3
191248; CHECK-NEXT: blr
249+ ;
250+ ; FUTURE-LABEL: rotr_i16:
251+ ; FUTURE: # %bb.0:
252+ ; FUTURE-NEXT: clrlwi 6, 4, 28
253+ ; FUTURE-NEXT: neg 4, 4
254+ ; FUTURE-NEXT: clrlwi 5, 3, 16
255+ ; FUTURE-NEXT: clrlwi 4, 4, 28
256+ ; FUTURE-NEXT: srw 5, 5, 6
257+ ; FUTURE-NEXT: slw 3, 3, 4
258+ ; FUTURE-NEXT: or 3, 5, 3
259+ ; FUTURE-NEXT: blr
192260 %f = call i16 @llvm.fshr.i16 (i16 %x , i16 %x , i16 %z )
193261 ret i16 %f
194262}
@@ -199,6 +267,12 @@ define i32 @rotr_i32(i32 %x, i32 %z) {
199267; CHECK-NEXT: neg 4, 4
200268; CHECK-NEXT: rotlw 3, 3, 4
201269; CHECK-NEXT: blr
270+ ;
271+ ; FUTURE-LABEL: rotr_i32:
272+ ; FUTURE: # %bb.0:
273+ ; FUTURE-NEXT: neg 4, 4
274+ ; FUTURE-NEXT: rotlw 3, 3, 4
275+ ; FUTURE-NEXT: blr
202276 %f = call i32 @llvm.fshr.i32 (i32 %x , i32 %x , i32 %z )
203277 ret i32 %f
204278}
@@ -231,6 +305,12 @@ define i64 @rotr_i64(i64 %x, i64 %z) {
231305; CHECK64-NEXT: neg 4, 4
232306; CHECK64-NEXT: rotld 3, 3, 4
233307; CHECK64-NEXT: blr
308+ ;
309+ ; FUTURE-LABEL: rotr_i64:
310+ ; FUTURE: # %bb.0:
311+ ; FUTURE-NEXT: neg 4, 4
312+ ; FUTURE-NEXT: rotld 3, 3, 4
313+ ; FUTURE-NEXT: blr
234314 %f = call i64 @llvm.fshr.i64 (i64 %x , i64 %x , i64 %z )
235315 ret i64 %f
236316}
@@ -263,6 +343,12 @@ define <4 x i32> @rotr_v4i32(<4 x i32> %x, <4 x i32> %z) {
263343; CHECK64-NEXT: vsubuwm 3, 4, 3
264344; CHECK64-NEXT: vrlw 2, 2, 3
265345; CHECK64-NEXT: blr
346+ ;
347+ ; FUTURE-LABEL: rotr_v4i32:
348+ ; FUTURE: # %bb.0:
349+ ; FUTURE-NEXT: vnegw 3, 3
350+ ; FUTURE-NEXT: xvrlw 34, 34, 35
351+ ; FUTURE-NEXT: blr
266352 %f = call <4 x i32 > @llvm.fshr.v4i32 (<4 x i32 > %x , <4 x i32 > %x , <4 x i32 > %z )
267353 ret <4 x i32 > %f
268354}
@@ -293,6 +379,12 @@ define <4 x i32> @rotr_v4i32_const_shift(<4 x i32> %x) {
293379; CHECK64-NEXT: vsubuwm 3, 4, 3
294380; CHECK64-NEXT: vrlw 2, 2, 3
295381; CHECK64-NEXT: blr
382+ ;
383+ ; FUTURE-LABEL: rotr_v4i32_const_shift:
384+ ; FUTURE: # %bb.0:
385+ ; FUTURE-NEXT: xxspltiw 0, 29
386+ ; FUTURE-NEXT: xvrlw 34, 34, 0
387+ ; FUTURE-NEXT: blr
296388 %f = call <4 x i32 > @llvm.fshr.v4i32 (<4 x i32 > %x , <4 x i32 > %x , <4 x i32 > <i32 3 , i32 3 , i32 3 , i32 3 >)
297389 ret <4 x i32 > %f
298390}
@@ -301,6 +393,10 @@ define i32 @rotl_i32_shift_by_bitwidth(i32 %x) {
301393; CHECK-LABEL: rotl_i32_shift_by_bitwidth:
302394; CHECK: # %bb.0:
303395; CHECK-NEXT: blr
396+ ;
397+ ; FUTURE-LABEL: rotl_i32_shift_by_bitwidth:
398+ ; FUTURE: # %bb.0:
399+ ; FUTURE-NEXT: blr
304400 %f = call i32 @llvm.fshl.i32 (i32 %x , i32 %x , i32 32 )
305401 ret i32 %f
306402}
@@ -309,6 +405,10 @@ define i32 @rotr_i32_shift_by_bitwidth(i32 %x) {
309405; CHECK-LABEL: rotr_i32_shift_by_bitwidth:
310406; CHECK: # %bb.0:
311407; CHECK-NEXT: blr
408+ ;
409+ ; FUTURE-LABEL: rotr_i32_shift_by_bitwidth:
410+ ; FUTURE: # %bb.0:
411+ ; FUTURE-NEXT: blr
312412 %f = call i32 @llvm.fshr.i32 (i32 %x , i32 %x , i32 32 )
313413 ret i32 %f
314414}
@@ -317,6 +417,10 @@ define <4 x i32> @rotl_v4i32_shift_by_bitwidth(<4 x i32> %x) {
317417; CHECK-LABEL: rotl_v4i32_shift_by_bitwidth:
318418; CHECK: # %bb.0:
319419; CHECK-NEXT: blr
420+ ;
421+ ; FUTURE-LABEL: rotl_v4i32_shift_by_bitwidth:
422+ ; FUTURE: # %bb.0:
423+ ; FUTURE-NEXT: blr
320424 %f = call <4 x i32 > @llvm.fshl.v4i32 (<4 x i32 > %x , <4 x i32 > %x , <4 x i32 > <i32 32 , i32 32 , i32 32 , i32 32 >)
321425 ret <4 x i32 > %f
322426}
@@ -325,6 +429,10 @@ define <4 x i32> @rotr_v4i32_shift_by_bitwidth(<4 x i32> %x) {
325429; CHECK-LABEL: rotr_v4i32_shift_by_bitwidth:
326430; CHECK: # %bb.0:
327431; CHECK-NEXT: blr
432+ ;
433+ ; FUTURE-LABEL: rotr_v4i32_shift_by_bitwidth:
434+ ; FUTURE: # %bb.0:
435+ ; FUTURE-NEXT: blr
328436 %f = call <4 x i32 > @llvm.fshr.v4i32 (<4 x i32 > %x , <4 x i32 > %x , <4 x i32 > <i32 32 , i32 32 , i32 32 , i32 32 >)
329437 ret <4 x i32 > %f
330438}
0 commit comments