xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/vec-perm-02.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test replications of a scalar register value, represented as splats.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Test v16i8 splat of the first element.
6*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f1(i8 %scalar) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
8*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2
9*9880d681SAndroid Build Coastguard Worker; CHECK: vrepb %v24, [[REG]], 7
10*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
11*9880d681SAndroid Build Coastguard Worker  %val = insertelement <16 x i8> undef, i8 %scalar, i32 0
12*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <16 x i8> %val, <16 x i8> undef,
13*9880d681SAndroid Build Coastguard Worker                       <16 x i32> zeroinitializer
14*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %ret
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; Test v16i8 splat of the last element.
18*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f2(i8 %scalar) {
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
20*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2
21*9880d681SAndroid Build Coastguard Worker; CHECK: vrepb %v24, [[REG]], 7
22*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
23*9880d681SAndroid Build Coastguard Worker  %val = insertelement <16 x i8> undef, i8 %scalar, i32 15
24*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <16 x i8> %val, <16 x i8> undef,
25*9880d681SAndroid Build Coastguard Worker                       <16 x i32> <i32 15, i32 15, i32 15, i32 15,
26*9880d681SAndroid Build Coastguard Worker                                   i32 15, i32 15, i32 15, i32 15,
27*9880d681SAndroid Build Coastguard Worker                                   i32 15, i32 15, i32 15, i32 15,
28*9880d681SAndroid Build Coastguard Worker                                   i32 15, i32 15, i32 15, i32 15>
29*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %ret
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; Test v16i8 splat of an arbitrary element, using the second operand of
33*9880d681SAndroid Build Coastguard Worker; the shufflevector.
34*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f3(i8 %scalar) {
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
36*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2
37*9880d681SAndroid Build Coastguard Worker; CHECK: vrepb %v24, [[REG]], 7
38*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
39*9880d681SAndroid Build Coastguard Worker  %val = insertelement <16 x i8> undef, i8 %scalar, i32 4
40*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <16 x i8> undef, <16 x i8> %val,
41*9880d681SAndroid Build Coastguard Worker                       <16 x i32> <i32 20, i32 20, i32 20, i32 20,
42*9880d681SAndroid Build Coastguard Worker                                   i32 20, i32 20, i32 20, i32 20,
43*9880d681SAndroid Build Coastguard Worker                                   i32 20, i32 20, i32 20, i32 20,
44*9880d681SAndroid Build Coastguard Worker                                   i32 20, i32 20, i32 20, i32 20>
45*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %ret
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; Test v8i16 splat of the first element.
49*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f4(i16 %scalar) {
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
51*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2
52*9880d681SAndroid Build Coastguard Worker; CHECK: vreph %v24, [[REG]], 3
53*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
54*9880d681SAndroid Build Coastguard Worker  %val = insertelement <8 x i16> undef, i16 %scalar, i32 0
55*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <8 x i16> %val, <8 x i16> undef,
56*9880d681SAndroid Build Coastguard Worker                       <8 x i32> zeroinitializer
57*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %ret
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; Test v8i16 splat of the last element.
61*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f5(i16 %scalar) {
62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
63*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2
64*9880d681SAndroid Build Coastguard Worker; CHECK: vreph %v24, [[REG]], 3
65*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
66*9880d681SAndroid Build Coastguard Worker  %val = insertelement <8 x i16> undef, i16 %scalar, i32 7
67*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <8 x i16> %val, <8 x i16> undef,
68*9880d681SAndroid Build Coastguard Worker                       <8 x i32> <i32 7, i32 7, i32 7, i32 7,
69*9880d681SAndroid Build Coastguard Worker                                  i32 7, i32 7, i32 7, i32 7>
70*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %ret
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; Test v8i16 splat of an arbitrary element, using the second operand of
74*9880d681SAndroid Build Coastguard Worker; the shufflevector.
75*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f6(i16 %scalar) {
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
77*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2
78*9880d681SAndroid Build Coastguard Worker; CHECK: vreph %v24, [[REG]], 3
79*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
80*9880d681SAndroid Build Coastguard Worker  %val = insertelement <8 x i16> undef, i16 %scalar, i32 2
81*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <8 x i16> undef, <8 x i16> %val,
82*9880d681SAndroid Build Coastguard Worker                       <8 x i32> <i32 10, i32 10, i32 10, i32 10,
83*9880d681SAndroid Build Coastguard Worker                                  i32 10, i32 10, i32 10, i32 10>
84*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %ret
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; Test v4i32 splat of the first element.
88*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f7(i32 %scalar) {
89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
90*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2
91*9880d681SAndroid Build Coastguard Worker; CHECK: vrepf %v24, [[REG]], 1
92*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
93*9880d681SAndroid Build Coastguard Worker  %val = insertelement <4 x i32> undef, i32 %scalar, i32 0
94*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x i32> %val, <4 x i32> undef,
95*9880d681SAndroid Build Coastguard Worker                       <4 x i32> zeroinitializer
96*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; Test v4i32 splat of the last element.
100*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f8(i32 %scalar) {
101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
102*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2
103*9880d681SAndroid Build Coastguard Worker; CHECK: vrepf %v24, [[REG]], 1
104*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
105*9880d681SAndroid Build Coastguard Worker  %val = insertelement <4 x i32> undef, i32 %scalar, i32 3
106*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x i32> %val, <4 x i32> undef,
107*9880d681SAndroid Build Coastguard Worker                       <4 x i32> <i32 3, i32 3, i32 3, i32 3>
108*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; Test v4i32 splat of an arbitrary element, using the second operand of
112*9880d681SAndroid Build Coastguard Worker; the shufflevector.
113*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f9(i32 %scalar) {
114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
115*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp [[REG:%v[0-9]+]], %r2, %r2
116*9880d681SAndroid Build Coastguard Worker; CHECK: vrepf %v24, [[REG]], 1
117*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
118*9880d681SAndroid Build Coastguard Worker  %val = insertelement <4 x i32> undef, i32 %scalar, i32 1
119*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x i32> undef, <4 x i32> %val,
120*9880d681SAndroid Build Coastguard Worker                       <4 x i32> <i32 5, i32 5, i32 5, i32 5>
121*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; Test v2i64 splat of the first element.
125*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f10(i64 %scalar) {
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
127*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp %v24, %r2, %r2
128*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
129*9880d681SAndroid Build Coastguard Worker  %val = insertelement <2 x i64> undef, i64 %scalar, i32 0
130*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <2 x i64> %val, <2 x i64> undef,
131*9880d681SAndroid Build Coastguard Worker                       <2 x i32> zeroinitializer
132*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; Test v2i64 splat of the last element.
136*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f11(i64 %scalar) {
137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
138*9880d681SAndroid Build Coastguard Worker; CHECK: vlvgp %v24, %r2, %r2
139*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
140*9880d681SAndroid Build Coastguard Worker  %val = insertelement <2 x i64> undef, i64 %scalar, i32 1
141*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <2 x i64> %val, <2 x i64> undef,
142*9880d681SAndroid Build Coastguard Worker                       <2 x i32> <i32 1, i32 1>
143*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; Test v4f32 splat of the first element.
147*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f12(float %scalar) {
148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
149*9880d681SAndroid Build Coastguard Worker; CHECK: vrepf %v24, %v0, 0
150*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
151*9880d681SAndroid Build Coastguard Worker  %val = insertelement <4 x float> undef, float %scalar, i32 0
152*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x float> %val, <4 x float> undef,
153*9880d681SAndroid Build Coastguard Worker                       <4 x i32> zeroinitializer
154*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; Test v4f32 splat of the last element.
158*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f13(float %scalar) {
159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
160*9880d681SAndroid Build Coastguard Worker; CHECK: vrepf %v24, %v0, 0
161*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
162*9880d681SAndroid Build Coastguard Worker  %val = insertelement <4 x float> undef, float %scalar, i32 3
163*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x float> %val, <4 x float> undef,
164*9880d681SAndroid Build Coastguard Worker                       <4 x i32> <i32 3, i32 3, i32 3, i32 3>
165*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker; Test v4f32 splat of an arbitrary element, using the second operand of
169*9880d681SAndroid Build Coastguard Worker; the shufflevector.
170*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f14(float %scalar) {
171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
172*9880d681SAndroid Build Coastguard Worker; CHECK: vrepf %v24, %v0, 0
173*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
174*9880d681SAndroid Build Coastguard Worker  %val = insertelement <4 x float> undef, float %scalar, i32 1
175*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <4 x float> undef, <4 x float> %val,
176*9880d681SAndroid Build Coastguard Worker                       <4 x i32> <i32 5, i32 5, i32 5, i32 5>
177*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
178*9880d681SAndroid Build Coastguard Worker}
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker; Test v2f64 splat of the first element.
181*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @f15(double %scalar) {
182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
183*9880d681SAndroid Build Coastguard Worker; CHECK: vrepg %v24, %v0, 0
184*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
185*9880d681SAndroid Build Coastguard Worker  %val = insertelement <2 x double> undef, double %scalar, i32 0
186*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <2 x double> %val, <2 x double> undef,
187*9880d681SAndroid Build Coastguard Worker                       <2 x i32> zeroinitializer
188*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker; Test v2f64 splat of the last element.
192*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @f16(double %scalar) {
193*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
194*9880d681SAndroid Build Coastguard Worker; CHECK: vrepg %v24, %v0, 0
195*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
196*9880d681SAndroid Build Coastguard Worker  %val = insertelement <2 x double> undef, double %scalar, i32 1
197*9880d681SAndroid Build Coastguard Worker  %ret = shufflevector <2 x double> %val, <2 x double> undef,
198*9880d681SAndroid Build Coastguard Worker                       <2 x i32> <i32 1, i32 1>
199*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
200*9880d681SAndroid Build Coastguard Worker}
201