[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / SystemZ / vec-perm-01.ll
blob4beec05eaece3864ab0e32b618fb73f985843d23
1 ; Test vector splat.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
5 ; Test v16i8 splat of the first element.
6 define <16 x i8> @f1(<16 x i8> %val) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: vrepb %v24, %v24, 0
9 ; CHECK: br %r14
10   %ret = shufflevector <16 x i8> %val, <16 x i8> undef,
11                        <16 x i32> zeroinitializer
12   ret <16 x i8> %ret
15 ; Test v16i8 splat of the last element.
16 define <16 x i8> @f2(<16 x i8> %val) {
17 ; CHECK-LABEL: f2:
18 ; CHECK: vrepb %v24, %v24, 15
19 ; CHECK: br %r14
20   %ret = shufflevector <16 x i8> %val, <16 x i8> undef,
21                        <16 x i32> <i32 15, i32 15, i32 15, i32 15,
22                                    i32 15, i32 15, i32 15, i32 15,
23                                    i32 15, i32 15, i32 15, i32 15,
24                                    i32 15, i32 15, i32 15, i32 15>
25   ret <16 x i8> %ret
28 ; Test v16i8 splat of an arbitrary element, using the second operand of
29 ; the shufflevector.
30 define <16 x i8> @f3(<16 x i8> %val) {
31 ; CHECK-LABEL: f3:
32 ; CHECK: vrepb %v24, %v24, 4
33 ; CHECK: br %r14
34   %ret = shufflevector <16 x i8> undef, <16 x i8> %val,
35                        <16 x i32> <i32 20, i32 20, i32 20, i32 20,
36                                    i32 20, i32 20, i32 20, i32 20,
37                                    i32 20, i32 20, i32 20, i32 20,
38                                    i32 20, i32 20, i32 20, i32 20>
39   ret <16 x i8> %ret
42 ; Test v8i16 splat of the first element.
43 define <8 x i16> @f4(<8 x i16> %val) {
44 ; CHECK-LABEL: f4:
45 ; CHECK: vreph %v24, %v24, 0
46 ; CHECK: br %r14
47   %ret = shufflevector <8 x i16> %val, <8 x i16> undef,
48                        <8 x i32> zeroinitializer
49   ret <8 x i16> %ret
52 ; Test v8i16 splat of the last element.
53 define <8 x i16> @f5(<8 x i16> %val) {
54 ; CHECK-LABEL: f5:
55 ; CHECK: vreph %v24, %v24, 7
56 ; CHECK: br %r14
57   %ret = shufflevector <8 x i16> %val, <8 x i16> undef,
58                        <8 x i32> <i32 7, i32 7, i32 7, i32 7,
59                                   i32 7, i32 7, i32 7, i32 7>
60   ret <8 x i16> %ret
63 ; Test v8i16 splat of an arbitrary element, using the second operand of
64 ; the shufflevector.
65 define <8 x i16> @f6(<8 x i16> %val) {
66 ; CHECK-LABEL: f6:
67 ; CHECK: vreph %v24, %v24, 2
68 ; CHECK: br %r14
69   %ret = shufflevector <8 x i16> undef, <8 x i16> %val,
70                        <8 x i32> <i32 10, i32 10, i32 10, i32 10,
71                                   i32 10, i32 10, i32 10, i32 10>
72   ret <8 x i16> %ret
75 ; Test v4i32 splat of the first element.
76 define <4 x i32> @f7(<4 x i32> %val) {
77 ; CHECK-LABEL: f7:
78 ; CHECK: vrepf %v24, %v24, 0
79 ; CHECK: br %r14
80   %ret = shufflevector <4 x i32> %val, <4 x i32> undef,
81                        <4 x i32> zeroinitializer
82   ret <4 x i32> %ret
85 ; Test v4i32 splat of the last element.
86 define <4 x i32> @f8(<4 x i32> %val) {
87 ; CHECK-LABEL: f8:
88 ; CHECK: vrepf %v24, %v24, 3
89 ; CHECK: br %r14
90   %ret = shufflevector <4 x i32> %val, <4 x i32> undef,
91                        <4 x i32> <i32 3, i32 3, i32 3, i32 3>
92   ret <4 x i32> %ret
95 ; Test v4i32 splat of an arbitrary element, using the second operand of
96 ; the shufflevector.
97 define <4 x i32> @f9(<4 x i32> %val) {
98 ; CHECK-LABEL: f9:
99 ; CHECK: vrepf %v24, %v24, 1
100 ; CHECK: br %r14
101   %ret = shufflevector <4 x i32> undef, <4 x i32> %val,
102                        <4 x i32> <i32 5, i32 5, i32 5, i32 5>
103   ret <4 x i32> %ret
106 ; Test v2i64 splat of the first element.
107 define <2 x i64> @f10(<2 x i64> %val) {
108 ; CHECK-LABEL: f10:
109 ; CHECK: vrepg %v24, %v24, 0
110 ; CHECK: br %r14
111   %ret = shufflevector <2 x i64> %val, <2 x i64> undef,
112                        <2 x i32> zeroinitializer
113   ret <2 x i64> %ret
116 ; Test v2i64 splat of the last element.
117 define <2 x i64> @f11(<2 x i64> %val) {
118 ; CHECK-LABEL: f11:
119 ; CHECK: vrepg %v24, %v24, 1
120 ; CHECK: br %r14
121   %ret = shufflevector <2 x i64> %val, <2 x i64> undef,
122                        <2 x i32> <i32 1, i32 1>
123   ret <2 x i64> %ret
126 ; Test v4f32 splat of the first element.
127 define <4 x float> @f12(<4 x float> %val) {
128 ; CHECK-LABEL: f12:
129 ; CHECK: vrepf %v24, %v24, 0
130 ; CHECK: br %r14
131   %ret = shufflevector <4 x float> %val, <4 x float> undef,
132                        <4 x i32> zeroinitializer
133   ret <4 x float> %ret
136 ; Test v4f32 splat of the last element.
137 define <4 x float> @f13(<4 x float> %val) {
138 ; CHECK-LABEL: f13:
139 ; CHECK: vrepf %v24, %v24, 3
140 ; CHECK: br %r14
141   %ret = shufflevector <4 x float> %val, <4 x float> undef,
142                        <4 x i32> <i32 3, i32 3, i32 3, i32 3>
143   ret <4 x float> %ret
146 ; Test v4f32 splat of an arbitrary element, using the second operand of
147 ; the shufflevector.
148 define <4 x float> @f14(<4 x float> %val) {
149 ; CHECK-LABEL: f14:
150 ; CHECK: vrepf %v24, %v24, 1
151 ; CHECK: br %r14
152   %ret = shufflevector <4 x float> undef, <4 x float> %val,
153                        <4 x i32> <i32 5, i32 5, i32 5, i32 5>
154   ret <4 x float> %ret
157 ; Test v2f64 splat of the first element.
158 define <2 x double> @f15(<2 x double> %val) {
159 ; CHECK-LABEL: f15:
160 ; CHECK: vrepg %v24, %v24, 0
161 ; CHECK: br %r14
162   %ret = shufflevector <2 x double> %val, <2 x double> undef,
163                        <2 x i32> zeroinitializer
164   ret <2 x double> %ret
167 ; Test v2f64 splat of the last element.
168 define <2 x double> @f16(<2 x double> %val) {
169 ; CHECK-LABEL: f16:
170 ; CHECK: vrepg %v24, %v24, 1
171 ; CHECK: br %r14
172   %ret = shufflevector <2 x double> %val, <2 x double> undef,
173                        <2 x i32> <i32 1, i32 1>
174   ret <2 x double> %ret