[X86] combineTargetShuffle - commute VPERMV3 shuffles so any load is on the RHS
[llvm-project.git] / llvm / test / CodeGen / SystemZ / vec-perm-07.ll
blob9a370af2c0e7fb8995aecabbe4b2bef6119ab950
1 ; Test vector shift left double immediate.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
5 ; Test a v16i8 shift with the lowest useful shift amount.
6 define <16 x i8> @f1(<16 x i8> %val1, <16 x i8> %val2) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: vsldb %v24, %v24, %v26, 1
9 ; CHECK: br %r14
10   %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2,
11                        <16 x i32> <i32 1, i32 2, i32 3, i32 4,
12                                    i32 5, i32 6, i32 7, i32 8,
13                                    i32 9, i32 10, i32 11, i32 12,
14                                    i32 13, i32 14, i32 15, i32 16>
15   ret <16 x i8> %ret
18 ; Test a v16i8 shift with the highest shift amount.
19 define <16 x i8> @f2(<16 x i8> %val1, <16 x i8> %val2) {
20 ; CHECK-LABEL: f2:
21 ; CHECK: vsldb %v24, %v24, %v26, 15
22 ; CHECK: br %r14
23   %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2,
24                        <16 x i32> <i32 15, i32 16, i32 17, i32 18,
25                                    i32 19, i32 20, i32 21, i32 22,
26                                    i32 23, i32 24, i32 25, i32 26,
27                                    i32 27, i32 28, i32 29, i32 30>
28   ret <16 x i8> %ret
31 ; Test a v16i8 shift in which the operands need to be reversed.
32 define <16 x i8> @f3(<16 x i8> %val1, <16 x i8> %val2) {
33 ; CHECK-LABEL: f3:
34 ; CHECK: vsldb %v24, %v26, %v24, 4
35 ; CHECK: br %r14
36   %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2,
37                        <16 x i32> <i32 20, i32 21, i32 22, i32 23,
38                                    i32 24, i32 25, i32 26, i32 27,
39                                    i32 28, i32 29, i32 30, i32 31,
40                                    i32 0, i32 1, i32 2, i32 3>
41   ret <16 x i8> %ret
44 ; Test a v16i8 shift in which the operands need to be duplicated.
45 define <16 x i8> @f4(<16 x i8> %val) {
46 ; CHECK-LABEL: f4:
47 ; CHECK: vsldb %v24, %v24, %v24, 7
48 ; CHECK: br %r14
49   %ret = shufflevector <16 x i8> %val, <16 x i8> undef,
50                        <16 x i32> <i32 7, i32 8, i32 9, i32 10,
51                                    i32 11, i32 12, i32 13, i32 14,
52                                    i32 15, i32 0, i32 1, i32 2,
53                                    i32 3, i32 4, i32 5, i32 6>
54   ret <16 x i8> %ret
57 ; Test a v16i8 shift in which some of the indices are undefs.
58 define <16 x i8> @f5(<16 x i8> %val1, <16 x i8> %val2) {
59 ; CHECK-LABEL: f5:
60 ; CHECK: vsldb %v24, %v24, %v26, 11
61 ; CHECK: br %r14
62   %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2,
63                        <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef,
64                                    i32 15, i32 16, i32 undef, i32 18,
65                                    i32 19, i32 20, i32 21, i32 22,
66                                    i32 23, i32 24, i32 25, i32 26>
67   ret <16 x i8> %ret
70 ; ...and again with reversed operands.
71 define <16 x i8> @f6(<16 x i8> %val1, <16 x i8> %val2) {
72 ; CHECK-LABEL: f6:
73 ; CHECK: vsldb %v24, %v26, %v24, 13
74 ; CHECK: br %r14
75   %ret = shufflevector <16 x i8> %val1, <16 x i8> %val2,
76                        <16 x i32> <i32 undef, i32 undef, i32 31, i32 0,
77                                    i32 1, i32 2, i32 3, i32 4,
78                                    i32 5, i32 6, i32 7, i32 8,
79                                    i32 9, i32 10, i32 11, i32 12>
80   ret <16 x i8> %ret
83 ; Test a v8i16 shift with the lowest useful shift amount.
84 define <8 x i16> @f7(<8 x i16> %val1, <8 x i16> %val2) {
85 ; CHECK-LABEL: f7:
86 ; CHECK: vsldb %v24, %v24, %v26, 2
87 ; CHECK: br %r14
88   %ret = shufflevector <8 x i16> %val1, <8 x i16> %val2,
89                        <8 x i32> <i32 1, i32 2, i32 3, i32 4,
90                                   i32 5, i32 6, i32 7, i32 8>
91   ret <8 x i16> %ret
94 ; Test a v8i16 shift with the highest useful shift amount.
95 define <8 x i16> @f8(<8 x i16> %val1, <8 x i16> %val2) {
96 ; CHECK-LABEL: f8:
97 ; CHECK: vsldb %v24, %v24, %v26, 14
98 ; CHECK: br %r14
99   %ret = shufflevector <8 x i16> %val1, <8 x i16> %val2,
100                        <8 x i32> <i32 7, i32 8, i32 9, i32 10,
101                                   i32 11, i32 12, i32 13, i32 14>
102   ret <8 x i16> %ret
105 ; Test a v4i32 shift with the lowest useful shift amount.
106 define <4 x i32> @f9(<4 x i32> %val1, <4 x i32> %val2) {
107 ; CHECK-LABEL: f9:
108 ; CHECK: vsldb %v24, %v24, %v26, 4
109 ; CHECK: br %r14
110   %ret = shufflevector <4 x i32> %val1, <4 x i32> %val2,
111                        <4 x i32> <i32 1, i32 2, i32 3, i32 4>
112   ret <4 x i32> %ret
115 ; Test a v4i32 shift with the highest useful shift amount.
116 define <4 x i32> @f10(<4 x i32> %val1, <4 x i32> %val2) {
117 ; CHECK-LABEL: f10:
118 ; CHECK: vsldb %v24, %v24, %v26, 12
119 ; CHECK: br %r14
120   %ret = shufflevector <4 x i32> %val1, <4 x i32> %val2,
121                        <4 x i32> <i32 3, i32 4, i32 5, i32 6>
122   ret <4 x i32> %ret
125 ; Test a v4f32 shift with the lowest useful shift amount.
126 define <4 x float> @f12(<4 x float> %val1, <4 x float> %val2) {
127 ; CHECK-LABEL: f12:
128 ; CHECK: vsldb %v24, %v24, %v26, 4
129 ; CHECK: br %r14
130   %ret = shufflevector <4 x float> %val1, <4 x float> %val2,
131                        <4 x i32> <i32 1, i32 2, i32 3, i32 4>
132   ret <4 x float> %ret
135 ; Test a v4f32 shift with the highest useful shift amount.
136 define <4 x float> @f13(<4 x float> %val1, <4 x float> %val2) {
137 ; CHECK-LABEL: f13:
138 ; CHECK: vsldb %v24, %v24, %v26, 12
139 ; CHECK: br %r14
140   %ret = shufflevector <4 x float> %val1, <4 x float> %val2,
141                        <4 x i32> <i32 3, i32 4, i32 5, i32 6>
142   ret <4 x float> %ret
145 ; We use VPDI for v2i64 shuffles.