xref: /llvm-project/llvm/test/CodeGen/SystemZ/vec-intrinsics-01.ll (revision a65ccc1b9fe740c9f65d9cf2b627de50278aad56)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; Test vector intrinsics.
3;
4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
5
6declare i32 @llvm.s390.lcbb(ptr, i32)
7declare <16 x i8> @llvm.s390.vlbb(ptr, i32)
8declare <16 x i8> @llvm.s390.vll(i32, ptr)
9declare <2 x i64> @llvm.s390.vpdi(<2 x i64>, <2 x i64>, i32)
10declare <16 x i8> @llvm.s390.vperm(<16 x i8>, <16 x i8>, <16 x i8>)
11declare <16 x i8> @llvm.s390.vpksh(<8 x i16>, <8 x i16>)
12declare <8 x i16> @llvm.s390.vpksf(<4 x i32>, <4 x i32>)
13declare <4 x i32> @llvm.s390.vpksg(<2 x i64>, <2 x i64>)
14declare {<16 x i8>, i32} @llvm.s390.vpkshs(<8 x i16>, <8 x i16>)
15declare {<8 x i16>, i32} @llvm.s390.vpksfs(<4 x i32>, <4 x i32>)
16declare {<4 x i32>, i32} @llvm.s390.vpksgs(<2 x i64>, <2 x i64>)
17declare <16 x i8> @llvm.s390.vpklsh(<8 x i16>, <8 x i16>)
18declare <8 x i16> @llvm.s390.vpklsf(<4 x i32>, <4 x i32>)
19declare <4 x i32> @llvm.s390.vpklsg(<2 x i64>, <2 x i64>)
20declare {<16 x i8>, i32} @llvm.s390.vpklshs(<8 x i16>, <8 x i16>)
21declare {<8 x i16>, i32} @llvm.s390.vpklsfs(<4 x i32>, <4 x i32>)
22declare {<4 x i32>, i32} @llvm.s390.vpklsgs(<2 x i64>, <2 x i64>)
23declare void @llvm.s390.vstl(<16 x i8>, i32, ptr)
24declare <8 x i16> @llvm.s390.vuphb(<16 x i8>)
25declare <4 x i32> @llvm.s390.vuphh(<8 x i16>)
26declare <2 x i64> @llvm.s390.vuphf(<4 x i32>)
27declare <8 x i16> @llvm.s390.vuplhb(<16 x i8>)
28declare <4 x i32> @llvm.s390.vuplhh(<8 x i16>)
29declare <2 x i64> @llvm.s390.vuplhf(<4 x i32>)
30declare <8 x i16> @llvm.s390.vuplb(<16 x i8>)
31declare <4 x i32> @llvm.s390.vuplhw(<8 x i16>)
32declare <2 x i64> @llvm.s390.vuplf(<4 x i32>)
33declare <8 x i16> @llvm.s390.vupllb(<16 x i8>)
34declare <4 x i32> @llvm.s390.vupllh(<8 x i16>)
35declare <2 x i64> @llvm.s390.vupllf(<4 x i32>)
36declare <16 x i8> @llvm.s390.vaccb(<16 x i8>, <16 x i8>)
37declare <8 x i16> @llvm.s390.vacch(<8 x i16>, <8 x i16>)
38declare <4 x i32> @llvm.s390.vaccf(<4 x i32>, <4 x i32>)
39declare <2 x i64> @llvm.s390.vaccg(<2 x i64>, <2 x i64>)
40declare i128 @llvm.s390.vaq(i128, i128)
41declare i128 @llvm.s390.vacq(i128, i128, i128)
42declare i128 @llvm.s390.vaccq(i128, i128)
43declare i128 @llvm.s390.vacccq(i128, i128, i128)
44declare <16 x i8> @llvm.s390.vavgb(<16 x i8>, <16 x i8>)
45declare <8 x i16> @llvm.s390.vavgh(<8 x i16>, <8 x i16>)
46declare <4 x i32> @llvm.s390.vavgf(<4 x i32>, <4 x i32>)
47declare <2 x i64> @llvm.s390.vavgg(<2 x i64>, <2 x i64>)
48declare <16 x i8> @llvm.s390.vavglb(<16 x i8>, <16 x i8>)
49declare <8 x i16> @llvm.s390.vavglh(<8 x i16>, <8 x i16>)
50declare <4 x i32> @llvm.s390.vavglf(<4 x i32>, <4 x i32>)
51declare <2 x i64> @llvm.s390.vavglg(<2 x i64>, <2 x i64>)
52declare <4 x i32> @llvm.s390.vcksm(<4 x i32>, <4 x i32>)
53declare <8 x i16> @llvm.s390.vgfmb(<16 x i8>, <16 x i8>)
54declare <4 x i32> @llvm.s390.vgfmh(<8 x i16>, <8 x i16>)
55declare <2 x i64> @llvm.s390.vgfmf(<4 x i32>, <4 x i32>)
56declare i128 @llvm.s390.vgfmg(<2 x i64>, <2 x i64>)
57declare <8 x i16> @llvm.s390.vgfmab(<16 x i8>, <16 x i8>, <8 x i16>)
58declare <4 x i32> @llvm.s390.vgfmah(<8 x i16>, <8 x i16>, <4 x i32>)
59declare <2 x i64> @llvm.s390.vgfmaf(<4 x i32>, <4 x i32>, <2 x i64>)
60declare i128 @llvm.s390.vgfmag(<2 x i64>, <2 x i64>, i128)
61declare <16 x i8> @llvm.s390.vmahb(<16 x i8>, <16 x i8>, <16 x i8>)
62declare <8 x i16> @llvm.s390.vmahh(<8 x i16>, <8 x i16>, <8 x i16>)
63declare <4 x i32> @llvm.s390.vmahf(<4 x i32>, <4 x i32>, <4 x i32>)
64declare <16 x i8> @llvm.s390.vmalhb(<16 x i8>, <16 x i8>, <16 x i8>)
65declare <8 x i16> @llvm.s390.vmalhh(<8 x i16>, <8 x i16>, <8 x i16>)
66declare <4 x i32> @llvm.s390.vmalhf(<4 x i32>, <4 x i32>, <4 x i32>)
67declare <8 x i16> @llvm.s390.vmaeb(<16 x i8>, <16 x i8>, <8 x i16>)
68declare <4 x i32> @llvm.s390.vmaeh(<8 x i16>, <8 x i16>, <4 x i32>)
69declare <2 x i64> @llvm.s390.vmaef(<4 x i32>, <4 x i32>, <2 x i64>)
70declare <8 x i16> @llvm.s390.vmaleb(<16 x i8>, <16 x i8>, <8 x i16>)
71declare <4 x i32> @llvm.s390.vmaleh(<8 x i16>, <8 x i16>, <4 x i32>)
72declare <2 x i64> @llvm.s390.vmalef(<4 x i32>, <4 x i32>, <2 x i64>)
73declare <8 x i16> @llvm.s390.vmaob(<16 x i8>, <16 x i8>, <8 x i16>)
74declare <4 x i32> @llvm.s390.vmaoh(<8 x i16>, <8 x i16>, <4 x i32>)
75declare <2 x i64> @llvm.s390.vmaof(<4 x i32>, <4 x i32>, <2 x i64>)
76declare <8 x i16> @llvm.s390.vmalob(<16 x i8>, <16 x i8>, <8 x i16>)
77declare <4 x i32> @llvm.s390.vmaloh(<8 x i16>, <8 x i16>, <4 x i32>)
78declare <2 x i64> @llvm.s390.vmalof(<4 x i32>, <4 x i32>, <2 x i64>)
79declare <16 x i8> @llvm.s390.vmhb(<16 x i8>, <16 x i8>)
80declare <8 x i16> @llvm.s390.vmhh(<8 x i16>, <8 x i16>)
81declare <4 x i32> @llvm.s390.vmhf(<4 x i32>, <4 x i32>)
82declare <16 x i8> @llvm.s390.vmlhb(<16 x i8>, <16 x i8>)
83declare <8 x i16> @llvm.s390.vmlhh(<8 x i16>, <8 x i16>)
84declare <4 x i32> @llvm.s390.vmlhf(<4 x i32>, <4 x i32>)
85declare <8 x i16> @llvm.s390.vmeb(<16 x i8>, <16 x i8>)
86declare <4 x i32> @llvm.s390.vmeh(<8 x i16>, <8 x i16>)
87declare <2 x i64> @llvm.s390.vmef(<4 x i32>, <4 x i32>)
88declare <8 x i16> @llvm.s390.vmleb(<16 x i8>, <16 x i8>)
89declare <4 x i32> @llvm.s390.vmleh(<8 x i16>, <8 x i16>)
90declare <2 x i64> @llvm.s390.vmlef(<4 x i32>, <4 x i32>)
91declare <8 x i16> @llvm.s390.vmob(<16 x i8>, <16 x i8>)
92declare <4 x i32> @llvm.s390.vmoh(<8 x i16>, <8 x i16>)
93declare <2 x i64> @llvm.s390.vmof(<4 x i32>, <4 x i32>)
94declare <8 x i16> @llvm.s390.vmlob(<16 x i8>, <16 x i8>)
95declare <4 x i32> @llvm.s390.vmloh(<8 x i16>, <8 x i16>)
96declare <2 x i64> @llvm.s390.vmlof(<4 x i32>, <4 x i32>)
97declare <16 x i8> @llvm.s390.verimb(<16 x i8>, <16 x i8>, <16 x i8>, i32)
98declare <8 x i16> @llvm.s390.verimh(<8 x i16>, <8 x i16>, <8 x i16>, i32)
99declare <4 x i32> @llvm.s390.verimf(<4 x i32>, <4 x i32>, <4 x i32>, i32)
100declare <2 x i64> @llvm.s390.verimg(<2 x i64>, <2 x i64>, <2 x i64>, i32)
101declare <16 x i8> @llvm.s390.vsl(<16 x i8>, <16 x i8>)
102declare <16 x i8> @llvm.s390.vslb(<16 x i8>, <16 x i8>)
103declare <16 x i8> @llvm.s390.vsra(<16 x i8>, <16 x i8>)
104declare <16 x i8> @llvm.s390.vsrab(<16 x i8>, <16 x i8>)
105declare <16 x i8> @llvm.s390.vsrl(<16 x i8>, <16 x i8>)
106declare <16 x i8> @llvm.s390.vsrlb(<16 x i8>, <16 x i8>)
107declare <16 x i8> @llvm.s390.vsldb(<16 x i8>, <16 x i8>, i32)
108declare <16 x i8> @llvm.s390.vscbib(<16 x i8>, <16 x i8>)
109declare <8 x i16> @llvm.s390.vscbih(<8 x i16>, <8 x i16>)
110declare <4 x i32> @llvm.s390.vscbif(<4 x i32>, <4 x i32>)
111declare <2 x i64> @llvm.s390.vscbig(<2 x i64>, <2 x i64>)
112declare i128 @llvm.s390.vsq(i128, i128)
113declare i128 @llvm.s390.vsbiq(i128, i128, i128)
114declare i128 @llvm.s390.vscbiq(i128, i128)
115declare i128 @llvm.s390.vsbcbiq(i128, i128, i128)
116declare <4 x i32> @llvm.s390.vsumb(<16 x i8>, <16 x i8>)
117declare <4 x i32> @llvm.s390.vsumh(<8 x i16>, <8 x i16>)
118declare <2 x i64> @llvm.s390.vsumgh(<8 x i16>, <8 x i16>)
119declare <2 x i64> @llvm.s390.vsumgf(<4 x i32>, <4 x i32>)
120declare i128 @llvm.s390.vsumqf(<4 x i32>, <4 x i32>)
121declare i128 @llvm.s390.vsumqg(<2 x i64>, <2 x i64>)
122declare i32 @llvm.s390.vtm(<16 x i8>, <16 x i8>)
123declare {<16 x i8>, i32} @llvm.s390.vceqbs(<16 x i8>, <16 x i8>)
124declare {<8 x i16>, i32} @llvm.s390.vceqhs(<8 x i16>, <8 x i16>)
125declare {<4 x i32>, i32} @llvm.s390.vceqfs(<4 x i32>, <4 x i32>)
126declare {<2 x i64>, i32} @llvm.s390.vceqgs(<2 x i64>, <2 x i64>)
127declare {<16 x i8>, i32} @llvm.s390.vchbs(<16 x i8>, <16 x i8>)
128declare {<8 x i16>, i32} @llvm.s390.vchhs(<8 x i16>, <8 x i16>)
129declare {<4 x i32>, i32} @llvm.s390.vchfs(<4 x i32>, <4 x i32>)
130declare {<2 x i64>, i32} @llvm.s390.vchgs(<2 x i64>, <2 x i64>)
131declare {<16 x i8>, i32} @llvm.s390.vchlbs(<16 x i8>, <16 x i8>)
132declare {<8 x i16>, i32} @llvm.s390.vchlhs(<8 x i16>, <8 x i16>)
133declare {<4 x i32>, i32} @llvm.s390.vchlfs(<4 x i32>, <4 x i32>)
134declare {<2 x i64>, i32} @llvm.s390.vchlgs(<2 x i64>, <2 x i64>)
135declare <16 x i8> @llvm.s390.vfaeb(<16 x i8>, <16 x i8>, i32)
136declare <8 x i16> @llvm.s390.vfaeh(<8 x i16>, <8 x i16>, i32)
137declare <4 x i32> @llvm.s390.vfaef(<4 x i32>, <4 x i32>, i32)
138declare {<16 x i8>, i32} @llvm.s390.vfaebs(<16 x i8>, <16 x i8>, i32)
139declare {<8 x i16>, i32} @llvm.s390.vfaehs(<8 x i16>, <8 x i16>, i32)
140declare {<4 x i32>, i32} @llvm.s390.vfaefs(<4 x i32>, <4 x i32>, i32)
141declare <16 x i8> @llvm.s390.vfaezb(<16 x i8>, <16 x i8>, i32)
142declare <8 x i16> @llvm.s390.vfaezh(<8 x i16>, <8 x i16>, i32)
143declare <4 x i32> @llvm.s390.vfaezf(<4 x i32>, <4 x i32>, i32)
144declare {<16 x i8>, i32} @llvm.s390.vfaezbs(<16 x i8>, <16 x i8>, i32)
145declare {<8 x i16>, i32} @llvm.s390.vfaezhs(<8 x i16>, <8 x i16>, i32)
146declare {<4 x i32>, i32} @llvm.s390.vfaezfs(<4 x i32>, <4 x i32>, i32)
147declare <16 x i8> @llvm.s390.vfeeb(<16 x i8>, <16 x i8>)
148declare <8 x i16> @llvm.s390.vfeeh(<8 x i16>, <8 x i16>)
149declare <4 x i32> @llvm.s390.vfeef(<4 x i32>, <4 x i32>)
150declare {<16 x i8>, i32} @llvm.s390.vfeebs(<16 x i8>, <16 x i8>)
151declare {<8 x i16>, i32} @llvm.s390.vfeehs(<8 x i16>, <8 x i16>)
152declare {<4 x i32>, i32} @llvm.s390.vfeefs(<4 x i32>, <4 x i32>)
153declare <16 x i8> @llvm.s390.vfeezb(<16 x i8>, <16 x i8>)
154declare <8 x i16> @llvm.s390.vfeezh(<8 x i16>, <8 x i16>)
155declare <4 x i32> @llvm.s390.vfeezf(<4 x i32>, <4 x i32>)
156declare {<16 x i8>, i32} @llvm.s390.vfeezbs(<16 x i8>, <16 x i8>)
157declare {<8 x i16>, i32} @llvm.s390.vfeezhs(<8 x i16>, <8 x i16>)
158declare {<4 x i32>, i32} @llvm.s390.vfeezfs(<4 x i32>, <4 x i32>)
159declare <16 x i8> @llvm.s390.vfeneb(<16 x i8>, <16 x i8>)
160declare <8 x i16> @llvm.s390.vfeneh(<8 x i16>, <8 x i16>)
161declare <4 x i32> @llvm.s390.vfenef(<4 x i32>, <4 x i32>)
162declare {<16 x i8>, i32} @llvm.s390.vfenebs(<16 x i8>, <16 x i8>)
163declare {<8 x i16>, i32} @llvm.s390.vfenehs(<8 x i16>, <8 x i16>)
164declare {<4 x i32>, i32} @llvm.s390.vfenefs(<4 x i32>, <4 x i32>)
165declare <16 x i8> @llvm.s390.vfenezb(<16 x i8>, <16 x i8>)
166declare <8 x i16> @llvm.s390.vfenezh(<8 x i16>, <8 x i16>)
167declare <4 x i32> @llvm.s390.vfenezf(<4 x i32>, <4 x i32>)
168declare {<16 x i8>, i32} @llvm.s390.vfenezbs(<16 x i8>, <16 x i8>)
169declare {<8 x i16>, i32} @llvm.s390.vfenezhs(<8 x i16>, <8 x i16>)
170declare {<4 x i32>, i32} @llvm.s390.vfenezfs(<4 x i32>, <4 x i32>)
171declare <16 x i8> @llvm.s390.vistrb(<16 x i8>)
172declare <8 x i16> @llvm.s390.vistrh(<8 x i16>)
173declare <4 x i32> @llvm.s390.vistrf(<4 x i32>)
174declare {<16 x i8>, i32} @llvm.s390.vistrbs(<16 x i8>)
175declare {<8 x i16>, i32} @llvm.s390.vistrhs(<8 x i16>)
176declare {<4 x i32>, i32} @llvm.s390.vistrfs(<4 x i32>)
177declare <16 x i8> @llvm.s390.vstrcb(<16 x i8>, <16 x i8>, <16 x i8>, i32)
178declare <8 x i16> @llvm.s390.vstrch(<8 x i16>, <8 x i16>, <8 x i16>, i32)
179declare <4 x i32> @llvm.s390.vstrcf(<4 x i32>, <4 x i32>, <4 x i32>, i32)
180declare {<16 x i8>, i32} @llvm.s390.vstrcbs(<16 x i8>, <16 x i8>, <16 x i8>,
181                                            i32)
182declare {<8 x i16>, i32} @llvm.s390.vstrchs(<8 x i16>, <8 x i16>, <8 x i16>,
183                                            i32)
184declare {<4 x i32>, i32} @llvm.s390.vstrcfs(<4 x i32>, <4 x i32>, <4 x i32>,
185                                            i32)
186declare <16 x i8> @llvm.s390.vstrczb(<16 x i8>, <16 x i8>, <16 x i8>, i32)
187declare <8 x i16> @llvm.s390.vstrczh(<8 x i16>, <8 x i16>, <8 x i16>, i32)
188declare <4 x i32> @llvm.s390.vstrczf(<4 x i32>, <4 x i32>, <4 x i32>, i32)
189declare {<16 x i8>, i32} @llvm.s390.vstrczbs(<16 x i8>, <16 x i8>, <16 x i8>,
190                                             i32)
191declare {<8 x i16>, i32} @llvm.s390.vstrczhs(<8 x i16>, <8 x i16>, <8 x i16>,
192                                             i32)
193declare {<4 x i32>, i32} @llvm.s390.vstrczfs(<4 x i32>, <4 x i32>, <4 x i32>,
194                                             i32)
195declare {<2 x i64>, i32} @llvm.s390.vfcedbs(<2 x double>, <2 x double>)
196declare {<2 x i64>, i32} @llvm.s390.vfchdbs(<2 x double>, <2 x double>)
197declare {<2 x i64>, i32} @llvm.s390.vfchedbs(<2 x double>, <2 x double>)
198declare {<2 x i64>, i32} @llvm.s390.vftcidb(<2 x double>, i32)
199declare <2 x double> @llvm.s390.vfidb(<2 x double>, i32, i32)
200
201; LCBB with the lowest M3 operand.
202define i32 @test_lcbb1(ptr %ptr) {
203; CHECK-LABEL: test_lcbb1:
204; CHECK:       # %bb.0:
205; CHECK-NEXT:    lcbb %r2, 0(%r2), 0
206; CHECK-NEXT:    br %r14
207  %res = call i32 @llvm.s390.lcbb(ptr %ptr, i32 0)
208  ret i32 %res
209}
210
211; LCBB with the highest M3 operand.
212define i32 @test_lcbb2(ptr %ptr) {
213; CHECK-LABEL: test_lcbb2:
214; CHECK:       # %bb.0:
215; CHECK-NEXT:    lcbb %r2, 0(%r2), 15
216; CHECK-NEXT:    br %r14
217  %res = call i32 @llvm.s390.lcbb(ptr %ptr, i32 15)
218  ret i32 %res
219}
220
221; LCBB with a displacement and index.
222define i32 @test_lcbb3(ptr %base, i64 %index) {
223; CHECK-LABEL: test_lcbb3:
224; CHECK:       # %bb.0:
225; CHECK-NEXT:    lcbb %r2, 4095(%r2,%r3), 4
226; CHECK-NEXT:    br %r14
227  %add = add i64 %index, 4095
228  %ptr = getelementptr i8, ptr %base, i64 %add
229  %res = call i32 @llvm.s390.lcbb(ptr %ptr, i32 4)
230  ret i32 %res
231}
232
233; LCBB with an out-of-range displacement.
234define i32 @test_lcbb4(ptr %base) {
235; CHECK-LABEL: test_lcbb4:
236; CHECK:       # %bb.0:
237; CHECK-NEXT:    aghi %r2, 4096
238; CHECK-NEXT:    lcbb %r2, 0(%r2), 5
239; CHECK-NEXT:    br %r14
240  %ptr = getelementptr i8, ptr %base, i64 4096
241  %res = call i32 @llvm.s390.lcbb(ptr %ptr, i32 5)
242  ret i32 %res
243}
244
245; VLBB with the lowest M3 operand.
246define <16 x i8> @test_vlbb1(ptr %ptr) {
247; CHECK-LABEL: test_vlbb1:
248; CHECK:       # %bb.0:
249; CHECK-NEXT:    vlbb %v24, 0(%r2), 0
250; CHECK-NEXT:    br %r14
251  %res = call <16 x i8> @llvm.s390.vlbb(ptr %ptr, i32 0)
252  ret <16 x i8> %res
253}
254
255; VLBB with the highest M3 operand.
256define <16 x i8> @test_vlbb2(ptr %ptr) {
257; CHECK-LABEL: test_vlbb2:
258; CHECK:       # %bb.0:
259; CHECK-NEXT:    vlbb %v24, 0(%r2), 15
260; CHECK-NEXT:    br %r14
261  %res = call <16 x i8> @llvm.s390.vlbb(ptr %ptr, i32 15)
262  ret <16 x i8> %res
263}
264
265; VLBB with a displacement and index.
266define <16 x i8> @test_vlbb3(ptr %base, i64 %index) {
267; CHECK-LABEL: test_vlbb3:
268; CHECK:       # %bb.0:
269; CHECK-NEXT:    vlbb %v24, 4095(%r2,%r3), 4
270; CHECK-NEXT:    br %r14
271  %add = add i64 %index, 4095
272  %ptr = getelementptr i8, ptr %base, i64 %add
273  %res = call <16 x i8> @llvm.s390.vlbb(ptr %ptr, i32 4)
274  ret <16 x i8> %res
275}
276
277; VLBB with an out-of-range displacement.
278define <16 x i8> @test_vlbb4(ptr %base) {
279; CHECK-LABEL: test_vlbb4:
280; CHECK:       # %bb.0:
281; CHECK-NEXT:    aghi %r2, 4096
282; CHECK-NEXT:    vlbb %v24, 0(%r2), 5
283; CHECK-NEXT:    br %r14
284  %ptr = getelementptr i8, ptr %base, i64 4096
285  %res = call <16 x i8> @llvm.s390.vlbb(ptr %ptr, i32 5)
286  ret <16 x i8> %res
287}
288
289; VLL with the lowest in-range displacement.
290define <16 x i8> @test_vll1(ptr %ptr, i32 %length) {
291; CHECK-LABEL: test_vll1:
292; CHECK:       # %bb.0:
293; CHECK-NEXT:    vll %v24, %r3, 0(%r2)
294; CHECK-NEXT:    br %r14
295  %res = call <16 x i8> @llvm.s390.vll(i32 %length, ptr %ptr)
296  ret <16 x i8> %res
297}
298
299; VLL with the highest in-range displacement.
300define <16 x i8> @test_vll2(ptr %base, i32 %length) {
301; CHECK-LABEL: test_vll2:
302; CHECK:       # %bb.0:
303; CHECK-NEXT:    vll %v24, %r3, 4095(%r2)
304; CHECK-NEXT:    br %r14
305  %ptr = getelementptr i8, ptr %base, i64 4095
306  %res = call <16 x i8> @llvm.s390.vll(i32 %length, ptr %ptr)
307  ret <16 x i8> %res
308}
309
310; VLL with an out-of-range displacementa.
311define <16 x i8> @test_vll3(ptr %base, i32 %length) {
312; CHECK-LABEL: test_vll3:
313; CHECK:       # %bb.0:
314; CHECK-NEXT:    aghi %r2, 4096
315; CHECK-NEXT:    vll %v24, %r3, 0(%r2)
316; CHECK-NEXT:    br %r14
317  %ptr = getelementptr i8, ptr %base, i64 4096
318  %res = call <16 x i8> @llvm.s390.vll(i32 %length, ptr %ptr)
319  ret <16 x i8> %res
320}
321
322; Check that VLL doesn't allow an index.
323define <16 x i8> @test_vll4(ptr %base, i64 %index, i32 %length) {
324; CHECK-LABEL: test_vll4:
325; CHECK:       # %bb.0:
326; CHECK-NEXT:    agr %r2, %r3
327; CHECK-NEXT:    vll %v24, %r4, 0(%r2)
328; CHECK-NEXT:    br %r14
329  %ptr = getelementptr i8, ptr %base, i64 %index
330  %res = call <16 x i8> @llvm.s390.vll(i32 %length, ptr %ptr)
331  ret <16 x i8> %res
332}
333
334; VLL with length >= 15 should become VL.
335define <16 x i8> @test_vll5(ptr %ptr) {
336; CHECK-LABEL: test_vll5:
337; CHECK:       # %bb.0:
338; CHECK-NEXT:    vl %v24, 0(%r2), 3
339; CHECK-NEXT:    br %r14
340  %res = call <16 x i8> @llvm.s390.vll(i32 15, ptr %ptr)
341  ret <16 x i8> %res
342}
343
344; VPDI taking element 0 from each half.
345define <2 x i64> @test_vpdi1(<2 x i64> %a, <2 x i64> %b) {
346; CHECK-LABEL: test_vpdi1:
347; CHECK:       # %bb.0:
348; CHECK-NEXT:    vpdi %v24, %v24, %v26, 0
349; CHECK-NEXT:    br %r14
350  %res = call <2 x i64> @llvm.s390.vpdi(<2 x i64> %a, <2 x i64> %b, i32 0)
351  ret <2 x i64> %res
352}
353
354; VPDI taking element 1 from each half.
355define <2 x i64> @test_vpdi2(<2 x i64> %a, <2 x i64> %b) {
356; CHECK-LABEL: test_vpdi2:
357; CHECK:       # %bb.0:
358; CHECK-NEXT:    vpdi %v24, %v24, %v26, 5
359; CHECK-NEXT:    br %r14
360  %res = call <2 x i64> @llvm.s390.vpdi(<2 x i64> %a, <2 x i64> %b, i32 5)
361  ret <2 x i64> %res
362}
363
364; VPERM.
365define <16 x i8> @test_vperm(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
366; CHECK-LABEL: test_vperm:
367; CHECK:       # %bb.0:
368; CHECK-NEXT:    vperm %v24, %v24, %v26, %v28
369; CHECK-NEXT:    br %r14
370  %res = call <16 x i8> @llvm.s390.vperm(<16 x i8> %a, <16 x i8> %b,
371                                         <16 x i8> %c)
372  ret <16 x i8> %res
373}
374
375; VPKSH.
376define <16 x i8> @test_vpksh(<8 x i16> %a, <8 x i16> %b) {
377; CHECK-LABEL: test_vpksh:
378; CHECK:       # %bb.0:
379; CHECK-NEXT:    vpksh %v24, %v24, %v26
380; CHECK-NEXT:    br %r14
381  %res = call <16 x i8> @llvm.s390.vpksh(<8 x i16> %a, <8 x i16> %b)
382  ret <16 x i8> %res
383}
384
385; VPKSF.
386define <8 x i16> @test_vpksf(<4 x i32> %a, <4 x i32> %b) {
387; CHECK-LABEL: test_vpksf:
388; CHECK:       # %bb.0:
389; CHECK-NEXT:    vpksf %v24, %v24, %v26
390; CHECK-NEXT:    br %r14
391  %res = call <8 x i16> @llvm.s390.vpksf(<4 x i32> %a, <4 x i32> %b)
392  ret <8 x i16> %res
393}
394
395; VPKSG.
396define <4 x i32> @test_vpksg(<2 x i64> %a, <2 x i64> %b) {
397; CHECK-LABEL: test_vpksg:
398; CHECK:       # %bb.0:
399; CHECK-NEXT:    vpksg %v24, %v24, %v26
400; CHECK-NEXT:    br %r14
401  %res = call <4 x i32> @llvm.s390.vpksg(<2 x i64> %a, <2 x i64> %b)
402  ret <4 x i32> %res
403}
404
405; VPKSHS with no processing of the result.
406define <16 x i8> @test_vpkshs(<8 x i16> %a, <8 x i16> %b, ptr %ccptr) {
407; CHECK-LABEL: test_vpkshs:
408; CHECK:       # %bb.0:
409; CHECK-NEXT:    vpkshs %v24, %v24, %v26
410; CHECK-NEXT:    ipm %r0
411; CHECK-NEXT:    srl %r0, 28
412; CHECK-NEXT:    st %r0, 0(%r2)
413; CHECK-NEXT:    br %r14
414  %call = call {<16 x i8>, i32} @llvm.s390.vpkshs(<8 x i16> %a, <8 x i16> %b)
415  %res = extractvalue {<16 x i8>, i32} %call, 0
416  %cc = extractvalue {<16 x i8>, i32} %call, 1
417  store i32 %cc, ptr %ccptr
418  ret <16 x i8> %res
419}
420
421; VPKSHS, storing to %ptr if all values were saturated.
422define <16 x i8> @test_vpkshs_all_store(<8 x i16> %a, <8 x i16> %b, ptr %ptr) {
423; CHECK-LABEL: test_vpkshs_all_store:
424; CHECK:       # %bb.0:
425; CHECK-NEXT:    vpkshs %v24, %v24, %v26
426; CHECK-NEXT:    bler %r14
427; CHECK-NEXT:  .LBB20_1: # %store
428; CHECK-NEXT:    mvhi 0(%r2), 0
429; CHECK-NEXT:    br %r14
430  %call = call {<16 x i8>, i32} @llvm.s390.vpkshs(<8 x i16> %a, <8 x i16> %b)
431  %res = extractvalue {<16 x i8>, i32} %call, 0
432  %cc = extractvalue {<16 x i8>, i32} %call, 1
433  %cmp = icmp uge i32 %cc, 3
434  br i1 %cmp, label %store, label %exit
435
436store:
437  store i32 0, ptr %ptr
438  br label %exit
439
440exit:
441  ret <16 x i8> %res
442}
443
444; VPKSFS with no processing of the result.
445define <8 x i16> @test_vpksfs(<4 x i32> %a, <4 x i32> %b, ptr %ccptr) {
446; CHECK-LABEL: test_vpksfs:
447; CHECK:       # %bb.0:
448; CHECK-NEXT:    vpksfs %v24, %v24, %v26
449; CHECK-NEXT:    ipm %r0
450; CHECK-NEXT:    srl %r0, 28
451; CHECK-NEXT:    st %r0, 0(%r2)
452; CHECK-NEXT:    br %r14
453  %call = call {<8 x i16>, i32} @llvm.s390.vpksfs(<4 x i32> %a, <4 x i32> %b)
454  %res = extractvalue {<8 x i16>, i32} %call, 0
455  %cc = extractvalue {<8 x i16>, i32} %call, 1
456  store i32 %cc, ptr %ccptr
457  ret <8 x i16> %res
458}
459
460; VPKSFS, storing to %ptr if any values were saturated.
461define <8 x i16> @test_vpksfs_any_store(<4 x i32> %a, <4 x i32> %b, ptr %ptr) {
462; CHECK-LABEL: test_vpksfs_any_store:
463; CHECK:       # %bb.0:
464; CHECK-NEXT:    vpksfs %v24, %v24, %v26
465; CHECK-NEXT:    ber %r14
466; CHECK-NEXT:  .LBB22_1: # %store
467; CHECK-NEXT:    mvhi 0(%r2), 0
468; CHECK-NEXT:    br %r14
469  %call = call {<8 x i16>, i32} @llvm.s390.vpksfs(<4 x i32> %a, <4 x i32> %b)
470  %res = extractvalue {<8 x i16>, i32} %call, 0
471  %cc = extractvalue {<8 x i16>, i32} %call, 1
472  %cmp = icmp ugt i32 %cc, 0
473  br i1 %cmp, label %store, label %exit
474
475store:
476  store i32 0, ptr %ptr
477  br label %exit
478
479exit:
480  ret <8 x i16> %res
481}
482
483; VPKSGS with no processing of the result.
484define <4 x i32> @test_vpksgs(<2 x i64> %a, <2 x i64> %b, ptr %ccptr) {
485; CHECK-LABEL: test_vpksgs:
486; CHECK:       # %bb.0:
487; CHECK-NEXT:    vpksgs %v24, %v24, %v26
488; CHECK-NEXT:    ipm %r0
489; CHECK-NEXT:    srl %r0, 28
490; CHECK-NEXT:    st %r0, 0(%r2)
491; CHECK-NEXT:    br %r14
492  %call = call {<4 x i32>, i32} @llvm.s390.vpksgs(<2 x i64> %a, <2 x i64> %b)
493  %res = extractvalue {<4 x i32>, i32} %call, 0
494  %cc = extractvalue {<4 x i32>, i32} %call, 1
495  store i32 %cc, ptr %ccptr
496  ret <4 x i32> %res
497}
498
499; VPKSGS, storing to %ptr if no elements were saturated
500define <4 x i32> @test_vpksgs_none_store(<2 x i64> %a, <2 x i64> %b,
501; CHECK-LABEL: test_vpksgs_none_store:
502; CHECK:       # %bb.0:
503; CHECK-NEXT:    vpksgs %v24, %v24, %v26
504; CHECK-NEXT:    bnher %r14
505; CHECK-NEXT:  .LBB24_1: # %store
506; CHECK-NEXT:    mvhi 0(%r2), 0
507; CHECK-NEXT:    br %r14
508                                         ptr %ptr) {
509  %call = call {<4 x i32>, i32} @llvm.s390.vpksgs(<2 x i64> %a, <2 x i64> %b)
510  %res = extractvalue {<4 x i32>, i32} %call, 0
511  %cc = extractvalue {<4 x i32>, i32} %call, 1
512  %cmp = icmp sle i32 %cc, 0
513  br i1 %cmp, label %store, label %exit
514
515store:
516  store i32 0, ptr %ptr
517  br label %exit
518
519exit:
520  ret <4 x i32> %res
521}
522
523; VPKLSH.
524define <16 x i8> @test_vpklsh(<8 x i16> %a, <8 x i16> %b) {
525; CHECK-LABEL: test_vpklsh:
526; CHECK:       # %bb.0:
527; CHECK-NEXT:    vpklsh %v24, %v24, %v26
528; CHECK-NEXT:    br %r14
529  %res = call <16 x i8> @llvm.s390.vpklsh(<8 x i16> %a, <8 x i16> %b)
530  ret <16 x i8> %res
531}
532
533; VPKLSF.
534define <8 x i16> @test_vpklsf(<4 x i32> %a, <4 x i32> %b) {
535; CHECK-LABEL: test_vpklsf:
536; CHECK:       # %bb.0:
537; CHECK-NEXT:    vpklsf %v24, %v24, %v26
538; CHECK-NEXT:    br %r14
539  %res = call <8 x i16> @llvm.s390.vpklsf(<4 x i32> %a, <4 x i32> %b)
540  ret <8 x i16> %res
541}
542
543; VPKLSG.
544define <4 x i32> @test_vpklsg(<2 x i64> %a, <2 x i64> %b) {
545; CHECK-LABEL: test_vpklsg:
546; CHECK:       # %bb.0:
547; CHECK-NEXT:    vpklsg %v24, %v24, %v26
548; CHECK-NEXT:    br %r14
549  %res = call <4 x i32> @llvm.s390.vpklsg(<2 x i64> %a, <2 x i64> %b)
550  ret <4 x i32> %res
551}
552
553; VPKLSHS with no processing of the result.
554define <16 x i8> @test_vpklshs(<8 x i16> %a, <8 x i16> %b, ptr %ccptr) {
555; CHECK-LABEL: test_vpklshs:
556; CHECK:       # %bb.0:
557; CHECK-NEXT:    vpklshs %v24, %v24, %v26
558; CHECK-NEXT:    ipm %r0
559; CHECK-NEXT:    srl %r0, 28
560; CHECK-NEXT:    st %r0, 0(%r2)
561; CHECK-NEXT:    br %r14
562  %call = call {<16 x i8>, i32} @llvm.s390.vpklshs(<8 x i16> %a, <8 x i16> %b)
563  %res = extractvalue {<16 x i8>, i32} %call, 0
564  %cc = extractvalue {<16 x i8>, i32} %call, 1
565  store i32 %cc, ptr %ccptr
566  ret <16 x i8> %res
567}
568
569; VPKLSHS, storing to %ptr if all values were saturated.
570define <16 x i8> @test_vpklshs_all_store(<8 x i16> %a, <8 x i16> %b,
571; CHECK-LABEL: test_vpklshs_all_store:
572; CHECK:       # %bb.0:
573; CHECK-NEXT:    vpklshs %v24, %v24, %v26
574; CHECK-NEXT:    bler %r14
575; CHECK-NEXT:  .LBB29_1: # %store
576; CHECK-NEXT:    mvhi 0(%r2), 0
577; CHECK-NEXT:    br %r14
578                                         ptr %ptr) {
579  %call = call {<16 x i8>, i32} @llvm.s390.vpklshs(<8 x i16> %a, <8 x i16> %b)
580  %res = extractvalue {<16 x i8>, i32} %call, 0
581  %cc = extractvalue {<16 x i8>, i32} %call, 1
582  %cmp = icmp eq i32 %cc, 3
583  br i1 %cmp, label %store, label %exit
584
585store:
586  store i32 0, ptr %ptr
587  br label %exit
588
589exit:
590  ret <16 x i8> %res
591}
592
593; VPKLSFS with no processing of the result.
594define <8 x i16> @test_vpklsfs(<4 x i32> %a, <4 x i32> %b, ptr %ccptr) {
595; CHECK-LABEL: test_vpklsfs:
596; CHECK:       # %bb.0:
597; CHECK-NEXT:    vpklsfs %v24, %v24, %v26
598; CHECK-NEXT:    ipm %r0
599; CHECK-NEXT:    srl %r0, 28
600; CHECK-NEXT:    st %r0, 0(%r2)
601; CHECK-NEXT:    br %r14
602  %call = call {<8 x i16>, i32} @llvm.s390.vpklsfs(<4 x i32> %a, <4 x i32> %b)
603  %res = extractvalue {<8 x i16>, i32} %call, 0
604  %cc = extractvalue {<8 x i16>, i32} %call, 1
605  store i32 %cc, ptr %ccptr
606  ret <8 x i16> %res
607}
608
609; VPKLSFS, storing to %ptr if any values were saturated.
610define <8 x i16> @test_vpklsfs_any_store(<4 x i32> %a, <4 x i32> %b,
611; CHECK-LABEL: test_vpklsfs_any_store:
612; CHECK:       # %bb.0:
613; CHECK-NEXT:    vpklsfs %v24, %v24, %v26
614; CHECK-NEXT:    ber %r14
615; CHECK-NEXT:  .LBB31_1: # %store
616; CHECK-NEXT:    mvhi 0(%r2), 0
617; CHECK-NEXT:    br %r14
618                                         ptr %ptr) {
619  %call = call {<8 x i16>, i32} @llvm.s390.vpklsfs(<4 x i32> %a, <4 x i32> %b)
620  %res = extractvalue {<8 x i16>, i32} %call, 0
621  %cc = extractvalue {<8 x i16>, i32} %call, 1
622  %cmp = icmp ne i32 %cc, 0
623  br i1 %cmp, label %store, label %exit
624
625store:
626  store i32 0, ptr %ptr
627  br label %exit
628
629exit:
630  ret <8 x i16> %res
631}
632
633; VPKLSGS with no processing of the result.
634define <4 x i32> @test_vpklsgs(<2 x i64> %a, <2 x i64> %b, ptr %ccptr) {
635; CHECK-LABEL: test_vpklsgs:
636; CHECK:       # %bb.0:
637; CHECK-NEXT:    vpklsgs %v24, %v24, %v26
638; CHECK-NEXT:    ipm %r0
639; CHECK-NEXT:    srl %r0, 28
640; CHECK-NEXT:    st %r0, 0(%r2)
641; CHECK-NEXT:    br %r14
642  %call = call {<4 x i32>, i32} @llvm.s390.vpklsgs(<2 x i64> %a, <2 x i64> %b)
643  %res = extractvalue {<4 x i32>, i32} %call, 0
644  %cc = extractvalue {<4 x i32>, i32} %call, 1
645  store i32 %cc, ptr %ccptr
646  ret <4 x i32> %res
647}
648
649; VPKLSGS, storing to %ptr if no elements were saturated
650define <4 x i32> @test_vpklsgs_none_store(<2 x i64> %a, <2 x i64> %b,
651; CHECK-LABEL: test_vpklsgs_none_store:
652; CHECK:       # %bb.0:
653; CHECK-NEXT:    vpklsgs %v24, %v24, %v26
654; CHECK-NEXT:    bnher %r14
655; CHECK-NEXT:  .LBB33_1: # %store
656; CHECK-NEXT:    mvhi 0(%r2), 0
657; CHECK-NEXT:    br %r14
658                                          ptr %ptr) {
659  %call = call {<4 x i32>, i32} @llvm.s390.vpklsgs(<2 x i64> %a, <2 x i64> %b)
660  %res = extractvalue {<4 x i32>, i32} %call, 0
661  %cc = extractvalue {<4 x i32>, i32} %call, 1
662  %cmp = icmp eq i32 %cc, 0
663  br i1 %cmp, label %store, label %exit
664
665store:
666  store i32 0, ptr %ptr
667  br label %exit
668
669exit:
670  ret <4 x i32> %res
671}
672
673; VSTL with the lowest in-range displacement.
674define void @test_vstl1(<16 x i8> %vec, ptr %ptr, i32 %length) {
675; CHECK-LABEL: test_vstl1:
676; CHECK:       # %bb.0:
677; CHECK-NEXT:    vstl %v24, %r3, 0(%r2)
678; CHECK-NEXT:    br %r14
679  call void @llvm.s390.vstl(<16 x i8> %vec, i32 %length, ptr %ptr)
680  ret void
681}
682
683; VSTL with the highest in-range displacement.
684define void @test_vstl2(<16 x i8> %vec, ptr %base, i32 %length) {
685; CHECK-LABEL: test_vstl2:
686; CHECK:       # %bb.0:
687; CHECK-NEXT:    vstl %v24, %r3, 4095(%r2)
688; CHECK-NEXT:    br %r14
689  %ptr = getelementptr i8, ptr %base, i64 4095
690  call void @llvm.s390.vstl(<16 x i8> %vec, i32 %length, ptr %ptr)
691  ret void
692}
693
694; VSTL with an out-of-range displacement.
695define void @test_vstl3(<16 x i8> %vec, ptr %base, i32 %length) {
696; CHECK-LABEL: test_vstl3:
697; CHECK:       # %bb.0:
698; CHECK-NEXT:    aghi %r2, 4096
699; CHECK-NEXT:    vstl %v24, %r3, 0(%r2)
700; CHECK-NEXT:    br %r14
701  %ptr = getelementptr i8, ptr %base, i64 4096
702  call void @llvm.s390.vstl(<16 x i8> %vec, i32 %length, ptr %ptr)
703  ret void
704}
705
706; Check that VSTL doesn't allow an index.
707define void @test_vstl4(<16 x i8> %vec, ptr %base, i64 %index, i32 %length) {
708; CHECK-LABEL: test_vstl4:
709; CHECK:       # %bb.0:
710; CHECK-NEXT:    agr %r2, %r3
711; CHECK-NEXT:    vstl %v24, %r4, 0(%r2)
712; CHECK-NEXT:    br %r14
713  %ptr = getelementptr i8, ptr %base, i64 %index
714  call void @llvm.s390.vstl(<16 x i8> %vec, i32 %length, ptr %ptr)
715  ret void
716}
717
718; VSTL with length >= 15 should become VST.
719define void @test_vstl5(<16 x i8> %vec, ptr %ptr) {
720; CHECK-LABEL: test_vstl5:
721; CHECK:       # %bb.0:
722; CHECK-NEXT:    vst %v24, 0(%r2), 3
723; CHECK-NEXT:    br %r14
724  call void @llvm.s390.vstl(<16 x i8> %vec, i32 15, ptr %ptr)
725  ret void
726}
727
728; VUPHB.
729define <8 x i16> @test_vuphb(<16 x i8> %a) {
730; CHECK-LABEL: test_vuphb:
731; CHECK:       # %bb.0:
732; CHECK-NEXT:    vuphb %v24, %v24
733; CHECK-NEXT:    br %r14
734  %res = call <8 x i16> @llvm.s390.vuphb(<16 x i8> %a)
735  ret <8 x i16> %res
736}
737
738; VUPHH.
739define <4 x i32> @test_vuphh(<8 x i16> %a) {
740; CHECK-LABEL: test_vuphh:
741; CHECK:       # %bb.0:
742; CHECK-NEXT:    vuphh %v24, %v24
743; CHECK-NEXT:    br %r14
744  %res = call <4 x i32> @llvm.s390.vuphh(<8 x i16> %a)
745  ret <4 x i32> %res
746}
747
748; VUPHF.
749define <2 x i64> @test_vuphf(<4 x i32> %a) {
750; CHECK-LABEL: test_vuphf:
751; CHECK:       # %bb.0:
752; CHECK-NEXT:    vuphf %v24, %v24
753; CHECK-NEXT:    br %r14
754  %res = call <2 x i64> @llvm.s390.vuphf(<4 x i32> %a)
755  ret <2 x i64> %res
756}
757
758; VUPLHB.
759define <8 x i16> @test_vuplhb(<16 x i8> %a) {
760; CHECK-LABEL: test_vuplhb:
761; CHECK:       # %bb.0:
762; CHECK-NEXT:    vuplhb %v24, %v24
763; CHECK-NEXT:    br %r14
764  %res = call <8 x i16> @llvm.s390.vuplhb(<16 x i8> %a)
765  ret <8 x i16> %res
766}
767
768; VUPLHH.
769define <4 x i32> @test_vuplhh(<8 x i16> %a) {
770; CHECK-LABEL: test_vuplhh:
771; CHECK:       # %bb.0:
772; CHECK-NEXT:    vuplhh %v24, %v24
773; CHECK-NEXT:    br %r14
774  %res = call <4 x i32> @llvm.s390.vuplhh(<8 x i16> %a)
775  ret <4 x i32> %res
776}
777
778; VUPLHF.
779define <2 x i64> @test_vuplhf(<4 x i32> %a) {
780; CHECK-LABEL: test_vuplhf:
781; CHECK:       # %bb.0:
782; CHECK-NEXT:    vuplhf %v24, %v24
783; CHECK-NEXT:    br %r14
784  %res = call <2 x i64> @llvm.s390.vuplhf(<4 x i32> %a)
785  ret <2 x i64> %res
786}
787
788; VUPLB.
789define <8 x i16> @test_vuplb(<16 x i8> %a) {
790; CHECK-LABEL: test_vuplb:
791; CHECK:       # %bb.0:
792; CHECK-NEXT:    vuplb %v24, %v24
793; CHECK-NEXT:    br %r14
794  %res = call <8 x i16> @llvm.s390.vuplb(<16 x i8> %a)
795  ret <8 x i16> %res
796}
797
798; VUPLHW.
799define <4 x i32> @test_vuplhw(<8 x i16> %a) {
800; CHECK-LABEL: test_vuplhw:
801; CHECK:       # %bb.0:
802; CHECK-NEXT:    vuplhw %v24, %v24
803; CHECK-NEXT:    br %r14
804  %res = call <4 x i32> @llvm.s390.vuplhw(<8 x i16> %a)
805  ret <4 x i32> %res
806}
807
808; VUPLF.
809define <2 x i64> @test_vuplf(<4 x i32> %a) {
810; CHECK-LABEL: test_vuplf:
811; CHECK:       # %bb.0:
812; CHECK-NEXT:    vuplf %v24, %v24
813; CHECK-NEXT:    br %r14
814  %res = call <2 x i64> @llvm.s390.vuplf(<4 x i32> %a)
815  ret <2 x i64> %res
816}
817
818; VUPLLB.
819define <8 x i16> @test_vupllb(<16 x i8> %a) {
820; CHECK-LABEL: test_vupllb:
821; CHECK:       # %bb.0:
822; CHECK-NEXT:    vupllb %v24, %v24
823; CHECK-NEXT:    br %r14
824  %res = call <8 x i16> @llvm.s390.vupllb(<16 x i8> %a)
825  ret <8 x i16> %res
826}
827
828; VUPLLH.
829define <4 x i32> @test_vupllh(<8 x i16> %a) {
830; CHECK-LABEL: test_vupllh:
831; CHECK:       # %bb.0:
832; CHECK-NEXT:    vupllh %v24, %v24
833; CHECK-NEXT:    br %r14
834  %res = call <4 x i32> @llvm.s390.vupllh(<8 x i16> %a)
835  ret <4 x i32> %res
836}
837
838; VUPLLF.
839define <2 x i64> @test_vupllf(<4 x i32> %a) {
840; CHECK-LABEL: test_vupllf:
841; CHECK:       # %bb.0:
842; CHECK-NEXT:    vupllf %v24, %v24
843; CHECK-NEXT:    br %r14
844  %res = call <2 x i64> @llvm.s390.vupllf(<4 x i32> %a)
845  ret <2 x i64> %res
846}
847
848; VACCB.
849define <16 x i8> @test_vaccb(<16 x i8> %a, <16 x i8> %b) {
850; CHECK-LABEL: test_vaccb:
851; CHECK:       # %bb.0:
852; CHECK-NEXT:    vaccb %v24, %v24, %v26
853; CHECK-NEXT:    br %r14
854  %res = call <16 x i8> @llvm.s390.vaccb(<16 x i8> %a, <16 x i8> %b)
855  ret <16 x i8> %res
856}
857
858; VACCH.
859define <8 x i16> @test_vacch(<8 x i16> %a, <8 x i16> %b) {
860; CHECK-LABEL: test_vacch:
861; CHECK:       # %bb.0:
862; CHECK-NEXT:    vacch %v24, %v24, %v26
863; CHECK-NEXT:    br %r14
864  %res = call <8 x i16> @llvm.s390.vacch(<8 x i16> %a, <8 x i16> %b)
865  ret <8 x i16> %res
866}
867
868; VACCF.
869define <4 x i32> @test_vaccf(<4 x i32> %a, <4 x i32> %b) {
870; CHECK-LABEL: test_vaccf:
871; CHECK:       # %bb.0:
872; CHECK-NEXT:    vaccf %v24, %v24, %v26
873; CHECK-NEXT:    br %r14
874  %res = call <4 x i32> @llvm.s390.vaccf(<4 x i32> %a, <4 x i32> %b)
875  ret <4 x i32> %res
876}
877
878; VACCG.
879define <2 x i64> @test_vaccg(<2 x i64> %a, <2 x i64> %b) {
880; CHECK-LABEL: test_vaccg:
881; CHECK:       # %bb.0:
882; CHECK-NEXT:    vaccg %v24, %v24, %v26
883; CHECK-NEXT:    br %r14
884  %res = call <2 x i64> @llvm.s390.vaccg(<2 x i64> %a, <2 x i64> %b)
885  ret <2 x i64> %res
886}
887
888; VAQ.
889define i128 @test_vaq(i128 %a, i128 %b) {
890; CHECK-LABEL: test_vaq:
891; CHECK:       # %bb.0:
892; CHECK-NEXT:    vl %v0, 0(%r4), 3
893; CHECK-NEXT:    vl %v1, 0(%r3), 3
894; CHECK-NEXT:    vaq %v0, %v1, %v0
895; CHECK-NEXT:    vst %v0, 0(%r2), 3
896; CHECK-NEXT:    br %r14
897  %res = call i128 @llvm.s390.vaq(i128 %a, i128 %b)
898  ret i128 %res
899}
900
901; VACQ.
902define i128 @test_vacq(i128 %a, i128 %b, i128 %c) {
903; CHECK-LABEL: test_vacq:
904; CHECK:       # %bb.0:
905; CHECK-NEXT:    vl %v0, 0(%r5), 3
906; CHECK-NEXT:    vl %v1, 0(%r4), 3
907; CHECK-NEXT:    vl %v2, 0(%r3), 3
908; CHECK-NEXT:    vacq %v0, %v2, %v1, %v0
909; CHECK-NEXT:    vst %v0, 0(%r2), 3
910; CHECK-NEXT:    br %r14
911  %res = call i128 @llvm.s390.vacq(i128 %a, i128 %b, i128 %c)
912  ret i128 %res
913}
914
915; VACCQ.
916define i128 @test_vaccq(i128 %a, i128 %b) {
917; CHECK-LABEL: test_vaccq:
918; CHECK:       # %bb.0:
919; CHECK-NEXT:    vl %v0, 0(%r4), 3
920; CHECK-NEXT:    vl %v1, 0(%r3), 3
921; CHECK-NEXT:    vaccq %v0, %v1, %v0
922; CHECK-NEXT:    vst %v0, 0(%r2), 3
923; CHECK-NEXT:    br %r14
924  %res = call i128 @llvm.s390.vaccq(i128 %a, i128 %b)
925  ret i128 %res
926}
927
928; VACCCQ.
929define i128 @test_vacccq(i128 %a, i128 %b, i128 %c) {
930; CHECK-LABEL: test_vacccq:
931; CHECK:       # %bb.0:
932; CHECK-NEXT:    vl %v0, 0(%r5), 3
933; CHECK-NEXT:    vl %v1, 0(%r4), 3
934; CHECK-NEXT:    vl %v2, 0(%r3), 3
935; CHECK-NEXT:    vacccq %v0, %v2, %v1, %v0
936; CHECK-NEXT:    vst %v0, 0(%r2), 3
937; CHECK-NEXT:    br %r14
938  %res = call i128 @llvm.s390.vacccq(i128 %a, i128 %b, i128 %c)
939  ret i128 %res
940}
941
942; VAVGB.
943define <16 x i8> @test_vavgb(<16 x i8> %a, <16 x i8> %b) {
944; CHECK-LABEL: test_vavgb:
945; CHECK:       # %bb.0:
946; CHECK-NEXT:    vavgb %v24, %v24, %v26
947; CHECK-NEXT:    br %r14
948  %res = call <16 x i8> @llvm.s390.vavgb(<16 x i8> %a, <16 x i8> %b)
949  ret <16 x i8> %res
950}
951
952; VAVGH.
953define <8 x i16> @test_vavgh(<8 x i16> %a, <8 x i16> %b) {
954; CHECK-LABEL: test_vavgh:
955; CHECK:       # %bb.0:
956; CHECK-NEXT:    vavgh %v24, %v24, %v26
957; CHECK-NEXT:    br %r14
958  %res = call <8 x i16> @llvm.s390.vavgh(<8 x i16> %a, <8 x i16> %b)
959  ret <8 x i16> %res
960}
961
962; VAVGF.
963define <4 x i32> @test_vavgf(<4 x i32> %a, <4 x i32> %b) {
964; CHECK-LABEL: test_vavgf:
965; CHECK:       # %bb.0:
966; CHECK-NEXT:    vavgf %v24, %v24, %v26
967; CHECK-NEXT:    br %r14
968  %res = call <4 x i32> @llvm.s390.vavgf(<4 x i32> %a, <4 x i32> %b)
969  ret <4 x i32> %res
970}
971
972; VAVGG.
973define <2 x i64> @test_vavgg(<2 x i64> %a, <2 x i64> %b) {
974; CHECK-LABEL: test_vavgg:
975; CHECK:       # %bb.0:
976; CHECK-NEXT:    vavgg %v24, %v24, %v26
977; CHECK-NEXT:    br %r14
978  %res = call <2 x i64> @llvm.s390.vavgg(<2 x i64> %a, <2 x i64> %b)
979  ret <2 x i64> %res
980}
981
982; VAVGLB.
983define <16 x i8> @test_vavglb(<16 x i8> %a, <16 x i8> %b) {
984; CHECK-LABEL: test_vavglb:
985; CHECK:       # %bb.0:
986; CHECK-NEXT:    vavglb %v24, %v24, %v26
987; CHECK-NEXT:    br %r14
988  %res = call <16 x i8> @llvm.s390.vavglb(<16 x i8> %a, <16 x i8> %b)
989  ret <16 x i8> %res
990}
991
992; VAVGLH.
993define <8 x i16> @test_vavglh(<8 x i16> %a, <8 x i16> %b) {
994; CHECK-LABEL: test_vavglh:
995; CHECK:       # %bb.0:
996; CHECK-NEXT:    vavglh %v24, %v24, %v26
997; CHECK-NEXT:    br %r14
998  %res = call <8 x i16> @llvm.s390.vavglh(<8 x i16> %a, <8 x i16> %b)
999  ret <8 x i16> %res
1000}
1001
1002; VAVGLF.
1003define <4 x i32> @test_vavglf(<4 x i32> %a, <4 x i32> %b) {
1004; CHECK-LABEL: test_vavglf:
1005; CHECK:       # %bb.0:
1006; CHECK-NEXT:    vavglf %v24, %v24, %v26
1007; CHECK-NEXT:    br %r14
1008  %res = call <4 x i32> @llvm.s390.vavglf(<4 x i32> %a, <4 x i32> %b)
1009  ret <4 x i32> %res
1010}
1011
1012; VAVGLG.
1013define <2 x i64> @test_vavglg(<2 x i64> %a, <2 x i64> %b) {
1014; CHECK-LABEL: test_vavglg:
1015; CHECK:       # %bb.0:
1016; CHECK-NEXT:    vavglg %v24, %v24, %v26
1017; CHECK-NEXT:    br %r14
1018  %res = call <2 x i64> @llvm.s390.vavglg(<2 x i64> %a, <2 x i64> %b)
1019  ret <2 x i64> %res
1020}
1021
1022; VCKSM.
1023define <4 x i32> @test_vcksm(<4 x i32> %a, <4 x i32> %b) {
1024; CHECK-LABEL: test_vcksm:
1025; CHECK:       # %bb.0:
1026; CHECK-NEXT:    vcksm %v24, %v24, %v26
1027; CHECK-NEXT:    br %r14
1028  %res = call <4 x i32> @llvm.s390.vcksm(<4 x i32> %a, <4 x i32> %b)
1029  ret <4 x i32> %res
1030}
1031
1032; VGFMB.
1033define <8 x i16> @test_vgfmb(<16 x i8> %a, <16 x i8> %b) {
1034; CHECK-LABEL: test_vgfmb:
1035; CHECK:       # %bb.0:
1036; CHECK-NEXT:    vgfmb %v24, %v24, %v26
1037; CHECK-NEXT:    br %r14
1038  %res = call <8 x i16> @llvm.s390.vgfmb(<16 x i8> %a, <16 x i8> %b)
1039  ret <8 x i16> %res
1040}
1041
1042; VGFMH.
1043define <4 x i32> @test_vgfmh(<8 x i16> %a, <8 x i16> %b) {
1044; CHECK-LABEL: test_vgfmh:
1045; CHECK:       # %bb.0:
1046; CHECK-NEXT:    vgfmh %v24, %v24, %v26
1047; CHECK-NEXT:    br %r14
1048  %res = call <4 x i32> @llvm.s390.vgfmh(<8 x i16> %a, <8 x i16> %b)
1049  ret <4 x i32> %res
1050}
1051
1052; VGFMF.
1053define <2 x i64> @test_vgfmf(<4 x i32> %a, <4 x i32> %b) {
1054; CHECK-LABEL: test_vgfmf:
1055; CHECK:       # %bb.0:
1056; CHECK-NEXT:    vgfmf %v24, %v24, %v26
1057; CHECK-NEXT:    br %r14
1058  %res = call <2 x i64> @llvm.s390.vgfmf(<4 x i32> %a, <4 x i32> %b)
1059  ret <2 x i64> %res
1060}
1061
1062; VGFMG.
1063define i128 @test_vgfmg(<2 x i64> %a, <2 x i64> %b) {
1064; CHECK-LABEL: test_vgfmg:
1065; CHECK:       # %bb.0:
1066; CHECK-NEXT:    vgfmg %v0, %v24, %v26
1067; CHECK-NEXT:    vst %v0, 0(%r2), 3
1068; CHECK-NEXT:    br %r14
1069  %res = call i128 @llvm.s390.vgfmg(<2 x i64> %a, <2 x i64> %b)
1070  ret i128 %res
1071}
1072
1073; VGFMAB.
1074define <8 x i16> @test_vgfmab(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) {
1075; CHECK-LABEL: test_vgfmab:
1076; CHECK:       # %bb.0:
1077; CHECK-NEXT:    vgfmab %v24, %v24, %v26, %v28
1078; CHECK-NEXT:    br %r14
1079  %res = call <8 x i16> @llvm.s390.vgfmab(<16 x i8> %a, <16 x i8> %b,
1080                                          <8 x i16> %c)
1081  ret <8 x i16> %res
1082}
1083
1084; VGFMAH.
1085define <4 x i32> @test_vgfmah(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) {
1086; CHECK-LABEL: test_vgfmah:
1087; CHECK:       # %bb.0:
1088; CHECK-NEXT:    vgfmah %v24, %v24, %v26, %v28
1089; CHECK-NEXT:    br %r14
1090  %res = call <4 x i32> @llvm.s390.vgfmah(<8 x i16> %a, <8 x i16> %b,
1091                                          <4 x i32> %c)
1092  ret <4 x i32> %res
1093}
1094
1095; VGFMAF.
1096define <2 x i64> @test_vgfmaf(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) {
1097; CHECK-LABEL: test_vgfmaf:
1098; CHECK:       # %bb.0:
1099; CHECK-NEXT:    vgfmaf %v24, %v24, %v26, %v28
1100; CHECK-NEXT:    br %r14
1101  %res = call <2 x i64> @llvm.s390.vgfmaf(<4 x i32> %a, <4 x i32> %b,
1102                                          <2 x i64> %c)
1103  ret <2 x i64> %res
1104}
1105
1106; VGFMAG.
1107define i128 @test_vgfmag(<2 x i64> %a, <2 x i64> %b, i128 %c) {
1108; CHECK-LABEL: test_vgfmag:
1109; CHECK:       # %bb.0:
1110; CHECK-NEXT:    vl %v0, 0(%r3), 3
1111; CHECK-NEXT:    vgfmag %v0, %v24, %v26, %v0
1112; CHECK-NEXT:    vst %v0, 0(%r2), 3
1113; CHECK-NEXT:    br %r14
1114  %res = call i128 @llvm.s390.vgfmag(<2 x i64> %a, <2 x i64> %b, i128 %c)
1115  ret i128 %res
1116}
1117
1118; VMAHB.
1119define <16 x i8> @test_vmahb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
1120; CHECK-LABEL: test_vmahb:
1121; CHECK:       # %bb.0:
1122; CHECK-NEXT:    vmahb %v24, %v24, %v26, %v28
1123; CHECK-NEXT:    br %r14
1124  %res = call <16 x i8> @llvm.s390.vmahb(<16 x i8> %a, <16 x i8> %b,
1125                                         <16 x i8> %c)
1126  ret <16 x i8> %res
1127}
1128
1129; VMAHH.
1130define <8 x i16> @test_vmahh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) {
1131; CHECK-LABEL: test_vmahh:
1132; CHECK:       # %bb.0:
1133; CHECK-NEXT:    vmahh %v24, %v24, %v26, %v28
1134; CHECK-NEXT:    br %r14
1135  %res = call <8 x i16> @llvm.s390.vmahh(<8 x i16> %a, <8 x i16> %b,
1136                                         <8 x i16> %c)
1137  ret <8 x i16> %res
1138}
1139
1140; VMAHF.
1141define <4 x i32> @test_vmahf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
1142; CHECK-LABEL: test_vmahf:
1143; CHECK:       # %bb.0:
1144; CHECK-NEXT:    vmahf %v24, %v24, %v26, %v28
1145; CHECK-NEXT:    br %r14
1146  %res = call <4 x i32> @llvm.s390.vmahf(<4 x i32> %a, <4 x i32> %b,
1147                                         <4 x i32> %c)
1148  ret <4 x i32> %res
1149}
1150
1151; VMALHB.
1152define <16 x i8> @test_vmalhb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
1153; CHECK-LABEL: test_vmalhb:
1154; CHECK:       # %bb.0:
1155; CHECK-NEXT:    vmalhb %v24, %v24, %v26, %v28
1156; CHECK-NEXT:    br %r14
1157  %res = call <16 x i8> @llvm.s390.vmalhb(<16 x i8> %a, <16 x i8> %b,
1158                                          <16 x i8> %c)
1159  ret <16 x i8> %res
1160}
1161
1162; VMALHH.
1163define <8 x i16> @test_vmalhh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) {
1164; CHECK-LABEL: test_vmalhh:
1165; CHECK:       # %bb.0:
1166; CHECK-NEXT:    vmalhh %v24, %v24, %v26, %v28
1167; CHECK-NEXT:    br %r14
1168  %res = call <8 x i16> @llvm.s390.vmalhh(<8 x i16> %a, <8 x i16> %b,
1169                                          <8 x i16> %c)
1170  ret <8 x i16> %res
1171}
1172
1173; VMALHF.
1174define <4 x i32> @test_vmalhf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
1175; CHECK-LABEL: test_vmalhf:
1176; CHECK:       # %bb.0:
1177; CHECK-NEXT:    vmalhf %v24, %v24, %v26, %v28
1178; CHECK-NEXT:    br %r14
1179  %res = call <4 x i32> @llvm.s390.vmalhf(<4 x i32> %a, <4 x i32> %b,
1180                                          <4 x i32> %c)
1181  ret <4 x i32> %res
1182}
1183
1184; VMAEB.
1185define <8 x i16> @test_vmaeb(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) {
1186; CHECK-LABEL: test_vmaeb:
1187; CHECK:       # %bb.0:
1188; CHECK-NEXT:    vmaeb %v24, %v24, %v26, %v28
1189; CHECK-NEXT:    br %r14
1190  %res = call <8 x i16> @llvm.s390.vmaeb(<16 x i8> %a, <16 x i8> %b,
1191                                         <8 x i16> %c)
1192  ret <8 x i16> %res
1193}
1194
1195; VMAEH.
1196define <4 x i32> @test_vmaeh(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) {
1197; CHECK-LABEL: test_vmaeh:
1198; CHECK:       # %bb.0:
1199; CHECK-NEXT:    vmaeh %v24, %v24, %v26, %v28
1200; CHECK-NEXT:    br %r14
1201  %res = call <4 x i32> @llvm.s390.vmaeh(<8 x i16> %a, <8 x i16> %b,
1202                                         <4 x i32> %c)
1203  ret <4 x i32> %res
1204}
1205
1206; VMAEF.
1207define <2 x i64> @test_vmaef(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) {
1208; CHECK-LABEL: test_vmaef:
1209; CHECK:       # %bb.0:
1210; CHECK-NEXT:    vmaef %v24, %v24, %v26, %v28
1211; CHECK-NEXT:    br %r14
1212  %res = call <2 x i64> @llvm.s390.vmaef(<4 x i32> %a, <4 x i32> %b,
1213                                         <2 x i64> %c)
1214  ret <2 x i64> %res
1215}
1216
1217; VMALEB.
1218define <8 x i16> @test_vmaleb(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) {
1219; CHECK-LABEL: test_vmaleb:
1220; CHECK:       # %bb.0:
1221; CHECK-NEXT:    vmaleb %v24, %v24, %v26, %v28
1222; CHECK-NEXT:    br %r14
1223  %res = call <8 x i16> @llvm.s390.vmaleb(<16 x i8> %a, <16 x i8> %b,
1224                                          <8 x i16> %c)
1225  ret <8 x i16> %res
1226}
1227
1228; VMALEH.
1229define <4 x i32> @test_vmaleh(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) {
1230; CHECK-LABEL: test_vmaleh:
1231; CHECK:       # %bb.0:
1232; CHECK-NEXT:    vmaleh %v24, %v24, %v26, %v28
1233; CHECK-NEXT:    br %r14
1234  %res = call <4 x i32> @llvm.s390.vmaleh(<8 x i16> %a, <8 x i16> %b,
1235                                          <4 x i32> %c)
1236  ret <4 x i32> %res
1237}
1238
1239; VMALEF.
1240define <2 x i64> @test_vmalef(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) {
1241; CHECK-LABEL: test_vmalef:
1242; CHECK:       # %bb.0:
1243; CHECK-NEXT:    vmalef %v24, %v24, %v26, %v28
1244; CHECK-NEXT:    br %r14
1245  %res = call <2 x i64> @llvm.s390.vmalef(<4 x i32> %a, <4 x i32> %b,
1246                                          <2 x i64> %c)
1247  ret <2 x i64> %res
1248}
1249
1250; VMAOB.
1251define <8 x i16> @test_vmaob(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) {
1252; CHECK-LABEL: test_vmaob:
1253; CHECK:       # %bb.0:
1254; CHECK-NEXT:    vmaob %v24, %v24, %v26, %v28
1255; CHECK-NEXT:    br %r14
1256  %res = call <8 x i16> @llvm.s390.vmaob(<16 x i8> %a, <16 x i8> %b,
1257                                         <8 x i16> %c)
1258  ret <8 x i16> %res
1259}
1260
1261; VMAOH.
1262define <4 x i32> @test_vmaoh(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) {
1263; CHECK-LABEL: test_vmaoh:
1264; CHECK:       # %bb.0:
1265; CHECK-NEXT:    vmaoh %v24, %v24, %v26, %v28
1266; CHECK-NEXT:    br %r14
1267  %res = call <4 x i32> @llvm.s390.vmaoh(<8 x i16> %a, <8 x i16> %b,
1268                                         <4 x i32> %c)
1269  ret <4 x i32> %res
1270}
1271
1272; VMAOF.
1273define <2 x i64> @test_vmaof(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) {
1274; CHECK-LABEL: test_vmaof:
1275; CHECK:       # %bb.0:
1276; CHECK-NEXT:    vmaof %v24, %v24, %v26, %v28
1277; CHECK-NEXT:    br %r14
1278  %res = call <2 x i64> @llvm.s390.vmaof(<4 x i32> %a, <4 x i32> %b,
1279                                         <2 x i64> %c)
1280  ret <2 x i64> %res
1281}
1282
1283; VMALOB.
1284define <8 x i16> @test_vmalob(<16 x i8> %a, <16 x i8> %b, <8 x i16> %c) {
1285; CHECK-LABEL: test_vmalob:
1286; CHECK:       # %bb.0:
1287; CHECK-NEXT:    vmalob %v24, %v24, %v26, %v28
1288; CHECK-NEXT:    br %r14
1289  %res = call <8 x i16> @llvm.s390.vmalob(<16 x i8> %a, <16 x i8> %b,
1290                                          <8 x i16> %c)
1291  ret <8 x i16> %res
1292}
1293
1294; VMALOH.
1295define <4 x i32> @test_vmaloh(<8 x i16> %a, <8 x i16> %b, <4 x i32> %c) {
1296; CHECK-LABEL: test_vmaloh:
1297; CHECK:       # %bb.0:
1298; CHECK-NEXT:    vmaloh %v24, %v24, %v26, %v28
1299; CHECK-NEXT:    br %r14
1300  %res = call <4 x i32> @llvm.s390.vmaloh(<8 x i16> %a, <8 x i16> %b,
1301                                          <4 x i32> %c)
1302  ret <4 x i32> %res
1303}
1304
1305; VMALOF.
1306define <2 x i64> @test_vmalof(<4 x i32> %a, <4 x i32> %b, <2 x i64> %c) {
1307; CHECK-LABEL: test_vmalof:
1308; CHECK:       # %bb.0:
1309; CHECK-NEXT:    vmalof %v24, %v24, %v26, %v28
1310; CHECK-NEXT:    br %r14
1311  %res = call <2 x i64> @llvm.s390.vmalof(<4 x i32> %a, <4 x i32> %b,
1312                                          <2 x i64> %c)
1313  ret <2 x i64> %res
1314}
1315
1316; VMHB.
1317define <16 x i8> @test_vmhb(<16 x i8> %a, <16 x i8> %b) {
1318; CHECK-LABEL: test_vmhb:
1319; CHECK:       # %bb.0:
1320; CHECK-NEXT:    vmhb %v24, %v24, %v26
1321; CHECK-NEXT:    br %r14
1322  %res = call <16 x i8> @llvm.s390.vmhb(<16 x i8> %a, <16 x i8> %b)
1323  ret <16 x i8> %res
1324}
1325
1326; VMHH.
1327define <8 x i16> @test_vmhh(<8 x i16> %a, <8 x i16> %b) {
1328; CHECK-LABEL: test_vmhh:
1329; CHECK:       # %bb.0:
1330; CHECK-NEXT:    vmhh %v24, %v24, %v26
1331; CHECK-NEXT:    br %r14
1332  %res = call <8 x i16> @llvm.s390.vmhh(<8 x i16> %a, <8 x i16> %b)
1333  ret <8 x i16> %res
1334}
1335
1336; VMHF.
1337define <4 x i32> @test_vmhf(<4 x i32> %a, <4 x i32> %b) {
1338; CHECK-LABEL: test_vmhf:
1339; CHECK:       # %bb.0:
1340; CHECK-NEXT:    vmhf %v24, %v24, %v26
1341; CHECK-NEXT:    br %r14
1342  %res = call <4 x i32> @llvm.s390.vmhf(<4 x i32> %a, <4 x i32> %b)
1343  ret <4 x i32> %res
1344}
1345
1346; VMLHB.
1347define <16 x i8> @test_vmlhb(<16 x i8> %a, <16 x i8> %b) {
1348; CHECK-LABEL: test_vmlhb:
1349; CHECK:       # %bb.0:
1350; CHECK-NEXT:    vmlhb %v24, %v24, %v26
1351; CHECK-NEXT:    br %r14
1352  %res = call <16 x i8> @llvm.s390.vmlhb(<16 x i8> %a, <16 x i8> %b)
1353  ret <16 x i8> %res
1354}
1355
1356; VMLHH.
1357define <8 x i16> @test_vmlhh(<8 x i16> %a, <8 x i16> %b) {
1358; CHECK-LABEL: test_vmlhh:
1359; CHECK:       # %bb.0:
1360; CHECK-NEXT:    vmlhh %v24, %v24, %v26
1361; CHECK-NEXT:    br %r14
1362  %res = call <8 x i16> @llvm.s390.vmlhh(<8 x i16> %a, <8 x i16> %b)
1363  ret <8 x i16> %res
1364}
1365
1366; VMLHF.
1367define <4 x i32> @test_vmlhf(<4 x i32> %a, <4 x i32> %b) {
1368; CHECK-LABEL: test_vmlhf:
1369; CHECK:       # %bb.0:
1370; CHECK-NEXT:    vmlhf %v24, %v24, %v26
1371; CHECK-NEXT:    br %r14
1372  %res = call <4 x i32> @llvm.s390.vmlhf(<4 x i32> %a, <4 x i32> %b)
1373  ret <4 x i32> %res
1374}
1375
1376; VMEB.
1377define <8 x i16> @test_vmeb(<16 x i8> %a, <16 x i8> %b) {
1378; CHECK-LABEL: test_vmeb:
1379; CHECK:       # %bb.0:
1380; CHECK-NEXT:    vmeb %v24, %v24, %v26
1381; CHECK-NEXT:    br %r14
1382  %res = call <8 x i16> @llvm.s390.vmeb(<16 x i8> %a, <16 x i8> %b)
1383  ret <8 x i16> %res
1384}
1385
1386; VMEH.
1387define <4 x i32> @test_vmeh(<8 x i16> %a, <8 x i16> %b) {
1388; CHECK-LABEL: test_vmeh:
1389; CHECK:       # %bb.0:
1390; CHECK-NEXT:    vmeh %v24, %v24, %v26
1391; CHECK-NEXT:    br %r14
1392  %res = call <4 x i32> @llvm.s390.vmeh(<8 x i16> %a, <8 x i16> %b)
1393  ret <4 x i32> %res
1394}
1395
1396; VMEF.
1397define <2 x i64> @test_vmef(<4 x i32> %a, <4 x i32> %b) {
1398; CHECK-LABEL: test_vmef:
1399; CHECK:       # %bb.0:
1400; CHECK-NEXT:    vmef %v24, %v24, %v26
1401; CHECK-NEXT:    br %r14
1402  %res = call <2 x i64> @llvm.s390.vmef(<4 x i32> %a, <4 x i32> %b)
1403  ret <2 x i64> %res
1404}
1405
1406; VMLEB.
1407define <8 x i16> @test_vmleb(<16 x i8> %a, <16 x i8> %b) {
1408; CHECK-LABEL: test_vmleb:
1409; CHECK:       # %bb.0:
1410; CHECK-NEXT:    vmleb %v24, %v24, %v26
1411; CHECK-NEXT:    br %r14
1412  %res = call <8 x i16> @llvm.s390.vmleb(<16 x i8> %a, <16 x i8> %b)
1413  ret <8 x i16> %res
1414}
1415
1416; VMLEH.
1417define <4 x i32> @test_vmleh(<8 x i16> %a, <8 x i16> %b) {
1418; CHECK-LABEL: test_vmleh:
1419; CHECK:       # %bb.0:
1420; CHECK-NEXT:    vmleh %v24, %v24, %v26
1421; CHECK-NEXT:    br %r14
1422  %res = call <4 x i32> @llvm.s390.vmleh(<8 x i16> %a, <8 x i16> %b)
1423  ret <4 x i32> %res
1424}
1425
1426; VMLEF.
1427define <2 x i64> @test_vmlef(<4 x i32> %a, <4 x i32> %b) {
1428; CHECK-LABEL: test_vmlef:
1429; CHECK:       # %bb.0:
1430; CHECK-NEXT:    vmlef %v24, %v24, %v26
1431; CHECK-NEXT:    br %r14
1432  %res = call <2 x i64> @llvm.s390.vmlef(<4 x i32> %a, <4 x i32> %b)
1433  ret <2 x i64> %res
1434}
1435
1436; VMOB.
1437define <8 x i16> @test_vmob(<16 x i8> %a, <16 x i8> %b) {
1438; CHECK-LABEL: test_vmob:
1439; CHECK:       # %bb.0:
1440; CHECK-NEXT:    vmob %v24, %v24, %v26
1441; CHECK-NEXT:    br %r14
1442  %res = call <8 x i16> @llvm.s390.vmob(<16 x i8> %a, <16 x i8> %b)
1443  ret <8 x i16> %res
1444}
1445
1446; VMOH.
1447define <4 x i32> @test_vmoh(<8 x i16> %a, <8 x i16> %b) {
1448; CHECK-LABEL: test_vmoh:
1449; CHECK:       # %bb.0:
1450; CHECK-NEXT:    vmoh %v24, %v24, %v26
1451; CHECK-NEXT:    br %r14
1452  %res = call <4 x i32> @llvm.s390.vmoh(<8 x i16> %a, <8 x i16> %b)
1453  ret <4 x i32> %res
1454}
1455
1456; VMOF.
1457define <2 x i64> @test_vmof(<4 x i32> %a, <4 x i32> %b) {
1458; CHECK-LABEL: test_vmof:
1459; CHECK:       # %bb.0:
1460; CHECK-NEXT:    vmof %v24, %v24, %v26
1461; CHECK-NEXT:    br %r14
1462  %res = call <2 x i64> @llvm.s390.vmof(<4 x i32> %a, <4 x i32> %b)
1463  ret <2 x i64> %res
1464}
1465
1466; VMLOB.
1467define <8 x i16> @test_vmlob(<16 x i8> %a, <16 x i8> %b) {
1468; CHECK-LABEL: test_vmlob:
1469; CHECK:       # %bb.0:
1470; CHECK-NEXT:    vmlob %v24, %v24, %v26
1471; CHECK-NEXT:    br %r14
1472  %res = call <8 x i16> @llvm.s390.vmlob(<16 x i8> %a, <16 x i8> %b)
1473  ret <8 x i16> %res
1474}
1475
1476; VMLOH.
1477define <4 x i32> @test_vmloh(<8 x i16> %a, <8 x i16> %b) {
1478; CHECK-LABEL: test_vmloh:
1479; CHECK:       # %bb.0:
1480; CHECK-NEXT:    vmloh %v24, %v24, %v26
1481; CHECK-NEXT:    br %r14
1482  %res = call <4 x i32> @llvm.s390.vmloh(<8 x i16> %a, <8 x i16> %b)
1483  ret <4 x i32> %res
1484}
1485
1486; VMLOF.
1487define <2 x i64> @test_vmlof(<4 x i32> %a, <4 x i32> %b) {
1488; CHECK-LABEL: test_vmlof:
1489; CHECK:       # %bb.0:
1490; CHECK-NEXT:    vmlof %v24, %v24, %v26
1491; CHECK-NEXT:    br %r14
1492  %res = call <2 x i64> @llvm.s390.vmlof(<4 x i32> %a, <4 x i32> %b)
1493  ret <2 x i64> %res
1494}
1495
1496; VERIMB.
1497define <16 x i8> @test_verimb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
1498; CHECK-LABEL: test_verimb:
1499; CHECK:       # %bb.0:
1500; CHECK-NEXT:    verimb %v24, %v26, %v28, 1
1501; CHECK-NEXT:    br %r14
1502  %res = call <16 x i8> @llvm.s390.verimb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, i32 1)
1503  ret <16 x i8> %res
1504}
1505
1506; VERIMH.
1507define <8 x i16> @test_verimh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) {
1508; CHECK-LABEL: test_verimh:
1509; CHECK:       # %bb.0:
1510; CHECK-NEXT:    verimh %v24, %v26, %v28, 1
1511; CHECK-NEXT:    br %r14
1512  %res = call <8 x i16> @llvm.s390.verimh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c, i32 1)
1513  ret <8 x i16> %res
1514}
1515
1516; VERIMF.
1517define <4 x i32> @test_verimf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
1518; CHECK-LABEL: test_verimf:
1519; CHECK:       # %bb.0:
1520; CHECK-NEXT:    verimf %v24, %v26, %v28, 1
1521; CHECK-NEXT:    br %r14
1522  %res = call <4 x i32> @llvm.s390.verimf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, i32 1)
1523  ret <4 x i32> %res
1524}
1525
1526; VERIMG.
1527define <2 x i64> @test_verimg(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c) {
1528; CHECK-LABEL: test_verimg:
1529; CHECK:       # %bb.0:
1530; CHECK-NEXT:    verimg %v24, %v26, %v28, 1
1531; CHECK-NEXT:    br %r14
1532  %res = call <2 x i64> @llvm.s390.verimg(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c, i32 1)
1533  ret <2 x i64> %res
1534}
1535
1536; VERIMB with a different mask.
1537define <16 x i8> @test_verimb_254(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
1538; CHECK-LABEL: test_verimb_254:
1539; CHECK:       # %bb.0:
1540; CHECK-NEXT:    verimb %v24, %v26, %v28, 254
1541; CHECK-NEXT:    br %r14
1542  %res = call <16 x i8> @llvm.s390.verimb(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c, i32 254)
1543  ret <16 x i8> %res
1544}
1545
1546; VSL.
1547define <16 x i8> @test_vsl(<16 x i8> %a, <16 x i8> %b) {
1548; CHECK-LABEL: test_vsl:
1549; CHECK:       # %bb.0:
1550; CHECK-NEXT:    vsl %v24, %v24, %v26
1551; CHECK-NEXT:    br %r14
1552  %res = call <16 x i8> @llvm.s390.vsl(<16 x i8> %a, <16 x i8> %b)
1553  ret <16 x i8> %res
1554}
1555
1556; VSLB.
1557define <16 x i8> @test_vslb(<16 x i8> %a, <16 x i8> %b) {
1558; CHECK-LABEL: test_vslb:
1559; CHECK:       # %bb.0:
1560; CHECK-NEXT:    vslb %v24, %v24, %v26
1561; CHECK-NEXT:    br %r14
1562  %res = call <16 x i8> @llvm.s390.vslb(<16 x i8> %a, <16 x i8> %b)
1563  ret <16 x i8> %res
1564}
1565
1566; VSRA.
1567define <16 x i8> @test_vsra(<16 x i8> %a, <16 x i8> %b) {
1568; CHECK-LABEL: test_vsra:
1569; CHECK:       # %bb.0:
1570; CHECK-NEXT:    vsra %v24, %v24, %v26
1571; CHECK-NEXT:    br %r14
1572  %res = call <16 x i8> @llvm.s390.vsra(<16 x i8> %a, <16 x i8> %b)
1573  ret <16 x i8> %res
1574}
1575
1576; VSRAB.
1577define <16 x i8> @test_vsrab(<16 x i8> %a, <16 x i8> %b) {
1578; CHECK-LABEL: test_vsrab:
1579; CHECK:       # %bb.0:
1580; CHECK-NEXT:    vsrab %v24, %v24, %v26
1581; CHECK-NEXT:    br %r14
1582  %res = call <16 x i8> @llvm.s390.vsrab(<16 x i8> %a, <16 x i8> %b)
1583  ret <16 x i8> %res
1584}
1585
1586; VSRL.
1587define <16 x i8> @test_vsrl(<16 x i8> %a, <16 x i8> %b) {
1588; CHECK-LABEL: test_vsrl:
1589; CHECK:       # %bb.0:
1590; CHECK-NEXT:    vsrl %v24, %v24, %v26
1591; CHECK-NEXT:    br %r14
1592  %res = call <16 x i8> @llvm.s390.vsrl(<16 x i8> %a, <16 x i8> %b)
1593  ret <16 x i8> %res
1594}
1595
1596; VSRLB.
1597define <16 x i8> @test_vsrlb(<16 x i8> %a, <16 x i8> %b) {
1598; CHECK-LABEL: test_vsrlb:
1599; CHECK:       # %bb.0:
1600; CHECK-NEXT:    vsrlb %v24, %v24, %v26
1601; CHECK-NEXT:    br %r14
1602  %res = call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %a, <16 x i8> %b)
1603  ret <16 x i8> %res
1604}
1605
1606; VSLDB with the minimum useful value.
1607define <16 x i8> @test_vsldb_1(<16 x i8> %a, <16 x i8> %b) {
1608; CHECK-LABEL: test_vsldb_1:
1609; CHECK:       # %bb.0:
1610; CHECK-NEXT:    vsldb %v24, %v24, %v26, 1
1611; CHECK-NEXT:    br %r14
1612  %res = call <16 x i8> @llvm.s390.vsldb(<16 x i8> %a, <16 x i8> %b, i32 1)
1613  ret <16 x i8> %res
1614}
1615
1616; VSLDB with the maximum value.
1617define <16 x i8> @test_vsldb_15(<16 x i8> %a, <16 x i8> %b) {
1618; CHECK-LABEL: test_vsldb_15:
1619; CHECK:       # %bb.0:
1620; CHECK-NEXT:    vsldb %v24, %v24, %v26, 15
1621; CHECK-NEXT:    br %r14
1622  %res = call <16 x i8> @llvm.s390.vsldb(<16 x i8> %a, <16 x i8> %b, i32 15)
1623  ret <16 x i8> %res
1624}
1625
1626; VSCBIB.
1627define <16 x i8> @test_vscbib(<16 x i8> %a, <16 x i8> %b) {
1628; CHECK-LABEL: test_vscbib:
1629; CHECK:       # %bb.0:
1630; CHECK-NEXT:    vscbib %v24, %v24, %v26
1631; CHECK-NEXT:    br %r14
1632  %res = call <16 x i8> @llvm.s390.vscbib(<16 x i8> %a, <16 x i8> %b)
1633  ret <16 x i8> %res
1634}
1635
1636; VSCBIH.
1637define <8 x i16> @test_vscbih(<8 x i16> %a, <8 x i16> %b) {
1638; CHECK-LABEL: test_vscbih:
1639; CHECK:       # %bb.0:
1640; CHECK-NEXT:    vscbih %v24, %v24, %v26
1641; CHECK-NEXT:    br %r14
1642  %res = call <8 x i16> @llvm.s390.vscbih(<8 x i16> %a, <8 x i16> %b)
1643  ret <8 x i16> %res
1644}
1645
1646; VSCBIF.
1647define <4 x i32> @test_vscbif(<4 x i32> %a, <4 x i32> %b) {
1648; CHECK-LABEL: test_vscbif:
1649; CHECK:       # %bb.0:
1650; CHECK-NEXT:    vscbif %v24, %v24, %v26
1651; CHECK-NEXT:    br %r14
1652  %res = call <4 x i32> @llvm.s390.vscbif(<4 x i32> %a, <4 x i32> %b)
1653  ret <4 x i32> %res
1654}
1655
1656; VSCBIG.
1657define <2 x i64> @test_vscbig(<2 x i64> %a, <2 x i64> %b) {
1658; CHECK-LABEL: test_vscbig:
1659; CHECK:       # %bb.0:
1660; CHECK-NEXT:    vscbig %v24, %v24, %v26
1661; CHECK-NEXT:    br %r14
1662  %res = call <2 x i64> @llvm.s390.vscbig(<2 x i64> %a, <2 x i64> %b)
1663  ret <2 x i64> %res
1664}
1665
1666; VSQ.
1667define i128 @test_vsq(i128 %a, i128 %b) {
1668; CHECK-LABEL: test_vsq:
1669; CHECK:       # %bb.0:
1670; CHECK-NEXT:    vl %v0, 0(%r4), 3
1671; CHECK-NEXT:    vl %v1, 0(%r3), 3
1672; CHECK-NEXT:    vsq %v0, %v1, %v0
1673; CHECK-NEXT:    vst %v0, 0(%r2), 3
1674; CHECK-NEXT:    br %r14
1675  %res = call i128 @llvm.s390.vsq(i128 %a, i128 %b)
1676  ret i128 %res
1677}
1678
1679; VSBIQ.
1680define i128 @test_vsbiq(i128 %a, i128 %b, i128 %c) {
1681; CHECK-LABEL: test_vsbiq:
1682; CHECK:       # %bb.0:
1683; CHECK-NEXT:    vl %v0, 0(%r5), 3
1684; CHECK-NEXT:    vl %v1, 0(%r4), 3
1685; CHECK-NEXT:    vl %v2, 0(%r3), 3
1686; CHECK-NEXT:    vsbiq %v0, %v2, %v1, %v0
1687; CHECK-NEXT:    vst %v0, 0(%r2), 3
1688; CHECK-NEXT:    br %r14
1689  %res = call i128 @llvm.s390.vsbiq(i128 %a, i128 %b, i128 %c)
1690  ret i128 %res
1691}
1692
1693; VSCBIQ.
1694define i128 @test_vscbiq(i128 %a, i128 %b) {
1695; CHECK-LABEL: test_vscbiq:
1696; CHECK:       # %bb.0:
1697; CHECK-NEXT:    vl %v0, 0(%r4), 3
1698; CHECK-NEXT:    vl %v1, 0(%r3), 3
1699; CHECK-NEXT:    vscbiq %v0, %v1, %v0
1700; CHECK-NEXT:    vst %v0, 0(%r2), 3
1701; CHECK-NEXT:    br %r14
1702  %res = call i128 @llvm.s390.vscbiq(i128 %a, i128 %b)
1703  ret i128 %res
1704}
1705
1706; VSBCBIQ.
1707define i128 @test_vsbcbiq(i128 %a, i128 %b, i128 %c) {
1708; CHECK-LABEL: test_vsbcbiq:
1709; CHECK:       # %bb.0:
1710; CHECK-NEXT:    vl %v0, 0(%r5), 3
1711; CHECK-NEXT:    vl %v1, 0(%r4), 3
1712; CHECK-NEXT:    vl %v2, 0(%r3), 3
1713; CHECK-NEXT:    vsbcbiq %v0, %v2, %v1, %v0
1714; CHECK-NEXT:    vst %v0, 0(%r2), 3
1715; CHECK-NEXT:    br %r14
1716  %res = call i128 @llvm.s390.vsbcbiq(i128 %a, i128 %b, i128 %c)
1717  ret i128 %res
1718}
1719
1720; VSUMB.
1721define <4 x i32> @test_vsumb(<16 x i8> %a, <16 x i8> %b) {
1722; CHECK-LABEL: test_vsumb:
1723; CHECK:       # %bb.0:
1724; CHECK-NEXT:    vsumb %v24, %v24, %v26
1725; CHECK-NEXT:    br %r14
1726  %res = call <4 x i32> @llvm.s390.vsumb(<16 x i8> %a, <16 x i8> %b)
1727  ret <4 x i32> %res
1728}
1729
1730; VSUMH.
1731define <4 x i32> @test_vsumh(<8 x i16> %a, <8 x i16> %b) {
1732; CHECK-LABEL: test_vsumh:
1733; CHECK:       # %bb.0:
1734; CHECK-NEXT:    vsumh %v24, %v24, %v26
1735; CHECK-NEXT:    br %r14
1736  %res = call <4 x i32> @llvm.s390.vsumh(<8 x i16> %a, <8 x i16> %b)
1737  ret <4 x i32> %res
1738}
1739
1740; VSUMGH.
1741define <2 x i64> @test_vsumgh(<8 x i16> %a, <8 x i16> %b) {
1742; CHECK-LABEL: test_vsumgh:
1743; CHECK:       # %bb.0:
1744; CHECK-NEXT:    vsumgh %v24, %v24, %v26
1745; CHECK-NEXT:    br %r14
1746  %res = call <2 x i64> @llvm.s390.vsumgh(<8 x i16> %a, <8 x i16> %b)
1747  ret <2 x i64> %res
1748}
1749
1750; VSUMGF.
1751define <2 x i64> @test_vsumgf(<4 x i32> %a, <4 x i32> %b) {
1752; CHECK-LABEL: test_vsumgf:
1753; CHECK:       # %bb.0:
1754; CHECK-NEXT:    vsumgf %v24, %v24, %v26
1755; CHECK-NEXT:    br %r14
1756  %res = call <2 x i64> @llvm.s390.vsumgf(<4 x i32> %a, <4 x i32> %b)
1757  ret <2 x i64> %res
1758}
1759
1760; VSUMQF.
1761define i128 @test_vsumqf(<4 x i32> %a, <4 x i32> %b) {
1762; CHECK-LABEL: test_vsumqf:
1763; CHECK:       # %bb.0:
1764; CHECK-NEXT:    vsumqf %v0, %v24, %v26
1765; CHECK-NEXT:    vst %v0, 0(%r2), 3
1766; CHECK-NEXT:    br %r14
1767  %res = call i128 @llvm.s390.vsumqf(<4 x i32> %a, <4 x i32> %b)
1768  ret i128 %res
1769}
1770
1771; VSUMQG.
1772define i128 @test_vsumqg(<2 x i64> %a, <2 x i64> %b) {
1773; CHECK-LABEL: test_vsumqg:
1774; CHECK:       # %bb.0:
1775; CHECK-NEXT:    vsumqg %v0, %v24, %v26
1776; CHECK-NEXT:    vst %v0, 0(%r2), 3
1777; CHECK-NEXT:    br %r14
1778  %res = call i128 @llvm.s390.vsumqg(<2 x i64> %a, <2 x i64> %b)
1779  ret i128 %res
1780}
1781
1782; VTM with no processing of the result.
1783define i32 @test_vtm(<16 x i8> %a, <16 x i8> %b) {
1784; CHECK-LABEL: test_vtm:
1785; CHECK:       # %bb.0:
1786; CHECK-NEXT:    vtm %v24, %v26
1787; CHECK-NEXT:    ipm %r2
1788; CHECK-NEXT:    srl %r2, 28
1789; CHECK-NEXT:    br %r14
1790  %res = call i32 @llvm.s390.vtm(<16 x i8> %a, <16 x i8> %b)
1791  ret i32 %res
1792}
1793
1794; VTM, storing to %ptr if all bits are set.
1795define void @test_vtm_all_store(<16 x i8> %a, <16 x i8> %b, ptr %ptr) {
1796; CHECK-LABEL: test_vtm_all_store:
1797; CHECK:       # %bb.0:
1798; CHECK-NEXT:    vtm %v24, %v26
1799; CHECK-NEXT:    bler %r14
1800; CHECK-NEXT:  .LBB140_1: # %store
1801; CHECK-NEXT:    mvhi 0(%r2), 0
1802; CHECK-NEXT:    br %r14
1803  %res = call i32 @llvm.s390.vtm(<16 x i8> %a, <16 x i8> %b)
1804  %cmp = icmp sge i32 %res, 3
1805  br i1 %cmp, label %store, label %exit
1806
1807store:
1808  store i32 0, ptr %ptr
1809  br label %exit
1810
1811exit:
1812  ret void
1813}
1814
1815; VCEQBS with no processing of the result.
1816define i32 @test_vceqbs(<16 x i8> %a, <16 x i8> %b) {
1817; CHECK-LABEL: test_vceqbs:
1818; CHECK:       # %bb.0:
1819; CHECK-NEXT:    vceqbs %v0, %v24, %v26
1820; CHECK-NEXT:    ipm %r2
1821; CHECK-NEXT:    srl %r2, 28
1822; CHECK-NEXT:    br %r14
1823  %call = call {<16 x i8>, i32} @llvm.s390.vceqbs(<16 x i8> %a, <16 x i8> %b)
1824  %res = extractvalue {<16 x i8>, i32} %call, 1
1825  ret i32 %res
1826}
1827
1828; VCEQBS, returning 1 if any elements are equal (CC != 3).
1829define i32 @test_vceqbs_any_bool(<16 x i8> %a, <16 x i8> %b) {
1830; CHECK-LABEL: test_vceqbs_any_bool:
1831; CHECK:       # %bb.0:
1832; CHECK-NEXT:    vceqbs %v0, %v24, %v26
1833; CHECK-NEXT:    lhi %r2, 0
1834; CHECK-NEXT:    lochile %r2, 1
1835; CHECK-NEXT:    br %r14
1836  %call = call {<16 x i8>, i32} @llvm.s390.vceqbs(<16 x i8> %a, <16 x i8> %b)
1837  %res = extractvalue {<16 x i8>, i32} %call, 1
1838  %cmp = icmp ne i32 %res, 3
1839  %ext = zext i1 %cmp to i32
1840  ret i32 %ext
1841}
1842
1843; VCEQBS, storing to %ptr if any elements are equal.
1844define <16 x i8> @test_vceqbs_any_store(<16 x i8> %a, <16 x i8> %b, ptr %ptr) {
1845; CHECK-LABEL: test_vceqbs_any_store:
1846; CHECK:       # %bb.0:
1847; CHECK-NEXT:    vceqbs %v24, %v24, %v26
1848; CHECK-NEXT:    bor %r14
1849; CHECK-NEXT:  .LBB143_1: # %store
1850; CHECK-NEXT:    mvhi 0(%r2), 0
1851; CHECK-NEXT:    br %r14
1852  %call = call {<16 x i8>, i32} @llvm.s390.vceqbs(<16 x i8> %a, <16 x i8> %b)
1853  %res = extractvalue {<16 x i8>, i32} %call, 0
1854  %cc = extractvalue {<16 x i8>, i32} %call, 1
1855  %cmp = icmp ule i32 %cc, 2
1856  br i1 %cmp, label %store, label %exit
1857
1858store:
1859  store i32 0, ptr %ptr
1860  br label %exit
1861
1862exit:
1863  ret <16 x i8> %res
1864}
1865
1866; VCEQHS with no processing of the result.
1867define i32 @test_vceqhs(<8 x i16> %a, <8 x i16> %b) {
1868; CHECK-LABEL: test_vceqhs:
1869; CHECK:       # %bb.0:
1870; CHECK-NEXT:    vceqhs %v0, %v24, %v26
1871; CHECK-NEXT:    ipm %r2
1872; CHECK-NEXT:    srl %r2, 28
1873; CHECK-NEXT:    br %r14
1874  %call = call {<8 x i16>, i32} @llvm.s390.vceqhs(<8 x i16> %a, <8 x i16> %b)
1875  %res = extractvalue {<8 x i16>, i32} %call, 1
1876  ret i32 %res
1877}
1878
1879; VCEQHS, returning 1 if not all elements are equal.
1880define i32 @test_vceqhs_notall_bool(<8 x i16> %a, <8 x i16> %b) {
1881; CHECK-LABEL: test_vceqhs_notall_bool:
1882; CHECK:       # %bb.0:
1883; CHECK-NEXT:    vceqhs %v0, %v24, %v26
1884; CHECK-NEXT:    lhi %r2, 0
1885; CHECK-NEXT:    lochinhe %r2, 1
1886; CHECK-NEXT:    br %r14
1887  %call = call {<8 x i16>, i32} @llvm.s390.vceqhs(<8 x i16> %a, <8 x i16> %b)
1888  %res = extractvalue {<8 x i16>, i32} %call, 1
1889  %cmp = icmp sge i32 %res, 1
1890  %ext = zext i1 %cmp to i32
1891  ret i32 %ext
1892}
1893
1894; VCEQHS, storing to %ptr if not all elements are equal.
1895define <8 x i16> @test_vceqhs_notall_store(<8 x i16> %a, <8 x i16> %b,
1896; CHECK-LABEL: test_vceqhs_notall_store:
1897; CHECK:       # %bb.0:
1898; CHECK-NEXT:    vceqhs %v24, %v24, %v26
1899; CHECK-NEXT:    ber %r14
1900; CHECK-NEXT:  .LBB146_1: # %store
1901; CHECK-NEXT:    mvhi 0(%r2), 0
1902; CHECK-NEXT:    br %r14
1903                                           ptr %ptr) {
1904  %call = call {<8 x i16>, i32} @llvm.s390.vceqhs(<8 x i16> %a, <8 x i16> %b)
1905  %res = extractvalue {<8 x i16>, i32} %call, 0
1906  %cc = extractvalue {<8 x i16>, i32} %call, 1
1907  %cmp = icmp ugt i32 %cc, 0
1908  br i1 %cmp, label %store, label %exit
1909
1910store:
1911  store i32 0, ptr %ptr
1912  br label %exit
1913
1914exit:
1915  ret <8 x i16> %res
1916}
1917
1918; VCEQFS with no processing of the result.
1919define i32 @test_vceqfs(<4 x i32> %a, <4 x i32> %b) {
1920; CHECK-LABEL: test_vceqfs:
1921; CHECK:       # %bb.0:
1922; CHECK-NEXT:    vceqfs %v0, %v24, %v26
1923; CHECK-NEXT:    ipm %r2
1924; CHECK-NEXT:    srl %r2, 28
1925; CHECK-NEXT:    br %r14
1926  %call = call {<4 x i32>, i32} @llvm.s390.vceqfs(<4 x i32> %a, <4 x i32> %b)
1927  %res = extractvalue {<4 x i32>, i32} %call, 1
1928  ret i32 %res
1929}
1930
1931; VCEQFS, returning 1 if no elements are equal.
1932define i32 @test_vceqfs_none_bool(<4 x i32> %a, <4 x i32> %b) {
1933; CHECK-LABEL: test_vceqfs_none_bool:
1934; CHECK:       # %bb.0:
1935; CHECK-NEXT:    vceqfs %v0, %v24, %v26
1936; CHECK-NEXT:    lhi %r2, 0
1937; CHECK-NEXT:    lochio %r2, 1
1938; CHECK-NEXT:    br %r14
1939  %call = call {<4 x i32>, i32} @llvm.s390.vceqfs(<4 x i32> %a, <4 x i32> %b)
1940  %res = extractvalue {<4 x i32>, i32} %call, 1
1941  %cmp = icmp eq i32 %res, 3
1942  %ext = zext i1 %cmp to i32
1943  ret i32 %ext
1944}
1945
1946; VCEQFS, storing to %ptr if no elements are equal.
1947define <4 x i32> @test_vceqfs_none_store(<4 x i32> %a, <4 x i32> %b,
1948; CHECK-LABEL: test_vceqfs_none_store:
1949; CHECK:       # %bb.0:
1950; CHECK-NEXT:    vceqfs %v24, %v24, %v26
1951; CHECK-NEXT:    bler %r14
1952; CHECK-NEXT:  .LBB149_1: # %store
1953; CHECK-NEXT:    mvhi 0(%r2), 0
1954; CHECK-NEXT:    br %r14
1955                                         ptr %ptr) {
1956  %call = call {<4 x i32>, i32} @llvm.s390.vceqfs(<4 x i32> %a, <4 x i32> %b)
1957  %res = extractvalue {<4 x i32>, i32} %call, 0
1958  %cc = extractvalue {<4 x i32>, i32} %call, 1
1959  %cmp = icmp uge i32 %cc, 3
1960  br i1 %cmp, label %store, label %exit
1961
1962store:
1963  store i32 0, ptr %ptr
1964  br label %exit
1965
1966exit:
1967  ret <4 x i32> %res
1968}
1969
1970; VCEQGS with no processing of the result.
1971define i32 @test_vceqgs(<2 x i64> %a, <2 x i64> %b) {
1972; CHECK-LABEL: test_vceqgs:
1973; CHECK:       # %bb.0:
1974; CHECK-NEXT:    vceqgs %v0, %v24, %v26
1975; CHECK-NEXT:    ipm %r2
1976; CHECK-NEXT:    srl %r2, 28
1977; CHECK-NEXT:    br %r14
1978  %call = call {<2 x i64>, i32} @llvm.s390.vceqgs(<2 x i64> %a, <2 x i64> %b)
1979  %res = extractvalue {<2 x i64>, i32} %call, 1
1980  ret i32 %res
1981}
1982
1983; VCEQGS returning 1 if all elements are equal (CC == 0).
1984define i32 @test_vceqgs_all_bool(<2 x i64> %a, <2 x i64> %b) {
1985; CHECK-LABEL: test_vceqgs_all_bool:
1986; CHECK:       # %bb.0:
1987; CHECK-NEXT:    vceqgs %v0, %v24, %v26
1988; CHECK-NEXT:    lhi %r2, 0
1989; CHECK-NEXT:    lochie %r2, 1
1990; CHECK-NEXT:    br %r14
1991  %call = call {<2 x i64>, i32} @llvm.s390.vceqgs(<2 x i64> %a, <2 x i64> %b)
1992  %res = extractvalue {<2 x i64>, i32} %call, 1
1993  %cmp = icmp ult i32 %res, 1
1994  %ext = zext i1 %cmp to i32
1995  ret i32 %ext
1996}
1997
1998; VCEQGS, storing to %ptr if all elements are equal.
1999define <2 x i64> @test_vceqgs_all_store(<2 x i64> %a, <2 x i64> %b, ptr %ptr) {
2000; CHECK-LABEL: test_vceqgs_all_store:
2001; CHECK:       # %bb.0:
2002; CHECK-NEXT:    vceqgs %v24, %v24, %v26
2003; CHECK-NEXT:    bnher %r14
2004; CHECK-NEXT:  .LBB152_1: # %store
2005; CHECK-NEXT:    mvhi 0(%r2), 0
2006; CHECK-NEXT:    br %r14
2007  %call = call {<2 x i64>, i32} @llvm.s390.vceqgs(<2 x i64> %a, <2 x i64> %b)
2008  %res = extractvalue {<2 x i64>, i32} %call, 0
2009  %cc = extractvalue {<2 x i64>, i32} %call, 1
2010  %cmp = icmp sle i32 %cc, 0
2011  br i1 %cmp, label %store, label %exit
2012
2013store:
2014  store i32 0, ptr %ptr
2015  br label %exit
2016
2017exit:
2018  ret <2 x i64> %res
2019}
2020
2021; VCHBS with no processing of the result.
2022define i32 @test_vchbs(<16 x i8> %a, <16 x i8> %b) {
2023; CHECK-LABEL: test_vchbs:
2024; CHECK:       # %bb.0:
2025; CHECK-NEXT:    vchbs %v0, %v24, %v26
2026; CHECK-NEXT:    ipm %r2
2027; CHECK-NEXT:    srl %r2, 28
2028; CHECK-NEXT:    br %r14
2029  %call = call {<16 x i8>, i32} @llvm.s390.vchbs(<16 x i8> %a, <16 x i8> %b)
2030  %res = extractvalue {<16 x i8>, i32} %call, 1
2031  ret i32 %res
2032}
2033
2034; VCHBS, returning 1 if any elements are higher (CC != 3).
2035define i32 @test_vchbs_any_bool(<16 x i8> %a, <16 x i8> %b) {
2036; CHECK-LABEL: test_vchbs_any_bool:
2037; CHECK:       # %bb.0:
2038; CHECK-NEXT:    vchbs %v0, %v24, %v26
2039; CHECK-NEXT:    lhi %r2, 0
2040; CHECK-NEXT:    lochile %r2, 1
2041; CHECK-NEXT:    br %r14
2042  %call = call {<16 x i8>, i32} @llvm.s390.vchbs(<16 x i8> %a, <16 x i8> %b)
2043  %res = extractvalue {<16 x i8>, i32} %call, 1
2044  %cmp = icmp ne i32 %res, 3
2045  %ext = zext i1 %cmp to i32
2046  ret i32 %ext
2047}
2048
2049; VCHBS, storing to %ptr if any elements are higher.
2050define <16 x i8> @test_vchbs_any_store(<16 x i8> %a, <16 x i8> %b, ptr %ptr) {
2051; CHECK-LABEL: test_vchbs_any_store:
2052; CHECK:       # %bb.0:
2053; CHECK-NEXT:    vchbs %v24, %v24, %v26
2054; CHECK-NEXT:    bor %r14
2055; CHECK-NEXT:  .LBB155_1: # %store
2056; CHECK-NEXT:    mvhi 0(%r2), 0
2057; CHECK-NEXT:    br %r14
2058  %call = call {<16 x i8>, i32} @llvm.s390.vchbs(<16 x i8> %a, <16 x i8> %b)
2059  %res = extractvalue {<16 x i8>, i32} %call, 0
2060  %cc = extractvalue {<16 x i8>, i32} %call, 1
2061  %cmp = icmp ule i32 %cc, 2
2062  br i1 %cmp, label %store, label %exit
2063
2064store:
2065  store i32 0, ptr %ptr
2066  br label %exit
2067
2068exit:
2069  ret <16 x i8> %res
2070}
2071
2072; VCHHS with no processing of the result.
2073define i32 @test_vchhs(<8 x i16> %a, <8 x i16> %b) {
2074; CHECK-LABEL: test_vchhs:
2075; CHECK:       # %bb.0:
2076; CHECK-NEXT:    vchhs %v0, %v24, %v26
2077; CHECK-NEXT:    ipm %r2
2078; CHECK-NEXT:    srl %r2, 28
2079; CHECK-NEXT:    br %r14
2080  %call = call {<8 x i16>, i32} @llvm.s390.vchhs(<8 x i16> %a, <8 x i16> %b)
2081  %res = extractvalue {<8 x i16>, i32} %call, 1
2082  ret i32 %res
2083}
2084
2085; VCHHS, returning 1 if not all elements are higher.
2086define i32 @test_vchhs_notall_bool(<8 x i16> %a, <8 x i16> %b) {
2087; CHECK-LABEL: test_vchhs_notall_bool:
2088; CHECK:       # %bb.0:
2089; CHECK-NEXT:    vchhs %v0, %v24, %v26
2090; CHECK-NEXT:    lhi %r2, 0
2091; CHECK-NEXT:    lochinhe %r2, 1
2092; CHECK-NEXT:    br %r14
2093  %call = call {<8 x i16>, i32} @llvm.s390.vchhs(<8 x i16> %a, <8 x i16> %b)
2094  %res = extractvalue {<8 x i16>, i32} %call, 1
2095  %cmp = icmp sge i32 %res, 1
2096  %ext = zext i1 %cmp to i32
2097  ret i32 %ext
2098}
2099
2100; VCHHS, storing to %ptr if not all elements are higher.
2101define <8 x i16> @test_vchhs_notall_store(<8 x i16> %a, <8 x i16> %b,
2102; CHECK-LABEL: test_vchhs_notall_store:
2103; CHECK:       # %bb.0:
2104; CHECK-NEXT:    vchhs %v24, %v24, %v26
2105; CHECK-NEXT:    ber %r14
2106; CHECK-NEXT:  .LBB158_1: # %store
2107; CHECK-NEXT:    mvhi 0(%r2), 0
2108; CHECK-NEXT:    br %r14
2109                                          ptr %ptr) {
2110  %call = call {<8 x i16>, i32} @llvm.s390.vchhs(<8 x i16> %a, <8 x i16> %b)
2111  %res = extractvalue {<8 x i16>, i32} %call, 0
2112  %cc = extractvalue {<8 x i16>, i32} %call, 1
2113  %cmp = icmp ugt i32 %cc, 0
2114  br i1 %cmp, label %store, label %exit
2115
2116store:
2117  store i32 0, ptr %ptr
2118  br label %exit
2119
2120exit:
2121  ret <8 x i16> %res
2122}
2123
2124; VCHFS with no processing of the result.
2125define i32 @test_vchfs(<4 x i32> %a, <4 x i32> %b) {
2126; CHECK-LABEL: test_vchfs:
2127; CHECK:       # %bb.0:
2128; CHECK-NEXT:    vchfs %v0, %v24, %v26
2129; CHECK-NEXT:    ipm %r2
2130; CHECK-NEXT:    srl %r2, 28
2131; CHECK-NEXT:    br %r14
2132  %call = call {<4 x i32>, i32} @llvm.s390.vchfs(<4 x i32> %a, <4 x i32> %b)
2133  %res = extractvalue {<4 x i32>, i32} %call, 1
2134  ret i32 %res
2135}
2136
2137; VCHFS, returning 1 if no elements are higher.
2138define i32 @test_vchfs_none_bool(<4 x i32> %a, <4 x i32> %b) {
2139; CHECK-LABEL: test_vchfs_none_bool:
2140; CHECK:       # %bb.0:
2141; CHECK-NEXT:    vchfs %v0, %v24, %v26
2142; CHECK-NEXT:    lhi %r2, 0
2143; CHECK-NEXT:    lochio %r2, 1
2144; CHECK-NEXT:    br %r14
2145  %call = call {<4 x i32>, i32} @llvm.s390.vchfs(<4 x i32> %a, <4 x i32> %b)
2146  %res = extractvalue {<4 x i32>, i32} %call, 1
2147  %cmp = icmp eq i32 %res, 3
2148  %ext = zext i1 %cmp to i32
2149  ret i32 %ext
2150}
2151
2152; VCHFS, storing to %ptr if no elements are higher.
2153define <4 x i32> @test_vchfs_none_store(<4 x i32> %a, <4 x i32> %b, ptr %ptr) {
2154; CHECK-LABEL: test_vchfs_none_store:
2155; CHECK:       # %bb.0:
2156; CHECK-NEXT:    vchfs %v24, %v24, %v26
2157; CHECK-NEXT:    bler %r14
2158; CHECK-NEXT:  .LBB161_1: # %store
2159; CHECK-NEXT:    mvhi 0(%r2), 0
2160; CHECK-NEXT:    br %r14
2161  %call = call {<4 x i32>, i32} @llvm.s390.vchfs(<4 x i32> %a, <4 x i32> %b)
2162  %res = extractvalue {<4 x i32>, i32} %call, 0
2163  %cc = extractvalue {<4 x i32>, i32} %call, 1
2164  %cmp = icmp uge i32 %cc, 3
2165  br i1 %cmp, label %store, label %exit
2166
2167store:
2168  store i32 0, ptr %ptr
2169  br label %exit
2170
2171exit:
2172  ret <4 x i32> %res
2173}
2174
2175; VCHGS with no processing of the result.
2176define i32 @test_vchgs(<2 x i64> %a, <2 x i64> %b) {
2177; CHECK-LABEL: test_vchgs:
2178; CHECK:       # %bb.0:
2179; CHECK-NEXT:    vchgs %v0, %v24, %v26
2180; CHECK-NEXT:    ipm %r2
2181; CHECK-NEXT:    srl %r2, 28
2182; CHECK-NEXT:    br %r14
2183  %call = call {<2 x i64>, i32} @llvm.s390.vchgs(<2 x i64> %a, <2 x i64> %b)
2184  %res = extractvalue {<2 x i64>, i32} %call, 1
2185  ret i32 %res
2186}
2187
2188; VCHGS returning 1 if all elements are higher (CC == 0).
2189define i32 @test_vchgs_all_bool(<2 x i64> %a, <2 x i64> %b) {
2190; CHECK-LABEL: test_vchgs_all_bool:
2191; CHECK:       # %bb.0:
2192; CHECK-NEXT:    vchgs %v0, %v24, %v26
2193; CHECK-NEXT:    lhi %r2, 0
2194; CHECK-NEXT:    lochie %r2, 1
2195; CHECK-NEXT:    br %r14
2196  %call = call {<2 x i64>, i32} @llvm.s390.vchgs(<2 x i64> %a, <2 x i64> %b)
2197  %res = extractvalue {<2 x i64>, i32} %call, 1
2198  %cmp = icmp ult i32 %res, 1
2199  %ext = zext i1 %cmp to i32
2200  ret i32 %ext
2201}
2202
2203; VCHGS, storing to %ptr if all elements are higher.
2204define <2 x i64> @test_vchgs_all_store(<2 x i64> %a, <2 x i64> %b, ptr %ptr) {
2205; CHECK-LABEL: test_vchgs_all_store:
2206; CHECK:       # %bb.0:
2207; CHECK-NEXT:    vchgs %v24, %v24, %v26
2208; CHECK-NEXT:    bnher %r14
2209; CHECK-NEXT:  .LBB164_1: # %store
2210; CHECK-NEXT:    mvhi 0(%r2), 0
2211; CHECK-NEXT:    br %r14
2212  %call = call {<2 x i64>, i32} @llvm.s390.vchgs(<2 x i64> %a, <2 x i64> %b)
2213  %res = extractvalue {<2 x i64>, i32} %call, 0
2214  %cc = extractvalue {<2 x i64>, i32} %call, 1
2215  %cmp = icmp sle i32 %cc, 0
2216  br i1 %cmp, label %store, label %exit
2217
2218store:
2219  store i32 0, ptr %ptr
2220  br label %exit
2221
2222exit:
2223  ret <2 x i64> %res
2224}
2225
2226; VCHLBS with no processing of the result.
2227define i32 @test_vchlbs(<16 x i8> %a, <16 x i8> %b) {
2228; CHECK-LABEL: test_vchlbs:
2229; CHECK:       # %bb.0:
2230; CHECK-NEXT:    vchlbs %v0, %v24, %v26
2231; CHECK-NEXT:    ipm %r2
2232; CHECK-NEXT:    srl %r2, 28
2233; CHECK-NEXT:    br %r14
2234  %call = call {<16 x i8>, i32} @llvm.s390.vchlbs(<16 x i8> %a, <16 x i8> %b)
2235  %res = extractvalue {<16 x i8>, i32} %call, 1
2236  ret i32 %res
2237}
2238
2239; VCHLBS, returning 1 if any elements are higher (CC != 3).
2240define i32 @test_vchlbs_any_bool(<16 x i8> %a, <16 x i8> %b) {
2241; CHECK-LABEL: test_vchlbs_any_bool:
2242; CHECK:       # %bb.0:
2243; CHECK-NEXT:    vchlbs %v0, %v24, %v26
2244; CHECK-NEXT:    lhi %r2, 0
2245; CHECK-NEXT:    lochile %r2, 1
2246; CHECK-NEXT:    br %r14
2247  %call = call {<16 x i8>, i32} @llvm.s390.vchlbs(<16 x i8> %a, <16 x i8> %b)
2248  %res = extractvalue {<16 x i8>, i32} %call, 1
2249  %cmp = icmp ne i32 %res, 3
2250  %ext = zext i1 %cmp to i32
2251  ret i32 %ext
2252}
2253
2254; VCHLBS, storing to %ptr if any elements are higher.
2255define <16 x i8> @test_vchlbs_any_store(<16 x i8> %a, <16 x i8> %b, ptr %ptr) {
2256; CHECK-LABEL: test_vchlbs_any_store:
2257; CHECK:       # %bb.0:
2258; CHECK-NEXT:    vchlbs %v24, %v24, %v26
2259; CHECK-NEXT:    bor %r14
2260; CHECK-NEXT:  .LBB167_1: # %store
2261; CHECK-NEXT:    mvhi 0(%r2), 0
2262; CHECK-NEXT:    br %r14
2263  %call = call {<16 x i8>, i32} @llvm.s390.vchlbs(<16 x i8> %a, <16 x i8> %b)
2264  %res = extractvalue {<16 x i8>, i32} %call, 0
2265  %cc = extractvalue {<16 x i8>, i32} %call, 1
2266  %cmp = icmp sle i32 %cc, 2
2267  br i1 %cmp, label %store, label %exit
2268
2269store:
2270  store i32 0, ptr %ptr
2271  br label %exit
2272
2273exit:
2274  ret <16 x i8> %res
2275}
2276
2277; VCHLHS with no processing of the result.
2278define i32 @test_vchlhs(<8 x i16> %a, <8 x i16> %b) {
2279; CHECK-LABEL: test_vchlhs:
2280; CHECK:       # %bb.0:
2281; CHECK-NEXT:    vchlhs %v0, %v24, %v26
2282; CHECK-NEXT:    ipm %r2
2283; CHECK-NEXT:    srl %r2, 28
2284; CHECK-NEXT:    br %r14
2285  %call = call {<8 x i16>, i32} @llvm.s390.vchlhs(<8 x i16> %a, <8 x i16> %b)
2286  %res = extractvalue {<8 x i16>, i32} %call, 1
2287  ret i32 %res
2288}
2289
2290; VCHLHS, returning 1 if not all elements are higher.
2291define i32 @test_vchlhs_notall_bool(<8 x i16> %a, <8 x i16> %b) {
2292; CHECK-LABEL: test_vchlhs_notall_bool:
2293; CHECK:       # %bb.0:
2294; CHECK-NEXT:    vchlhs %v0, %v24, %v26
2295; CHECK-NEXT:    lhi %r2, 0
2296; CHECK-NEXT:    lochinhe %r2, 1
2297; CHECK-NEXT:    br %r14
2298  %call = call {<8 x i16>, i32} @llvm.s390.vchlhs(<8 x i16> %a, <8 x i16> %b)
2299  %res = extractvalue {<8 x i16>, i32} %call, 1
2300  %cmp = icmp uge i32 %res, 1
2301  %ext = zext i1 %cmp to i32
2302  ret i32 %ext
2303}
2304
2305; VCHLHS, storing to %ptr if not all elements are higher.
2306define <8 x i16> @test_vchlhs_notall_store(<8 x i16> %a, <8 x i16> %b,
2307; CHECK-LABEL: test_vchlhs_notall_store:
2308; CHECK:       # %bb.0:
2309; CHECK-NEXT:    vchlhs %v24, %v24, %v26
2310; CHECK-NEXT:    ber %r14
2311; CHECK-NEXT:  .LBB170_1: # %store
2312; CHECK-NEXT:    mvhi 0(%r2), 0
2313; CHECK-NEXT:    br %r14
2314                                           ptr %ptr) {
2315  %call = call {<8 x i16>, i32} @llvm.s390.vchlhs(<8 x i16> %a, <8 x i16> %b)
2316  %res = extractvalue {<8 x i16>, i32} %call, 0
2317  %cc = extractvalue {<8 x i16>, i32} %call, 1
2318  %cmp = icmp sgt i32 %cc, 0
2319  br i1 %cmp, label %store, label %exit
2320
2321store:
2322  store i32 0, ptr %ptr
2323  br label %exit
2324
2325exit:
2326  ret <8 x i16> %res
2327}
2328
2329; VCHLFS with no processing of the result.
2330define i32 @test_vchlfs(<4 x i32> %a, <4 x i32> %b) {
2331; CHECK-LABEL: test_vchlfs:
2332; CHECK:       # %bb.0:
2333; CHECK-NEXT:    vchlfs %v0, %v24, %v26
2334; CHECK-NEXT:    ipm %r2
2335; CHECK-NEXT:    srl %r2, 28
2336; CHECK-NEXT:    br %r14
2337  %call = call {<4 x i32>, i32} @llvm.s390.vchlfs(<4 x i32> %a, <4 x i32> %b)
2338  %res = extractvalue {<4 x i32>, i32} %call, 1
2339  ret i32 %res
2340}
2341
2342; VCHLFS, returning 1 if no elements are higher.
2343define i32 @test_vchlfs_none_bool(<4 x i32> %a, <4 x i32> %b) {
2344; CHECK-LABEL: test_vchlfs_none_bool:
2345; CHECK:       # %bb.0:
2346; CHECK-NEXT:    vchlfs %v0, %v24, %v26
2347; CHECK-NEXT:    lhi %r2, 0
2348; CHECK-NEXT:    lochio %r2, 1
2349; CHECK-NEXT:    br %r14
2350  %call = call {<4 x i32>, i32} @llvm.s390.vchlfs(<4 x i32> %a, <4 x i32> %b)
2351  %res = extractvalue {<4 x i32>, i32} %call, 1
2352  %cmp = icmp eq i32 %res, 3
2353  %ext = zext i1 %cmp to i32
2354  ret i32 %ext
2355}
2356
2357; VCHLFS, storing to %ptr if no elements are higher.
2358define <4 x i32> @test_vchlfs_none_store(<4 x i32> %a, <4 x i32> %b,
2359; CHECK-LABEL: test_vchlfs_none_store:
2360; CHECK:       # %bb.0:
2361; CHECK-NEXT:    vchlfs %v24, %v24, %v26
2362; CHECK-NEXT:    bler %r14
2363; CHECK-NEXT:  .LBB173_1: # %store
2364; CHECK-NEXT:    mvhi 0(%r2), 0
2365; CHECK-NEXT:    br %r14
2366                                         ptr %ptr) {
2367  %call = call {<4 x i32>, i32} @llvm.s390.vchlfs(<4 x i32> %a, <4 x i32> %b)
2368  %res = extractvalue {<4 x i32>, i32} %call, 0
2369  %cc = extractvalue {<4 x i32>, i32} %call, 1
2370  %cmp = icmp sge i32 %cc, 3
2371  br i1 %cmp, label %store, label %exit
2372
2373store:
2374  store i32 0, ptr %ptr
2375  br label %exit
2376
2377exit:
2378  ret <4 x i32> %res
2379}
2380
2381; VCHLGS with no processing of the result.
2382define i32 @test_vchlgs(<2 x i64> %a, <2 x i64> %b) {
2383; CHECK-LABEL: test_vchlgs:
2384; CHECK:       # %bb.0:
2385; CHECK-NEXT:    vchlgs %v0, %v24, %v26
2386; CHECK-NEXT:    ipm %r2
2387; CHECK-NEXT:    srl %r2, 28
2388; CHECK-NEXT:    br %r14
2389  %call = call {<2 x i64>, i32} @llvm.s390.vchlgs(<2 x i64> %a, <2 x i64> %b)
2390  %res = extractvalue {<2 x i64>, i32} %call, 1
2391  ret i32 %res
2392}
2393
2394; VCHLGS returning 1 if all elements are higher (CC == 0).
2395define i32 @test_vchlgs_all_bool(<2 x i64> %a, <2 x i64> %b) {
2396; CHECK-LABEL: test_vchlgs_all_bool:
2397; CHECK:       # %bb.0:
2398; CHECK-NEXT:    vchlgs %v0, %v24, %v26
2399; CHECK-NEXT:    lhi %r2, 0
2400; CHECK-NEXT:    lochie %r2, 1
2401; CHECK-NEXT:    br %r14
2402  %call = call {<2 x i64>, i32} @llvm.s390.vchlgs(<2 x i64> %a, <2 x i64> %b)
2403  %res = extractvalue {<2 x i64>, i32} %call, 1
2404  %cmp = icmp slt i32 %res, 1
2405  %ext = zext i1 %cmp to i32
2406  ret i32 %ext
2407}
2408
2409; VCHLGS, storing to %ptr if all elements are higher.
2410define <2 x i64> @test_vchlgs_all_store(<2 x i64> %a, <2 x i64> %b, ptr %ptr) {
2411; CHECK-LABEL: test_vchlgs_all_store:
2412; CHECK:       # %bb.0:
2413; CHECK-NEXT:    vchlgs %v24, %v24, %v26
2414; CHECK-NEXT:    bnher %r14
2415; CHECK-NEXT:  .LBB176_1: # %store
2416; CHECK-NEXT:    mvhi 0(%r2), 0
2417; CHECK-NEXT:    br %r14
2418  %call = call {<2 x i64>, i32} @llvm.s390.vchlgs(<2 x i64> %a, <2 x i64> %b)
2419  %res = extractvalue {<2 x i64>, i32} %call, 0
2420  %cc = extractvalue {<2 x i64>, i32} %call, 1
2421  %cmp = icmp ule i32 %cc, 0
2422  br i1 %cmp, label %store, label %exit
2423
2424store:
2425  store i32 0, ptr %ptr
2426  br label %exit
2427
2428exit:
2429  ret <2 x i64> %res
2430}
2431
2432; VFAEB with !IN !RT.
2433define <16 x i8> @test_vfaeb_0(<16 x i8> %a, <16 x i8> %b) {
2434; CHECK-LABEL: test_vfaeb_0:
2435; CHECK:       # %bb.0:
2436; CHECK-NEXT:    vfaeb %v24, %v24, %v26, 0
2437; CHECK-NEXT:    br %r14
2438  %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 0)
2439  ret <16 x i8> %res
2440}
2441
2442; VFAEB with !IN RT.
2443define <16 x i8> @test_vfaeb_4(<16 x i8> %a, <16 x i8> %b) {
2444; CHECK-LABEL: test_vfaeb_4:
2445; CHECK:       # %bb.0:
2446; CHECK-NEXT:    vfaeb %v24, %v24, %v26, 4
2447; CHECK-NEXT:    br %r14
2448  %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 4)
2449  ret <16 x i8> %res
2450}
2451
2452; VFAEB with IN !RT.
2453define <16 x i8> @test_vfaeb_8(<16 x i8> %a, <16 x i8> %b) {
2454; CHECK-LABEL: test_vfaeb_8:
2455; CHECK:       # %bb.0:
2456; CHECK-NEXT:    vfaeb %v24, %v24, %v26, 8
2457; CHECK-NEXT:    br %r14
2458  %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 8)
2459  ret <16 x i8> %res
2460}
2461
2462; VFAEB with IN RT.
2463define <16 x i8> @test_vfaeb_12(<16 x i8> %a, <16 x i8> %b) {
2464; CHECK-LABEL: test_vfaeb_12:
2465; CHECK:       # %bb.0:
2466; CHECK-NEXT:    vfaeb %v24, %v24, %v26, 12
2467; CHECK-NEXT:    br %r14
2468  %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 12)
2469  ret <16 x i8> %res
2470}
2471
2472; VFAEB with CS -- should be ignored.
2473define <16 x i8> @test_vfaeb_1(<16 x i8> %a, <16 x i8> %b) {
2474; CHECK-LABEL: test_vfaeb_1:
2475; CHECK:       # %bb.0:
2476; CHECK-NEXT:    vfaeb %v24, %v24, %v26, 0
2477; CHECK-NEXT:    br %r14
2478  %res = call <16 x i8> @llvm.s390.vfaeb(<16 x i8> %a, <16 x i8> %b, i32 1)
2479  ret <16 x i8> %res
2480}
2481
2482; VFAEH.
2483define <8 x i16> @test_vfaeh(<8 x i16> %a, <8 x i16> %b) {
2484; CHECK-LABEL: test_vfaeh:
2485; CHECK:       # %bb.0:
2486; CHECK-NEXT:    vfaeh %v24, %v24, %v26, 4
2487; CHECK-NEXT:    br %r14
2488  %res = call <8 x i16> @llvm.s390.vfaeh(<8 x i16> %a, <8 x i16> %b, i32 4)
2489  ret <8 x i16> %res
2490}
2491
2492; VFAEF.
2493define <4 x i32> @test_vfaef(<4 x i32> %a, <4 x i32> %b) {
2494; CHECK-LABEL: test_vfaef:
2495; CHECK:       # %bb.0:
2496; CHECK-NEXT:    vfaef %v24, %v24, %v26, 8
2497; CHECK-NEXT:    br %r14
2498  %res = call <4 x i32> @llvm.s390.vfaef(<4 x i32> %a, <4 x i32> %b, i32 8)
2499  ret <4 x i32> %res
2500}
2501
2502; VFAEBS.
2503define <16 x i8> @test_vfaebs(<16 x i8> %a, <16 x i8> %b, ptr %ccptr) {
2504; CHECK-LABEL: test_vfaebs:
2505; CHECK:       # %bb.0:
2506; CHECK-NEXT:    vfaebs %v24, %v24, %v26, 0
2507; CHECK-NEXT:    ipm %r0
2508; CHECK-NEXT:    srl %r0, 28
2509; CHECK-NEXT:    st %r0, 0(%r2)
2510; CHECK-NEXT:    br %r14
2511  %call = call {<16 x i8>, i32} @llvm.s390.vfaebs(<16 x i8> %a, <16 x i8> %b,
2512                                                  i32 0)
2513  %res = extractvalue {<16 x i8>, i32} %call, 0
2514  %cc = extractvalue {<16 x i8>, i32} %call, 1
2515  store i32 %cc, ptr %ccptr
2516  ret <16 x i8> %res
2517}
2518
2519; VFAEHS.
2520define <8 x i16> @test_vfaehs(<8 x i16> %a, <8 x i16> %b, ptr %ccptr) {
2521; CHECK-LABEL: test_vfaehs:
2522; CHECK:       # %bb.0:
2523; CHECK-NEXT:    vfaehs %v24, %v24, %v26, 4
2524; CHECK-NEXT:    ipm %r0
2525; CHECK-NEXT:    srl %r0, 28
2526; CHECK-NEXT:    st %r0, 0(%r2)
2527; CHECK-NEXT:    br %r14
2528  %call = call {<8 x i16>, i32} @llvm.s390.vfaehs(<8 x i16> %a, <8 x i16> %b,
2529                                                  i32 4)
2530  %res = extractvalue {<8 x i16>, i32} %call, 0
2531  %cc = extractvalue {<8 x i16>, i32} %call, 1
2532  store i32 %cc, ptr %ccptr
2533  ret <8 x i16> %res
2534}
2535
2536; VFAEFS.
2537define <4 x i32> @test_vfaefs(<4 x i32> %a, <4 x i32> %b, ptr %ccptr) {
2538; CHECK-LABEL: test_vfaefs:
2539; CHECK:       # %bb.0:
2540; CHECK-NEXT:    vfaefs %v24, %v24, %v26, 8
2541; CHECK-NEXT:    ipm %r0
2542; CHECK-NEXT:    srl %r0, 28
2543; CHECK-NEXT:    st %r0, 0(%r2)
2544; CHECK-NEXT:    br %r14
2545  %call = call {<4 x i32>, i32} @llvm.s390.vfaefs(<4 x i32> %a, <4 x i32> %b,
2546                                                  i32 8)
2547  %res = extractvalue {<4 x i32>, i32} %call, 0
2548  %cc = extractvalue {<4 x i32>, i32} %call, 1
2549  store i32 %cc, ptr %ccptr
2550  ret <4 x i32> %res
2551}
2552
2553; VFAEZB with !IN !RT.
2554define <16 x i8> @test_vfaezb_0(<16 x i8> %a, <16 x i8> %b) {
2555; CHECK-LABEL: test_vfaezb_0:
2556; CHECK:       # %bb.0:
2557; CHECK-NEXT:    vfaezb %v24, %v24, %v26, 0
2558; CHECK-NEXT:    br %r14
2559  %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 0)
2560  ret <16 x i8> %res
2561}
2562
2563; VFAEZB with !IN RT.
2564define <16 x i8> @test_vfaezb_4(<16 x i8> %a, <16 x i8> %b) {
2565; CHECK-LABEL: test_vfaezb_4:
2566; CHECK:       # %bb.0:
2567; CHECK-NEXT:    vfaezb %v24, %v24, %v26, 4
2568; CHECK-NEXT:    br %r14
2569  %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 4)
2570  ret <16 x i8> %res
2571}
2572
2573; VFAEZB with IN !RT.
2574define <16 x i8> @test_vfaezb_8(<16 x i8> %a, <16 x i8> %b) {
2575; CHECK-LABEL: test_vfaezb_8:
2576; CHECK:       # %bb.0:
2577; CHECK-NEXT:    vfaezb %v24, %v24, %v26, 8
2578; CHECK-NEXT:    br %r14
2579  %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 8)
2580  ret <16 x i8> %res
2581}
2582
2583; VFAEZB with IN RT.
2584define <16 x i8> @test_vfaezb_12(<16 x i8> %a, <16 x i8> %b) {
2585; CHECK-LABEL: test_vfaezb_12:
2586; CHECK:       # %bb.0:
2587; CHECK-NEXT:    vfaezb %v24, %v24, %v26, 12
2588; CHECK-NEXT:    br %r14
2589  %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 12)
2590  ret <16 x i8> %res
2591}
2592
2593; VFAEZB with CS -- should be ignored.
2594define <16 x i8> @test_vfaezb_1(<16 x i8> %a, <16 x i8> %b) {
2595; CHECK-LABEL: test_vfaezb_1:
2596; CHECK:       # %bb.0:
2597; CHECK-NEXT:    vfaezb %v24, %v24, %v26, 0
2598; CHECK-NEXT:    br %r14
2599  %res = call <16 x i8> @llvm.s390.vfaezb(<16 x i8> %a, <16 x i8> %b, i32 1)
2600  ret <16 x i8> %res
2601}
2602
2603; VFAEZH.
2604define <8 x i16> @test_vfaezh(<8 x i16> %a, <8 x i16> %b) {
2605; CHECK-LABEL: test_vfaezh:
2606; CHECK:       # %bb.0:
2607; CHECK-NEXT:    vfaezh %v24, %v24, %v26, 4
2608; CHECK-NEXT:    br %r14
2609  %res = call <8 x i16> @llvm.s390.vfaezh(<8 x i16> %a, <8 x i16> %b, i32 4)
2610  ret <8 x i16> %res
2611}
2612
2613; VFAEZF.
2614define <4 x i32> @test_vfaezf(<4 x i32> %a, <4 x i32> %b) {
2615; CHECK-LABEL: test_vfaezf:
2616; CHECK:       # %bb.0:
2617; CHECK-NEXT:    vfaezf %v24, %v24, %v26, 8
2618; CHECK-NEXT:    br %r14
2619  %res = call <4 x i32> @llvm.s390.vfaezf(<4 x i32> %a, <4 x i32> %b, i32 8)
2620  ret <4 x i32> %res
2621}
2622
2623; VFAEZBS.
2624define <16 x i8> @test_vfaezbs(<16 x i8> %a, <16 x i8> %b, ptr %ccptr) {
2625; CHECK-LABEL: test_vfaezbs:
2626; CHECK:       # %bb.0:
2627; CHECK-NEXT:    vfaezbs %v24, %v24, %v26, 0
2628; CHECK-NEXT:    ipm %r0
2629; CHECK-NEXT:    srl %r0, 28
2630; CHECK-NEXT:    st %r0, 0(%r2)
2631; CHECK-NEXT:    br %r14
2632  %call = call {<16 x i8>, i32} @llvm.s390.vfaezbs(<16 x i8> %a, <16 x i8> %b,
2633                                                   i32 0)
2634  %res = extractvalue {<16 x i8>, i32} %call, 0
2635  %cc = extractvalue {<16 x i8>, i32} %call, 1
2636  store i32 %cc, ptr %ccptr
2637  ret <16 x i8> %res
2638}
2639
2640; VFAEZHS.
2641define <8 x i16> @test_vfaezhs(<8 x i16> %a, <8 x i16> %b, ptr %ccptr) {
2642; CHECK-LABEL: test_vfaezhs:
2643; CHECK:       # %bb.0:
2644; CHECK-NEXT:    vfaezhs %v24, %v24, %v26, 4
2645; CHECK-NEXT:    ipm %r0
2646; CHECK-NEXT:    srl %r0, 28
2647; CHECK-NEXT:    st %r0, 0(%r2)
2648; CHECK-NEXT:    br %r14
2649  %call = call {<8 x i16>, i32} @llvm.s390.vfaezhs(<8 x i16> %a, <8 x i16> %b,
2650                                                   i32 4)
2651  %res = extractvalue {<8 x i16>, i32} %call, 0
2652  %cc = extractvalue {<8 x i16>, i32} %call, 1
2653  store i32 %cc, ptr %ccptr
2654  ret <8 x i16> %res
2655}
2656
2657; VFAEZFS.
2658define <4 x i32> @test_vfaezfs(<4 x i32> %a, <4 x i32> %b, ptr %ccptr) {
2659; CHECK-LABEL: test_vfaezfs:
2660; CHECK:       # %bb.0:
2661; CHECK-NEXT:    vfaezfs %v24, %v24, %v26, 8
2662; CHECK-NEXT:    ipm %r0
2663; CHECK-NEXT:    srl %r0, 28
2664; CHECK-NEXT:    st %r0, 0(%r2)
2665; CHECK-NEXT:    br %r14
2666  %call = call {<4 x i32>, i32} @llvm.s390.vfaezfs(<4 x i32> %a, <4 x i32> %b,
2667                                                   i32 8)
2668  %res = extractvalue {<4 x i32>, i32} %call, 0
2669  %cc = extractvalue {<4 x i32>, i32} %call, 1
2670  store i32 %cc, ptr %ccptr
2671  ret <4 x i32> %res
2672}
2673
2674; VFEEB.
2675define <16 x i8> @test_vfeeb_0(<16 x i8> %a, <16 x i8> %b) {
2676; CHECK-LABEL: test_vfeeb_0:
2677; CHECK:       # %bb.0:
2678; CHECK-NEXT:    vfeeb %v24, %v24, %v26, 0
2679; CHECK-NEXT:    br %r14
2680  %res = call <16 x i8> @llvm.s390.vfeeb(<16 x i8> %a, <16 x i8> %b)
2681  ret <16 x i8> %res
2682}
2683
2684; VFEEH.
2685define <8 x i16> @test_vfeeh(<8 x i16> %a, <8 x i16> %b) {
2686; CHECK-LABEL: test_vfeeh:
2687; CHECK:       # %bb.0:
2688; CHECK-NEXT:    vfeeh %v24, %v24, %v26, 0
2689; CHECK-NEXT:    br %r14
2690  %res = call <8 x i16> @llvm.s390.vfeeh(<8 x i16> %a, <8 x i16> %b)
2691  ret <8 x i16> %res
2692}
2693
2694; VFEEF.
2695define <4 x i32> @test_vfeef(<4 x i32> %a, <4 x i32> %b) {
2696; CHECK-LABEL: test_vfeef:
2697; CHECK:       # %bb.0:
2698; CHECK-NEXT:    vfeef %v24, %v24, %v26, 0
2699; CHECK-NEXT:    br %r14
2700  %res = call <4 x i32> @llvm.s390.vfeef(<4 x i32> %a, <4 x i32> %b)
2701  ret <4 x i32> %res
2702}
2703
2704; VFEEBS.
2705define <16 x i8> @test_vfeebs(<16 x i8> %a, <16 x i8> %b, ptr %ccptr) {
2706; CHECK-LABEL: test_vfeebs:
2707; CHECK:       # %bb.0:
2708; CHECK-NEXT:    vfeebs %v24, %v24, %v26
2709; CHECK-NEXT:    ipm %r0
2710; CHECK-NEXT:    srl %r0, 28
2711; CHECK-NEXT:    st %r0, 0(%r2)
2712; CHECK-NEXT:    br %r14
2713  %call = call {<16 x i8>, i32} @llvm.s390.vfeebs(<16 x i8> %a, <16 x i8> %b)
2714  %res = extractvalue {<16 x i8>, i32} %call, 0
2715  %cc = extractvalue {<16 x i8>, i32} %call, 1
2716  store i32 %cc, ptr %ccptr
2717  ret <16 x i8> %res
2718}
2719
2720; VFEEHS.
2721define <8 x i16> @test_vfeehs(<8 x i16> %a, <8 x i16> %b, ptr %ccptr) {
2722; CHECK-LABEL: test_vfeehs:
2723; CHECK:       # %bb.0:
2724; CHECK-NEXT:    vfeehs %v24, %v24, %v26
2725; CHECK-NEXT:    ipm %r0
2726; CHECK-NEXT:    srl %r0, 28
2727; CHECK-NEXT:    st %r0, 0(%r2)
2728; CHECK-NEXT:    br %r14
2729  %call = call {<8 x i16>, i32} @llvm.s390.vfeehs(<8 x i16> %a, <8 x i16> %b)
2730  %res = extractvalue {<8 x i16>, i32} %call, 0
2731  %cc = extractvalue {<8 x i16>, i32} %call, 1
2732  store i32 %cc, ptr %ccptr
2733  ret <8 x i16> %res
2734}
2735
2736; VFEEFS.
2737define <4 x i32> @test_vfeefs(<4 x i32> %a, <4 x i32> %b, ptr %ccptr) {
2738; CHECK-LABEL: test_vfeefs:
2739; CHECK:       # %bb.0:
2740; CHECK-NEXT:    vfeefs %v24, %v24, %v26
2741; CHECK-NEXT:    ipm %r0
2742; CHECK-NEXT:    srl %r0, 28
2743; CHECK-NEXT:    st %r0, 0(%r2)
2744; CHECK-NEXT:    br %r14
2745  %call = call {<4 x i32>, i32} @llvm.s390.vfeefs(<4 x i32> %a, <4 x i32> %b)
2746  %res = extractvalue {<4 x i32>, i32} %call, 0
2747  %cc = extractvalue {<4 x i32>, i32} %call, 1
2748  store i32 %cc, ptr %ccptr
2749  ret <4 x i32> %res
2750}
2751
2752; VFEEZB.
2753define <16 x i8> @test_vfeezb(<16 x i8> %a, <16 x i8> %b) {
2754; CHECK-LABEL: test_vfeezb:
2755; CHECK:       # %bb.0:
2756; CHECK-NEXT:    vfeezb %v24, %v24, %v26
2757; CHECK-NEXT:    br %r14
2758  %res = call <16 x i8> @llvm.s390.vfeezb(<16 x i8> %a, <16 x i8> %b)
2759  ret <16 x i8> %res
2760}
2761
2762; VFEEZH.
2763define <8 x i16> @test_vfeezh(<8 x i16> %a, <8 x i16> %b) {
2764; CHECK-LABEL: test_vfeezh:
2765; CHECK:       # %bb.0:
2766; CHECK-NEXT:    vfeezh %v24, %v24, %v26
2767; CHECK-NEXT:    br %r14
2768  %res = call <8 x i16> @llvm.s390.vfeezh(<8 x i16> %a, <8 x i16> %b)
2769  ret <8 x i16> %res
2770}
2771
2772; VFEEZF.
2773define <4 x i32> @test_vfeezf(<4 x i32> %a, <4 x i32> %b) {
2774; CHECK-LABEL: test_vfeezf:
2775; CHECK:       # %bb.0:
2776; CHECK-NEXT:    vfeezf %v24, %v24, %v26
2777; CHECK-NEXT:    br %r14
2778  %res = call <4 x i32> @llvm.s390.vfeezf(<4 x i32> %a, <4 x i32> %b)
2779  ret <4 x i32> %res
2780}
2781
2782; VFEEZBS.
2783define <16 x i8> @test_vfeezbs(<16 x i8> %a, <16 x i8> %b, ptr %ccptr) {
2784; CHECK-LABEL: test_vfeezbs:
2785; CHECK:       # %bb.0:
2786; CHECK-NEXT:    vfeezbs %v24, %v24, %v26
2787; CHECK-NEXT:    ipm %r0
2788; CHECK-NEXT:    srl %r0, 28
2789; CHECK-NEXT:    st %r0, 0(%r2)
2790; CHECK-NEXT:    br %r14
2791  %call = call {<16 x i8>, i32} @llvm.s390.vfeezbs(<16 x i8> %a, <16 x i8> %b)
2792  %res = extractvalue {<16 x i8>, i32} %call, 0
2793  %cc = extractvalue {<16 x i8>, i32} %call, 1
2794  store i32 %cc, ptr %ccptr
2795  ret <16 x i8> %res
2796}
2797
2798; VFEEZHS.
2799define <8 x i16> @test_vfeezhs(<8 x i16> %a, <8 x i16> %b, ptr %ccptr) {
2800; CHECK-LABEL: test_vfeezhs:
2801; CHECK:       # %bb.0:
2802; CHECK-NEXT:    vfeezhs %v24, %v24, %v26
2803; CHECK-NEXT:    ipm %r0
2804; CHECK-NEXT:    srl %r0, 28
2805; CHECK-NEXT:    st %r0, 0(%r2)
2806; CHECK-NEXT:    br %r14
2807  %call = call {<8 x i16>, i32} @llvm.s390.vfeezhs(<8 x i16> %a, <8 x i16> %b)
2808  %res = extractvalue {<8 x i16>, i32} %call, 0
2809  %cc = extractvalue {<8 x i16>, i32} %call, 1
2810  store i32 %cc, ptr %ccptr
2811  ret <8 x i16> %res
2812}
2813
2814; VFEEZFS.
2815define <4 x i32> @test_vfeezfs(<4 x i32> %a, <4 x i32> %b, ptr %ccptr) {
2816; CHECK-LABEL: test_vfeezfs:
2817; CHECK:       # %bb.0:
2818; CHECK-NEXT:    vfeezfs %v24, %v24, %v26
2819; CHECK-NEXT:    ipm %r0
2820; CHECK-NEXT:    srl %r0, 28
2821; CHECK-NEXT:    st %r0, 0(%r2)
2822; CHECK-NEXT:    br %r14
2823  %call = call {<4 x i32>, i32} @llvm.s390.vfeezfs(<4 x i32> %a, <4 x i32> %b)
2824  %res = extractvalue {<4 x i32>, i32} %call, 0
2825  %cc = extractvalue {<4 x i32>, i32} %call, 1
2826  store i32 %cc, ptr %ccptr
2827  ret <4 x i32> %res
2828}
2829
2830; VFENEB.
2831define <16 x i8> @test_vfeneb_0(<16 x i8> %a, <16 x i8> %b) {
2832; CHECK-LABEL: test_vfeneb_0:
2833; CHECK:       # %bb.0:
2834; CHECK-NEXT:    vfeneb %v24, %v24, %v26, 0
2835; CHECK-NEXT:    br %r14
2836  %res = call <16 x i8> @llvm.s390.vfeneb(<16 x i8> %a, <16 x i8> %b)
2837  ret <16 x i8> %res
2838}
2839
2840; VFENEH.
2841define <8 x i16> @test_vfeneh(<8 x i16> %a, <8 x i16> %b) {
2842; CHECK-LABEL: test_vfeneh:
2843; CHECK:       # %bb.0:
2844; CHECK-NEXT:    vfeneh %v24, %v24, %v26, 0
2845; CHECK-NEXT:    br %r14
2846  %res = call <8 x i16> @llvm.s390.vfeneh(<8 x i16> %a, <8 x i16> %b)
2847  ret <8 x i16> %res
2848}
2849
2850; VFENEF.
2851define <4 x i32> @test_vfenef(<4 x i32> %a, <4 x i32> %b) {
2852; CHECK-LABEL: test_vfenef:
2853; CHECK:       # %bb.0:
2854; CHECK-NEXT:    vfenef %v24, %v24, %v26, 0
2855; CHECK-NEXT:    br %r14
2856  %res = call <4 x i32> @llvm.s390.vfenef(<4 x i32> %a, <4 x i32> %b)
2857  ret <4 x i32> %res
2858}
2859
2860; VFENEBS.
2861define <16 x i8> @test_vfenebs(<16 x i8> %a, <16 x i8> %b, ptr %ccptr) {
2862; CHECK-LABEL: test_vfenebs:
2863; CHECK:       # %bb.0:
2864; CHECK-NEXT:    vfenebs %v24, %v24, %v26
2865; CHECK-NEXT:    ipm %r0
2866; CHECK-NEXT:    srl %r0, 28
2867; CHECK-NEXT:    st %r0, 0(%r2)
2868; CHECK-NEXT:    br %r14
2869  %call = call {<16 x i8>, i32} @llvm.s390.vfenebs(<16 x i8> %a, <16 x i8> %b)
2870  %res = extractvalue {<16 x i8>, i32} %call, 0
2871  %cc = extractvalue {<16 x i8>, i32} %call, 1
2872  store i32 %cc, ptr %ccptr
2873  ret <16 x i8> %res
2874}
2875
2876; VFENEHS.
2877define <8 x i16> @test_vfenehs(<8 x i16> %a, <8 x i16> %b, ptr %ccptr) {
2878; CHECK-LABEL: test_vfenehs:
2879; CHECK:       # %bb.0:
2880; CHECK-NEXT:    vfenehs %v24, %v24, %v26
2881; CHECK-NEXT:    ipm %r0
2882; CHECK-NEXT:    srl %r0, 28
2883; CHECK-NEXT:    st %r0, 0(%r2)
2884; CHECK-NEXT:    br %r14
2885  %call = call {<8 x i16>, i32} @llvm.s390.vfenehs(<8 x i16> %a, <8 x i16> %b)
2886  %res = extractvalue {<8 x i16>, i32} %call, 0
2887  %cc = extractvalue {<8 x i16>, i32} %call, 1
2888  store i32 %cc, ptr %ccptr
2889  ret <8 x i16> %res
2890}
2891
2892; VFENEFS.
2893define <4 x i32> @test_vfenefs(<4 x i32> %a, <4 x i32> %b, ptr %ccptr) {
2894; CHECK-LABEL: test_vfenefs:
2895; CHECK:       # %bb.0:
2896; CHECK-NEXT:    vfenefs %v24, %v24, %v26
2897; CHECK-NEXT:    ipm %r0
2898; CHECK-NEXT:    srl %r0, 28
2899; CHECK-NEXT:    st %r0, 0(%r2)
2900; CHECK-NEXT:    br %r14
2901  %call = call {<4 x i32>, i32} @llvm.s390.vfenefs(<4 x i32> %a, <4 x i32> %b)
2902  %res = extractvalue {<4 x i32>, i32} %call, 0
2903  %cc = extractvalue {<4 x i32>, i32} %call, 1
2904  store i32 %cc, ptr %ccptr
2905  ret <4 x i32> %res
2906}
2907
2908; VFENEZB.
2909define <16 x i8> @test_vfenezb(<16 x i8> %a, <16 x i8> %b) {
2910; CHECK-LABEL: test_vfenezb:
2911; CHECK:       # %bb.0:
2912; CHECK-NEXT:    vfenezb %v24, %v24, %v26
2913; CHECK-NEXT:    br %r14
2914  %res = call <16 x i8> @llvm.s390.vfenezb(<16 x i8> %a, <16 x i8> %b)
2915  ret <16 x i8> %res
2916}
2917
2918; VFENEZH.
2919define <8 x i16> @test_vfenezh(<8 x i16> %a, <8 x i16> %b) {
2920; CHECK-LABEL: test_vfenezh:
2921; CHECK:       # %bb.0:
2922; CHECK-NEXT:    vfenezh %v24, %v24, %v26
2923; CHECK-NEXT:    br %r14
2924  %res = call <8 x i16> @llvm.s390.vfenezh(<8 x i16> %a, <8 x i16> %b)
2925  ret <8 x i16> %res
2926}
2927
2928; VFENEZF.
2929define <4 x i32> @test_vfenezf(<4 x i32> %a, <4 x i32> %b) {
2930; CHECK-LABEL: test_vfenezf:
2931; CHECK:       # %bb.0:
2932; CHECK-NEXT:    vfenezf %v24, %v24, %v26
2933; CHECK-NEXT:    br %r14
2934  %res = call <4 x i32> @llvm.s390.vfenezf(<4 x i32> %a, <4 x i32> %b)
2935  ret <4 x i32> %res
2936}
2937
2938; VFENEZBS.
2939define <16 x i8> @test_vfenezbs(<16 x i8> %a, <16 x i8> %b, ptr %ccptr) {
2940; CHECK-LABEL: test_vfenezbs:
2941; CHECK:       # %bb.0:
2942; CHECK-NEXT:    vfenezbs %v24, %v24, %v26
2943; CHECK-NEXT:    ipm %r0
2944; CHECK-NEXT:    srl %r0, 28
2945; CHECK-NEXT:    st %r0, 0(%r2)
2946; CHECK-NEXT:    br %r14
2947  %call = call {<16 x i8>, i32} @llvm.s390.vfenezbs(<16 x i8> %a, <16 x i8> %b)
2948  %res = extractvalue {<16 x i8>, i32} %call, 0
2949  %cc = extractvalue {<16 x i8>, i32} %call, 1
2950  store i32 %cc, ptr %ccptr
2951  ret <16 x i8> %res
2952}
2953
2954; VFENEZHS.
2955define <8 x i16> @test_vfenezhs(<8 x i16> %a, <8 x i16> %b, ptr %ccptr) {
2956; CHECK-LABEL: test_vfenezhs:
2957; CHECK:       # %bb.0:
2958; CHECK-NEXT:    vfenezhs %v24, %v24, %v26
2959; CHECK-NEXT:    ipm %r0
2960; CHECK-NEXT:    srl %r0, 28
2961; CHECK-NEXT:    st %r0, 0(%r2)
2962; CHECK-NEXT:    br %r14
2963  %call = call {<8 x i16>, i32} @llvm.s390.vfenezhs(<8 x i16> %a, <8 x i16> %b)
2964  %res = extractvalue {<8 x i16>, i32} %call, 0
2965  %cc = extractvalue {<8 x i16>, i32} %call, 1
2966  store i32 %cc, ptr %ccptr
2967  ret <8 x i16> %res
2968}
2969
2970; VFENEZFS.
2971define <4 x i32> @test_vfenezfs(<4 x i32> %a, <4 x i32> %b, ptr %ccptr) {
2972; CHECK-LABEL: test_vfenezfs:
2973; CHECK:       # %bb.0:
2974; CHECK-NEXT:    vfenezfs %v24, %v24, %v26
2975; CHECK-NEXT:    ipm %r0
2976; CHECK-NEXT:    srl %r0, 28
2977; CHECK-NEXT:    st %r0, 0(%r2)
2978; CHECK-NEXT:    br %r14
2979  %call = call {<4 x i32>, i32} @llvm.s390.vfenezfs(<4 x i32> %a, <4 x i32> %b)
2980  %res = extractvalue {<4 x i32>, i32} %call, 0
2981  %cc = extractvalue {<4 x i32>, i32} %call, 1
2982  store i32 %cc, ptr %ccptr
2983  ret <4 x i32> %res
2984}
2985
2986; VISTRB.
2987define <16 x i8> @test_vistrb(<16 x i8> %a) {
2988; CHECK-LABEL: test_vistrb:
2989; CHECK:       # %bb.0:
2990; CHECK-NEXT:    vistrb %v24, %v24, 0
2991; CHECK-NEXT:    br %r14
2992  %res = call <16 x i8> @llvm.s390.vistrb(<16 x i8> %a)
2993  ret <16 x i8> %res
2994}
2995
2996; VISTRH.
2997define <8 x i16> @test_vistrh(<8 x i16> %a) {
2998; CHECK-LABEL: test_vistrh:
2999; CHECK:       # %bb.0:
3000; CHECK-NEXT:    vistrh %v24, %v24, 0
3001; CHECK-NEXT:    br %r14
3002  %res = call <8 x i16> @llvm.s390.vistrh(<8 x i16> %a)
3003  ret <8 x i16> %res
3004}
3005
3006; VISTRF.
3007define <4 x i32> @test_vistrf(<4 x i32> %a) {
3008; CHECK-LABEL: test_vistrf:
3009; CHECK:       # %bb.0:
3010; CHECK-NEXT:    vistrf %v24, %v24, 0
3011; CHECK-NEXT:    br %r14
3012  %res = call <4 x i32> @llvm.s390.vistrf(<4 x i32> %a)
3013  ret <4 x i32> %res
3014}
3015
3016; VISTRBS.
3017define <16 x i8> @test_vistrbs(<16 x i8> %a, ptr %ccptr) {
3018; CHECK-LABEL: test_vistrbs:
3019; CHECK:       # %bb.0:
3020; CHECK-NEXT:    vistrbs %v24, %v24
3021; CHECK-NEXT:    ipm %r0
3022; CHECK-NEXT:    srl %r0, 28
3023; CHECK-NEXT:    st %r0, 0(%r2)
3024; CHECK-NEXT:    br %r14
3025  %call = call {<16 x i8>, i32} @llvm.s390.vistrbs(<16 x i8> %a)
3026  %res = extractvalue {<16 x i8>, i32} %call, 0
3027  %cc = extractvalue {<16 x i8>, i32} %call, 1
3028  store i32 %cc, ptr %ccptr
3029  ret <16 x i8> %res
3030}
3031
3032; VISTRHS.
3033define <8 x i16> @test_vistrhs(<8 x i16> %a, ptr %ccptr) {
3034; CHECK-LABEL: test_vistrhs:
3035; CHECK:       # %bb.0:
3036; CHECK-NEXT:    vistrhs %v24, %v24
3037; CHECK-NEXT:    ipm %r0
3038; CHECK-NEXT:    srl %r0, 28
3039; CHECK-NEXT:    st %r0, 0(%r2)
3040; CHECK-NEXT:    br %r14
3041  %call = call {<8 x i16>, i32} @llvm.s390.vistrhs(<8 x i16> %a)
3042  %res = extractvalue {<8 x i16>, i32} %call, 0
3043  %cc = extractvalue {<8 x i16>, i32} %call, 1
3044  store i32 %cc, ptr %ccptr
3045  ret <8 x i16> %res
3046}
3047
3048; VISTRFS.
3049define <4 x i32> @test_vistrfs(<4 x i32> %a, ptr %ccptr) {
3050; CHECK-LABEL: test_vistrfs:
3051; CHECK:       # %bb.0:
3052; CHECK-NEXT:    vistrfs %v24, %v24
3053; CHECK-NEXT:    ipm %r0
3054; CHECK-NEXT:    srl %r0, 28
3055; CHECK-NEXT:    st %r0, 0(%r2)
3056; CHECK-NEXT:    br %r14
3057  %call = call {<4 x i32>, i32} @llvm.s390.vistrfs(<4 x i32> %a)
3058  %res = extractvalue {<4 x i32>, i32} %call, 0
3059  %cc = extractvalue {<4 x i32>, i32} %call, 1
3060  store i32 %cc, ptr %ccptr
3061  ret <4 x i32> %res
3062}
3063
3064; VSTRCB with !IN !RT.
3065define <16 x i8> @test_vstrcb_0(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3066; CHECK-LABEL: test_vstrcb_0:
3067; CHECK:       # %bb.0:
3068; CHECK-NEXT:    vstrcb %v24, %v24, %v26, %v28, 0
3069; CHECK-NEXT:    br %r14
3070  %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b,
3071                                          <16 x i8> %c, i32 0)
3072  ret <16 x i8> %res
3073}
3074
3075; VSTRCB with !IN RT.
3076define <16 x i8> @test_vstrcb_4(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3077; CHECK-LABEL: test_vstrcb_4:
3078; CHECK:       # %bb.0:
3079; CHECK-NEXT:    vstrcb %v24, %v24, %v26, %v28, 4
3080; CHECK-NEXT:    br %r14
3081  %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b,
3082                                          <16 x i8> %c, i32 4)
3083  ret <16 x i8> %res
3084}
3085
3086; VSTRCB with IN !RT.
3087define <16 x i8> @test_vstrcb_8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3088; CHECK-LABEL: test_vstrcb_8:
3089; CHECK:       # %bb.0:
3090; CHECK-NEXT:    vstrcb %v24, %v24, %v26, %v28, 8
3091; CHECK-NEXT:    br %r14
3092  %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b,
3093                                          <16 x i8> %c, i32 8)
3094  ret <16 x i8> %res
3095}
3096
3097; VSTRCB with IN RT.
3098define <16 x i8> @test_vstrcb_12(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3099; CHECK-LABEL: test_vstrcb_12:
3100; CHECK:       # %bb.0:
3101; CHECK-NEXT:    vstrcb %v24, %v24, %v26, %v28, 12
3102; CHECK-NEXT:    br %r14
3103  %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b,
3104                                          <16 x i8> %c, i32 12)
3105  ret <16 x i8> %res
3106}
3107
3108; VSTRCB with CS -- should be ignored.
3109define <16 x i8> @test_vstrcb_1(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3110; CHECK-LABEL: test_vstrcb_1:
3111; CHECK:       # %bb.0:
3112; CHECK-NEXT:    vstrcb %v24, %v24, %v26, %v28, 0
3113; CHECK-NEXT:    br %r14
3114  %res = call <16 x i8> @llvm.s390.vstrcb(<16 x i8> %a, <16 x i8> %b,
3115                                          <16 x i8> %c, i32 1)
3116  ret <16 x i8> %res
3117}
3118
3119; VSTRCH.
3120define <8 x i16> @test_vstrch(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) {
3121; CHECK-LABEL: test_vstrch:
3122; CHECK:       # %bb.0:
3123; CHECK-NEXT:    vstrch %v24, %v24, %v26, %v28, 4
3124; CHECK-NEXT:    br %r14
3125  %res = call <8 x i16> @llvm.s390.vstrch(<8 x i16> %a, <8 x i16> %b,
3126                                          <8 x i16> %c, i32 4)
3127  ret <8 x i16> %res
3128}
3129
3130; VSTRCF.
3131define <4 x i32> @test_vstrcf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
3132; CHECK-LABEL: test_vstrcf:
3133; CHECK:       # %bb.0:
3134; CHECK-NEXT:    vstrcf %v24, %v24, %v26, %v28, 8
3135; CHECK-NEXT:    br %r14
3136  %res = call <4 x i32> @llvm.s390.vstrcf(<4 x i32> %a, <4 x i32> %b,
3137                                          <4 x i32> %c, i32 8)
3138  ret <4 x i32> %res
3139}
3140
3141; VSTRCBS.
3142define <16 x i8> @test_vstrcbs(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c,
3143; CHECK-LABEL: test_vstrcbs:
3144; CHECK:       # %bb.0:
3145; CHECK-NEXT:    vstrcbs %v24, %v24, %v26, %v28, 0
3146; CHECK-NEXT:    ipm %r0
3147; CHECK-NEXT:    srl %r0, 28
3148; CHECK-NEXT:    st %r0, 0(%r2)
3149; CHECK-NEXT:    br %r14
3150                               ptr %ccptr) {
3151  %call = call {<16 x i8>, i32} @llvm.s390.vstrcbs(<16 x i8> %a, <16 x i8> %b,
3152                                                   <16 x i8> %c, i32 0)
3153  %res = extractvalue {<16 x i8>, i32} %call, 0
3154  %cc = extractvalue {<16 x i8>, i32} %call, 1
3155  store i32 %cc, ptr %ccptr
3156  ret <16 x i8> %res
3157}
3158
3159; VSTRCHS.
3160define <8 x i16> @test_vstrchs(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c,
3161; CHECK-LABEL: test_vstrchs:
3162; CHECK:       # %bb.0:
3163; CHECK-NEXT:    vstrchs %v24, %v24, %v26, %v28, 4
3164; CHECK-NEXT:    ipm %r0
3165; CHECK-NEXT:    srl %r0, 28
3166; CHECK-NEXT:    st %r0, 0(%r2)
3167; CHECK-NEXT:    br %r14
3168                               ptr %ccptr) {
3169  %call = call {<8 x i16>, i32} @llvm.s390.vstrchs(<8 x i16> %a, <8 x i16> %b,
3170                                                   <8 x i16> %c, i32 4)
3171  %res = extractvalue {<8 x i16>, i32} %call, 0
3172  %cc = extractvalue {<8 x i16>, i32} %call, 1
3173  store i32 %cc, ptr %ccptr
3174  ret <8 x i16> %res
3175}
3176
3177; VSTRCFS.
3178define <4 x i32> @test_vstrcfs(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c,
3179; CHECK-LABEL: test_vstrcfs:
3180; CHECK:       # %bb.0:
3181; CHECK-NEXT:    vstrcfs %v24, %v24, %v26, %v28, 8
3182; CHECK-NEXT:    ipm %r0
3183; CHECK-NEXT:    srl %r0, 28
3184; CHECK-NEXT:    st %r0, 0(%r2)
3185; CHECK-NEXT:    br %r14
3186                               ptr %ccptr) {
3187  %call = call {<4 x i32>, i32} @llvm.s390.vstrcfs(<4 x i32> %a, <4 x i32> %b,
3188                                                   <4 x i32> %c, i32 8)
3189  %res = extractvalue {<4 x i32>, i32} %call, 0
3190  %cc = extractvalue {<4 x i32>, i32} %call, 1
3191  store i32 %cc, ptr %ccptr
3192  ret <4 x i32> %res
3193}
3194
3195; VSTRCZB with !IN !RT.
3196define <16 x i8> @test_vstrczb_0(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3197; CHECK-LABEL: test_vstrczb_0:
3198; CHECK:       # %bb.0:
3199; CHECK-NEXT:    vstrczb %v24, %v24, %v26, %v28, 0
3200; CHECK-NEXT:    br %r14
3201  %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b,
3202                                           <16 x i8> %c, i32 0)
3203  ret <16 x i8> %res
3204}
3205
3206; VSTRCZB with !IN RT.
3207define <16 x i8> @test_vstrczb_4(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3208; CHECK-LABEL: test_vstrczb_4:
3209; CHECK:       # %bb.0:
3210; CHECK-NEXT:    vstrczb %v24, %v24, %v26, %v28, 4
3211; CHECK-NEXT:    br %r14
3212  %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b,
3213                                           <16 x i8> %c, i32 4)
3214  ret <16 x i8> %res
3215}
3216
3217; VSTRCZB with IN !RT.
3218define <16 x i8> @test_vstrczb_8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3219; CHECK-LABEL: test_vstrczb_8:
3220; CHECK:       # %bb.0:
3221; CHECK-NEXT:    vstrczb %v24, %v24, %v26, %v28, 8
3222; CHECK-NEXT:    br %r14
3223  %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b,
3224                                           <16 x i8> %c, i32 8)
3225  ret <16 x i8> %res
3226}
3227
3228; VSTRCZB with IN RT.
3229define <16 x i8> @test_vstrczb_12(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3230; CHECK-LABEL: test_vstrczb_12:
3231; CHECK:       # %bb.0:
3232; CHECK-NEXT:    vstrczb %v24, %v24, %v26, %v28, 12
3233; CHECK-NEXT:    br %r14
3234  %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b,
3235                                           <16 x i8> %c, i32 12)
3236  ret <16 x i8> %res
3237}
3238
3239; VSTRCZB with CS -- should be ignored.
3240define <16 x i8> @test_vstrczb_1(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
3241; CHECK-LABEL: test_vstrczb_1:
3242; CHECK:       # %bb.0:
3243; CHECK-NEXT:    vstrczb %v24, %v24, %v26, %v28, 0
3244; CHECK-NEXT:    br %r14
3245  %res = call <16 x i8> @llvm.s390.vstrczb(<16 x i8> %a, <16 x i8> %b,
3246                                           <16 x i8> %c, i32 1)
3247  ret <16 x i8> %res
3248}
3249
3250; VSTRCZH.
3251define <8 x i16> @test_vstrczh(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) {
3252; CHECK-LABEL: test_vstrczh:
3253; CHECK:       # %bb.0:
3254; CHECK-NEXT:    vstrczh %v24, %v24, %v26, %v28, 4
3255; CHECK-NEXT:    br %r14
3256  %res = call <8 x i16> @llvm.s390.vstrczh(<8 x i16> %a, <8 x i16> %b,
3257                                           <8 x i16> %c,  i32 4)
3258  ret <8 x i16> %res
3259}
3260
3261; VSTRCZF.
3262define <4 x i32> @test_vstrczf(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
3263; CHECK-LABEL: test_vstrczf:
3264; CHECK:       # %bb.0:
3265; CHECK-NEXT:    vstrczf %v24, %v24, %v26, %v28, 8
3266; CHECK-NEXT:    br %r14
3267  %res = call <4 x i32> @llvm.s390.vstrczf(<4 x i32> %a, <4 x i32> %b,
3268                                           <4 x i32> %c, i32 8)
3269  ret <4 x i32> %res
3270}
3271
3272; VSTRCZBS.
3273define <16 x i8> @test_vstrczbs(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c,
3274; CHECK-LABEL: test_vstrczbs:
3275; CHECK:       # %bb.0:
3276; CHECK-NEXT:    vstrczbs %v24, %v24, %v26, %v28, 0
3277; CHECK-NEXT:    ipm %r0
3278; CHECK-NEXT:    srl %r0, 28
3279; CHECK-NEXT:    st %r0, 0(%r2)
3280; CHECK-NEXT:    br %r14
3281                                ptr %ccptr) {
3282  %call = call {<16 x i8>, i32} @llvm.s390.vstrczbs(<16 x i8> %a, <16 x i8> %b,
3283                                                    <16 x i8> %c, i32 0)
3284  %res = extractvalue {<16 x i8>, i32} %call, 0
3285  %cc = extractvalue {<16 x i8>, i32} %call, 1
3286  store i32 %cc, ptr %ccptr
3287  ret <16 x i8> %res
3288}
3289
3290; VSTRCZHS.
3291define <8 x i16> @test_vstrczhs(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c,
3292; CHECK-LABEL: test_vstrczhs:
3293; CHECK:       # %bb.0:
3294; CHECK-NEXT:    vstrczhs %v24, %v24, %v26, %v28, 4
3295; CHECK-NEXT:    ipm %r0
3296; CHECK-NEXT:    srl %r0, 28
3297; CHECK-NEXT:    st %r0, 0(%r2)
3298; CHECK-NEXT:    br %r14
3299                                ptr %ccptr) {
3300  %call = call {<8 x i16>, i32} @llvm.s390.vstrczhs(<8 x i16> %a, <8 x i16> %b,
3301                                                    <8 x i16> %c, i32 4)
3302  %res = extractvalue {<8 x i16>, i32} %call, 0
3303  %cc = extractvalue {<8 x i16>, i32} %call, 1
3304  store i32 %cc, ptr %ccptr
3305  ret <8 x i16> %res
3306}
3307
3308; VSTRCZFS.
3309define <4 x i32> @test_vstrczfs(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c,
3310; CHECK-LABEL: test_vstrczfs:
3311; CHECK:       # %bb.0:
3312; CHECK-NEXT:    vstrczfs %v24, %v24, %v26, %v28, 8
3313; CHECK-NEXT:    ipm %r0
3314; CHECK-NEXT:    srl %r0, 28
3315; CHECK-NEXT:    st %r0, 0(%r2)
3316; CHECK-NEXT:    br %r14
3317                                ptr %ccptr) {
3318  %call = call {<4 x i32>, i32} @llvm.s390.vstrczfs(<4 x i32> %a, <4 x i32> %b,
3319                                                    <4 x i32> %c, i32 8)
3320  %res = extractvalue {<4 x i32>, i32} %call, 0
3321  %cc = extractvalue {<4 x i32>, i32} %call, 1
3322  store i32 %cc, ptr %ccptr
3323  ret <4 x i32> %res
3324}
3325
3326; VFCEDBS with no processing of the result.
3327define i32 @test_vfcedbs(<2 x double> %a, <2 x double> %b) {
3328; CHECK-LABEL: test_vfcedbs:
3329; CHECK:       # %bb.0:
3330; CHECK-NEXT:    vfcedbs %v0, %v24, %v26
3331; CHECK-NEXT:    ipm %r2
3332; CHECK-NEXT:    srl %r2, 28
3333; CHECK-NEXT:    br %r14
3334  %call = call {<2 x i64>, i32} @llvm.s390.vfcedbs(<2 x double> %a,
3335                                                   <2 x double> %b)
3336  %res = extractvalue {<2 x i64>, i32} %call, 1
3337  ret i32 %res
3338}
3339
3340; VFCEDBS, returning 1 if any elements are equal (CC != 3).
3341define i32 @test_vfcedbs_any_bool(<2 x double> %a, <2 x double> %b) {
3342; CHECK-LABEL: test_vfcedbs_any_bool:
3343; CHECK:       # %bb.0:
3344; CHECK-NEXT:    vfcedbs %v0, %v24, %v26
3345; CHECK-NEXT:    lhi %r2, 0
3346; CHECK-NEXT:    lochile %r2, 1
3347; CHECK-NEXT:    br %r14
3348  %call = call {<2 x i64>, i32} @llvm.s390.vfcedbs(<2 x double> %a,
3349                                                   <2 x double> %b)
3350  %res = extractvalue {<2 x i64>, i32} %call, 1
3351  %cmp = icmp ne i32 %res, 3
3352  %ext = zext i1 %cmp to i32
3353  ret i32 %ext
3354}
3355
3356; VFCEDBS, storing to %ptr if any elements are equal.
3357define <2 x i64> @test_vfcedbs_any_store(<2 x double> %a, <2 x double> %b,
3358; CHECK-LABEL: test_vfcedbs_any_store:
3359; CHECK:       # %bb.0:
3360; CHECK-NEXT:    vfcedbs %v24, %v24, %v26
3361; CHECK-NEXT:    bor %r14
3362; CHECK-NEXT:  .LBB249_1: # %store
3363; CHECK-NEXT:    mvhi 0(%r2), 0
3364; CHECK-NEXT:    br %r14
3365                                         ptr %ptr) {
3366  %call = call {<2 x i64>, i32} @llvm.s390.vfcedbs(<2 x double> %a,
3367                                                   <2 x double> %b)
3368  %res = extractvalue {<2 x i64>, i32} %call, 0
3369  %cc = extractvalue {<2 x i64>, i32} %call, 1
3370  %cmp = icmp ule i32 %cc, 2
3371  br i1 %cmp, label %store, label %exit
3372
3373store:
3374  store i32 0, ptr %ptr
3375  br label %exit
3376
3377exit:
3378  ret <2 x i64> %res
3379}
3380
3381; VFCHDBS with no processing of the result.
3382define i32 @test_vfchdbs(<2 x double> %a, <2 x double> %b) {
3383; CHECK-LABEL: test_vfchdbs:
3384; CHECK:       # %bb.0:
3385; CHECK-NEXT:    vfchdbs %v0, %v24, %v26
3386; CHECK-NEXT:    ipm %r2
3387; CHECK-NEXT:    srl %r2, 28
3388; CHECK-NEXT:    br %r14
3389  %call = call {<2 x i64>, i32} @llvm.s390.vfchdbs(<2 x double> %a,
3390                                                   <2 x double> %b)
3391  %res = extractvalue {<2 x i64>, i32} %call, 1
3392  ret i32 %res
3393}
3394
3395; VFCHDBS, returning 1 if not all elements are higher.
3396define i32 @test_vfchdbs_notall_bool(<2 x double> %a, <2 x double> %b) {
3397; CHECK-LABEL: test_vfchdbs_notall_bool:
3398; CHECK:       # %bb.0:
3399; CHECK-NEXT:    vfchdbs %v0, %v24, %v26
3400; CHECK-NEXT:    lhi %r2, 0
3401; CHECK-NEXT:    lochinhe %r2, 1
3402; CHECK-NEXT:    br %r14
3403  %call = call {<2 x i64>, i32} @llvm.s390.vfchdbs(<2 x double> %a,
3404                                                   <2 x double> %b)
3405  %res = extractvalue {<2 x i64>, i32} %call, 1
3406  %cmp = icmp sge i32 %res, 1
3407  %ext = zext i1 %cmp to i32
3408  ret i32 %ext
3409}
3410
3411; VFCHDBS, storing to %ptr if not all elements are higher.
3412define <2 x i64> @test_vfchdbs_notall_store(<2 x double> %a, <2 x double> %b,
3413; CHECK-LABEL: test_vfchdbs_notall_store:
3414; CHECK:       # %bb.0:
3415; CHECK-NEXT:    vfchdbs %v24, %v24, %v26
3416; CHECK-NEXT:    ber %r14
3417; CHECK-NEXT:  .LBB252_1: # %store
3418; CHECK-NEXT:    mvhi 0(%r2), 0
3419; CHECK-NEXT:    br %r14
3420                                            ptr %ptr) {
3421  %call = call {<2 x i64>, i32} @llvm.s390.vfchdbs(<2 x double> %a,
3422                                                   <2 x double> %b)
3423  %res = extractvalue {<2 x i64>, i32} %call, 0
3424  %cc = extractvalue {<2 x i64>, i32} %call, 1
3425  %cmp = icmp ugt i32 %cc, 0
3426  br i1 %cmp, label %store, label %exit
3427
3428store:
3429  store i32 0, ptr %ptr
3430  br label %exit
3431
3432exit:
3433  ret <2 x i64> %res
3434}
3435
3436; VFCHEDBS with no processing of the result.
3437define i32 @test_vfchedbs(<2 x double> %a, <2 x double> %b) {
3438; CHECK-LABEL: test_vfchedbs:
3439; CHECK:       # %bb.0:
3440; CHECK-NEXT:    vfchedbs %v0, %v24, %v26
3441; CHECK-NEXT:    ipm %r2
3442; CHECK-NEXT:    srl %r2, 28
3443; CHECK-NEXT:    br %r14
3444  %call = call {<2 x i64>, i32} @llvm.s390.vfchedbs(<2 x double> %a,
3445						    <2 x double> %b)
3446  %res = extractvalue {<2 x i64>, i32} %call, 1
3447  ret i32 %res
3448}
3449
3450; VFCHEDBS, returning 1 if neither element is higher or equal.
3451define i32 @test_vfchedbs_none_bool(<2 x double> %a, <2 x double> %b) {
3452; CHECK-LABEL: test_vfchedbs_none_bool:
3453; CHECK:       # %bb.0:
3454; CHECK-NEXT:    vfchedbs %v0, %v24, %v26
3455; CHECK-NEXT:    lhi %r2, 0
3456; CHECK-NEXT:    lochio %r2, 1
3457; CHECK-NEXT:    br %r14
3458  %call = call {<2 x i64>, i32} @llvm.s390.vfchedbs(<2 x double> %a,
3459						    <2 x double> %b)
3460  %res = extractvalue {<2 x i64>, i32} %call, 1
3461  %cmp = icmp eq i32 %res, 3
3462  %ext = zext i1 %cmp to i32
3463  ret i32 %ext
3464}
3465
3466; VFCHEDBS, storing to %ptr if neither element is higher or equal.
3467define <2 x i64> @test_vfchedbs_none_store(<2 x double> %a, <2 x double> %b,
3468; CHECK-LABEL: test_vfchedbs_none_store:
3469; CHECK:       # %bb.0:
3470; CHECK-NEXT:    vfchedbs %v24, %v24, %v26
3471; CHECK-NEXT:    bler %r14
3472; CHECK-NEXT:  .LBB255_1: # %store
3473; CHECK-NEXT:    mvhi 0(%r2), 0
3474; CHECK-NEXT:    br %r14
3475                                           ptr %ptr) {
3476  %call = call {<2 x i64>, i32} @llvm.s390.vfchedbs(<2 x double> %a,
3477						    <2 x double> %b)
3478  %res = extractvalue {<2 x i64>, i32} %call, 0
3479  %cc = extractvalue {<2 x i64>, i32} %call, 1
3480  %cmp = icmp uge i32 %cc, 3
3481  br i1 %cmp, label %store, label %exit
3482
3483store:
3484  store i32 0, ptr %ptr
3485  br label %exit
3486
3487exit:
3488  ret <2 x i64> %res
3489}
3490
3491; VFTCIDB with the lowest useful class selector and no processing of the result.
3492define i32 @test_vftcidb(<2 x double> %a) {
3493; CHECK-LABEL: test_vftcidb:
3494; CHECK:       # %bb.0:
3495; CHECK-NEXT:    vftcidb %v0, %v24, 1
3496; CHECK-NEXT:    ipm %r2
3497; CHECK-NEXT:    srl %r2, 28
3498; CHECK-NEXT:    br %r14
3499  %call = call {<2 x i64>, i32} @llvm.s390.vftcidb(<2 x double> %a, i32 1)
3500  %res = extractvalue {<2 x i64>, i32} %call, 1
3501  ret i32 %res
3502}
3503
3504; VFTCIDB with the highest useful class selector, returning 1 if all elements
3505; have the right class (CC == 0).
3506define i32 @test_vftcidb_all_bool(<2 x double> %a) {
3507; CHECK-LABEL: test_vftcidb_all_bool:
3508; CHECK:       # %bb.0:
3509; CHECK-NEXT:    vftcidb %v0, %v24, 4094
3510; CHECK-NEXT:    lhi %r2, 0
3511; CHECK-NEXT:    lochie %r2, 1
3512; CHECK-NEXT:    br %r14
3513  %call = call {<2 x i64>, i32} @llvm.s390.vftcidb(<2 x double> %a, i32 4094)
3514  %res = extractvalue {<2 x i64>, i32} %call, 1
3515  %cmp = icmp eq i32 %res, 0
3516  %ext = zext i1 %cmp to i32
3517  ret i32 %ext
3518}
3519
3520; VFIDB with a rounding mode not usable via standard intrinsics.
3521define <2 x double> @test_vfidb_0_4(<2 x double> %a) {
3522; CHECK-LABEL: test_vfidb_0_4:
3523; CHECK:       # %bb.0:
3524; CHECK-NEXT:    vfidb %v24, %v24, 0, 4
3525; CHECK-NEXT:    br %r14
3526  %res = call <2 x double> @llvm.s390.vfidb(<2 x double> %a, i32 0, i32 4)
3527  ret <2 x double> %res
3528}
3529
3530; VFIDB with IEEE-inexact exception suppressed.
3531define <2 x double> @test_vfidb_4_0(<2 x double> %a) {
3532; CHECK-LABEL: test_vfidb_4_0:
3533; CHECK:       # %bb.0:
3534; CHECK-NEXT:    vfidb %v24, %v24, 4, 0
3535; CHECK-NEXT:    br %r14
3536  %res = call <2 x double> @llvm.s390.vfidb(<2 x double> %a, i32 4, i32 0)
3537  ret <2 x double> %res
3538}
3539
3540