llvm.org GIT mirror llvm / 618cbae
[FPEnv] Added a special UnrollVectorOp method to deal with the chain on StrictFP opcodes This change creates UnrollVectorOp_StrictFP. The purpose of this is to address a failure that consistently occurs when calling StrictFP functions on vectors whose number of elements is 3 + 2n on most platforms, such as PowerPC or SystemZ. The old UnrollVectorOp method does not expect that the vector that it will unroll will have a chain, so it has an assert that prevents it from running if this is the case. This new StrictFP version of the method deals with the chain while unrolling the vector. With this new function in place during vector widending, llc can run vector-constrained-fp-intrinsics.ll for SystemZ successfully. Submitted by: Drew Wock <drew.wock@sas.com> Reviewed by: Cameron McInally, Kevin P. Neal Approved by: Cameron McInally Differential Revision: http://reviews.llvm.org/D62546 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362112 91177308-0d34-0410-b5e6-96231b3b80d8 Kevin P. Neal 8 months ago
3 changed file(s) with 6508 addition(s) and 1 deletion(s). Raw diff Collapse all Expand all
856856 SDValue WidenVecOp_FCOPYSIGN(SDNode *N);
857857 SDValue WidenVecOp_VECREDUCE(SDNode *N);
858858
859 /// Helper function to generate a set of operations to perform
860 /// a vector operation for a wider type.
861 ///
862 SDValue UnrollVectorOp_StrictFP(SDNode *N, unsigned ResNE);
863
859864 //===--------------------------------------------------------------------===//
860865 // Vector Widening Utilities Support: LegalizeVectorTypes.cpp
861866 //===--------------------------------------------------------------------===//
13171317 ReplaceValueWith(SDValue(N, 1), Chain);
13181318 }
13191319
1320 SDValue DAGTypeLegalizer::UnrollVectorOp_StrictFP(SDNode *N, unsigned ResNE) {
1321 SDValue Chain = N->getOperand(0);
1322 EVT VT = N->getValueType(0);
1323 unsigned NE = VT.getVectorNumElements();
1324 EVT EltVT = VT.getVectorElementType();
1325 SDLoc dl(N);
1326
1327 SmallVector Scalars;
1328 SmallVector Operands(N->getNumOperands());
1329
1330 // If ResNE is 0, fully unroll the vector op.
1331 if (ResNE == 0)
1332 ResNE = NE;
1333 else if (NE > ResNE)
1334 NE = ResNE;
1335
1336 //The results of each unrolled operation, including the chain.
1337 EVT ChainVTs[] = {EltVT, MVT::Other};
1338 SmallVector Chains;
1339
1340 unsigned i;
1341 for (i = 0; i != NE; ++i) {
1342 Operands[0] = Chain;
1343 for (unsigned j = 1, e = N->getNumOperands(); j != e; ++j) {
1344 SDValue Operand = N->getOperand(j);
1345 EVT OperandVT = Operand.getValueType();
1346 if (OperandVT.isVector()) {
1347 EVT OperandEltVT = OperandVT.getVectorElementType();
1348 Operands[j] =
1349 DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT, Operand,
1350 DAG.getConstant(i, dl, TLI.getVectorIdxTy(
1351 DAG.getDataLayout())));
1352 } else {
1353 Operands[j] = Operand;
1354 }
1355 }
1356 SDValue Scalar = DAG.getNode(N->getOpcode(), dl, ChainVTs, Operands);
1357 Scalar.getNode()->setFlags(N->getFlags());
1358
1359 //Add in the scalar as well as its chain value to the
1360 //result vectors.
1361 Scalars.push_back(Scalar);
1362 Chains.push_back(Scalar.getValue(1));
1363 }
1364
1365 for (; i < ResNE; ++i)
1366 Scalars.push_back(DAG.getUNDEF(EltVT));
1367
1368 // Build a new factor node to connect the chain back together.
1369 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Chains);
1370 ReplaceValueWith(SDValue(N, 1), Chain);
1371
1372 // Create a new BUILD_VECTOR node
1373 EVT VecVT = EVT::getVectorVT(*DAG.getContext(), EltVT, ResNE);
1374 return DAG.getBuildVector(VecVT, dl, Scalars);
1375 }
1376
13201377 void DAGTypeLegalizer::SplitVecRes_OverflowOp(SDNode *N, unsigned ResNo,
13211378 SDValue &Lo, SDValue &Hi) {
13221379 SDLoc dl(N);
29673024
29683025 // No legal vector version so unroll the vector operation and then widen.
29693026 if (NumElts == 1)
2970 return DAG.UnrollVectorOp(N, WidenVT.getVectorNumElements());
3027 return UnrollVectorOp_StrictFP(N, WidenVT.getVectorNumElements());
29713028
29723029 // Since the operation can trap, apply operation on the original vector.
29733030 EVT MaxVT = VT;
0 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
1 ; RUN: llc -O3 -mtriple=s390x-linux-gnu < %s | FileCheck --check-prefix=S390X %s
2 ; RUN: llc -O3 -mtriple=s390x-linux-gnu -mcpu=z13 < %s | FileCheck --check-prefix=SZ13 %s
3
4 define <1 x float> @constrained_vector_fdiv_v1f32() {
5 ; S390X-LABEL: constrained_vector_fdiv_v1f32:
6 ; S390X: # %bb.0: # %entry
7 ; S390X-NEXT: larl %r1, .LCPI0_0
8 ; S390X-NEXT: le %f0, 0(%r1)
9 ; S390X-NEXT: larl %r1, .LCPI0_1
10 ; S390X-NEXT: deb %f0, 0(%r1)
11 ; S390X-NEXT: br %r14
12 ;
13 ; SZ13-LABEL: constrained_vector_fdiv_v1f32:
14 ; SZ13: # %bb.0: # %entry
15 ; SZ13-NEXT: larl %r1, .LCPI0_0
16 ; SZ13-NEXT: vgmf %v0, 2, 8
17 ; SZ13-NEXT: deb %f0, 0(%r1)
18 ; SZ13-NEXT: vlr %v24, %v0
19 ; SZ13-NEXT: br %r14
20 entry:
21 %div = call <1 x float> @llvm.experimental.constrained.fdiv.v1f32(
22 <1 x float> ,
23 <1 x float> ,
24 metadata !"round.dynamic",
25 metadata !"fpexcept.strict")
26 ret <1 x float> %div
27 }
28
29 define <2 x double> @constrained_vector_fdiv_v2f64() {
30 ; S390X-LABEL: constrained_vector_fdiv_v2f64:
31 ; S390X: # %bb.0: # %entry
32 ; S390X-NEXT: larl %r1, .LCPI1_0
33 ; S390X-NEXT: ldeb %f1, 0(%r1)
34 ; S390X-NEXT: larl %r1, .LCPI1_1
35 ; S390X-NEXT: ldeb %f0, 0(%r1)
36 ; S390X-NEXT: larl %r1, .LCPI1_2
37 ; S390X-NEXT: ldeb %f2, 0(%r1)
38 ; S390X-NEXT: ddbr %f0, %f1
39 ; S390X-NEXT: ddbr %f2, %f1
40 ; S390X-NEXT: br %r14
41 ;
42 ; SZ13-LABEL: constrained_vector_fdiv_v2f64:
43 ; SZ13: # %bb.0: # %entry
44 ; SZ13-NEXT: larl %r1, .LCPI1_0
45 ; SZ13-NEXT: vl %v0, 0(%r1)
46 ; SZ13-NEXT: larl %r1, .LCPI1_1
47 ; SZ13-NEXT: vl %v1, 0(%r1)
48 ; SZ13-NEXT: vfddb %v24, %v1, %v0
49 ; SZ13-NEXT: br %r14
50 entry:
51 %div = call <2 x double> @llvm.experimental.constrained.fdiv.v2f64(
52 <2 x double> ,
53 <2 x double> ,
54 metadata !"round.dynamic",
55 metadata !"fpexcept.strict")
56 ret <2 x double> %div
57 }
58
59 define <3 x float> @constrained_vector_fdiv_v3f32() {
60 ; S390X-LABEL: constrained_vector_fdiv_v3f32:
61 ; S390X: # %bb.0: # %entry
62 ; S390X-NEXT: larl %r1, .LCPI2_0
63 ; S390X-NEXT: le %f1, 0(%r1)
64 ; S390X-NEXT: larl %r1, .LCPI2_1
65 ; S390X-NEXT: le %f0, 0(%r1)
66 ; S390X-NEXT: larl %r1, .LCPI2_2
67 ; S390X-NEXT: le %f2, 0(%r1)
68 ; S390X-NEXT: larl %r1, .LCPI2_3
69 ; S390X-NEXT: le %f4, 0(%r1)
70 ; S390X-NEXT: debr %f0, %f1
71 ; S390X-NEXT: debr %f2, %f1
72 ; S390X-NEXT: debr %f4, %f1
73 ; S390X-NEXT: br %r14
74 ;
75 ; SZ13-LABEL: constrained_vector_fdiv_v3f32:
76 ; SZ13: # %bb.0: # %entry
77 ; SZ13-NEXT: larl %r1, .LCPI2_0
78 ; SZ13-NEXT: lde %f0, 0(%r1)
79 ; SZ13-NEXT: larl %r1, .LCPI2_1
80 ; SZ13-NEXT: lde %f1, 0(%r1)
81 ; SZ13-NEXT: debr %f1, %f0
82 ; SZ13-NEXT: vgmf %v2, 2, 8
83 ; SZ13-NEXT: vgmf %v3, 1, 1
84 ; SZ13-NEXT: debr %f2, %f0
85 ; SZ13-NEXT: vrepf %v1, %v1, 0
86 ; SZ13-NEXT: debr %f3, %f0
87 ; SZ13-NEXT: vmrhf %v0, %v2, %v3
88 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
89 ; SZ13-NEXT: br %r14
90 entry:
91 %div = call <3 x float> @llvm.experimental.constrained.fdiv.v3f32(
92 <3 x float> ,
93 <3 x float> ,
94 metadata !"round.dynamic",
95 metadata !"fpexcept.strict")
96 ret <3 x float> %div
97 }
98
99 define void @constrained_vector_fdiv_v3f64(<3 x double>* %a) {
100 ; S390X-LABEL: constrained_vector_fdiv_v3f64:
101 ; S390X: # %bb.0: # %entry
102 ; S390X-NEXT: larl %r1, .LCPI3_1
103 ; S390X-NEXT: ldeb %f0, 0(%r1)
104 ; S390X-NEXT: larl %r1, .LCPI3_2
105 ; S390X-NEXT: ldeb %f1, 0(%r1)
106 ; S390X-NEXT: larl %r1, .LCPI3_0
107 ; S390X-NEXT: ldeb %f2, 0(%r1)
108 ; S390X-NEXT: ddb %f1, 16(%r2)
109 ; S390X-NEXT: ddb %f0, 8(%r2)
110 ; S390X-NEXT: ddb %f2, 0(%r2)
111 ; S390X-NEXT: std %f1, 16(%r2)
112 ; S390X-NEXT: std %f0, 8(%r2)
113 ; S390X-NEXT: std %f2, 0(%r2)
114 ; S390X-NEXT: br %r14
115 ;
116 ; SZ13-LABEL: constrained_vector_fdiv_v3f64:
117 ; SZ13: # %bb.0: # %entry
118 ; SZ13-NEXT: larl %r1, .LCPI3_0
119 ; SZ13-NEXT: vl %v0, 0(%r2)
120 ; SZ13-NEXT: vl %v1, 0(%r1)
121 ; SZ13-NEXT: vfddb %v0, %v1, %v0
122 ; SZ13-NEXT: larl %r1, .LCPI3_1
123 ; SZ13-NEXT: ldeb %f1, 0(%r1)
124 ; SZ13-NEXT: ddb %f1, 16(%r2)
125 ; SZ13-NEXT: std %f1, 16(%r2)
126 ; SZ13-NEXT: vst %v0, 0(%r2)
127 ; SZ13-NEXT: br %r14
128 entry:
129 %b = load <3 x double>, <3 x double>* %a
130 %div = call <3 x double> @llvm.experimental.constrained.fdiv.v3f64(
131 <3 x double> ,
132 <3 x double> %b,
133 metadata !"round.dynamic",
134 metadata !"fpexcept.strict")
135 store <3 x double> %div, <3 x double>* %a
136 ret void
137 }
138
139 define <4 x double> @constrained_vector_fdiv_v4f64() {
140 ; S390X-LABEL: constrained_vector_fdiv_v4f64:
141 ; S390X: # %bb.0: # %entry
142 ; S390X-NEXT: larl %r1, .LCPI4_0
143 ; S390X-NEXT: ldeb %f1, 0(%r1)
144 ; S390X-NEXT: larl %r1, .LCPI4_1
145 ; S390X-NEXT: ldeb %f0, 0(%r1)
146 ; S390X-NEXT: larl %r1, .LCPI4_2
147 ; S390X-NEXT: ldeb %f2, 0(%r1)
148 ; S390X-NEXT: larl %r1, .LCPI4_3
149 ; S390X-NEXT: ldeb %f4, 0(%r1)
150 ; S390X-NEXT: larl %r1, .LCPI4_4
151 ; S390X-NEXT: ldeb %f6, 0(%r1)
152 ; S390X-NEXT: ddbr %f0, %f1
153 ; S390X-NEXT: ddbr %f2, %f1
154 ; S390X-NEXT: ddbr %f4, %f1
155 ; S390X-NEXT: ddbr %f6, %f1
156 ; S390X-NEXT: br %r14
157 ;
158 ; SZ13-LABEL: constrained_vector_fdiv_v4f64:
159 ; SZ13: # %bb.0: # %entry
160 ; SZ13-NEXT: larl %r1, .LCPI4_0
161 ; SZ13-NEXT: vl %v0, 0(%r1)
162 ; SZ13-NEXT: larl %r1, .LCPI4_1
163 ; SZ13-NEXT: vl %v1, 0(%r1)
164 ; SZ13-NEXT: vfddb %v24, %v1, %v0
165 ; SZ13-NEXT: larl %r1, .LCPI4_2
166 ; SZ13-NEXT: vl %v1, 0(%r1)
167 ; SZ13-NEXT: vfddb %v26, %v1, %v0
168 ; SZ13-NEXT: br %r14
169 entry:
170 %div = call <4 x double> @llvm.experimental.constrained.fdiv.v4f64(
171 <4 x double>
172 double 3.000000e+00, double 4.000000e+00>,
173 <4 x double>
174 double 1.000000e+01, double 1.000000e+01>,
175 metadata !"round.dynamic",
176 metadata !"fpexcept.strict")
177 ret <4 x double> %div
178 }
179
180 define <1 x float> @constrained_vector_frem_v1f32() {
181 ; S390X-LABEL: constrained_vector_frem_v1f32:
182 ; S390X: # %bb.0: # %entry
183 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
184 ; S390X-NEXT: .cfi_offset %r14, -48
185 ; S390X-NEXT: .cfi_offset %r15, -40
186 ; S390X-NEXT: aghi %r15, -160
187 ; S390X-NEXT: .cfi_def_cfa_offset 320
188 ; S390X-NEXT: larl %r1, .LCPI5_0
189 ; S390X-NEXT: le %f0, 0(%r1)
190 ; S390X-NEXT: larl %r1, .LCPI5_1
191 ; S390X-NEXT: le %f2, 0(%r1)
192 ; S390X-NEXT: brasl %r14, fmodf@PLT
193 ; S390X-NEXT: lmg %r14, %r15, 272(%r15)
194 ; S390X-NEXT: br %r14
195 ;
196 ; SZ13-LABEL: constrained_vector_frem_v1f32:
197 ; SZ13: # %bb.0: # %entry
198 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
199 ; SZ13-NEXT: .cfi_offset %r14, -48
200 ; SZ13-NEXT: .cfi_offset %r15, -40
201 ; SZ13-NEXT: aghi %r15, -160
202 ; SZ13-NEXT: .cfi_def_cfa_offset 320
203 ; SZ13-NEXT: larl %r1, .LCPI5_0
204 ; SZ13-NEXT: lde %f2, 0(%r1)
205 ; SZ13-NEXT: vgmf %v0, 2, 8
206 ; SZ13-NEXT: brasl %r14, fmodf@PLT
207 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
208 ; SZ13-NEXT: vlr %v24, %v0
209 ; SZ13-NEXT: lmg %r14, %r15, 272(%r15)
210 ; SZ13-NEXT: br %r14
211 entry:
212 %rem = call <1 x float> @llvm.experimental.constrained.frem.v1f32(
213 <1 x float> ,
214 <1 x float> ,
215 metadata !"round.dynamic",
216 metadata !"fpexcept.strict")
217 ret <1 x float> %rem
218 }
219
220 define <2 x double> @constrained_vector_frem_v2f64() {
221 ; S390X-LABEL: constrained_vector_frem_v2f64:
222 ; S390X: # %bb.0: # %entry
223 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
224 ; S390X-NEXT: .cfi_offset %r14, -48
225 ; S390X-NEXT: .cfi_offset %r15, -40
226 ; S390X-NEXT: aghi %r15, -176
227 ; S390X-NEXT: .cfi_def_cfa_offset 336
228 ; S390X-NEXT: std %f8, 168(%r15) # 8-byte Folded Spill
229 ; S390X-NEXT: std %f9, 160(%r15) # 8-byte Folded Spill
230 ; S390X-NEXT: .cfi_offset %f8, -168
231 ; S390X-NEXT: .cfi_offset %f9, -176
232 ; S390X-NEXT: larl %r1, .LCPI6_0
233 ; S390X-NEXT: ldeb %f0, 0(%r1)
234 ; S390X-NEXT: larl %r1, .LCPI6_1
235 ; S390X-NEXT: ldeb %f8, 0(%r1)
236 ; S390X-NEXT: ldr %f2, %f8
237 ; S390X-NEXT: brasl %r14, fmod@PLT
238 ; S390X-NEXT: larl %r1, .LCPI6_2
239 ; S390X-NEXT: ldeb %f1, 0(%r1)
240 ; S390X-NEXT: ldr %f9, %f0
241 ; S390X-NEXT: ldr %f0, %f1
242 ; S390X-NEXT: ldr %f2, %f8
243 ; S390X-NEXT: brasl %r14, fmod@PLT
244 ; S390X-NEXT: ldr %f2, %f0
245 ; S390X-NEXT: ldr %f0, %f9
246 ; S390X-NEXT: ld %f8, 168(%r15) # 8-byte Folded Reload
247 ; S390X-NEXT: ld %f9, 160(%r15) # 8-byte Folded Reload
248 ; S390X-NEXT: lmg %r14, %r15, 288(%r15)
249 ; S390X-NEXT: br %r14
250 ;
251 ; SZ13-LABEL: constrained_vector_frem_v2f64:
252 ; SZ13: # %bb.0: # %entry
253 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
254 ; SZ13-NEXT: .cfi_offset %r14, -48
255 ; SZ13-NEXT: .cfi_offset %r15, -40
256 ; SZ13-NEXT: aghi %r15, -184
257 ; SZ13-NEXT: .cfi_def_cfa_offset 344
258 ; SZ13-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
259 ; SZ13-NEXT: .cfi_offset %f8, -168
260 ; SZ13-NEXT: larl %r1, .LCPI6_0
261 ; SZ13-NEXT: ldeb %f8, 0(%r1)
262 ; SZ13-NEXT: vgmg %v0, 1, 1
263 ; SZ13-NEXT: ldr %f2, %f8
264 ; SZ13-NEXT: brasl %r14, fmod@PLT
265 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
266 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
267 ; SZ13-NEXT: vgmg %v0, 2, 11
268 ; SZ13-NEXT: ldr %f2, %f8
269 ; SZ13-NEXT: brasl %r14, fmod@PLT
270 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
271 ; SZ13-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
272 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
273 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
274 ; SZ13-NEXT: lmg %r14, %r15, 296(%r15)
275 ; SZ13-NEXT: br %r14
276 entry:
277 %rem = call <2 x double> @llvm.experimental.constrained.frem.v2f64(
278 <2 x double> ,
279 <2 x double> ,
280 metadata !"round.dynamic",
281 metadata !"fpexcept.strict")
282 ret <2 x double> %rem
283 }
284
285 define <3 x float> @constrained_vector_frem_v3f32() {
286 ; S390X-LABEL: constrained_vector_frem_v3f32:
287 ; S390X: # %bb.0: # %entry
288 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
289 ; S390X-NEXT: .cfi_offset %r14, -48
290 ; S390X-NEXT: .cfi_offset %r15, -40
291 ; S390X-NEXT: aghi %r15, -184
292 ; S390X-NEXT: .cfi_def_cfa_offset 344
293 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
294 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
295 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
296 ; S390X-NEXT: .cfi_offset %f8, -168
297 ; S390X-NEXT: .cfi_offset %f9, -176
298 ; S390X-NEXT: .cfi_offset %f10, -184
299 ; S390X-NEXT: larl %r1, .LCPI7_0
300 ; S390X-NEXT: le %f0, 0(%r1)
301 ; S390X-NEXT: larl %r1, .LCPI7_1
302 ; S390X-NEXT: le %f8, 0(%r1)
303 ; S390X-NEXT: ler %f2, %f8
304 ; S390X-NEXT: brasl %r14, fmodf@PLT
305 ; S390X-NEXT: larl %r1, .LCPI7_2
306 ; S390X-NEXT: le %f1, 0(%r1)
307 ; S390X-NEXT: ler %f9, %f0
308 ; S390X-NEXT: ler %f0, %f1
309 ; S390X-NEXT: ler %f2, %f8
310 ; S390X-NEXT: brasl %r14, fmodf@PLT
311 ; S390X-NEXT: larl %r1, .LCPI7_3
312 ; S390X-NEXT: le %f1, 0(%r1)
313 ; S390X-NEXT: ler %f10, %f0
314 ; S390X-NEXT: ler %f0, %f1
315 ; S390X-NEXT: ler %f2, %f8
316 ; S390X-NEXT: brasl %r14, fmodf@PLT
317 ; S390X-NEXT: ler %f4, %f0
318 ; S390X-NEXT: ler %f0, %f9
319 ; S390X-NEXT: ler %f2, %f10
320 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
321 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
322 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
323 ; S390X-NEXT: lmg %r14, %r15, 296(%r15)
324 ; S390X-NEXT: br %r14
325 ;
326 ; SZ13-LABEL: constrained_vector_frem_v3f32:
327 ; SZ13: # %bb.0: # %entry
328 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
329 ; SZ13-NEXT: .cfi_offset %r14, -48
330 ; SZ13-NEXT: .cfi_offset %r15, -40
331 ; SZ13-NEXT: aghi %r15, -200
332 ; SZ13-NEXT: .cfi_def_cfa_offset 360
333 ; SZ13-NEXT: std %f8, 192(%r15) # 8-byte Folded Spill
334 ; SZ13-NEXT: .cfi_offset %f8, -168
335 ; SZ13-NEXT: larl %r1, .LCPI7_0
336 ; SZ13-NEXT: lde %f0, 0(%r1)
337 ; SZ13-NEXT: larl %r1, .LCPI7_1
338 ; SZ13-NEXT: lde %f8, 0(%r1)
339 ; SZ13-NEXT: ldr %f2, %f8
340 ; SZ13-NEXT: brasl %r14, fmodf@PLT
341 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
342 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
343 ; SZ13-NEXT: vgmf %v0, 2, 8
344 ; SZ13-NEXT: ldr %f2, %f8
345 ; SZ13-NEXT: brasl %r14, fmodf@PLT
346 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
347 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
348 ; SZ13-NEXT: vgmf %v0, 1, 1
349 ; SZ13-NEXT: ldr %f2, %f8
350 ; SZ13-NEXT: brasl %r14, fmodf@PLT
351 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
352 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
353 ; SZ13-NEXT: vmrhf %v0, %v1, %v0
354 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
355 ; SZ13-NEXT: ld %f8, 192(%r15) # 8-byte Folded Reload
356 ; SZ13-NEXT: vrepf %v1, %v1, 0
357 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
358 ; SZ13-NEXT: lmg %r14, %r15, 312(%r15)
359 ; SZ13-NEXT: br %r14
360 entry:
361 %rem = call <3 x float> @llvm.experimental.constrained.frem.v3f32(
362 <3 x float> ,
363 <3 x float> ,
364 metadata !"round.dynamic",
365 metadata !"fpexcept.strict")
366 ret <3 x float> %rem
367 }
368
369 define void @constrained_vector_frem_v3f64(<3 x double>* %a) {
370 ; S390X-LABEL: constrained_vector_frem_v3f64:
371 ; S390X: # %bb.0: # %entry
372 ; S390X-NEXT: stmg %r13, %r15, 104(%r15)
373 ; S390X-NEXT: .cfi_offset %r13, -56
374 ; S390X-NEXT: .cfi_offset %r14, -48
375 ; S390X-NEXT: .cfi_offset %r15, -40
376 ; S390X-NEXT: aghi %r15, -184
377 ; S390X-NEXT: .cfi_def_cfa_offset 344
378 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
379 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
380 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
381 ; S390X-NEXT: .cfi_offset %f8, -168
382 ; S390X-NEXT: .cfi_offset %f9, -176
383 ; S390X-NEXT: .cfi_offset %f10, -184
384 ; S390X-NEXT: lgr %r13, %r2
385 ; S390X-NEXT: ld %f8, 16(%r2)
386 ; S390X-NEXT: ld %f2, 0(%r2)
387 ; S390X-NEXT: larl %r1, .LCPI8_0
388 ; S390X-NEXT: ldeb %f0, 0(%r1)
389 ; S390X-NEXT: ld %f9, 8(%r2)
390 ; S390X-NEXT: brasl %r14, fmod@PLT
391 ; S390X-NEXT: larl %r1, .LCPI8_1
392 ; S390X-NEXT: ldeb %f1, 0(%r1)
393 ; S390X-NEXT: ldr %f10, %f0
394 ; S390X-NEXT: ldr %f0, %f1
395 ; S390X-NEXT: ldr %f2, %f9
396 ; S390X-NEXT: brasl %r14, fmod@PLT
397 ; S390X-NEXT: larl %r1, .LCPI8_2
398 ; S390X-NEXT: ldeb %f1, 0(%r1)
399 ; S390X-NEXT: ldr %f9, %f0
400 ; S390X-NEXT: ldr %f0, %f1
401 ; S390X-NEXT: ldr %f2, %f8
402 ; S390X-NEXT: brasl %r14, fmod@PLT
403 ; S390X-NEXT: std %f0, 16(%r13)
404 ; S390X-NEXT: std %f9, 8(%r13)
405 ; S390X-NEXT: std %f10, 0(%r13)
406 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
407 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
408 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
409 ; S390X-NEXT: lmg %r13, %r15, 288(%r15)
410 ; S390X-NEXT: br %r14
411 ;
412 ; SZ13-LABEL: constrained_vector_frem_v3f64:
413 ; SZ13: # %bb.0: # %entry
414 ; SZ13-NEXT: stmg %r13, %r15, 104(%r15)
415 ; SZ13-NEXT: .cfi_offset %r13, -56
416 ; SZ13-NEXT: .cfi_offset %r14, -48
417 ; SZ13-NEXT: .cfi_offset %r15, -40
418 ; SZ13-NEXT: aghi %r15, -200
419 ; SZ13-NEXT: .cfi_def_cfa_offset 360
420 ; SZ13-NEXT: std %f8, 192(%r15) # 8-byte Folded Spill
421 ; SZ13-NEXT: .cfi_offset %f8, -168
422 ; SZ13-NEXT: vl %v2, 0(%r2)
423 ; SZ13-NEXT: ld %f8, 16(%r2)
424 ; SZ13-NEXT: vgmg %v0, 2, 11
425 ; SZ13-NEXT: lgr %r13, %r2
426 ; SZ13-NEXT: vst %v2, 160(%r15) # 16-byte Folded Spill
427 ; SZ13-NEXT: # kill: def $f2d killed $f2d killed $v2
428 ; SZ13-NEXT: brasl %r14, fmod@PLT
429 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
430 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
431 ; SZ13-NEXT: vl %v0, 160(%r15) # 16-byte Folded Reload
432 ; SZ13-NEXT: vrepg %v2, %v0, 1
433 ; SZ13-NEXT: vgmg %v0, 1, 1
434 ; SZ13-NEXT: # kill: def $f2d killed $f2d killed $v2
435 ; SZ13-NEXT: brasl %r14, fmod@PLT
436 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
437 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
438 ; SZ13-NEXT: vmrhg %v0, %v1, %v0
439 ; SZ13-NEXT: larl %r1, .LCPI8_0
440 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
441 ; SZ13-NEXT: ldeb %f0, 0(%r1)
442 ; SZ13-NEXT: ldr %f2, %f8
443 ; SZ13-NEXT: brasl %r14, fmod@PLT
444 ; SZ13-NEXT: std %f0, 16(%r13)
445 ; SZ13-NEXT: vl %v0, 176(%r15) # 16-byte Folded Reload
446 ; SZ13-NEXT: ld %f8, 192(%r15) # 8-byte Folded Reload
447 ; SZ13-NEXT: vst %v0, 0(%r13)
448 ; SZ13-NEXT: lmg %r13, %r15, 304(%r15)
449 ; SZ13-NEXT: br %r14
450 entry:
451 %b = load <3 x double>, <3 x double>* %a
452 %rem = call <3 x double> @llvm.experimental.constrained.frem.v3f64(
453 <3 x double> ,
454 <3 x double> %b,
455 metadata !"round.dynamic",
456 metadata !"fpexcept.strict")
457 store <3 x double> %rem, <3 x double>* %a
458 ret void
459 }
460
461 define <4 x double> @constrained_vector_frem_v4f64() {
462 ; S390X-LABEL: constrained_vector_frem_v4f64:
463 ; S390X: # %bb.0:
464 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
465 ; S390X-NEXT: .cfi_offset %r14, -48
466 ; S390X-NEXT: .cfi_offset %r15, -40
467 ; S390X-NEXT: aghi %r15, -192
468 ; S390X-NEXT: .cfi_def_cfa_offset 352
469 ; S390X-NEXT: std %f8, 184(%r15) # 8-byte Folded Spill
470 ; S390X-NEXT: std %f9, 176(%r15) # 8-byte Folded Spill
471 ; S390X-NEXT: std %f10, 168(%r15) # 8-byte Folded Spill
472 ; S390X-NEXT: std %f11, 160(%r15) # 8-byte Folded Spill
473 ; S390X-NEXT: .cfi_offset %f8, -168
474 ; S390X-NEXT: .cfi_offset %f9, -176
475 ; S390X-NEXT: .cfi_offset %f10, -184
476 ; S390X-NEXT: .cfi_offset %f11, -192
477 ; S390X-NEXT: larl %r1, .LCPI9_0
478 ; S390X-NEXT: ldeb %f0, 0(%r1)
479 ; S390X-NEXT: larl %r1, .LCPI9_1
480 ; S390X-NEXT: ldeb %f8, 0(%r1)
481 ; S390X-NEXT: ldr %f2, %f8
482 ; S390X-NEXT: brasl %r14, fmod@PLT
483 ; S390X-NEXT: larl %r1, .LCPI9_2
484 ; S390X-NEXT: ldeb %f1, 0(%r1)
485 ; S390X-NEXT: ldr %f9, %f0
486 ; S390X-NEXT: ldr %f0, %f1
487 ; S390X-NEXT: ldr %f2, %f8
488 ; S390X-NEXT: brasl %r14, fmod@PLT
489 ; S390X-NEXT: larl %r1, .LCPI9_3
490 ; S390X-NEXT: ldeb %f1, 0(%r1)
491 ; S390X-NEXT: ldr %f10, %f0
492 ; S390X-NEXT: ldr %f0, %f1
493 ; S390X-NEXT: ldr %f2, %f8
494 ; S390X-NEXT: brasl %r14, fmod@PLT
495 ; S390X-NEXT: larl %r1, .LCPI9_4
496 ; S390X-NEXT: ldeb %f1, 0(%r1)
497 ; S390X-NEXT: ldr %f11, %f0
498 ; S390X-NEXT: ldr %f0, %f1
499 ; S390X-NEXT: ldr %f2, %f8
500 ; S390X-NEXT: brasl %r14, fmod@PLT
501 ; S390X-NEXT: ldr %f6, %f0
502 ; S390X-NEXT: ldr %f0, %f9
503 ; S390X-NEXT: ldr %f2, %f10
504 ; S390X-NEXT: ldr %f4, %f11
505 ; S390X-NEXT: ld %f8, 184(%r15) # 8-byte Folded Reload
506 ; S390X-NEXT: ld %f9, 176(%r15) # 8-byte Folded Reload
507 ; S390X-NEXT: ld %f10, 168(%r15) # 8-byte Folded Reload
508 ; S390X-NEXT: ld %f11, 160(%r15) # 8-byte Folded Reload
509 ; S390X-NEXT: lmg %r14, %r15, 304(%r15)
510 ; S390X-NEXT: br %r14
511 ;
512 ; SZ13-LABEL: constrained_vector_frem_v4f64:
513 ; SZ13: # %bb.0:
514 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
515 ; SZ13-NEXT: .cfi_offset %r14, -48
516 ; SZ13-NEXT: .cfi_offset %r15, -40
517 ; SZ13-NEXT: aghi %r15, -200
518 ; SZ13-NEXT: .cfi_def_cfa_offset 360
519 ; SZ13-NEXT: std %f8, 192(%r15) # 8-byte Folded Spill
520 ; SZ13-NEXT: .cfi_offset %f8, -168
521 ; SZ13-NEXT: larl %r1, .LCPI9_0
522 ; SZ13-NEXT: ldeb %f8, 0(%r1)
523 ; SZ13-NEXT: vgmg %v0, 1, 1
524 ; SZ13-NEXT: ldr %f2, %f8
525 ; SZ13-NEXT: brasl %r14, fmod@PLT
526 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
527 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
528 ; SZ13-NEXT: vgmg %v0, 2, 11
529 ; SZ13-NEXT: ldr %f2, %f8
530 ; SZ13-NEXT: brasl %r14, fmod@PLT
531 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
532 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
533 ; SZ13-NEXT: vmrhg %v0, %v0, %v1
534 ; SZ13-NEXT: larl %r1, .LCPI9_1
535 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
536 ; SZ13-NEXT: ldeb %f0, 0(%r1)
537 ; SZ13-NEXT: ldr %f2, %f8
538 ; SZ13-NEXT: brasl %r14, fmod@PLT
539 ; SZ13-NEXT: larl %r1, .LCPI9_2
540 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
541 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
542 ; SZ13-NEXT: ldeb %f0, 0(%r1)
543 ; SZ13-NEXT: ldr %f2, %f8
544 ; SZ13-NEXT: brasl %r14, fmod@PLT
545 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
546 ; SZ13-NEXT: vl %v24, 176(%r15) # 16-byte Folded Reload
547 ; SZ13-NEXT: ld %f8, 192(%r15) # 8-byte Folded Reload
548 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
549 ; SZ13-NEXT: vmrhg %v26, %v0, %v1
550 ; SZ13-NEXT: lmg %r14, %r15, 312(%r15)
551 ; SZ13-NEXT: br %r14
552 %rem = call <4 x double> @llvm.experimental.constrained.frem.v4f64(
553 <4 x double>
554 double 3.000000e+00, double 4.000000e+00>,
555 <4 x double>
556 double 1.000000e+01, double 1.000000e+01>,
557 metadata !"round.dynamic",
558 metadata !"fpexcept.strict")
559 ret <4 x double> %rem
560 }
561
562 define <1 x float> @constrained_vector_fmul_v1f32() {
563 ; S390X-LABEL: constrained_vector_fmul_v1f32:
564 ; S390X: # %bb.0: # %entry
565 ; S390X-NEXT: larl %r1, .LCPI10_0
566 ; S390X-NEXT: le %f0, 0(%r1)
567 ; S390X-NEXT: larl %r1, .LCPI10_1
568 ; S390X-NEXT: meeb %f0, 0(%r1)
569 ; S390X-NEXT: br %r14
570 ;
571 ; SZ13-LABEL: constrained_vector_fmul_v1f32:
572 ; SZ13: # %bb.0: # %entry
573 ; SZ13-NEXT: vgmf %v0, 1, 1
574 ; SZ13-NEXT: vgmf %v1, 1, 8
575 ; SZ13-NEXT: meebr %f1, %f0
576 ; SZ13-NEXT: vlr %v24, %v1
577 ; SZ13-NEXT: br %r14
578 entry:
579 %mul = call <1 x float> @llvm.experimental.constrained.fmul.v1f32(
580 <1 x float> ,
581 <1 x float> ,
582 metadata !"round.dynamic",
583 metadata !"fpexcept.strict")
584 ret <1 x float> %mul
585 }
586
587 define <2 x double> @constrained_vector_fmul_v2f64() {
588 ; S390X-LABEL: constrained_vector_fmul_v2f64:
589 ; S390X: # %bb.0: # %entry
590 ; S390X-NEXT: larl %r1, .LCPI11_0
591 ; S390X-NEXT: ldeb %f0, 0(%r1)
592 ; S390X-NEXT: larl %r1, .LCPI11_1
593 ; S390X-NEXT: ld %f1, 0(%r1)
594 ; S390X-NEXT: larl %r1, .LCPI11_2
595 ; S390X-NEXT: ldeb %f2, 0(%r1)
596 ; S390X-NEXT: mdbr %f0, %f1
597 ; S390X-NEXT: mdbr %f2, %f1
598 ; S390X-NEXT: br %r14
599 ;
600 ; SZ13-LABEL: constrained_vector_fmul_v2f64:
601 ; SZ13: # %bb.0: # %entry
602 ; SZ13-NEXT: larl %r1, .LCPI11_0
603 ; SZ13-NEXT: vl %v0, 0(%r1)
604 ; SZ13-NEXT: larl %r1, .LCPI11_1
605 ; SZ13-NEXT: vl %v1, 0(%r1)
606 ; SZ13-NEXT: vfmdb %v24, %v1, %v0
607 ; SZ13-NEXT: br %r14
608 entry:
609 %mul = call <2 x double> @llvm.experimental.constrained.fmul.v2f64(
610 <2 x double> ,
611 <2 x double> ,
612 metadata !"round.dynamic",
613 metadata !"fpexcept.strict")
614 ret <2 x double> %mul
615 }
616
617 define <3 x float> @constrained_vector_fmul_v3f32() {
618 ; S390X-LABEL: constrained_vector_fmul_v3f32:
619 ; S390X: # %bb.0: # %entry
620 ; S390X-NEXT: larl %r1, .LCPI12_0
621 ; S390X-NEXT: le %f4, 0(%r1)
622 ; S390X-NEXT: larl %r1, .LCPI12_1
623 ; S390X-NEXT: ler %f0, %f4
624 ; S390X-NEXT: meeb %f0, 0(%r1)
625 ; S390X-NEXT: larl %r1, .LCPI12_2
626 ; S390X-NEXT: ler %f2, %f4
627 ; S390X-NEXT: meeb %f2, 0(%r1)
628 ; S390X-NEXT: larl %r1, .LCPI12_3
629 ; S390X-NEXT: meeb %f4, 0(%r1)
630 ; S390X-NEXT: br %r14
631 ;
632 ; SZ13-LABEL: constrained_vector_fmul_v3f32:
633 ; SZ13: # %bb.0: # %entry
634 ; SZ13-NEXT: vgmf %v0, 1, 8
635 ; SZ13-NEXT: larl %r1, .LCPI12_0
636 ; SZ13-NEXT: vgmf %v2, 2, 8
637 ; SZ13-NEXT: vgmf %v1, 1, 8
638 ; SZ13-NEXT: meeb %f1, 0(%r1)
639 ; SZ13-NEXT: larl %r1, .LCPI12_1
640 ; SZ13-NEXT: meebr %f2, %f0
641 ; SZ13-NEXT: meeb %f0, 0(%r1)
642 ; SZ13-NEXT: vmrhf %v0, %v2, %v0
643 ; SZ13-NEXT: vrepf %v1, %v1, 0
644 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
645 ; SZ13-NEXT: br %r14
646 entry:
647 %mul = call <3 x float> @llvm.experimental.constrained.fmul.v3f32(
648 <3 x float>
649 float 0x7FF0000000000000>,
650 <3 x float> ,
651 metadata !"round.dynamic",
652 metadata !"fpexcept.strict")
653 ret <3 x float> %mul
654 }
655
656 define void @constrained_vector_fmul_v3f64(<3 x double>* %a) {
657 ; S390X-LABEL: constrained_vector_fmul_v3f64:
658 ; S390X: # %bb.0: # %entry
659 ; S390X-NEXT: larl %r1, .LCPI13_0
660 ; S390X-NEXT: ld %f0, 0(%r1)
661 ; S390X-NEXT: ldr %f1, %f0
662 ; S390X-NEXT: ldr %f2, %f0
663 ; S390X-NEXT: mdb %f0, 16(%r2)
664 ; S390X-NEXT: mdb %f2, 8(%r2)
665 ; S390X-NEXT: mdb %f1, 0(%r2)
666 ; S390X-NEXT: std %f0, 16(%r2)
667 ; S390X-NEXT: std %f2, 8(%r2)
668 ; S390X-NEXT: std %f1, 0(%r2)
669 ; S390X-NEXT: br %r14
670 ;
671 ; SZ13-LABEL: constrained_vector_fmul_v3f64:
672 ; SZ13: # %bb.0: # %entry
673 ; SZ13-NEXT: larl %r1, .LCPI13_0
674 ; SZ13-NEXT: vl %v0, 0(%r2)
675 ; SZ13-NEXT: vl %v1, 0(%r1)
676 ; SZ13-NEXT: larl %r1, .LCPI13_1
677 ; SZ13-NEXT: vfmdb %v0, %v1, %v0
678 ; SZ13-NEXT: ld %f1, 0(%r1)
679 ; SZ13-NEXT: mdb %f1, 16(%r2)
680 ; SZ13-NEXT: std %f1, 16(%r2)
681 ; SZ13-NEXT: vst %v0, 0(%r2)
682 ; SZ13-NEXT: br %r14
683 entry:
684 %b = load <3 x double>, <3 x double>* %a
685 %mul = call <3 x double> @llvm.experimental.constrained.fmul.v3f64(
686 <3 x double>
687 double 0x7FEFFFFFFFFFFFFF>,
688 <3 x double> %b,
689 metadata !"round.dynamic",
690 metadata !"fpexcept.strict")
691 store <3 x double> %mul, <3 x double>* %a
692 ret void
693 }
694
695 define <4 x double> @constrained_vector_fmul_v4f64() {
696 ; S390X-LABEL: constrained_vector_fmul_v4f64:
697 ; S390X: # %bb.0: # %entry
698 ; S390X-NEXT: larl %r1, .LCPI14_0
699 ; S390X-NEXT: ldeb %f0, 0(%r1)
700 ; S390X-NEXT: larl %r1, .LCPI14_1
701 ; S390X-NEXT: ld %f1, 0(%r1)
702 ; S390X-NEXT: larl %r1, .LCPI14_2
703 ; S390X-NEXT: ldeb %f2, 0(%r1)
704 ; S390X-NEXT: larl %r1, .LCPI14_3
705 ; S390X-NEXT: ldeb %f4, 0(%r1)
706 ; S390X-NEXT: larl %r1, .LCPI14_4
707 ; S390X-NEXT: ldeb %f6, 0(%r1)
708 ; S390X-NEXT: mdbr %f0, %f1
709 ; S390X-NEXT: mdbr %f2, %f1
710 ; S390X-NEXT: mdbr %f4, %f1
711 ; S390X-NEXT: mdbr %f6, %f1
712 ; S390X-NEXT: br %r14
713 ;
714 ; SZ13-LABEL: constrained_vector_fmul_v4f64:
715 ; SZ13: # %bb.0: # %entry
716 ; SZ13-NEXT: larl %r1, .LCPI14_0
717 ; SZ13-NEXT: vl %v0, 0(%r1)
718 ; SZ13-NEXT: larl %r1, .LCPI14_1
719 ; SZ13-NEXT: vl %v1, 0(%r1)
720 ; SZ13-NEXT: larl %r1, .LCPI14_2
721 ; SZ13-NEXT: vfmdb %v24, %v1, %v0
722 ; SZ13-NEXT: vl %v0, 0(%r1)
723 ; SZ13-NEXT: vfmdb %v26, %v1, %v0
724 ; SZ13-NEXT: br %r14
725 entry:
726 %mul = call <4 x double> @llvm.experimental.constrained.fmul.v4f64(
727 <4 x double>
728 double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF>,
729 <4 x double>
730 double 4.000000e+00, double 5.000000e+00>,
731 metadata !"round.dynamic",
732 metadata !"fpexcept.strict")
733 ret <4 x double> %mul
734 }
735
736 define <1 x float> @constrained_vector_fadd_v1f32() {
737 ; S390X-LABEL: constrained_vector_fadd_v1f32:
738 ; S390X: # %bb.0: # %entry
739 ; S390X-NEXT: larl %r1, .LCPI15_0
740 ; S390X-NEXT: le %f0, 0(%r1)
741 ; S390X-NEXT: larl %r1, .LCPI15_1
742 ; S390X-NEXT: aeb %f0, 0(%r1)
743 ; S390X-NEXT: br %r14
744 ;
745 ; SZ13-LABEL: constrained_vector_fadd_v1f32:
746 ; SZ13: # %bb.0: # %entry
747 ; SZ13-NEXT: vgmf %v0, 2, 8
748 ; SZ13-NEXT: vgmf %v1, 1, 8
749 ; SZ13-NEXT: aebr %f1, %f0
750 ; SZ13-NEXT: vlr %v24, %v1
751 ; SZ13-NEXT: br %r14
752 entry:
753 %add = call <1 x float> @llvm.experimental.constrained.fadd.v1f32(
754 <1 x float> ,
755 <1 x float> ,
756 metadata !"round.dynamic",
757 metadata !"fpexcept.strict")
758 ret <1 x float> %add
759 }
760
761 define <2 x double> @constrained_vector_fadd_v2f64() {
762 ; S390X-LABEL: constrained_vector_fadd_v2f64:
763 ; S390X: # %bb.0: # %entry
764 ; S390X-NEXT: larl %r1, .LCPI16_0
765 ; S390X-NEXT: ldeb %f0, 0(%r1)
766 ; S390X-NEXT: larl %r1, .LCPI16_1
767 ; S390X-NEXT: ld %f2, 0(%r1)
768 ; S390X-NEXT: adbr %f0, %f2
769 ; S390X-NEXT: larl %r1, .LCPI16_2
770 ; S390X-NEXT: adb %f2, 0(%r1)
771 ; S390X-NEXT: br %r14
772 ;
773 ; SZ13-LABEL: constrained_vector_fadd_v2f64:
774 ; SZ13: # %bb.0: # %entry
775 ; SZ13-NEXT: larl %r1, .LCPI16_0
776 ; SZ13-NEXT: vl %v0, 0(%r1)
777 ; SZ13-NEXT: larl %r1, .LCPI16_1
778 ; SZ13-NEXT: vl %v1, 0(%r1)
779 ; SZ13-NEXT: vfadb %v24, %v1, %v0
780 ; SZ13-NEXT: br %r14
781 entry:
782 %add = call <2 x double> @llvm.experimental.constrained.fadd.v2f64(
783 <2 x double> ,
784 <2 x double> ,
785 metadata !"round.dynamic",
786 metadata !"fpexcept.strict")
787 ret <2 x double> %add
788 }
789
790 define <3 x float> @constrained_vector_fadd_v3f32() {
791 ; S390X-LABEL: constrained_vector_fadd_v3f32:
792 ; S390X: # %bb.0: # %entry
793 ; S390X-NEXT: larl %r1, .LCPI17_0
794 ; S390X-NEXT: le %f1, 0(%r1)
795 ; S390X-NEXT: larl %r1, .LCPI17_1
796 ; S390X-NEXT: ler %f2, %f1
797 ; S390X-NEXT: ler %f0, %f1
798 ; S390X-NEXT: aeb %f0, 0(%r1)
799 ; S390X-NEXT: larl %r1, .LCPI17_2
800 ; S390X-NEXT: aeb %f2, 0(%r1)
801 ; S390X-NEXT: lzer %f4
802 ; S390X-NEXT: aebr %f4, %f1
803 ; S390X-NEXT: br %r14
804 ;
805 ; SZ13-LABEL: constrained_vector_fadd_v3f32:
806 ; SZ13: # %bb.0: # %entry
807 ; SZ13-NEXT: vgbm %v0, 15
808 ; SZ13-NEXT: vgmf %v2, 1, 1
809 ; SZ13-NEXT: vgmf %v3, 2, 8
810 ; SZ13-NEXT: lzer %f1
811 ; SZ13-NEXT: aebr %f1, %f0
812 ; SZ13-NEXT: aebr %f2, %f0
813 ; SZ13-NEXT: aebr %f3, %f0
814 ; SZ13-NEXT: vmrhf %v0, %v2, %v3
815 ; SZ13-NEXT: vrepf %v1, %v1, 0
816 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
817 ; SZ13-NEXT: br %r14
818 entry:
819 %add = call <3 x float> @llvm.experimental.constrained.fadd.v3f32(
820 <3 x float>
821 float 0xFFFFFFFFE0000000>,
822 <3 x float> ,
823 metadata !"round.dynamic",
824 metadata !"fpexcept.strict")
825 ret <3 x float> %add
826 }
827
828 define void @constrained_vector_fadd_v3f64(<3 x double>* %a) {
829 ; S390X-LABEL: constrained_vector_fadd_v3f64:
830 ; S390X: # %bb.0: # %entry
831 ; S390X-NEXT: larl %r1, .LCPI18_0
832 ; S390X-NEXT: ld %f0, 0(%r1)
833 ; S390X-NEXT: ldr %f1, %f0
834 ; S390X-NEXT: ldr %f2, %f0
835 ; S390X-NEXT: adb %f0, 16(%r2)
836 ; S390X-NEXT: adb %f2, 8(%r2)
837 ; S390X-NEXT: adb %f1, 0(%r2)
838 ; S390X-NEXT: std %f0, 16(%r2)
839 ; S390X-NEXT: std %f2, 8(%r2)
840 ; S390X-NEXT: std %f1, 0(%r2)
841 ; S390X-NEXT: br %r14
842 ;
843 ; SZ13-LABEL: constrained_vector_fadd_v3f64:
844 ; SZ13: # %bb.0: # %entry
845 ; SZ13-NEXT: larl %r1, .LCPI18_0
846 ; SZ13-NEXT: vl %v0, 0(%r2)
847 ; SZ13-NEXT: vl %v1, 0(%r1)
848 ; SZ13-NEXT: larl %r1, .LCPI18_1
849 ; SZ13-NEXT: vfadb %v0, %v1, %v0
850 ; SZ13-NEXT: ld %f1, 0(%r1)
851 ; SZ13-NEXT: adb %f1, 16(%r2)
852 ; SZ13-NEXT: std %f1, 16(%r2)
853 ; SZ13-NEXT: vst %v0, 0(%r2)
854 ; SZ13-NEXT: br %r14
855 entry:
856 %b = load <3 x double>, <3 x double>* %a
857 %add = call <3 x double> @llvm.experimental.constrained.fadd.v3f64(
858 <3 x double>
859 double 0x7FEFFFFFFFFFFFFF>,
860 <3 x double> %b,
861 metadata !"round.dynamic",
862 metadata !"fpexcept.strict")
863 store <3 x double> %add, <3 x double>* %a
864 ret void
865 }
866
867 define <4 x double> @constrained_vector_fadd_v4f64() {
868 ; S390X-LABEL: constrained_vector_fadd_v4f64:
869 ; S390X: # %bb.0: # %entry
870 ; S390X-NEXT: larl %r1, .LCPI19_0
871 ; S390X-NEXT: ldeb %f0, 0(%r1)
872 ; S390X-NEXT: larl %r1, .LCPI19_1
873 ; S390X-NEXT: ld %f6, 0(%r1)
874 ; S390X-NEXT: larl %r1, .LCPI19_3
875 ; S390X-NEXT: ldeb %f4, 0(%r1)
876 ; S390X-NEXT: adbr %f0, %f6
877 ; S390X-NEXT: larl %r1, .LCPI19_2
878 ; S390X-NEXT: ldr %f2, %f6
879 ; S390X-NEXT: adb %f2, 0(%r1)
880 ; S390X-NEXT: adbr %f4, %f6
881 ; S390X-NEXT: larl %r1, .LCPI19_4
882 ; S390X-NEXT: adb %f6, 0(%r1)
883 ; S390X-NEXT: br %r14
884 ;
885 ; SZ13-LABEL: constrained_vector_fadd_v4f64:
886 ; SZ13: # %bb.0: # %entry
887 ; SZ13-NEXT: larl %r1, .LCPI19_0
888 ; SZ13-NEXT: vl %v0, 0(%r1)
889 ; SZ13-NEXT: larl %r1, .LCPI19_1
890 ; SZ13-NEXT: vl %v1, 0(%r1)
891 ; SZ13-NEXT: larl %r1, .LCPI19_2
892 ; SZ13-NEXT: vfadb %v24, %v1, %v0
893 ; SZ13-NEXT: vl %v0, 0(%r1)
894 ; SZ13-NEXT: vfadb %v26, %v1, %v0
895 ; SZ13-NEXT: br %r14
896 entry:
897 %add = call <4 x double> @llvm.experimental.constrained.fadd.v4f64(
898 <4 x double>
899 double 0x7FEFFFFFFFFFFFFF, double 0x7FEFFFFFFFFFFFFF>,
900 <4 x double>
901 double 2.000000e+00, double 2.000000e-01>,
902 metadata !"round.dynamic",
903 metadata !"fpexcept.strict")
904 ret <4 x double> %add
905 }
906
907 define <1 x float> @constrained_vector_fsub_v1f32() {
908 ; S390X-LABEL: constrained_vector_fsub_v1f32:
909 ; S390X: # %bb.0: # %entry
910 ; S390X-NEXT: larl %r1, .LCPI20_0
911 ; S390X-NEXT: le %f0, 0(%r1)
912 ; S390X-NEXT: larl %r1, .LCPI20_1
913 ; S390X-NEXT: seb %f0, 0(%r1)
914 ; S390X-NEXT: br %r14
915 ;
916 ; SZ13-LABEL: constrained_vector_fsub_v1f32:
917 ; SZ13: # %bb.0: # %entry
918 ; SZ13-NEXT: vgmf %v0, 2, 8
919 ; SZ13-NEXT: vgmf %v1, 1, 8
920 ; SZ13-NEXT: sebr %f1, %f0
921 ; SZ13-NEXT: vlr %v24, %v1
922 ; SZ13-NEXT: br %r14
923 entry:
924 %sub = call <1 x float> @llvm.experimental.constrained.fsub.v1f32(
925 <1 x float> ,
926 <1 x float> ,
927 metadata !"round.dynamic",
928 metadata !"fpexcept.strict")
929 ret <1 x float> %sub
930 }
931
932 define <2 x double> @constrained_vector_fsub_v2f64() {
933 ; S390X-LABEL: constrained_vector_fsub_v2f64:
934 ; S390X: # %bb.0: # %entry
935 ; S390X-NEXT: larl %r1, .LCPI21_1
936 ; S390X-NEXT: ld %f2, 0(%r1)
937 ; S390X-NEXT: larl %r1, .LCPI21_0
938 ; S390X-NEXT: ldeb %f1, 0(%r1)
939 ; S390X-NEXT: ldr %f0, %f2
940 ; S390X-NEXT: larl %r1, .LCPI21_2
941 ; S390X-NEXT: sdb %f2, 0(%r1)
942 ; S390X-NEXT: sdbr %f0, %f1
943 ; S390X-NEXT: br %r14
944 ;
945 ; SZ13-LABEL: constrained_vector_fsub_v2f64:
946 ; SZ13: # %bb.0: # %entry
947 ; SZ13-NEXT: larl %r1, .LCPI21_0
948 ; SZ13-NEXT: vl %v0, 0(%r1)
949 ; SZ13-NEXT: vgmg %v1, 12, 10
950 ; SZ13-NEXT: vfsdb %v24, %v1, %v0
951 ; SZ13-NEXT: br %r14
952 entry:
953 %sub = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(
954 <2 x double> ,
955 <2 x double> ,
956 metadata !"round.dynamic",
957 metadata !"fpexcept.strict")
958 ret <2 x double> %sub
959 }
960
961 define <3 x float> @constrained_vector_fsub_v3f32() {
962 ; S390X-LABEL: constrained_vector_fsub_v3f32:
963 ; S390X: # %bb.0: # %entry
964 ; S390X-NEXT: larl %r1, .LCPI22_0
965 ; S390X-NEXT: le %f4, 0(%r1)
966 ; S390X-NEXT: larl %r1, .LCPI22_1
967 ; S390X-NEXT: ler %f0, %f4
968 ; S390X-NEXT: seb %f0, 0(%r1)
969 ; S390X-NEXT: larl %r1, .LCPI22_2
970 ; S390X-NEXT: ler %f2, %f4
971 ; S390X-NEXT: seb %f2, 0(%r1)
972 ; S390X-NEXT: lzer %f1
973 ; S390X-NEXT: sebr %f4, %f1
974 ; S390X-NEXT: br %r14
975 ;
976 ; SZ13-LABEL: constrained_vector_fsub_v3f32:
977 ; SZ13: # %bb.0: # %entry
978 ; SZ13-NEXT: vgbm %v2, 15
979 ; SZ13-NEXT: lzer %f1
980 ; SZ13-NEXT: sebr %f2, %f1
981 ; SZ13-NEXT: vgmf %v1, 1, 1
982 ; SZ13-NEXT: vgbm %v3, 15
983 ; SZ13-NEXT: vgbm %v0, 15
984 ; SZ13-NEXT: sebr %f3, %f1
985 ; SZ13-NEXT: vgmf %v1, 2, 8
986 ; SZ13-NEXT: sebr %f0, %f1
987 ; SZ13-NEXT: vmrhf %v0, %v3, %v0
988 ; SZ13-NEXT: vrepf %v1, %v2, 0
989 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
990 ; SZ13-NEXT: br %r14
991 entry:
992 %sub = call <3 x float> @llvm.experimental.constrained.fsub.v3f32(
993 <3 x float>
994 float 0xFFFFFFFFE0000000>,
995 <3 x float> ,
996 metadata !"round.dynamic",
997 metadata !"fpexcept.strict")
998 ret <3 x float> %sub
999 }
1000
1001 define void @constrained_vector_fsub_v3f64(<3 x double>* %a) {
1002 ; S390X-LABEL: constrained_vector_fsub_v3f64:
1003 ; S390X: # %bb.0: # %entry
1004 ; S390X-NEXT: larl %r1, .LCPI23_0
1005 ; S390X-NEXT: ld %f0, 0(%r1)
1006 ; S390X-NEXT: ldr %f1, %f0
1007 ; S390X-NEXT: ldr %f2, %f0
1008 ; S390X-NEXT: sdb %f0, 16(%r2)
1009 ; S390X-NEXT: sdb %f2, 8(%r2)
1010 ; S390X-NEXT: sdb %f1, 0(%r2)
1011 ; S390X-NEXT: std %f0, 16(%r2)
1012 ; S390X-NEXT: std %f2, 8(%r2)
1013 ; S390X-NEXT: std %f1, 0(%r2)
1014 ; S390X-NEXT: br %r14
1015 ;
1016 ; SZ13-LABEL: constrained_vector_fsub_v3f64:
1017 ; SZ13: # %bb.0: # %entry
1018 ; SZ13-NEXT: vl %v0, 0(%r2)
1019 ; SZ13-NEXT: vgmg %v1, 12, 10
1020 ; SZ13-NEXT: vfsdb %v0, %v1, %v0
1021 ; SZ13-NEXT: sdb %f1, 16(%r2)
1022 ; SZ13-NEXT: std %f1, 16(%r2)
1023 ; SZ13-NEXT: vst %v0, 0(%r2)
1024 ; SZ13-NEXT: br %r14
1025 entry:
1026 %b = load <3 x double>, <3 x double>* %a
1027 %sub = call <3 x double> @llvm.experimental.constrained.fsub.v3f64(
1028 <3 x double>
1029 double 0xFFEFFFFFFFFFFFFF>,
1030 <3 x double> %b,
1031 metadata !"round.dynamic",
1032 metadata !"fpexcept.strict")
1033 store <3 x double> %sub, <3 x double>* %a
1034 ret void
1035 }
1036
1037 define <4 x double> @constrained_vector_fsub_v4f64() {
1038 ; S390X-LABEL: constrained_vector_fsub_v4f64:
1039 ; S390X: # %bb.0: # %entry
1040 ; S390X-NEXT: larl %r1, .LCPI24_1
1041 ; S390X-NEXT: ld %f6, 0(%r1)
1042 ; S390X-NEXT: larl %r1, .LCPI24_0
1043 ; S390X-NEXT: ldeb %f1, 0(%r1)
1044 ; S390X-NEXT: ldr %f0, %f6
1045 ; S390X-NEXT: larl %r1, .LCPI24_2
1046 ; S390X-NEXT: ldr %f2, %f6
1047 ; S390X-NEXT: sdb %f2, 0(%r1)
1048 ; S390X-NEXT: larl %r1, .LCPI24_3
1049 ; S390X-NEXT: ldeb %f3, 0(%r1)
1050 ; S390X-NEXT: ldr %f4, %f6
1051 ; S390X-NEXT: larl %r1, .LCPI24_4
1052 ; S390X-NEXT: sdb %f6, 0(%r1)
1053 ; S390X-NEXT: sdbr %f0, %f1
1054 ; S390X-NEXT: sdbr %f4, %f3
1055 ; S390X-NEXT: br %r14
1056 ;
1057 ; SZ13-LABEL: constrained_vector_fsub_v4f64:
1058 ; SZ13: # %bb.0: # %entry
1059 ; SZ13-NEXT: larl %r1, .LCPI24_0
1060 ; SZ13-NEXT: vl %v0, 0(%r1)
1061 ; SZ13-NEXT: vgmg %v1, 12, 10
1062 ; SZ13-NEXT: larl %r1, .LCPI24_1
1063 ; SZ13-NEXT: vfsdb %v24, %v1, %v0
1064 ; SZ13-NEXT: vl %v0, 0(%r1)
1065 ; SZ13-NEXT: vfsdb %v26, %v1, %v0
1066 ; SZ13-NEXT: br %r14
1067 entry:
1068 %sub = call <4 x double> @llvm.experimental.constrained.fsub.v4f64(
1069 <4 x double>
1070 double 0xFFEFFFFFFFFFFFFF, double 0xFFEFFFFFFFFFFFFF>,
1071 <4 x double>
1072 double 2.000000e+00, double 2.000000e-01>,
1073 metadata !"round.dynamic",
1074 metadata !"fpexcept.strict")
1075 ret <4 x double> %sub
1076 }
1077
1078 define <1 x float> @constrained_vector_sqrt_v1f32() {
1079 ; S390X-LABEL: constrained_vector_sqrt_v1f32:
1080 ; S390X: # %bb.0: # %entry
1081 ; S390X-NEXT: larl %r1, .LCPI25_0
1082 ; S390X-NEXT: sqeb %f0, 0(%r1)
1083 ; S390X-NEXT: br %r14
1084 ;
1085 ; SZ13-LABEL: constrained_vector_sqrt_v1f32:
1086 ; SZ13: # %bb.0: # %entry
1087 ; SZ13-NEXT: larl %r1, .LCPI25_0
1088 ; SZ13-NEXT: sqeb %f0, 0(%r1)
1089 ; SZ13-NEXT: vlr %v24, %v0
1090 ; SZ13-NEXT: br %r14
1091 entry:
1092 %sqrt = call <1 x float> @llvm.experimental.constrained.sqrt.v1f32(
1093 <1 x float> ,
1094 metadata !"round.dynamic",
1095 metadata !"fpexcept.strict")
1096 ret <1 x float> %sqrt
1097 }
1098
1099 define <2 x double> @constrained_vector_sqrt_v2f64() {
1100 ; S390X-LABEL: constrained_vector_sqrt_v2f64:
1101 ; S390X: # %bb.0: # %entry
1102 ; S390X-NEXT: larl %r1, .LCPI26_0
1103 ; S390X-NEXT: larl %r2, .LCPI26_1
1104 ; S390X-NEXT: ldeb %f0, 0(%r2)
1105 ; S390X-NEXT: sqdb %f2, 0(%r1)
1106 ; S390X-NEXT: sqdbr %f0, %f0
1107 ; S390X-NEXT: br %r14
1108 ;
1109 ; SZ13-LABEL: constrained_vector_sqrt_v2f64:
1110 ; SZ13: # %bb.0: # %entry
1111 ; SZ13-NEXT: larl %r1, .LCPI26_0
1112 ; SZ13-NEXT: vl %v0, 0(%r1)
1113 ; SZ13-NEXT: vfsqdb %v24, %v0
1114 ; SZ13-NEXT: br %r14
1115 entry:
1116 %sqrt = call <2 x double> @llvm.experimental.constrained.sqrt.v2f64(
1117 <2 x double> ,
1118 metadata !"round.dynamic",
1119 metadata !"fpexcept.strict")
1120 ret <2 x double> %sqrt
1121 }
1122
1123 define <3 x float> @constrained_vector_sqrt_v3f32() {
1124 ; S390X-LABEL: constrained_vector_sqrt_v3f32:
1125 ; S390X: # %bb.0: # %entry
1126 ; S390X-NEXT: larl %r1, .LCPI27_0
1127 ; S390X-NEXT: sqeb %f0, 0(%r1)
1128 ; S390X-NEXT: larl %r1, .LCPI27_1
1129 ; S390X-NEXT: sqeb %f2, 0(%r1)
1130 ; S390X-NEXT: larl %r1, .LCPI27_2
1131 ; S390X-NEXT: sqeb %f4, 0(%r1)
1132 ; S390X-NEXT: br %r14
1133 ;
1134 ; SZ13-LABEL: constrained_vector_sqrt_v3f32:
1135 ; SZ13: # %bb.0: # %entry
1136 ; SZ13-NEXT: larl %r1, .LCPI27_0
1137 ; SZ13-NEXT: sqeb %f0, 0(%r1)
1138 ; SZ13-NEXT: larl %r1, .LCPI27_1
1139 ; SZ13-NEXT: vrepf %v0, %v0, 0
1140 ; SZ13-NEXT: sqeb %f1, 0(%r1)
1141 ; SZ13-NEXT: larl %r1, .LCPI27_2
1142 ; SZ13-NEXT: sqeb %f2, 0(%r1)
1143 ; SZ13-NEXT: vmrhf %v1, %v1, %v2
1144 ; SZ13-NEXT: vmrhg %v24, %v1, %v0
1145 ; SZ13-NEXT: br %r14
1146 entry:
1147 %sqrt = call <3 x float> @llvm.experimental.constrained.sqrt.v3f32(
1148 <3 x float> ,
1149 metadata !"round.dynamic",
1150 metadata !"fpexcept.strict")
1151 ret <3 x float> %sqrt
1152 }
1153
1154 define void @constrained_vector_sqrt_v3f64(<3 x double>* %a) {
1155 ; S390X-LABEL: constrained_vector_sqrt_v3f64:
1156 ; S390X: # %bb.0: # %entry
1157 ; S390X-NEXT: sqdb %f0, 16(%r2)
1158 ; S390X-NEXT: sqdb %f1, 8(%r2)
1159 ; S390X-NEXT: sqdb %f2, 0(%r2)
1160 ; S390X-NEXT: std %f0, 16(%r2)
1161 ; S390X-NEXT: std %f1, 8(%r2)
1162 ; S390X-NEXT: std %f2, 0(%r2)
1163 ; S390X-NEXT: br %r14
1164 ;
1165 ; SZ13-LABEL: constrained_vector_sqrt_v3f64:
1166 ; SZ13: # %bb.0: # %entry
1167 ; SZ13-NEXT: sqdb %f1, 16(%r2)
1168 ; SZ13-NEXT: vl %v0, 0(%r2)
1169 ; SZ13-NEXT: std %f1, 16(%r2)
1170 ; SZ13-NEXT: vfsqdb %v0, %v0
1171 ; SZ13-NEXT: vst %v0, 0(%r2)
1172 ; SZ13-NEXT: br %r14
1173 entry:
1174 %b = load <3 x double>, <3 x double>* %a
1175 %sqrt = call <3 x double> @llvm.experimental.constrained.sqrt.v3f64(
1176 <3 x double> %b,
1177 metadata !"round.dynamic",
1178 metadata !"fpexcept.strict")
1179 store <3 x double> %sqrt, <3 x double>* %a
1180 ret void
1181 }
1182
1183 define <4 x double> @constrained_vector_sqrt_v4f64() {
1184 ; S390X-LABEL: constrained_vector_sqrt_v4f64:
1185 ; S390X: # %bb.0: # %entry
1186 ; S390X-NEXT: larl %r1, .LCPI29_0
1187 ; S390X-NEXT: sqdb %f2, 0(%r1)
1188 ; S390X-NEXT: larl %r1, .LCPI29_1
1189 ; S390X-NEXT: sqdb %f4, 0(%r1)
1190 ; S390X-NEXT: larl %r1, .LCPI29_3
1191 ; S390X-NEXT: ldeb %f0, 0(%r1)
1192 ; S390X-NEXT: larl %r1, .LCPI29_2
1193 ; S390X-NEXT: sqdb %f6, 0(%r1)
1194 ; S390X-NEXT: sqdbr %f0, %f0
1195 ; S390X-NEXT: br %r14
1196 ;
1197 ; SZ13-LABEL: constrained_vector_sqrt_v4f64:
1198 ; SZ13: # %bb.0: # %entry
1199 ; SZ13-NEXT: larl %r1, .LCPI29_0
1200 ; SZ13-NEXT: vl %v0, 0(%r1)
1201 ; SZ13-NEXT: vfsqdb %v24, %v0
1202 ; SZ13-NEXT: larl %r1, .LCPI29_1
1203 ; SZ13-NEXT: vl %v0, 0(%r1)
1204 ; SZ13-NEXT: vfsqdb %v26, %v0
1205 ; SZ13-NEXT: br %r14
1206 entry:
1207 %sqrt = call <4 x double> @llvm.experimental.constrained.sqrt.v4f64(
1208 <4 x double>
1209 double 42.2, double 42.3>,
1210 metadata !"round.dynamic",
1211 metadata !"fpexcept.strict")
1212 ret <4 x double> %sqrt
1213 }
1214
1215 define <1 x float> @constrained_vector_pow_v1f32() {
1216 ; S390X-LABEL: constrained_vector_pow_v1f32:
1217 ; S390X: # %bb.0: # %entry
1218 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1219 ; S390X-NEXT: .cfi_offset %r14, -48
1220 ; S390X-NEXT: .cfi_offset %r15, -40
1221 ; S390X-NEXT: aghi %r15, -160
1222 ; S390X-NEXT: .cfi_def_cfa_offset 320
1223 ; S390X-NEXT: larl %r1, .LCPI30_0
1224 ; S390X-NEXT: le %f0, 0(%r1)
1225 ; S390X-NEXT: larl %r1, .LCPI30_1
1226 ; S390X-NEXT: le %f2, 0(%r1)
1227 ; S390X-NEXT: brasl %r14, powf@PLT
1228 ; S390X-NEXT: lmg %r14, %r15, 272(%r15)
1229 ; S390X-NEXT: br %r14
1230 ;
1231 ; SZ13-LABEL: constrained_vector_pow_v1f32:
1232 ; SZ13: # %bb.0: # %entry
1233 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
1234 ; SZ13-NEXT: .cfi_offset %r14, -48
1235 ; SZ13-NEXT: .cfi_offset %r15, -40
1236 ; SZ13-NEXT: aghi %r15, -160
1237 ; SZ13-NEXT: .cfi_def_cfa_offset 320
1238 ; SZ13-NEXT: larl %r1, .LCPI30_0
1239 ; SZ13-NEXT: lde %f0, 0(%r1)
1240 ; SZ13-NEXT: larl %r1, .LCPI30_1
1241 ; SZ13-NEXT: lde %f2, 0(%r1)
1242 ; SZ13-NEXT: brasl %r14, powf@PLT
1243 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
1244 ; SZ13-NEXT: vlr %v24, %v0
1245 ; SZ13-NEXT: lmg %r14, %r15, 272(%r15)
1246 ; SZ13-NEXT: br %r14
1247 entry:
1248 %pow = call <1 x float> @llvm.experimental.constrained.pow.v1f32(
1249 <1 x float> ,
1250 <1 x float> ,
1251 metadata !"round.dynamic",
1252 metadata !"fpexcept.strict")
1253 ret <1 x float> %pow
1254 }
1255
1256 define <2 x double> @constrained_vector_pow_v2f64() {
1257 ; S390X-LABEL: constrained_vector_pow_v2f64:
1258 ; S390X: # %bb.0: # %entry
1259 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1260 ; S390X-NEXT: .cfi_offset %r14, -48
1261 ; S390X-NEXT: .cfi_offset %r15, -40
1262 ; S390X-NEXT: aghi %r15, -176
1263 ; S390X-NEXT: .cfi_def_cfa_offset 336
1264 ; S390X-NEXT: std %f8, 168(%r15) # 8-byte Folded Spill
1265 ; S390X-NEXT: std %f9, 160(%r15) # 8-byte Folded Spill
1266 ; S390X-NEXT: .cfi_offset %f8, -168
1267 ; S390X-NEXT: .cfi_offset %f9, -176
1268 ; S390X-NEXT: larl %r1, .LCPI31_0
1269 ; S390X-NEXT: ld %f0, 0(%r1)
1270 ; S390X-NEXT: larl %r1, .LCPI31_1
1271 ; S390X-NEXT: ldeb %f8, 0(%r1)
1272 ; S390X-NEXT: ldr %f2, %f8
1273 ; S390X-NEXT: brasl %r14, pow@PLT
1274 ; S390X-NEXT: larl %r1, .LCPI31_2
1275 ; S390X-NEXT: ld %f1, 0(%r1)
1276 ; S390X-NEXT: ldr %f9, %f0
1277 ; S390X-NEXT: ldr %f0, %f1
1278 ; S390X-NEXT: ldr %f2, %f8
1279 ; S390X-NEXT: brasl %r14, pow@PLT
1280 ; S390X-NEXT: ldr %f2, %f0
1281 ; S390X-NEXT: ldr %f0, %f9
1282 ; S390X-NEXT: ld %f8, 168(%r15) # 8-byte Folded Reload
1283 ; S390X-NEXT: ld %f9, 160(%r15) # 8-byte Folded Reload
1284 ; S390X-NEXT: lmg %r14, %r15, 288(%r15)
1285 ; S390X-NEXT: br %r14
1286 ;
1287 ; SZ13-LABEL: constrained_vector_pow_v2f64:
1288 ; SZ13: # %bb.0: # %entry
1289 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
1290 ; SZ13-NEXT: .cfi_offset %r14, -48
1291 ; SZ13-NEXT: .cfi_offset %r15, -40
1292 ; SZ13-NEXT: aghi %r15, -184
1293 ; SZ13-NEXT: .cfi_def_cfa_offset 344
1294 ; SZ13-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
1295 ; SZ13-NEXT: .cfi_offset %f8, -168
1296 ; SZ13-NEXT: larl %r1, .LCPI31_0
1297 ; SZ13-NEXT: ld %f0, 0(%r1)
1298 ; SZ13-NEXT: larl %r1, .LCPI31_1
1299 ; SZ13-NEXT: ldeb %f8, 0(%r1)
1300 ; SZ13-NEXT: ldr %f2, %f8
1301 ; SZ13-NEXT: brasl %r14, pow@PLT
1302 ; SZ13-NEXT: larl %r1, .LCPI31_2
1303 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1304 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
1305 ; SZ13-NEXT: ld %f0, 0(%r1)
1306 ; SZ13-NEXT: ldr %f2, %f8
1307 ; SZ13-NEXT: brasl %r14, pow@PLT
1308 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
1309 ; SZ13-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
1310 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1311 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
1312 ; SZ13-NEXT: lmg %r14, %r15, 296(%r15)
1313 ; SZ13-NEXT: br %r14
1314 entry:
1315 %pow = call <2 x double> @llvm.experimental.constrained.pow.v2f64(
1316 <2 x double> ,
1317 <2 x double> ,
1318 metadata !"round.dynamic",
1319 metadata !"fpexcept.strict")
1320 ret <2 x double> %pow
1321 }
1322
1323 define <3 x float> @constrained_vector_pow_v3f32() {
1324 ; S390X-LABEL: constrained_vector_pow_v3f32:
1325 ; S390X: # %bb.0: # %entry
1326 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1327 ; S390X-NEXT: .cfi_offset %r14, -48
1328 ; S390X-NEXT: .cfi_offset %r15, -40
1329 ; S390X-NEXT: aghi %r15, -184
1330 ; S390X-NEXT: .cfi_def_cfa_offset 344
1331 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
1332 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
1333 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
1334 ; S390X-NEXT: .cfi_offset %f8, -168
1335 ; S390X-NEXT: .cfi_offset %f9, -176
1336 ; S390X-NEXT: .cfi_offset %f10, -184
1337 ; S390X-NEXT: larl %r1, .LCPI32_0
1338 ; S390X-NEXT: le %f0, 0(%r1)
1339 ; S390X-NEXT: larl %r1, .LCPI32_1
1340 ; S390X-NEXT: le %f8, 0(%r1)
1341 ; S390X-NEXT: ler %f2, %f8
1342 ; S390X-NEXT: brasl %r14, powf@PLT
1343 ; S390X-NEXT: larl %r1, .LCPI32_2
1344 ; S390X-NEXT: le %f1, 0(%r1)
1345 ; S390X-NEXT: ler %f9, %f0
1346 ; S390X-NEXT: ler %f0, %f1
1347 ; S390X-NEXT: ler %f2, %f8
1348 ; S390X-NEXT: brasl %r14, powf@PLT
1349 ; S390X-NEXT: larl %r1, .LCPI32_3
1350 ; S390X-NEXT: le %f1, 0(%r1)
1351 ; S390X-NEXT: ler %f10, %f0
1352 ; S390X-NEXT: ler %f0, %f1
1353 ; S390X-NEXT: ler %f2, %f8
1354 ; S390X-NEXT: brasl %r14, powf@PLT
1355 ; S390X-NEXT: ler %f4, %f0
1356 ; S390X-NEXT: ler %f0, %f9
1357 ; S390X-NEXT: ler %f2, %f10
1358 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
1359 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
1360 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
1361 ; S390X-NEXT: lmg %r14, %r15, 296(%r15)
1362 ; S390X-NEXT: br %r14
1363 ;
1364 ; SZ13-LABEL: constrained_vector_pow_v3f32:
1365 ; SZ13: # %bb.0: # %entry
1366 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
1367 ; SZ13-NEXT: .cfi_offset %r14, -48
1368 ; SZ13-NEXT: .cfi_offset %r15, -40
1369 ; SZ13-NEXT: aghi %r15, -200
1370 ; SZ13-NEXT: .cfi_def_cfa_offset 360
1371 ; SZ13-NEXT: std %f8, 192(%r15) # 8-byte Folded Spill
1372 ; SZ13-NEXT: .cfi_offset %f8, -168
1373 ; SZ13-NEXT: larl %r1, .LCPI32_0
1374 ; SZ13-NEXT: lde %f0, 0(%r1)
1375 ; SZ13-NEXT: larl %r1, .LCPI32_1
1376 ; SZ13-NEXT: lde %f8, 0(%r1)
1377 ; SZ13-NEXT: ldr %f2, %f8
1378 ; SZ13-NEXT: brasl %r14, powf@PLT
1379 ; SZ13-NEXT: larl %r1, .LCPI32_2
1380 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
1381 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
1382 ; SZ13-NEXT: lde %f0, 0(%r1)
1383 ; SZ13-NEXT: ldr %f2, %f8
1384 ; SZ13-NEXT: brasl %r14, powf@PLT
1385 ; SZ13-NEXT: larl %r1, .LCPI32_3
1386 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
1387 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
1388 ; SZ13-NEXT: lde %f0, 0(%r1)
1389 ; SZ13-NEXT: ldr %f2, %f8
1390 ; SZ13-NEXT: brasl %r14, powf@PLT
1391 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
1392 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
1393 ; SZ13-NEXT: vmrhf %v0, %v1, %v0
1394 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
1395 ; SZ13-NEXT: ld %f8, 192(%r15) # 8-byte Folded Reload
1396 ; SZ13-NEXT: vrepf %v1, %v1, 0
1397 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
1398 ; SZ13-NEXT: lmg %r14, %r15, 312(%r15)
1399 ; SZ13-NEXT: br %r14
1400 entry:
1401 %pow = call <3 x float> @llvm.experimental.constrained.pow.v3f32(
1402 <3 x float> ,
1403 <3 x float> ,
1404 metadata !"round.dynamic",
1405 metadata !"fpexcept.strict")
1406 ret <3 x float> %pow
1407 }
1408
1409 define void @constrained_vector_pow_v3f64(<3 x double>* %a) {
1410 ; S390X-LABEL: constrained_vector_pow_v3f64:
1411 ; S390X: # %bb.0: # %entry
1412 ; S390X-NEXT: stmg %r13, %r15, 104(%r15)
1413 ; S390X-NEXT: .cfi_offset %r13, -56
1414 ; S390X-NEXT: .cfi_offset %r14, -48
1415 ; S390X-NEXT: .cfi_offset %r15, -40
1416 ; S390X-NEXT: aghi %r15, -192
1417 ; S390X-NEXT: .cfi_def_cfa_offset 352
1418 ; S390X-NEXT: std %f8, 184(%r15) # 8-byte Folded Spill
1419 ; S390X-NEXT: std %f9, 176(%r15) # 8-byte Folded Spill
1420 ; S390X-NEXT: std %f10, 168(%r15) # 8-byte Folded Spill
1421 ; S390X-NEXT: std %f11, 160(%r15) # 8-byte Folded Spill
1422 ; S390X-NEXT: .cfi_offset %f8, -168
1423 ; S390X-NEXT: .cfi_offset %f9, -176
1424 ; S390X-NEXT: .cfi_offset %f10, -184
1425 ; S390X-NEXT: .cfi_offset %f11, -192
1426 ; S390X-NEXT: lgr %r13, %r2
1427 ; S390X-NEXT: ld %f8, 16(%r2)
1428 ; S390X-NEXT: ld %f0, 0(%r2)
1429 ; S390X-NEXT: larl %r1, .LCPI33_0
1430 ; S390X-NEXT: ldeb %f9, 0(%r1)
1431 ; S390X-NEXT: ld %f10, 8(%r2)
1432 ; S390X-NEXT: ldr %f2, %f9
1433 ; S390X-NEXT: brasl %r14, pow@PLT
1434 ; S390X-NEXT: ldr %f11, %f0
1435 ; S390X-NEXT: ldr %f0, %f10
1436 ; S390X-NEXT: ldr %f2, %f9
1437 ; S390X-NEXT: brasl %r14, pow@PLT
1438 ; S390X-NEXT: ldr %f10, %f0
1439 ; S390X-NEXT: ldr %f0, %f8
1440 ; S390X-NEXT: ldr %f2, %f9
1441 ; S390X-NEXT: brasl %r14, pow@PLT
1442 ; S390X-NEXT: std %f0, 16(%r13)
1443 ; S390X-NEXT: std %f10, 8(%r13)
1444 ; S390X-NEXT: std %f11, 0(%r13)
1445 ; S390X-NEXT: ld %f8, 184(%r15) # 8-byte Folded Reload
1446 ; S390X-NEXT: ld %f9, 176(%r15) # 8-byte Folded Reload
1447 ; S390X-NEXT: ld %f10, 168(%r15) # 8-byte Folded Reload
1448 ; S390X-NEXT: ld %f11, 160(%r15) # 8-byte Folded Reload
1449 ; S390X-NEXT: lmg %r13, %r15, 296(%r15)
1450 ; S390X-NEXT: br %r14
1451 ;
1452 ; SZ13-LABEL: constrained_vector_pow_v3f64:
1453 ; SZ13: # %bb.0: # %entry
1454 ; SZ13-NEXT: stmg %r13, %r15, 104(%r15)
1455 ; SZ13-NEXT: .cfi_offset %r13, -56
1456 ; SZ13-NEXT: .cfi_offset %r14, -48
1457 ; SZ13-NEXT: .cfi_offset %r15, -40
1458 ; SZ13-NEXT: aghi %r15, -208
1459 ; SZ13-NEXT: .cfi_def_cfa_offset 368
1460 ; SZ13-NEXT: std %f8, 200(%r15) # 8-byte Folded Spill
1461 ; SZ13-NEXT: std %f9, 192(%r15) # 8-byte Folded Spill
1462 ; SZ13-NEXT: .cfi_offset %f8, -168
1463 ; SZ13-NEXT: .cfi_offset %f9, -176
1464 ; SZ13-NEXT: larl %r1, .LCPI33_0
1465 ; SZ13-NEXT: ldeb %f9, 0(%r1)
1466 ; SZ13-NEXT: vl %v0, 0(%r2)
1467 ; SZ13-NEXT: ld %f8, 16(%r2)
1468 ; SZ13-NEXT: ldr %f2, %f9
1469 ; SZ13-NEXT: lgr %r13, %r2
1470 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
1471 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
1472 ; SZ13-NEXT: brasl %r14, pow@PLT
1473 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1474 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
1475 ; SZ13-NEXT: vl %v0, 160(%r15) # 16-byte Folded Reload
1476 ; SZ13-NEXT: ldr %f2, %f9
1477 ; SZ13-NEXT: vrepg %v0, %v0, 1
1478 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
1479 ; SZ13-NEXT: brasl %r14, pow@PLT
1480 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
1481 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1482 ; SZ13-NEXT: vmrhg %v0, %v1, %v0
1483 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
1484 ; SZ13-NEXT: ldr %f0, %f8
1485 ; SZ13-NEXT: ldr %f2, %f9
1486 ; SZ13-NEXT: brasl %r14, pow@PLT
1487 ; SZ13-NEXT: std %f0, 16(%r13)
1488 ; SZ13-NEXT: vl %v0, 176(%r15) # 16-byte Folded Reload
1489 ; SZ13-NEXT: ld %f8, 200(%r15) # 8-byte Folded Reload
1490 ; SZ13-NEXT: ld %f9, 192(%r15) # 8-byte Folded Reload
1491 ; SZ13-NEXT: vst %v0, 0(%r13)
1492 ; SZ13-NEXT: lmg %r13, %r15, 312(%r15)
1493 ; SZ13-NEXT: br %r14
1494 entry:
1495 %b = load <3 x double>, <3 x double>* %a
1496 %pow = call <3 x double> @llvm.experimental.constrained.pow.v3f64(
1497 <3 x double> %b,
1498 <3 x double> ,
1499 metadata !"round.dynamic",
1500 metadata !"fpexcept.strict")
1501 store <3 x double> %pow, <3 x double>* %a
1502 ret void
1503 }
1504
1505 define <4 x double> @constrained_vector_pow_v4f64() {
1506 ; S390X-LABEL: constrained_vector_pow_v4f64:
1507 ; S390X: # %bb.0: # %entry
1508 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1509 ; S390X-NEXT: .cfi_offset %r14, -48
1510 ; S390X-NEXT: .cfi_offset %r15, -40
1511 ; S390X-NEXT: aghi %r15, -192
1512 ; S390X-NEXT: .cfi_def_cfa_offset 352
1513 ; S390X-NEXT: std %f8, 184(%r15) # 8-byte Folded Spill
1514 ; S390X-NEXT: std %f9, 176(%r15) # 8-byte Folded Spill
1515 ; S390X-NEXT: std %f10, 168(%r15) # 8-byte Folded Spill
1516 ; S390X-NEXT: std %f11, 160(%r15) # 8-byte Folded Spill
1517 ; S390X-NEXT: .cfi_offset %f8, -168
1518 ; S390X-NEXT: .cfi_offset %f9, -176
1519 ; S390X-NEXT: .cfi_offset %f10, -184
1520 ; S390X-NEXT: .cfi_offset %f11, -192
1521 ; S390X-NEXT: larl %r1, .LCPI34_0
1522 ; S390X-NEXT: ld %f0, 0(%r1)
1523 ; S390X-NEXT: larl %r1, .LCPI34_1
1524 ; S390X-NEXT: ldeb %f8, 0(%r1)
1525 ; S390X-NEXT: ldr %f2, %f8
1526 ; S390X-NEXT: brasl %r14, pow@PLT
1527 ; S390X-NEXT: larl %r1, .LCPI34_2
1528 ; S390X-NEXT: ld %f1, 0(%r1)
1529 ; S390X-NEXT: ldr %f9, %f0
1530 ; S390X-NEXT: ldr %f0, %f1
1531 ; S390X-NEXT: ldr %f2, %f8
1532 ; S390X-NEXT: brasl %r14, pow@PLT
1533 ; S390X-NEXT: larl %r1, .LCPI34_3
1534 ; S390X-NEXT: ld %f1, 0(%r1)
1535 ; S390X-NEXT: ldr %f10, %f0
1536 ; S390X-NEXT: ldr %f0, %f1
1537 ; S390X-NEXT: ldr %f2, %f8
1538 ; S390X-NEXT: brasl %r14, pow@PLT
1539 ; S390X-NEXT: larl %r1, .LCPI34_4
1540 ; S390X-NEXT: ld %f1, 0(%r1)
1541 ; S390X-NEXT: ldr %f11, %f0
1542 ; S390X-NEXT: ldr %f0, %f1
1543 ; S390X-NEXT: ldr %f2, %f8
1544 ; S390X-NEXT: brasl %r14, pow@PLT
1545 ; S390X-NEXT: ldr %f6, %f0
1546 ; S390X-NEXT: ldr %f0, %f9
1547 ; S390X-NEXT: ldr %f2, %f10
1548 ; S390X-NEXT: ldr %f4, %f11
1549 ; S390X-NEXT: ld %f8, 184(%r15) # 8-byte Folded Reload
1550 ; S390X-NEXT: ld %f9, 176(%r15) # 8-byte Folded Reload
1551 ; S390X-NEXT: ld %f10, 168(%r15) # 8-byte Folded Reload
1552 ; S390X-NEXT: ld %f11, 160(%r15) # 8-byte Folded Reload
1553 ; S390X-NEXT: lmg %r14, %r15, 304(%r15)
1554 ; S390X-NEXT: br %r14
1555 ;
1556 ; SZ13-LABEL: constrained_vector_pow_v4f64:
1557 ; SZ13: # %bb.0: # %entry
1558 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
1559 ; SZ13-NEXT: .cfi_offset %r14, -48
1560 ; SZ13-NEXT: .cfi_offset %r15, -40
1561 ; SZ13-NEXT: aghi %r15, -200
1562 ; SZ13-NEXT: .cfi_def_cfa_offset 360
1563 ; SZ13-NEXT: std %f8, 192(%r15) # 8-byte Folded Spill
1564 ; SZ13-NEXT: .cfi_offset %f8, -168
1565 ; SZ13-NEXT: larl %r1, .LCPI34_0
1566 ; SZ13-NEXT: ld %f0, 0(%r1)
1567 ; SZ13-NEXT: larl %r1, .LCPI34_1
1568 ; SZ13-NEXT: ldeb %f8, 0(%r1)
1569 ; SZ13-NEXT: ldr %f2, %f8
1570 ; SZ13-NEXT: brasl %r14, pow@PLT
1571 ; SZ13-NEXT: larl %r1, .LCPI34_2
1572 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1573 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
1574 ; SZ13-NEXT: ld %f0, 0(%r1)
1575 ; SZ13-NEXT: ldr %f2, %f8
1576 ; SZ13-NEXT: brasl %r14, pow@PLT
1577 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
1578 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1579 ; SZ13-NEXT: vmrhg %v0, %v0, %v1
1580 ; SZ13-NEXT: larl %r1, .LCPI34_3
1581 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
1582 ; SZ13-NEXT: ld %f0, 0(%r1)
1583 ; SZ13-NEXT: ldr %f2, %f8
1584 ; SZ13-NEXT: brasl %r14, pow@PLT
1585 ; SZ13-NEXT: larl %r1, .LCPI34_4
1586 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1587 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
1588 ; SZ13-NEXT: ld %f0, 0(%r1)
1589 ; SZ13-NEXT: ldr %f2, %f8
1590 ; SZ13-NEXT: brasl %r14, pow@PLT
1591 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
1592 ; SZ13-NEXT: vl %v24, 176(%r15) # 16-byte Folded Reload
1593 ; SZ13-NEXT: ld %f8, 192(%r15) # 8-byte Folded Reload
1594 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1595 ; SZ13-NEXT: vmrhg %v26, %v0, %v1
1596 ; SZ13-NEXT: lmg %r14, %r15, 312(%r15)
1597 ; SZ13-NEXT: br %r14
1598 entry:
1599 %pow = call <4 x double> @llvm.experimental.constrained.pow.v4f64(
1600 <4 x double>
1601 double 42.3, double 42.4>,
1602 <4 x double>
1603 double 3.0, double 3.0>,
1604 metadata !"round.dynamic",
1605 metadata !"fpexcept.strict")
1606 ret <4 x double> %pow
1607 }
1608
1609 define <1 x float> @constrained_vector_powi_v1f32() {
1610 ; S390X-LABEL: constrained_vector_powi_v1f32:
1611 ; S390X: # %bb.0: # %entry
1612 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1613 ; S390X-NEXT: .cfi_offset %r14, -48
1614 ; S390X-NEXT: .cfi_offset %r15, -40
1615 ; S390X-NEXT: aghi %r15, -160
1616 ; S390X-NEXT: .cfi_def_cfa_offset 320
1617 ; S390X-NEXT: larl %r1, .LCPI35_0
1618 ; S390X-NEXT: le %f0, 0(%r1)
1619 ; S390X-NEXT: lghi %r2, 3
1620 ; S390X-NEXT: brasl %r14, __powisf2@PLT
1621 ; S390X-NEXT: lmg %r14, %r15, 272(%r15)
1622 ; S390X-NEXT: br %r14
1623 ;
1624 ; SZ13-LABEL: constrained_vector_powi_v1f32:
1625 ; SZ13: # %bb.0: # %entry
1626 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
1627 ; SZ13-NEXT: .cfi_offset %r14, -48
1628 ; SZ13-NEXT: .cfi_offset %r15, -40
1629 ; SZ13-NEXT: aghi %r15, -160
1630 ; SZ13-NEXT: .cfi_def_cfa_offset 320
1631 ; SZ13-NEXT: larl %r1, .LCPI35_0
1632 ; SZ13-NEXT: lde %f0, 0(%r1)
1633 ; SZ13-NEXT: lghi %r2, 3
1634 ; SZ13-NEXT: brasl %r14, __powisf2@PLT
1635 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
1636 ; SZ13-NEXT: vlr %v24, %v0
1637 ; SZ13-NEXT: lmg %r14, %r15, 272(%r15)
1638 ; SZ13-NEXT: br %r14
1639 entry:
1640 %powi = call <1 x float> @llvm.experimental.constrained.powi.v1f32(
1641 <1 x float> ,
1642 i32 3,
1643 metadata !"round.dynamic",
1644 metadata !"fpexcept.strict")
1645 ret <1 x float> %powi
1646 }
1647
1648 define <2 x double> @constrained_vector_powi_v2f64() {
1649 ; S390X-LABEL: constrained_vector_powi_v2f64:
1650 ; S390X: # %bb.0: # %entry
1651 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1652 ; S390X-NEXT: .cfi_offset %r14, -48
1653 ; S390X-NEXT: .cfi_offset %r15, -40
1654 ; S390X-NEXT: aghi %r15, -168
1655 ; S390X-NEXT: .cfi_def_cfa_offset 328
1656 ; S390X-NEXT: std %f8, 160(%r15) # 8-byte Folded Spill
1657 ; S390X-NEXT: .cfi_offset %f8, -168
1658 ; S390X-NEXT: larl %r1, .LCPI36_0
1659 ; S390X-NEXT: ld %f0, 0(%r1)
1660 ; S390X-NEXT: lghi %r2, 3
1661 ; S390X-NEXT: brasl %r14, __powidf2@PLT
1662 ; S390X-NEXT: larl %r1, .LCPI36_1
1663 ; S390X-NEXT: ld %f1, 0(%r1)
1664 ; S390X-NEXT: ldr %f8, %f0
1665 ; S390X-NEXT: lghi %r2, 3
1666 ; S390X-NEXT: ldr %f0, %f1
1667 ; S390X-NEXT: brasl %r14, __powidf2@PLT
1668 ; S390X-NEXT: ldr %f2, %f0
1669 ; S390X-NEXT: ldr %f0, %f8
1670 ; S390X-NEXT: ld %f8, 160(%r15) # 8-byte Folded Reload
1671 ; S390X-NEXT: lmg %r14, %r15, 280(%r15)
1672 ; S390X-NEXT: br %r14
1673 ;
1674 ; SZ13-LABEL: constrained_vector_powi_v2f64:
1675 ; SZ13: # %bb.0: # %entry
1676 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
1677 ; SZ13-NEXT: .cfi_offset %r14, -48
1678 ; SZ13-NEXT: .cfi_offset %r15, -40
1679 ; SZ13-NEXT: aghi %r15, -176
1680 ; SZ13-NEXT: .cfi_def_cfa_offset 336
1681 ; SZ13-NEXT: larl %r1, .LCPI36_0
1682 ; SZ13-NEXT: ld %f0, 0(%r1)
1683 ; SZ13-NEXT: lghi %r2, 3
1684 ; SZ13-NEXT: brasl %r14, __powidf2@PLT
1685 ; SZ13-NEXT: larl %r1, .LCPI36_1
1686 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1687 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
1688 ; SZ13-NEXT: ld %f0, 0(%r1)
1689 ; SZ13-NEXT: lghi %r2, 3
1690 ; SZ13-NEXT: brasl %r14, __powidf2@PLT
1691 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
1692 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1693 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
1694 ; SZ13-NEXT: lmg %r14, %r15, 288(%r15)
1695 ; SZ13-NEXT: br %r14
1696 entry:
1697 %powi = call <2 x double> @llvm.experimental.constrained.powi.v2f64(
1698 <2 x double> ,
1699 i32 3,
1700 metadata !"round.dynamic",
1701 metadata !"fpexcept.strict")
1702 ret <2 x double> %powi
1703 }
1704
1705 define <3 x float> @constrained_vector_powi_v3f32() {
1706 ; S390X-LABEL: constrained_vector_powi_v3f32:
1707 ; S390X: # %bb.0: # %entry
1708 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1709 ; S390X-NEXT: .cfi_offset %r14, -48
1710 ; S390X-NEXT: .cfi_offset %r15, -40
1711 ; S390X-NEXT: aghi %r15, -176
1712 ; S390X-NEXT: .cfi_def_cfa_offset 336
1713 ; S390X-NEXT: std %f8, 168(%r15) # 8-byte Folded Spill
1714 ; S390X-NEXT: std %f9, 160(%r15) # 8-byte Folded Spill
1715 ; S390X-NEXT: .cfi_offset %f8, -168
1716 ; S390X-NEXT: .cfi_offset %f9, -176
1717 ; S390X-NEXT: larl %r1, .LCPI37_0
1718 ; S390X-NEXT: le %f0, 0(%r1)
1719 ; S390X-NEXT: lghi %r2, 3
1720 ; S390X-NEXT: brasl %r14, __powisf2@PLT
1721 ; S390X-NEXT: larl %r1, .LCPI37_1
1722 ; S390X-NEXT: le %f1, 0(%r1)
1723 ; S390X-NEXT: ler %f8, %f0
1724 ; S390X-NEXT: lghi %r2, 3
1725 ; S390X-NEXT: ler %f0, %f1
1726 ; S390X-NEXT: brasl %r14, __powisf2@PLT
1727 ; S390X-NEXT: larl %r1, .LCPI37_2
1728 ; S390X-NEXT: le %f1, 0(%r1)
1729 ; S390X-NEXT: ler %f9, %f0
1730 ; S390X-NEXT: lghi %r2, 3
1731 ; S390X-NEXT: ler %f0, %f1
1732 ; S390X-NEXT: brasl %r14, __powisf2@PLT
1733 ; S390X-NEXT: ler %f4, %f0
1734 ; S390X-NEXT: ler %f0, %f8
1735 ; S390X-NEXT: ler %f2, %f9
1736 ; S390X-NEXT: ld %f8, 168(%r15) # 8-byte Folded Reload
1737 ; S390X-NEXT: ld %f9, 160(%r15) # 8-byte Folded Reload
1738 ; S390X-NEXT: lmg %r14, %r15, 288(%r15)
1739 ; S390X-NEXT: br %r14
1740 ;
1741 ; SZ13-LABEL: constrained_vector_powi_v3f32:
1742 ; SZ13: # %bb.0: # %entry
1743 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
1744 ; SZ13-NEXT: .cfi_offset %r14, -48
1745 ; SZ13-NEXT: .cfi_offset %r15, -40
1746 ; SZ13-NEXT: aghi %r15, -192
1747 ; SZ13-NEXT: .cfi_def_cfa_offset 352
1748 ; SZ13-NEXT: larl %r1, .LCPI37_0
1749 ; SZ13-NEXT: lde %f0, 0(%r1)
1750 ; SZ13-NEXT: lghi %r2, 3
1751 ; SZ13-NEXT: brasl %r14, __powisf2@PLT
1752 ; SZ13-NEXT: larl %r1, .LCPI37_1
1753 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
1754 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
1755 ; SZ13-NEXT: lde %f0, 0(%r1)
1756 ; SZ13-NEXT: lghi %r2, 3
1757 ; SZ13-NEXT: brasl %r14, __powisf2@PLT
1758 ; SZ13-NEXT: larl %r1, .LCPI37_2
1759 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
1760 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
1761 ; SZ13-NEXT: lde %f0, 0(%r1)
1762 ; SZ13-NEXT: lghi %r2, 3
1763 ; SZ13-NEXT: brasl %r14, __powisf2@PLT
1764 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
1765 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
1766 ; SZ13-NEXT: vmrhf %v0, %v1, %v0
1767 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
1768 ; SZ13-NEXT: vrepf %v1, %v1, 0
1769 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
1770 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
1771 ; SZ13-NEXT: br %r14
1772 entry:
1773 %powi = call <3 x float> @llvm.experimental.constrained.powi.v3f32(
1774 <3 x float> ,
1775 i32 3,
1776 metadata !"round.dynamic",
1777 metadata !"fpexcept.strict")
1778 ret <3 x float> %powi
1779 }
1780
1781 define void @constrained_vector_powi_v3f64(<3 x double>* %a) {
1782 ; S390X-LABEL: constrained_vector_powi_v3f64:
1783 ; S390X: # %bb.0: # %entry
1784 ; S390X-NEXT: stmg %r13, %r15, 104(%r15)
1785 ; S390X-NEXT: .cfi_offset %r13, -56
1786 ; S390X-NEXT: .cfi_offset %r14, -48
1787 ; S390X-NEXT: .cfi_offset %r15, -40
1788 ; S390X-NEXT: aghi %r15, -176
1789 ; S390X-NEXT: .cfi_def_cfa_offset 336
1790 ; S390X-NEXT: std %f8, 168(%r15) # 8-byte Folded Spill
1791 ; S390X-NEXT: std %f9, 160(%r15) # 8-byte Folded Spill
1792 ; S390X-NEXT: .cfi_offset %f8, -168
1793 ; S390X-NEXT: .cfi_offset %f9, -176
1794 ; S390X-NEXT: larl %r1, .LCPI38_0
1795 ; S390X-NEXT: ld %f0, 0(%r1)
1796 ; S390X-NEXT: lgr %r13, %r2
1797 ; S390X-NEXT: lghi %r2, 3
1798 ; S390X-NEXT: brasl %r14, __powidf2@PLT
1799 ; S390X-NEXT: larl %r1, .LCPI38_1
1800 ; S390X-NEXT: ldeb %f1, 0(%r1)
1801 ; S390X-NEXT: ldr %f8, %f0
1802 ; S390X-NEXT: lghi %r2, 3
1803 ; S390X-NEXT: ldr %f0, %f1
1804 ; S390X-NEXT: brasl %r14, __powidf2@PLT
1805 ; S390X-NEXT: larl %r1, .LCPI38_2
1806 ; S390X-NEXT: ld %f1, 0(%r1)
1807 ; S390X-NEXT: ldr %f9, %f0
1808 ; S390X-NEXT: lghi %r2, 3
1809 ; S390X-NEXT: ldr %f0, %f1
1810 ; S390X-NEXT: brasl %r14, __powidf2@PLT
1811 ; S390X-NEXT: std %f0, 8(%r13)
1812 ; S390X-NEXT: std %f9, 0(%r13)
1813 ; S390X-NEXT: std %f8, 16(%r13)
1814 ; S390X-NEXT: ld %f8, 168(%r15) # 8-byte Folded Reload
1815 ; S390X-NEXT: ld %f9, 160(%r15) # 8-byte Folded Reload
1816 ; S390X-NEXT: lmg %r13, %r15, 280(%r15)
1817 ; S390X-NEXT: br %r14
1818 ;
1819 ; SZ13-LABEL: constrained_vector_powi_v3f64:
1820 ; SZ13: # %bb.0: # %entry
1821 ; SZ13-NEXT: stmg %r13, %r15, 104(%r15)
1822 ; SZ13-NEXT: .cfi_offset %r13, -56
1823 ; SZ13-NEXT: .cfi_offset %r14, -48
1824 ; SZ13-NEXT: .cfi_offset %r15, -40
1825 ; SZ13-NEXT: aghi %r15, -176
1826 ; SZ13-NEXT: .cfi_def_cfa_offset 336
1827 ; SZ13-NEXT: larl %r1, .LCPI38_0
1828 ; SZ13-NEXT: ld %f0, 0(%r1)
1829 ; SZ13-NEXT: lgr %r13, %r2
1830 ; SZ13-NEXT: lghi %r2, 3
1831 ; SZ13-NEXT: brasl %r14, __powidf2@PLT
1832 ; SZ13-NEXT: larl %r1, .LCPI38_1
1833 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1834 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
1835 ; SZ13-NEXT: ldeb %f0, 0(%r1)
1836 ; SZ13-NEXT: lghi %r2, 3
1837 ; SZ13-NEXT: brasl %r14, __powidf2@PLT
1838 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
1839 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1840 ; SZ13-NEXT: vmrhg %v0, %v0, %v1
1841 ; SZ13-NEXT: larl %r1, .LCPI38_2
1842 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
1843 ; SZ13-NEXT: ld %f0, 0(%r1)
1844 ; SZ13-NEXT: lghi %r2, 3
1845 ; SZ13-NEXT: brasl %r14, __powidf2@PLT
1846 ; SZ13-NEXT: std %f0, 16(%r13)
1847 ; SZ13-NEXT: vl %v0, 160(%r15) # 16-byte Folded Reload
1848 ; SZ13-NEXT: vst %v0, 0(%r13)
1849 ; SZ13-NEXT: lmg %r13, %r15, 280(%r15)
1850 ; SZ13-NEXT: br %r14
1851 entry:
1852 %b = load <3 x double>, <3 x double>* %a
1853 %powi = call <3 x double> @llvm.experimental.constrained.powi.v3f64(
1854 <3 x double> ,
1855 i32 3,
1856 metadata !"round.dynamic",
1857 metadata !"fpexcept.strict")
1858 store <3 x double> %powi, <3 x double>* %a
1859 ret void
1860 }
1861
1862 define <4 x double> @constrained_vector_powi_v4f64() {
1863 ; S390X-LABEL: constrained_vector_powi_v4f64:
1864 ; S390X: # %bb.0: # %entry
1865 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1866 ; S390X-NEXT: .cfi_offset %r14, -48
1867 ; S390X-NEXT: .cfi_offset %r15, -40
1868 ; S390X-NEXT: aghi %r15, -184
1869 ; S390X-NEXT: .cfi_def_cfa_offset 344
1870 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
1871 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
1872 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
1873 ; S390X-NEXT: .cfi_offset %f8, -168
1874 ; S390X-NEXT: .cfi_offset %f9, -176
1875 ; S390X-NEXT: .cfi_offset %f10, -184
1876 ; S390X-NEXT: larl %r1, .LCPI39_0
1877 ; S390X-NEXT: ld %f0, 0(%r1)
1878 ; S390X-NEXT: lghi %r2, 3
1879 ; S390X-NEXT: brasl %r14, __powidf2@PLT
1880 ; S390X-NEXT: larl %r1, .LCPI39_1
1881 ; S390X-NEXT: ld %f1, 0(%r1)
1882 ; S390X-NEXT: ldr %f8, %f0
1883 ; S390X-NEXT: lghi %r2, 3
1884 ; S390X-NEXT: ldr %f0, %f1
1885 ; S390X-NEXT: brasl %r14, __powidf2@PLT
1886 ; S390X-NEXT: larl %r1, .LCPI39_2
1887 ; S390X-NEXT: ld %f1, 0(%r1)
1888 ; S390X-NEXT: ldr %f9, %f0
1889 ; S390X-NEXT: lghi %r2, 3
1890 ; S390X-NEXT: ldr %f0, %f1
1891 ; S390X-NEXT: brasl %r14, __powidf2@PLT
1892 ; S390X-NEXT: larl %r1, .LCPI39_3
1893 ; S390X-NEXT: ld %f1, 0(%r1)
1894 ; S390X-NEXT: ldr %f10, %f0
1895 ; S390X-NEXT: lghi %r2, 3
1896 ; S390X-NEXT: ldr %f0, %f1
1897 ; S390X-NEXT: brasl %r14, __powidf2@PLT
1898 ; S390X-NEXT: ldr %f6, %f0
1899 ; S390X-NEXT: ldr %f0, %f8
1900 ; S390X-NEXT: ldr %f2, %f9
1901 ; S390X-NEXT: ldr %f4, %f10
1902 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
1903 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
1904 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
1905 ; S390X-NEXT: lmg %r14, %r15, 296(%r15)
1906 ; S390X-NEXT: br %r14
1907 ;
1908 ; SZ13-LABEL: constrained_vector_powi_v4f64:
1909 ; SZ13: # %bb.0: # %entry
1910 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
1911 ; SZ13-NEXT: .cfi_offset %r14, -48
1912 ; SZ13-NEXT: .cfi_offset %r15, -40
1913 ; SZ13-NEXT: aghi %r15, -192
1914 ; SZ13-NEXT: .cfi_def_cfa_offset 352
1915 ; SZ13-NEXT: larl %r1, .LCPI39_0
1916 ; SZ13-NEXT: ld %f0, 0(%r1)
1917 ; SZ13-NEXT: lghi %r2, 3
1918 ; SZ13-NEXT: brasl %r14, __powidf2@PLT
1919 ; SZ13-NEXT: larl %r1, .LCPI39_1
1920 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1921 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
1922 ; SZ13-NEXT: ld %f0, 0(%r1)
1923 ; SZ13-NEXT: lghi %r2, 3
1924 ; SZ13-NEXT: brasl %r14, __powidf2@PLT
1925 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
1926 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1927 ; SZ13-NEXT: vmrhg %v0, %v0, %v1
1928 ; SZ13-NEXT: larl %r1, .LCPI39_2
1929 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
1930 ; SZ13-NEXT: ld %f0, 0(%r1)
1931 ; SZ13-NEXT: lghi %r2, 3
1932 ; SZ13-NEXT: brasl %r14, __powidf2@PLT
1933 ; SZ13-NEXT: larl %r1, .LCPI39_3
1934 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1935 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
1936 ; SZ13-NEXT: ld %f0, 0(%r1)
1937 ; SZ13-NEXT: lghi %r2, 3
1938 ; SZ13-NEXT: brasl %r14, __powidf2@PLT
1939 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
1940 ; SZ13-NEXT: vl %v24, 176(%r15) # 16-byte Folded Reload
1941 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
1942 ; SZ13-NEXT: vmrhg %v26, %v0, %v1
1943 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
1944 ; SZ13-NEXT: br %r14
1945 entry:
1946 %powi = call <4 x double> @llvm.experimental.constrained.powi.v4f64(
1947 <4 x double>
1948 double 42.3, double 42.4>,
1949 i32 3,
1950 metadata !"round.dynamic",
1951 metadata !"fpexcept.strict")
1952 ret <4 x double> %powi
1953 }
1954
1955 define <1 x float> @constrained_vector_sin_v1f32() {
1956 ; S390X-LABEL: constrained_vector_sin_v1f32:
1957 ; S390X: # %bb.0: # %entry
1958 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1959 ; S390X-NEXT: .cfi_offset %r14, -48
1960 ; S390X-NEXT: .cfi_offset %r15, -40
1961 ; S390X-NEXT: aghi %r15, -160
1962 ; S390X-NEXT: .cfi_def_cfa_offset 320
1963 ; S390X-NEXT: larl %r1, .LCPI40_0
1964 ; S390X-NEXT: le %f0, 0(%r1)
1965 ; S390X-NEXT: brasl %r14, sinf@PLT
1966 ; S390X-NEXT: lmg %r14, %r15, 272(%r15)
1967 ; S390X-NEXT: br %r14
1968 ;
1969 ; SZ13-LABEL: constrained_vector_sin_v1f32:
1970 ; SZ13: # %bb.0: # %entry
1971 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
1972 ; SZ13-NEXT: .cfi_offset %r14, -48
1973 ; SZ13-NEXT: .cfi_offset %r15, -40
1974 ; SZ13-NEXT: aghi %r15, -160
1975 ; SZ13-NEXT: .cfi_def_cfa_offset 320
1976 ; SZ13-NEXT: larl %r1, .LCPI40_0
1977 ; SZ13-NEXT: lde %f0, 0(%r1)
1978 ; SZ13-NEXT: brasl %r14, sinf@PLT
1979 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
1980 ; SZ13-NEXT: vlr %v24, %v0
1981 ; SZ13-NEXT: lmg %r14, %r15, 272(%r15)
1982 ; SZ13-NEXT: br %r14
1983 entry:
1984 %sin = call <1 x float> @llvm.experimental.constrained.sin.v1f32(
1985 <1 x float> ,
1986 metadata !"round.dynamic",
1987 metadata !"fpexcept.strict")
1988 ret <1 x float> %sin
1989 }
1990
1991 define <2 x double> @constrained_vector_sin_v2f64() {
1992 ; S390X-LABEL: constrained_vector_sin_v2f64:
1993 ; S390X: # %bb.0: # %entry
1994 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
1995 ; S390X-NEXT: .cfi_offset %r14, -48
1996 ; S390X-NEXT: .cfi_offset %r15, -40
1997 ; S390X-NEXT: aghi %r15, -168
1998 ; S390X-NEXT: .cfi_def_cfa_offset 328
1999 ; S390X-NEXT: std %f8, 160(%r15) # 8-byte Folded Spill
2000 ; S390X-NEXT: .cfi_offset %f8, -168
2001 ; S390X-NEXT: larl %r1, .LCPI41_0
2002 ; S390X-NEXT: ldeb %f0, 0(%r1)
2003 ; S390X-NEXT: brasl %r14, sin@PLT
2004 ; S390X-NEXT: larl %r1, .LCPI41_1
2005 ; S390X-NEXT: ld %f1, 0(%r1)
2006 ; S390X-NEXT: ldr %f8, %f0
2007 ; S390X-NEXT: ldr %f0, %f1
2008 ; S390X-NEXT: brasl %r14, sin@PLT
2009 ; S390X-NEXT: ldr %f2, %f0
2010 ; S390X-NEXT: ldr %f0, %f8
2011 ; S390X-NEXT: ld %f8, 160(%r15) # 8-byte Folded Reload
2012 ; S390X-NEXT: lmg %r14, %r15, 280(%r15)
2013 ; S390X-NEXT: br %r14
2014 ;
2015 ; SZ13-LABEL: constrained_vector_sin_v2f64:
2016 ; SZ13: # %bb.0: # %entry
2017 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2018 ; SZ13-NEXT: .cfi_offset %r14, -48
2019 ; SZ13-NEXT: .cfi_offset %r15, -40
2020 ; SZ13-NEXT: aghi %r15, -176
2021 ; SZ13-NEXT: .cfi_def_cfa_offset 336
2022 ; SZ13-NEXT: larl %r1, .LCPI41_0
2023 ; SZ13-NEXT: ld %f0, 0(%r1)
2024 ; SZ13-NEXT: brasl %r14, sin@PLT
2025 ; SZ13-NEXT: larl %r1, .LCPI41_1
2026 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2027 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2028 ; SZ13-NEXT: ldeb %f0, 0(%r1)
2029 ; SZ13-NEXT: brasl %r14, sin@PLT
2030 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2031 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2032 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
2033 ; SZ13-NEXT: lmg %r14, %r15, 288(%r15)
2034 ; SZ13-NEXT: br %r14
2035 entry:
2036 %sin = call <2 x double> @llvm.experimental.constrained.sin.v2f64(
2037 <2 x double> ,
2038 metadata !"round.dynamic",
2039 metadata !"fpexcept.strict")
2040 ret <2 x double> %sin
2041 }
2042
2043 define <3 x float> @constrained_vector_sin_v3f32() {
2044 ; S390X-LABEL: constrained_vector_sin_v3f32:
2045 ; S390X: # %bb.0: # %entry
2046 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2047 ; S390X-NEXT: .cfi_offset %r14, -48
2048 ; S390X-NEXT: .cfi_offset %r15, -40
2049 ; S390X-NEXT: aghi %r15, -176
2050 ; S390X-NEXT: .cfi_def_cfa_offset 336
2051 ; S390X-NEXT: std %f8, 168(%r15) # 8-byte Folded Spill
2052 ; S390X-NEXT: std %f9, 160(%r15) # 8-byte Folded Spill
2053 ; S390X-NEXT: .cfi_offset %f8, -168
2054 ; S390X-NEXT: .cfi_offset %f9, -176
2055 ; S390X-NEXT: larl %r1, .LCPI42_0
2056 ; S390X-NEXT: le %f0, 0(%r1)
2057 ; S390X-NEXT: brasl %r14, sinf@PLT
2058 ; S390X-NEXT: larl %r1, .LCPI42_1
2059 ; S390X-NEXT: le %f1, 0(%r1)
2060 ; S390X-NEXT: ler %f8, %f0
2061 ; S390X-NEXT: ler %f0, %f1
2062 ; S390X-NEXT: brasl %r14, sinf@PLT
2063 ; S390X-NEXT: larl %r1, .LCPI42_2
2064 ; S390X-NEXT: le %f1, 0(%r1)
2065 ; S390X-NEXT: ler %f9, %f0
2066 ; S390X-NEXT: ler %f0, %f1
2067 ; S390X-NEXT: brasl %r14, sinf@PLT
2068 ; S390X-NEXT: ler %f4, %f0
2069 ; S390X-NEXT: ler %f0, %f8
2070 ; S390X-NEXT: ler %f2, %f9
2071 ; S390X-NEXT: ld %f8, 168(%r15) # 8-byte Folded Reload
2072 ; S390X-NEXT: ld %f9, 160(%r15) # 8-byte Folded Reload
2073 ; S390X-NEXT: lmg %r14, %r15, 288(%r15)
2074 ; S390X-NEXT: br %r14
2075 ;
2076 ; SZ13-LABEL: constrained_vector_sin_v3f32:
2077 ; SZ13: # %bb.0: # %entry
2078 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2079 ; SZ13-NEXT: .cfi_offset %r14, -48
2080 ; SZ13-NEXT: .cfi_offset %r15, -40
2081 ; SZ13-NEXT: aghi %r15, -192
2082 ; SZ13-NEXT: .cfi_def_cfa_offset 352
2083 ; SZ13-NEXT: larl %r1, .LCPI42_0
2084 ; SZ13-NEXT: lde %f0, 0(%r1)
2085 ; SZ13-NEXT: brasl %r14, sinf@PLT
2086 ; SZ13-NEXT: larl %r1, .LCPI42_1
2087 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2088 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2089 ; SZ13-NEXT: lde %f0, 0(%r1)
2090 ; SZ13-NEXT: brasl %r14, sinf@PLT
2091 ; SZ13-NEXT: larl %r1, .LCPI42_2
2092 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2093 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2094 ; SZ13-NEXT: lde %f0, 0(%r1)
2095 ; SZ13-NEXT: brasl %r14, sinf@PLT
2096 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2097 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2098 ; SZ13-NEXT: vmrhf %v0, %v1, %v0
2099 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
2100 ; SZ13-NEXT: vrepf %v1, %v1, 0
2101 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
2102 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
2103 ; SZ13-NEXT: br %r14
2104 entry:
2105 %sin = call <3 x float> @llvm.experimental.constrained.sin.v3f32(
2106 <3 x float> ,
2107 metadata !"round.dynamic",
2108 metadata !"fpexcept.strict")
2109 ret <3 x float> %sin
2110 }
2111
2112 define void @constrained_vector_sin_v3f64(<3 x double>* %a) {
2113 ; S390X-LABEL: constrained_vector_sin_v3f64:
2114 ; S390X: # %bb.0: # %entry
2115 ; S390X-NEXT: stmg %r13, %r15, 104(%r15)
2116 ; S390X-NEXT: .cfi_offset %r13, -56
2117 ; S390X-NEXT: .cfi_offset %r14, -48
2118 ; S390X-NEXT: .cfi_offset %r15, -40
2119 ; S390X-NEXT: aghi %r15, -184
2120 ; S390X-NEXT: .cfi_def_cfa_offset 344
2121 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
2122 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
2123 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
2124 ; S390X-NEXT: .cfi_offset %f8, -168
2125 ; S390X-NEXT: .cfi_offset %f9, -176
2126 ; S390X-NEXT: .cfi_offset %f10, -184
2127 ; S390X-NEXT: lgr %r13, %r2
2128 ; S390X-NEXT: ld %f8, 16(%r2)
2129 ; S390X-NEXT: ld %f0, 0(%r2)
2130 ; S390X-NEXT: ld %f9, 8(%r2)
2131 ; S390X-NEXT: brasl %r14, sin@PLT
2132 ; S390X-NEXT: ldr %f10, %f0
2133 ; S390X-NEXT: ldr %f0, %f9
2134 ; S390X-NEXT: brasl %r14, sin@PLT
2135 ; S390X-NEXT: ldr %f9, %f0
2136 ; S390X-NEXT: ldr %f0, %f8
2137 ; S390X-NEXT: brasl %r14, sin@PLT
2138 ; S390X-NEXT: std %f0, 16(%r13)
2139 ; S390X-NEXT: std %f9, 8(%r13)
2140 ; S390X-NEXT: std %f10, 0(%r13)
2141 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
2142 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
2143 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
2144 ; S390X-NEXT: lmg %r13, %r15, 288(%r15)
2145 ; S390X-NEXT: br %r14
2146 ;
2147 ; SZ13-LABEL: constrained_vector_sin_v3f64:
2148 ; SZ13: # %bb.0: # %entry
2149 ; SZ13-NEXT: stmg %r13, %r15, 104(%r15)
2150 ; SZ13-NEXT: .cfi_offset %r13, -56
2151 ; SZ13-NEXT: .cfi_offset %r14, -48
2152 ; SZ13-NEXT: .cfi_offset %r15, -40
2153 ; SZ13-NEXT: aghi %r15, -200
2154 ; SZ13-NEXT: .cfi_def_cfa_offset 360
2155 ; SZ13-NEXT: std %f8, 192(%r15) # 8-byte Folded Spill
2156 ; SZ13-NEXT: .cfi_offset %f8, -168
2157 ; SZ13-NEXT: vl %v0, 0(%r2)
2158 ; SZ13-NEXT: ld %f8, 16(%r2)
2159 ; SZ13-NEXT: lgr %r13, %r2
2160 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2161 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
2162 ; SZ13-NEXT: brasl %r14, sin@PLT
2163 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2164 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2165 ; SZ13-NEXT: vl %v0, 160(%r15) # 16-byte Folded Reload
2166 ; SZ13-NEXT: vrepg %v0, %v0, 1
2167 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
2168 ; SZ13-NEXT: brasl %r14, sin@PLT
2169 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
2170 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2171 ; SZ13-NEXT: vmrhg %v0, %v1, %v0
2172 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2173 ; SZ13-NEXT: ldr %f0, %f8
2174 ; SZ13-NEXT: brasl %r14, sin@PLT
2175 ; SZ13-NEXT: std %f0, 16(%r13)
2176 ; SZ13-NEXT: vl %v0, 176(%r15) # 16-byte Folded Reload
2177 ; SZ13-NEXT: ld %f8, 192(%r15) # 8-byte Folded Reload
2178 ; SZ13-NEXT: vst %v0, 0(%r13)
2179 ; SZ13-NEXT: lmg %r13, %r15, 304(%r15)
2180 ; SZ13-NEXT: br %r14
2181 entry:
2182 %b = load <3 x double>, <3 x double>* %a
2183 %sin = call <3 x double> @llvm.experimental.constrained.sin.v3f64(
2184 <3 x double> %b,
2185 metadata !"round.dynamic",
2186 metadata !"fpexcept.strict")
2187 store <3 x double> %sin, <3 x double>* %a
2188 ret void
2189 }
2190
2191 define <4 x double> @constrained_vector_sin_v4f64() {
2192 ; S390X-LABEL: constrained_vector_sin_v4f64:
2193 ; S390X: # %bb.0: # %entry
2194 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2195 ; S390X-NEXT: .cfi_offset %r14, -48
2196 ; S390X-NEXT: .cfi_offset %r15, -40
2197 ; S390X-NEXT: aghi %r15, -184
2198 ; S390X-NEXT: .cfi_def_cfa_offset 344
2199 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
2200 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
2201 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
2202 ; S390X-NEXT: .cfi_offset %f8, -168
2203 ; S390X-NEXT: .cfi_offset %f9, -176
2204 ; S390X-NEXT: .cfi_offset %f10, -184
2205 ; S390X-NEXT: larl %r1, .LCPI44_0
2206 ; S390X-NEXT: ldeb %f0, 0(%r1)
2207 ; S390X-NEXT: brasl %r14, sin@PLT
2208 ; S390X-NEXT: larl %r1, .LCPI44_1
2209 ; S390X-NEXT: ld %f1, 0(%r1)
2210 ; S390X-NEXT: ldr %f8, %f0
2211 ; S390X-NEXT: ldr %f0, %f1
2212 ; S390X-NEXT: brasl %r14, sin@PLT
2213 ; S390X-NEXT: larl %r1, .LCPI44_2
2214 ; S390X-NEXT: ld %f1, 0(%r1)
2215 ; S390X-NEXT: ldr %f9, %f0
2216 ; S390X-NEXT: ldr %f0, %f1
2217 ; S390X-NEXT: brasl %r14, sin@PLT
2218 ; S390X-NEXT: larl %r1, .LCPI44_3
2219 ; S390X-NEXT: ld %f1, 0(%r1)
2220 ; S390X-NEXT: ldr %f10, %f0
2221 ; S390X-NEXT: ldr %f0, %f1
2222 ; S390X-NEXT: brasl %r14, sin@PLT
2223 ; S390X-NEXT: ldr %f6, %f0
2224 ; S390X-NEXT: ldr %f0, %f8
2225 ; S390X-NEXT: ldr %f2, %f9
2226 ; S390X-NEXT: ldr %f4, %f10
2227 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
2228 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
2229 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
2230 ; S390X-NEXT: lmg %r14, %r15, 296(%r15)
2231 ; S390X-NEXT: br %r14
2232 ;
2233 ; SZ13-LABEL: constrained_vector_sin_v4f64:
2234 ; SZ13: # %bb.0: # %entry
2235 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2236 ; SZ13-NEXT: .cfi_offset %r14, -48
2237 ; SZ13-NEXT: .cfi_offset %r15, -40
2238 ; SZ13-NEXT: aghi %r15, -192
2239 ; SZ13-NEXT: .cfi_def_cfa_offset 352
2240 ; SZ13-NEXT: larl %r1, .LCPI44_0
2241 ; SZ13-NEXT: ld %f0, 0(%r1)
2242 ; SZ13-NEXT: brasl %r14, sin@PLT
2243 ; SZ13-NEXT: larl %r1, .LCPI44_1
2244 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2245 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2246 ; SZ13-NEXT: ldeb %f0, 0(%r1)
2247 ; SZ13-NEXT: brasl %r14, sin@PLT
2248 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
2249 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2250 ; SZ13-NEXT: vmrhg %v0, %v0, %v1
2251 ; SZ13-NEXT: larl %r1, .LCPI44_2
2252 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2253 ; SZ13-NEXT: ld %f0, 0(%r1)
2254 ; SZ13-NEXT: brasl %r14, sin@PLT
2255 ; SZ13-NEXT: larl %r1, .LCPI44_3
2256 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2257 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2258 ; SZ13-NEXT: ld %f0, 0(%r1)
2259 ; SZ13-NEXT: brasl %r14, sin@PLT
2260 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2261 ; SZ13-NEXT: vl %v24, 176(%r15) # 16-byte Folded Reload
2262 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2263 ; SZ13-NEXT: vmrhg %v26, %v0, %v1
2264 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
2265 ; SZ13-NEXT: br %r14
2266 entry:
2267 %sin = call <4 x double> @llvm.experimental.constrained.sin.v4f64(
2268 <4 x double>
2269 double 42.2, double 42.3>,
2270 metadata !"round.dynamic",
2271 metadata !"fpexcept.strict")
2272 ret <4 x double> %sin
2273 }
2274
2275 define <1 x float> @constrained_vector_cos_v1f32() {
2276 ; S390X-LABEL: constrained_vector_cos_v1f32:
2277 ; S390X: # %bb.0: # %entry
2278 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2279 ; S390X-NEXT: .cfi_offset %r14, -48
2280 ; S390X-NEXT: .cfi_offset %r15, -40
2281 ; S390X-NEXT: aghi %r15, -160
2282 ; S390X-NEXT: .cfi_def_cfa_offset 320
2283 ; S390X-NEXT: larl %r1, .LCPI45_0
2284 ; S390X-NEXT: le %f0, 0(%r1)
2285 ; S390X-NEXT: brasl %r14, cosf@PLT
2286 ; S390X-NEXT: lmg %r14, %r15, 272(%r15)
2287 ; S390X-NEXT: br %r14
2288 ;
2289 ; SZ13-LABEL: constrained_vector_cos_v1f32:
2290 ; SZ13: # %bb.0: # %entry
2291 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2292 ; SZ13-NEXT: .cfi_offset %r14, -48
2293 ; SZ13-NEXT: .cfi_offset %r15, -40
2294 ; SZ13-NEXT: aghi %r15, -160
2295 ; SZ13-NEXT: .cfi_def_cfa_offset 320
2296 ; SZ13-NEXT: larl %r1, .LCPI45_0
2297 ; SZ13-NEXT: lde %f0, 0(%r1)
2298 ; SZ13-NEXT: brasl %r14, cosf@PLT
2299 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2300 ; SZ13-NEXT: vlr %v24, %v0
2301 ; SZ13-NEXT: lmg %r14, %r15, 272(%r15)
2302 ; SZ13-NEXT: br %r14
2303 entry:
2304 %cos = call <1 x float> @llvm.experimental.constrained.cos.v1f32(
2305 <1 x float> ,
2306 metadata !"round.dynamic",
2307 metadata !"fpexcept.strict")
2308 ret <1 x float> %cos
2309 }
2310
2311 define <2 x double> @constrained_vector_cos_v2f64() {
2312 ; S390X-LABEL: constrained_vector_cos_v2f64:
2313 ; S390X: # %bb.0: # %entry
2314 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2315 ; S390X-NEXT: .cfi_offset %r14, -48
2316 ; S390X-NEXT: .cfi_offset %r15, -40
2317 ; S390X-NEXT: aghi %r15, -168
2318 ; S390X-NEXT: .cfi_def_cfa_offset 328
2319 ; S390X-NEXT: std %f8, 160(%r15) # 8-byte Folded Spill
2320 ; S390X-NEXT: .cfi_offset %f8, -168
2321 ; S390X-NEXT: larl %r1, .LCPI46_0
2322 ; S390X-NEXT: ldeb %f0, 0(%r1)
2323 ; S390X-NEXT: brasl %r14, cos@PLT
2324 ; S390X-NEXT: larl %r1, .LCPI46_1
2325 ; S390X-NEXT: ld %f1, 0(%r1)
2326 ; S390X-NEXT: ldr %f8, %f0
2327 ; S390X-NEXT: ldr %f0, %f1
2328 ; S390X-NEXT: brasl %r14, cos@PLT
2329 ; S390X-NEXT: ldr %f2, %f0
2330 ; S390X-NEXT: ldr %f0, %f8
2331 ; S390X-NEXT: ld %f8, 160(%r15) # 8-byte Folded Reload
2332 ; S390X-NEXT: lmg %r14, %r15, 280(%r15)
2333 ; S390X-NEXT: br %r14
2334 ;
2335 ; SZ13-LABEL: constrained_vector_cos_v2f64:
2336 ; SZ13: # %bb.0: # %entry
2337 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2338 ; SZ13-NEXT: .cfi_offset %r14, -48
2339 ; SZ13-NEXT: .cfi_offset %r15, -40
2340 ; SZ13-NEXT: aghi %r15, -176
2341 ; SZ13-NEXT: .cfi_def_cfa_offset 336
2342 ; SZ13-NEXT: larl %r1, .LCPI46_0
2343 ; SZ13-NEXT: ld %f0, 0(%r1)
2344 ; SZ13-NEXT: brasl %r14, cos@PLT
2345 ; SZ13-NEXT: larl %r1, .LCPI46_1
2346 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2347 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2348 ; SZ13-NEXT: ldeb %f0, 0(%r1)
2349 ; SZ13-NEXT: brasl %r14, cos@PLT
2350 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2351 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2352 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
2353 ; SZ13-NEXT: lmg %r14, %r15, 288(%r15)
2354 ; SZ13-NEXT: br %r14
2355 entry:
2356 %cos = call <2 x double> @llvm.experimental.constrained.cos.v2f64(
2357 <2 x double> ,
2358 metadata !"round.dynamic",
2359 metadata !"fpexcept.strict")
2360 ret <2 x double> %cos
2361 }
2362
2363 define <3 x float> @constrained_vector_cos_v3f32() {
2364 ; S390X-LABEL: constrained_vector_cos_v3f32:
2365 ; S390X: # %bb.0: # %entry
2366 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2367 ; S390X-NEXT: .cfi_offset %r14, -48
2368 ; S390X-NEXT: .cfi_offset %r15, -40
2369 ; S390X-NEXT: aghi %r15, -176
2370 ; S390X-NEXT: .cfi_def_cfa_offset 336
2371 ; S390X-NEXT: std %f8, 168(%r15) # 8-byte Folded Spill
2372 ; S390X-NEXT: std %f9, 160(%r15) # 8-byte Folded Spill
2373 ; S390X-NEXT: .cfi_offset %f8, -168
2374 ; S390X-NEXT: .cfi_offset %f9, -176
2375 ; S390X-NEXT: larl %r1, .LCPI47_0
2376 ; S390X-NEXT: le %f0, 0(%r1)
2377 ; S390X-NEXT: brasl %r14, cosf@PLT
2378 ; S390X-NEXT: larl %r1, .LCPI47_1
2379 ; S390X-NEXT: le %f1, 0(%r1)
2380 ; S390X-NEXT: ler %f8, %f0
2381 ; S390X-NEXT: ler %f0, %f1
2382 ; S390X-NEXT: brasl %r14, cosf@PLT
2383 ; S390X-NEXT: larl %r1, .LCPI47_2
2384 ; S390X-NEXT: le %f1, 0(%r1)
2385 ; S390X-NEXT: ler %f9, %f0
2386 ; S390X-NEXT: ler %f0, %f1
2387 ; S390X-NEXT: brasl %r14, cosf@PLT
2388 ; S390X-NEXT: ler %f4, %f0
2389 ; S390X-NEXT: ler %f0, %f8
2390 ; S390X-NEXT: ler %f2, %f9
2391 ; S390X-NEXT: ld %f8, 168(%r15) # 8-byte Folded Reload
2392 ; S390X-NEXT: ld %f9, 160(%r15) # 8-byte Folded Reload
2393 ; S390X-NEXT: lmg %r14, %r15, 288(%r15)
2394 ; S390X-NEXT: br %r14
2395 ;
2396 ; SZ13-LABEL: constrained_vector_cos_v3f32:
2397 ; SZ13: # %bb.0: # %entry
2398 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2399 ; SZ13-NEXT: .cfi_offset %r14, -48
2400 ; SZ13-NEXT: .cfi_offset %r15, -40
2401 ; SZ13-NEXT: aghi %r15, -192
2402 ; SZ13-NEXT: .cfi_def_cfa_offset 352
2403 ; SZ13-NEXT: larl %r1, .LCPI47_0
2404 ; SZ13-NEXT: lde %f0, 0(%r1)
2405 ; SZ13-NEXT: brasl %r14, cosf@PLT
2406 ; SZ13-NEXT: larl %r1, .LCPI47_1
2407 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2408 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2409 ; SZ13-NEXT: lde %f0, 0(%r1)
2410 ; SZ13-NEXT: brasl %r14, cosf@PLT
2411 ; SZ13-NEXT: larl %r1, .LCPI47_2
2412 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2413 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2414 ; SZ13-NEXT: lde %f0, 0(%r1)
2415 ; SZ13-NEXT: brasl %r14, cosf@PLT
2416 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2417 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2418 ; SZ13-NEXT: vmrhf %v0, %v1, %v0
2419 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
2420 ; SZ13-NEXT: vrepf %v1, %v1, 0
2421 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
2422 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
2423 ; SZ13-NEXT: br %r14
2424 entry:
2425 %cos = call <3 x float> @llvm.experimental.constrained.cos.v3f32(
2426 <3 x float> ,
2427 metadata !"round.dynamic",
2428 metadata !"fpexcept.strict")
2429 ret <3 x float> %cos
2430 }
2431
2432 define void @constrained_vector_cos_v3f64(<3 x double>* %a) {
2433 ; S390X-LABEL: constrained_vector_cos_v3f64:
2434 ; S390X: # %bb.0: # %entry
2435 ; S390X-NEXT: stmg %r13, %r15, 104(%r15)
2436 ; S390X-NEXT: .cfi_offset %r13, -56
2437 ; S390X-NEXT: .cfi_offset %r14, -48
2438 ; S390X-NEXT: .cfi_offset %r15, -40
2439 ; S390X-NEXT: aghi %r15, -184
2440 ; S390X-NEXT: .cfi_def_cfa_offset 344
2441 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
2442 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
2443 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
2444 ; S390X-NEXT: .cfi_offset %f8, -168
2445 ; S390X-NEXT: .cfi_offset %f9, -176
2446 ; S390X-NEXT: .cfi_offset %f10, -184
2447 ; S390X-NEXT: lgr %r13, %r2
2448 ; S390X-NEXT: ld %f8, 16(%r2)
2449 ; S390X-NEXT: ld %f0, 0(%r2)
2450 ; S390X-NEXT: ld %f9, 8(%r2)
2451 ; S390X-NEXT: brasl %r14, cos@PLT
2452 ; S390X-NEXT: ldr %f10, %f0
2453 ; S390X-NEXT: ldr %f0, %f9
2454 ; S390X-NEXT: brasl %r14, cos@PLT
2455 ; S390X-NEXT: ldr %f9, %f0
2456 ; S390X-NEXT: ldr %f0, %f8
2457 ; S390X-NEXT: brasl %r14, cos@PLT
2458 ; S390X-NEXT: std %f0, 16(%r13)
2459 ; S390X-NEXT: std %f9, 8(%r13)
2460 ; S390X-NEXT: std %f10, 0(%r13)
2461 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
2462 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
2463 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
2464 ; S390X-NEXT: lmg %r13, %r15, 288(%r15)
2465 ; S390X-NEXT: br %r14
2466 ;
2467 ; SZ13-LABEL: constrained_vector_cos_v3f64:
2468 ; SZ13: # %bb.0: # %entry
2469 ; SZ13-NEXT: stmg %r13, %r15, 104(%r15)
2470 ; SZ13-NEXT: .cfi_offset %r13, -56
2471 ; SZ13-NEXT: .cfi_offset %r14, -48
2472 ; SZ13-NEXT: .cfi_offset %r15, -40
2473 ; SZ13-NEXT: aghi %r15, -200
2474 ; SZ13-NEXT: .cfi_def_cfa_offset 360
2475 ; SZ13-NEXT: std %f8, 192(%r15) # 8-byte Folded Spill
2476 ; SZ13-NEXT: .cfi_offset %f8, -168
2477 ; SZ13-NEXT: vl %v0, 0(%r2)
2478 ; SZ13-NEXT: ld %f8, 16(%r2)
2479 ; SZ13-NEXT: lgr %r13, %r2
2480 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2481 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
2482 ; SZ13-NEXT: brasl %r14, cos@PLT
2483 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2484 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2485 ; SZ13-NEXT: vl %v0, 160(%r15) # 16-byte Folded Reload
2486 ; SZ13-NEXT: vrepg %v0, %v0, 1
2487 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
2488 ; SZ13-NEXT: brasl %r14, cos@PLT
2489 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
2490 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2491 ; SZ13-NEXT: vmrhg %v0, %v1, %v0
2492 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2493 ; SZ13-NEXT: ldr %f0, %f8
2494 ; SZ13-NEXT: brasl %r14, cos@PLT
2495 ; SZ13-NEXT: std %f0, 16(%r13)
2496 ; SZ13-NEXT: vl %v0, 176(%r15) # 16-byte Folded Reload
2497 ; SZ13-NEXT: ld %f8, 192(%r15) # 8-byte Folded Reload
2498 ; SZ13-NEXT: vst %v0, 0(%r13)
2499 ; SZ13-NEXT: lmg %r13, %r15, 304(%r15)
2500 ; SZ13-NEXT: br %r14
2501 entry:
2502 %b = load <3 x double>, <3 x double>* %a
2503 %cos = call <3 x double> @llvm.experimental.constrained.cos.v3f64(
2504 <3 x double> %b,
2505 metadata !"round.dynamic",
2506 metadata !"fpexcept.strict")
2507 store <3 x double> %cos, <3 x double>* %a
2508 ret void
2509 }
2510
2511 define <4 x double> @constrained_vector_cos_v4f64() {
2512 ; S390X-LABEL: constrained_vector_cos_v4f64:
2513 ; S390X: # %bb.0: # %entry
2514 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2515 ; S390X-NEXT: .cfi_offset %r14, -48
2516 ; S390X-NEXT: .cfi_offset %r15, -40
2517 ; S390X-NEXT: aghi %r15, -184
2518 ; S390X-NEXT: .cfi_def_cfa_offset 344
2519 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
2520 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
2521 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
2522 ; S390X-NEXT: .cfi_offset %f8, -168
2523 ; S390X-NEXT: .cfi_offset %f9, -176
2524 ; S390X-NEXT: .cfi_offset %f10, -184
2525 ; S390X-NEXT: larl %r1, .LCPI49_0
2526 ; S390X-NEXT: ldeb %f0, 0(%r1)
2527 ; S390X-NEXT: brasl %r14, cos@PLT
2528 ; S390X-NEXT: larl %r1, .LCPI49_1
2529 ; S390X-NEXT: ld %f1, 0(%r1)
2530 ; S390X-NEXT: ldr %f8, %f0
2531 ; S390X-NEXT: ldr %f0, %f1
2532 ; S390X-NEXT: brasl %r14, cos@PLT
2533 ; S390X-NEXT: larl %r1, .LCPI49_2
2534 ; S390X-NEXT: ld %f1, 0(%r1)
2535 ; S390X-NEXT: ldr %f9, %f0
2536 ; S390X-NEXT: ldr %f0, %f1
2537 ; S390X-NEXT: brasl %r14, cos@PLT
2538 ; S390X-NEXT: larl %r1, .LCPI49_3
2539 ; S390X-NEXT: ld %f1, 0(%r1)
2540 ; S390X-NEXT: ldr %f10, %f0
2541 ; S390X-NEXT: ldr %f0, %f1
2542 ; S390X-NEXT: brasl %r14, cos@PLT
2543 ; S390X-NEXT: ldr %f6, %f0
2544 ; S390X-NEXT: ldr %f0, %f8
2545 ; S390X-NEXT: ldr %f2, %f9
2546 ; S390X-NEXT: ldr %f4, %f10
2547 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
2548 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
2549 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
2550 ; S390X-NEXT: lmg %r14, %r15, 296(%r15)
2551 ; S390X-NEXT: br %r14
2552 ;
2553 ; SZ13-LABEL: constrained_vector_cos_v4f64:
2554 ; SZ13: # %bb.0: # %entry
2555 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2556 ; SZ13-NEXT: .cfi_offset %r14, -48
2557 ; SZ13-NEXT: .cfi_offset %r15, -40
2558 ; SZ13-NEXT: aghi %r15, -192
2559 ; SZ13-NEXT: .cfi_def_cfa_offset 352
2560 ; SZ13-NEXT: larl %r1, .LCPI49_0
2561 ; SZ13-NEXT: ld %f0, 0(%r1)
2562 ; SZ13-NEXT: brasl %r14, cos@PLT
2563 ; SZ13-NEXT: larl %r1, .LCPI49_1
2564 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2565 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2566 ; SZ13-NEXT: ldeb %f0, 0(%r1)
2567 ; SZ13-NEXT: brasl %r14, cos@PLT
2568 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
2569 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2570 ; SZ13-NEXT: vmrhg %v0, %v0, %v1
2571 ; SZ13-NEXT: larl %r1, .LCPI49_2
2572 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2573 ; SZ13-NEXT: ld %f0, 0(%r1)
2574 ; SZ13-NEXT: brasl %r14, cos@PLT
2575 ; SZ13-NEXT: larl %r1, .LCPI49_3
2576 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2577 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2578 ; SZ13-NEXT: ld %f0, 0(%r1)
2579 ; SZ13-NEXT: brasl %r14, cos@PLT
2580 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2581 ; SZ13-NEXT: vl %v24, 176(%r15) # 16-byte Folded Reload
2582 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2583 ; SZ13-NEXT: vmrhg %v26, %v0, %v1
2584 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
2585 ; SZ13-NEXT: br %r14
2586 entry:
2587 %cos = call <4 x double> @llvm.experimental.constrained.cos.v4f64(
2588 <4 x double>
2589 double 42.2, double 42.3>,
2590 metadata !"round.dynamic",
2591 metadata !"fpexcept.strict")
2592 ret <4 x double> %cos
2593 }
2594
2595 define <1 x float> @constrained_vector_exp_v1f32() {
2596 ; S390X-LABEL: constrained_vector_exp_v1f32:
2597 ; S390X: # %bb.0: # %entry
2598 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2599 ; S390X-NEXT: .cfi_offset %r14, -48
2600 ; S390X-NEXT: .cfi_offset %r15, -40
2601 ; S390X-NEXT: aghi %r15, -160
2602 ; S390X-NEXT: .cfi_def_cfa_offset 320
2603 ; S390X-NEXT: larl %r1, .LCPI50_0
2604 ; S390X-NEXT: le %f0, 0(%r1)
2605 ; S390X-NEXT: brasl %r14, expf@PLT
2606 ; S390X-NEXT: lmg %r14, %r15, 272(%r15)
2607 ; S390X-NEXT: br %r14
2608 ;
2609 ; SZ13-LABEL: constrained_vector_exp_v1f32:
2610 ; SZ13: # %bb.0: # %entry
2611 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2612 ; SZ13-NEXT: .cfi_offset %r14, -48
2613 ; SZ13-NEXT: .cfi_offset %r15, -40
2614 ; SZ13-NEXT: aghi %r15, -160
2615 ; SZ13-NEXT: .cfi_def_cfa_offset 320
2616 ; SZ13-NEXT: larl %r1, .LCPI50_0
2617 ; SZ13-NEXT: lde %f0, 0(%r1)
2618 ; SZ13-NEXT: brasl %r14, expf@PLT
2619 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2620 ; SZ13-NEXT: vlr %v24, %v0
2621 ; SZ13-NEXT: lmg %r14, %r15, 272(%r15)
2622 ; SZ13-NEXT: br %r14
2623 entry:
2624 %exp = call <1 x float> @llvm.experimental.constrained.exp.v1f32(
2625 <1 x float> ,
2626 metadata !"round.dynamic",
2627 metadata !"fpexcept.strict")
2628 ret <1 x float> %exp
2629 }
2630
2631 define <2 x double> @constrained_vector_exp_v2f64() {
2632 ; S390X-LABEL: constrained_vector_exp_v2f64:
2633 ; S390X: # %bb.0: # %entry
2634 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2635 ; S390X-NEXT: .cfi_offset %r14, -48
2636 ; S390X-NEXT: .cfi_offset %r15, -40
2637 ; S390X-NEXT: aghi %r15, -168
2638 ; S390X-NEXT: .cfi_def_cfa_offset 328
2639 ; S390X-NEXT: std %f8, 160(%r15) # 8-byte Folded Spill
2640 ; S390X-NEXT: .cfi_offset %f8, -168
2641 ; S390X-NEXT: larl %r1, .LCPI51_0
2642 ; S390X-NEXT: ldeb %f0, 0(%r1)
2643 ; S390X-NEXT: brasl %r14, exp@PLT
2644 ; S390X-NEXT: larl %r1, .LCPI51_1
2645 ; S390X-NEXT: ld %f1, 0(%r1)
2646 ; S390X-NEXT: ldr %f8, %f0
2647 ; S390X-NEXT: ldr %f0, %f1
2648 ; S390X-NEXT: brasl %r14, exp@PLT
2649 ; S390X-NEXT: ldr %f2, %f0
2650 ; S390X-NEXT: ldr %f0, %f8
2651 ; S390X-NEXT: ld %f8, 160(%r15) # 8-byte Folded Reload
2652 ; S390X-NEXT: lmg %r14, %r15, 280(%r15)
2653 ; S390X-NEXT: br %r14
2654 ;
2655 ; SZ13-LABEL: constrained_vector_exp_v2f64:
2656 ; SZ13: # %bb.0: # %entry
2657 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2658 ; SZ13-NEXT: .cfi_offset %r14, -48
2659 ; SZ13-NEXT: .cfi_offset %r15, -40
2660 ; SZ13-NEXT: aghi %r15, -176
2661 ; SZ13-NEXT: .cfi_def_cfa_offset 336
2662 ; SZ13-NEXT: larl %r1, .LCPI51_0
2663 ; SZ13-NEXT: ld %f0, 0(%r1)
2664 ; SZ13-NEXT: brasl %r14, exp@PLT
2665 ; SZ13-NEXT: larl %r1, .LCPI51_1
2666 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2667 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2668 ; SZ13-NEXT: ldeb %f0, 0(%r1)
2669 ; SZ13-NEXT: brasl %r14, exp@PLT
2670 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2671 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2672 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
2673 ; SZ13-NEXT: lmg %r14, %r15, 288(%r15)
2674 ; SZ13-NEXT: br %r14
2675 entry:
2676 %exp = call <2 x double> @llvm.experimental.constrained.exp.v2f64(
2677 <2 x double> ,
2678 metadata !"round.dynamic",
2679 metadata !"fpexcept.strict")
2680 ret <2 x double> %exp
2681 }
2682
2683 define <3 x float> @constrained_vector_exp_v3f32() {
2684 ; S390X-LABEL: constrained_vector_exp_v3f32:
2685 ; S390X: # %bb.0: # %entry
2686 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2687 ; S390X-NEXT: .cfi_offset %r14, -48
2688 ; S390X-NEXT: .cfi_offset %r15, -40
2689 ; S390X-NEXT: aghi %r15, -176
2690 ; S390X-NEXT: .cfi_def_cfa_offset 336
2691 ; S390X-NEXT: std %f8, 168(%r15) # 8-byte Folded Spill
2692 ; S390X-NEXT: std %f9, 160(%r15) # 8-byte Folded Spill
2693 ; S390X-NEXT: .cfi_offset %f8, -168
2694 ; S390X-NEXT: .cfi_offset %f9, -176
2695 ; S390X-NEXT: larl %r1, .LCPI52_0
2696 ; S390X-NEXT: le %f0, 0(%r1)
2697 ; S390X-NEXT: brasl %r14, expf@PLT
2698 ; S390X-NEXT: larl %r1, .LCPI52_1
2699 ; S390X-NEXT: le %f1, 0(%r1)
2700 ; S390X-NEXT: ler %f8, %f0
2701 ; S390X-NEXT: ler %f0, %f1
2702 ; S390X-NEXT: brasl %r14, expf@PLT
2703 ; S390X-NEXT: larl %r1, .LCPI52_2
2704 ; S390X-NEXT: le %f1, 0(%r1)
2705 ; S390X-NEXT: ler %f9, %f0
2706 ; S390X-NEXT: ler %f0, %f1
2707 ; S390X-NEXT: brasl %r14, expf@PLT
2708 ; S390X-NEXT: ler %f4, %f0
2709 ; S390X-NEXT: ler %f0, %f8
2710 ; S390X-NEXT: ler %f2, %f9
2711 ; S390X-NEXT: ld %f8, 168(%r15) # 8-byte Folded Reload
2712 ; S390X-NEXT: ld %f9, 160(%r15) # 8-byte Folded Reload
2713 ; S390X-NEXT: lmg %r14, %r15, 288(%r15)
2714 ; S390X-NEXT: br %r14
2715 ;
2716 ; SZ13-LABEL: constrained_vector_exp_v3f32:
2717 ; SZ13: # %bb.0: # %entry
2718 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2719 ; SZ13-NEXT: .cfi_offset %r14, -48
2720 ; SZ13-NEXT: .cfi_offset %r15, -40
2721 ; SZ13-NEXT: aghi %r15, -192
2722 ; SZ13-NEXT: .cfi_def_cfa_offset 352
2723 ; SZ13-NEXT: larl %r1, .LCPI52_0
2724 ; SZ13-NEXT: lde %f0, 0(%r1)
2725 ; SZ13-NEXT: brasl %r14, expf@PLT
2726 ; SZ13-NEXT: larl %r1, .LCPI52_1
2727 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2728 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2729 ; SZ13-NEXT: lde %f0, 0(%r1)
2730 ; SZ13-NEXT: brasl %r14, expf@PLT
2731 ; SZ13-NEXT: larl %r1, .LCPI52_2
2732 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2733 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2734 ; SZ13-NEXT: lde %f0, 0(%r1)
2735 ; SZ13-NEXT: brasl %r14, expf@PLT
2736 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2737 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2738 ; SZ13-NEXT: vmrhf %v0, %v1, %v0
2739 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
2740 ; SZ13-NEXT: vrepf %v1, %v1, 0
2741 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
2742 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
2743 ; SZ13-NEXT: br %r14
2744 entry:
2745 %exp = call <3 x float> @llvm.experimental.constrained.exp.v3f32(
2746 <3 x float> ,
2747 metadata !"round.dynamic",
2748 metadata !"fpexcept.strict")
2749 ret <3 x float> %exp
2750 }
2751
2752 define void @constrained_vector_exp_v3f64(<3 x double>* %a) {
2753 ; S390X-LABEL: constrained_vector_exp_v3f64:
2754 ; S390X: # %bb.0: # %entry
2755 ; S390X-NEXT: stmg %r13, %r15, 104(%r15)
2756 ; S390X-NEXT: .cfi_offset %r13, -56
2757 ; S390X-NEXT: .cfi_offset %r14, -48
2758 ; S390X-NEXT: .cfi_offset %r15, -40
2759 ; S390X-NEXT: aghi %r15, -184
2760 ; S390X-NEXT: .cfi_def_cfa_offset 344
2761 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
2762 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
2763 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
2764 ; S390X-NEXT: .cfi_offset %f8, -168
2765 ; S390X-NEXT: .cfi_offset %f9, -176
2766 ; S390X-NEXT: .cfi_offset %f10, -184
2767 ; S390X-NEXT: lgr %r13, %r2
2768 ; S390X-NEXT: ld %f8, 16(%r2)
2769 ; S390X-NEXT: ld %f0, 0(%r2)
2770 ; S390X-NEXT: ld %f9, 8(%r2)
2771 ; S390X-NEXT: brasl %r14, exp@PLT
2772 ; S390X-NEXT: ldr %f10, %f0
2773 ; S390X-NEXT: ldr %f0, %f9
2774 ; S390X-NEXT: brasl %r14, exp@PLT
2775 ; S390X-NEXT: ldr %f9, %f0
2776 ; S390X-NEXT: ldr %f0, %f8
2777 ; S390X-NEXT: brasl %r14, exp@PLT
2778 ; S390X-NEXT: std %f0, 16(%r13)
2779 ; S390X-NEXT: std %f9, 8(%r13)
2780 ; S390X-NEXT: std %f10, 0(%r13)
2781 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
2782 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
2783 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
2784 ; S390X-NEXT: lmg %r13, %r15, 288(%r15)
2785 ; S390X-NEXT: br %r14
2786 ;
2787 ; SZ13-LABEL: constrained_vector_exp_v3f64:
2788 ; SZ13: # %bb.0: # %entry
2789 ; SZ13-NEXT: stmg %r13, %r15, 104(%r15)
2790 ; SZ13-NEXT: .cfi_offset %r13, -56
2791 ; SZ13-NEXT: .cfi_offset %r14, -48
2792 ; SZ13-NEXT: .cfi_offset %r15, -40
2793 ; SZ13-NEXT: aghi %r15, -200
2794 ; SZ13-NEXT: .cfi_def_cfa_offset 360
2795 ; SZ13-NEXT: std %f8, 192(%r15) # 8-byte Folded Spill
2796 ; SZ13-NEXT: .cfi_offset %f8, -168
2797 ; SZ13-NEXT: vl %v0, 0(%r2)
2798 ; SZ13-NEXT: ld %f8, 16(%r2)
2799 ; SZ13-NEXT: lgr %r13, %r2
2800 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2801 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
2802 ; SZ13-NEXT: brasl %r14, exp@PLT
2803 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2804 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2805 ; SZ13-NEXT: vl %v0, 160(%r15) # 16-byte Folded Reload
2806 ; SZ13-NEXT: vrepg %v0, %v0, 1
2807 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
2808 ; SZ13-NEXT: brasl %r14, exp@PLT
2809 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
2810 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2811 ; SZ13-NEXT: vmrhg %v0, %v1, %v0
2812 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2813 ; SZ13-NEXT: ldr %f0, %f8
2814 ; SZ13-NEXT: brasl %r14, exp@PLT
2815 ; SZ13-NEXT: std %f0, 16(%r13)
2816 ; SZ13-NEXT: vl %v0, 176(%r15) # 16-byte Folded Reload
2817 ; SZ13-NEXT: ld %f8, 192(%r15) # 8-byte Folded Reload
2818 ; SZ13-NEXT: vst %v0, 0(%r13)
2819 ; SZ13-NEXT: lmg %r13, %r15, 304(%r15)
2820 ; SZ13-NEXT: br %r14
2821 entry:
2822 %b = load <3 x double>, <3 x double>* %a
2823 %exp = call <3 x double> @llvm.experimental.constrained.exp.v3f64(
2824 <3 x double> %b,
2825 metadata !"round.dynamic",
2826 metadata !"fpexcept.strict")
2827 store <3 x double> %exp, <3 x double>* %a
2828 ret void
2829 }
2830
2831 define <4 x double> @constrained_vector_exp_v4f64() {
2832 ; S390X-LABEL: constrained_vector_exp_v4f64:
2833 ; S390X: # %bb.0: # %entry
2834 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2835 ; S390X-NEXT: .cfi_offset %r14, -48
2836 ; S390X-NEXT: .cfi_offset %r15, -40
2837 ; S390X-NEXT: aghi %r15, -184
2838 ; S390X-NEXT: .cfi_def_cfa_offset 344
2839 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
2840 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
2841 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
2842 ; S390X-NEXT: .cfi_offset %f8, -168
2843 ; S390X-NEXT: .cfi_offset %f9, -176
2844 ; S390X-NEXT: .cfi_offset %f10, -184
2845 ; S390X-NEXT: larl %r1, .LCPI54_0
2846 ; S390X-NEXT: ldeb %f0, 0(%r1)
2847 ; S390X-NEXT: brasl %r14, exp@PLT
2848 ; S390X-NEXT: larl %r1, .LCPI54_1
2849 ; S390X-NEXT: ld %f1, 0(%r1)
2850 ; S390X-NEXT: ldr %f8, %f0
2851 ; S390X-NEXT: ldr %f0, %f1
2852 ; S390X-NEXT: brasl %r14, exp@PLT
2853 ; S390X-NEXT: larl %r1, .LCPI54_2
2854 ; S390X-NEXT: ld %f1, 0(%r1)
2855 ; S390X-NEXT: ldr %f9, %f0
2856 ; S390X-NEXT: ldr %f0, %f1
2857 ; S390X-NEXT: brasl %r14, exp@PLT
2858 ; S390X-NEXT: larl %r1, .LCPI54_3
2859 ; S390X-NEXT: ld %f1, 0(%r1)
2860 ; S390X-NEXT: ldr %f10, %f0
2861 ; S390X-NEXT: ldr %f0, %f1
2862 ; S390X-NEXT: brasl %r14, exp@PLT
2863 ; S390X-NEXT: ldr %f6, %f0
2864 ; S390X-NEXT: ldr %f0, %f8
2865 ; S390X-NEXT: ldr %f2, %f9
2866 ; S390X-NEXT: ldr %f4, %f10
2867 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
2868 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
2869 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
2870 ; S390X-NEXT: lmg %r14, %r15, 296(%r15)
2871 ; S390X-NEXT: br %r14
2872 ;
2873 ; SZ13-LABEL: constrained_vector_exp_v4f64:
2874 ; SZ13: # %bb.0: # %entry
2875 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2876 ; SZ13-NEXT: .cfi_offset %r14, -48
2877 ; SZ13-NEXT: .cfi_offset %r15, -40
2878 ; SZ13-NEXT: aghi %r15, -192
2879 ; SZ13-NEXT: .cfi_def_cfa_offset 352
2880 ; SZ13-NEXT: larl %r1, .LCPI54_0
2881 ; SZ13-NEXT: ld %f0, 0(%r1)
2882 ; SZ13-NEXT: brasl %r14, exp@PLT
2883 ; SZ13-NEXT: larl %r1, .LCPI54_1
2884 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2885 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2886 ; SZ13-NEXT: ldeb %f0, 0(%r1)
2887 ; SZ13-NEXT: brasl %r14, exp@PLT
2888 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
2889 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2890 ; SZ13-NEXT: vmrhg %v0, %v0, %v1
2891 ; SZ13-NEXT: larl %r1, .LCPI54_2
2892 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
2893 ; SZ13-NEXT: ld %f0, 0(%r1)
2894 ; SZ13-NEXT: brasl %r14, exp@PLT
2895 ; SZ13-NEXT: larl %r1, .LCPI54_3
2896 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2897 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2898 ; SZ13-NEXT: ld %f0, 0(%r1)
2899 ; SZ13-NEXT: brasl %r14, exp@PLT
2900 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2901 ; SZ13-NEXT: vl %v24, 176(%r15) # 16-byte Folded Reload
2902 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2903 ; SZ13-NEXT: vmrhg %v26, %v0, %v1
2904 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
2905 ; SZ13-NEXT: br %r14
2906 entry:
2907 %exp = call <4 x double> @llvm.experimental.constrained.exp.v4f64(
2908 <4 x double>
2909 double 42.2, double 42.3>,
2910 metadata !"round.dynamic",
2911 metadata !"fpexcept.strict")
2912 ret <4 x double> %exp
2913 }
2914
2915 define <1 x float> @constrained_vector_exp2_v1f32() {
2916 ; S390X-LABEL: constrained_vector_exp2_v1f32:
2917 ; S390X: # %bb.0: # %entry
2918 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2919 ; S390X-NEXT: .cfi_offset %r14, -48
2920 ; S390X-NEXT: .cfi_offset %r15, -40
2921 ; S390X-NEXT: aghi %r15, -160
2922 ; S390X-NEXT: .cfi_def_cfa_offset 320
2923 ; S390X-NEXT: larl %r1, .LCPI55_0
2924 ; S390X-NEXT: le %f0, 0(%r1)
2925 ; S390X-NEXT: brasl %r14, exp2f@PLT
2926 ; S390X-NEXT: lmg %r14, %r15, 272(%r15)
2927 ; S390X-NEXT: br %r14
2928 ;
2929 ; SZ13-LABEL: constrained_vector_exp2_v1f32:
2930 ; SZ13: # %bb.0: # %entry
2931 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2932 ; SZ13-NEXT: .cfi_offset %r14, -48
2933 ; SZ13-NEXT: .cfi_offset %r15, -40
2934 ; SZ13-NEXT: aghi %r15, -160
2935 ; SZ13-NEXT: .cfi_def_cfa_offset 320
2936 ; SZ13-NEXT: larl %r1, .LCPI55_0
2937 ; SZ13-NEXT: lde %f0, 0(%r1)
2938 ; SZ13-NEXT: brasl %r14, exp2f@PLT
2939 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
2940 ; SZ13-NEXT: vlr %v24, %v0
2941 ; SZ13-NEXT: lmg %r14, %r15, 272(%r15)
2942 ; SZ13-NEXT: br %r14
2943 entry:
2944 %exp2 = call <1 x float> @llvm.experimental.constrained.exp2.v1f32(
2945 <1 x float> ,
2946 metadata !"round.dynamic",
2947 metadata !"fpexcept.strict")
2948 ret <1 x float> %exp2
2949 }
2950
2951 define <2 x double> @constrained_vector_exp2_v2f64() {
2952 ; S390X-LABEL: constrained_vector_exp2_v2f64:
2953 ; S390X: # %bb.0: # %entry
2954 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
2955 ; S390X-NEXT: .cfi_offset %r14, -48
2956 ; S390X-NEXT: .cfi_offset %r15, -40
2957 ; S390X-NEXT: aghi %r15, -168
2958 ; S390X-NEXT: .cfi_def_cfa_offset 328
2959 ; S390X-NEXT: std %f8, 160(%r15) # 8-byte Folded Spill
2960 ; S390X-NEXT: .cfi_offset %f8, -168
2961 ; S390X-NEXT: larl %r1, .LCPI56_0
2962 ; S390X-NEXT: ld %f0, 0(%r1)
2963 ; S390X-NEXT: brasl %r14, exp2@PLT
2964 ; S390X-NEXT: larl %r1, .LCPI56_1
2965 ; S390X-NEXT: ldeb %f1, 0(%r1)
2966 ; S390X-NEXT: ldr %f8, %f0
2967 ; S390X-NEXT: ldr %f0, %f1
2968 ; S390X-NEXT: brasl %r14, exp2@PLT
2969 ; S390X-NEXT: ldr %f2, %f0
2970 ; S390X-NEXT: ldr %f0, %f8
2971 ; S390X-NEXT: ld %f8, 160(%r15) # 8-byte Folded Reload
2972 ; S390X-NEXT: lmg %r14, %r15, 280(%r15)
2973 ; S390X-NEXT: br %r14
2974 ;
2975 ; SZ13-LABEL: constrained_vector_exp2_v2f64:
2976 ; SZ13: # %bb.0: # %entry
2977 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
2978 ; SZ13-NEXT: .cfi_offset %r14, -48
2979 ; SZ13-NEXT: .cfi_offset %r15, -40
2980 ; SZ13-NEXT: aghi %r15, -176
2981 ; SZ13-NEXT: .cfi_def_cfa_offset 336
2982 ; SZ13-NEXT: larl %r1, .LCPI56_0
2983 ; SZ13-NEXT: ldeb %f0, 0(%r1)
2984 ; SZ13-NEXT: brasl %r14, exp2@PLT
2985 ; SZ13-NEXT: larl %r1, .LCPI56_1
2986 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2987 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
2988 ; SZ13-NEXT: ld %f0, 0(%r1)
2989 ; SZ13-NEXT: brasl %r14, exp2@PLT
2990 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
2991 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
2992 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
2993 ; SZ13-NEXT: lmg %r14, %r15, 288(%r15)
2994 ; SZ13-NEXT: br %r14
2995 entry:
2996 %exp2 = call <2 x double> @llvm.experimental.constrained.exp2.v2f64(
2997 <2 x double> ,
2998 metadata !"round.dynamic",
2999 metadata !"fpexcept.strict")
3000 ret <2 x double> %exp2
3001 }
3002
3003 define <3 x float> @constrained_vector_exp2_v3f32() {
3004 ; S390X-LABEL: constrained_vector_exp2_v3f32:
3005 ; S390X: # %bb.0: # %entry
3006 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
3007 ; S390X-NEXT: .cfi_offset %r14, -48
3008 ; S390X-NEXT: .cfi_offset %r15, -40
3009 ; S390X-NEXT: aghi %r15, -176
3010 ; S390X-NEXT: .cfi_def_cfa_offset 336
3011 ; S390X-NEXT: std %f8, 168(%r15) # 8-byte Folded Spill
3012 ; S390X-NEXT: std %f9, 160(%r15) # 8-byte Folded Spill
3013 ; S390X-NEXT: .cfi_offset %f8, -168
3014 ; S390X-NEXT: .cfi_offset %f9, -176
3015 ; S390X-NEXT: larl %r1, .LCPI57_0
3016 ; S390X-NEXT: le %f0, 0(%r1)
3017 ; S390X-NEXT: brasl %r14, exp2f@PLT
3018 ; S390X-NEXT: larl %r1, .LCPI57_1
3019 ; S390X-NEXT: le %f1, 0(%r1)
3020 ; S390X-NEXT: ler %f8, %f0
3021 ; S390X-NEXT: ler %f0, %f1
3022 ; S390X-NEXT: brasl %r14, exp2f@PLT
3023 ; S390X-NEXT: larl %r1, .LCPI57_2
3024 ; S390X-NEXT: le %f1, 0(%r1)
3025 ; S390X-NEXT: ler %f9, %f0
3026 ; S390X-NEXT: ler %f0, %f1
3027 ; S390X-NEXT: brasl %r14, exp2f@PLT
3028 ; S390X-NEXT: ler %f4, %f0
3029 ; S390X-NEXT: ler %f0, %f8
3030 ; S390X-NEXT: ler %f2, %f9
3031 ; S390X-NEXT: ld %f8, 168(%r15) # 8-byte Folded Reload
3032 ; S390X-NEXT: ld %f9, 160(%r15) # 8-byte Folded Reload
3033 ; S390X-NEXT: lmg %r14, %r15, 288(%r15)
3034 ; S390X-NEXT: br %r14
3035 ;
3036 ; SZ13-LABEL: constrained_vector_exp2_v3f32:
3037 ; SZ13: # %bb.0: # %entry
3038 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
3039 ; SZ13-NEXT: .cfi_offset %r14, -48
3040 ; SZ13-NEXT: .cfi_offset %r15, -40
3041 ; SZ13-NEXT: aghi %r15, -192
3042 ; SZ13-NEXT: .cfi_def_cfa_offset 352
3043 ; SZ13-NEXT: larl %r1, .LCPI57_0
3044 ; SZ13-NEXT: lde %f0, 0(%r1)
3045 ; SZ13-NEXT: brasl %r14, exp2f@PLT
3046 ; SZ13-NEXT: larl %r1, .LCPI57_1
3047 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
3048 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
3049 ; SZ13-NEXT: lde %f0, 0(%r1)
3050 ; SZ13-NEXT: brasl %r14, exp2f@PLT
3051 ; SZ13-NEXT: larl %r1, .LCPI57_2
3052 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
3053 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
3054 ; SZ13-NEXT: lde %f0, 0(%r1)
3055 ; SZ13-NEXT: brasl %r14, exp2f@PLT
3056 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
3057 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
3058 ; SZ13-NEXT: vmrhf %v0, %v1, %v0
3059 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
3060 ; SZ13-NEXT: vrepf %v1, %v1, 0
3061 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
3062 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
3063 ; SZ13-NEXT: br %r14
3064 entry:
3065 %exp2 = call <3 x float> @llvm.experimental.constrained.exp2.v3f32(
3066 <3 x float> ,
3067 metadata !"round.dynamic",
3068 metadata !"fpexcept.strict")
3069 ret <3 x float> %exp2
3070 }
3071
3072 define void @constrained_vector_exp2_v3f64(<3 x double>* %a) {
3073 ; S390X-LABEL: constrained_vector_exp2_v3f64:
3074 ; S390X: # %bb.0: # %entry
3075 ; S390X-NEXT: stmg %r13, %r15, 104(%r15)
3076 ; S390X-NEXT: .cfi_offset %r13, -56
3077 ; S390X-NEXT: .cfi_offset %r14, -48
3078 ; S390X-NEXT: .cfi_offset %r15, -40
3079 ; S390X-NEXT: aghi %r15, -184
3080 ; S390X-NEXT: .cfi_def_cfa_offset 344
3081 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
3082 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
3083 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
3084 ; S390X-NEXT: .cfi_offset %f8, -168
3085 ; S390X-NEXT: .cfi_offset %f9, -176
3086 ; S390X-NEXT: .cfi_offset %f10, -184
3087 ; S390X-NEXT: lgr %r13, %r2
3088 ; S390X-NEXT: ld %f8, 16(%r2)
3089 ; S390X-NEXT: ld %f0, 0(%r2)
3090 ; S390X-NEXT: ld %f9, 8(%r2)
3091 ; S390X-NEXT: brasl %r14, exp2@PLT
3092 ; S390X-NEXT: ldr %f10, %f0
3093 ; S390X-NEXT: ldr %f0, %f9
3094 ; S390X-NEXT: brasl %r14, exp2@PLT
3095 ; S390X-NEXT: ldr %f9, %f0
3096 ; S390X-NEXT: ldr %f0, %f8
3097 ; S390X-NEXT: brasl %r14, exp2@PLT
3098 ; S390X-NEXT: std %f0, 16(%r13)
3099 ; S390X-NEXT: std %f9, 8(%r13)
3100 ; S390X-NEXT: std %f10, 0(%r13)
3101 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
3102 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
3103 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
3104 ; S390X-NEXT: lmg %r13, %r15, 288(%r15)
3105 ; S390X-NEXT: br %r14
3106 ;
3107 ; SZ13-LABEL: constrained_vector_exp2_v3f64:
3108 ; SZ13: # %bb.0: # %entry
3109 ; SZ13-NEXT: stmg %r13, %r15, 104(%r15)
3110 ; SZ13-NEXT: .cfi_offset %r13, -56
3111 ; SZ13-NEXT: .cfi_offset %r14, -48
3112 ; SZ13-NEXT: .cfi_offset %r15, -40
3113 ; SZ13-NEXT: aghi %r15, -200
3114 ; SZ13-NEXT: .cfi_def_cfa_offset 360
3115 ; SZ13-NEXT: std %f8, 192(%r15) # 8-byte Folded Spill
3116 ; SZ13-NEXT: .cfi_offset %f8, -168
3117 ; SZ13-NEXT: vl %v0, 0(%r2)
3118 ; SZ13-NEXT: ld %f8, 16(%r2)
3119 ; SZ13-NEXT: lgr %r13, %r2
3120 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
3121 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
3122 ; SZ13-NEXT: brasl %r14, exp2@PLT
3123 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
3124 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
3125 ; SZ13-NEXT: vl %v0, 160(%r15) # 16-byte Folded Reload
3126 ; SZ13-NEXT: vrepg %v0, %v0, 1
3127 ; SZ13-NEXT: # kill: def $f0d killed $f0d killed $v0
3128 ; SZ13-NEXT: brasl %r14, exp2@PLT
3129 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
3130 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
3131 ; SZ13-NEXT: vmrhg %v0, %v1, %v0
3132 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
3133 ; SZ13-NEXT: ldr %f0, %f8
3134 ; SZ13-NEXT: brasl %r14, exp2@PLT
3135 ; SZ13-NEXT: std %f0, 16(%r13)
3136 ; SZ13-NEXT: vl %v0, 176(%r15) # 16-byte Folded Reload
3137 ; SZ13-NEXT: ld %f8, 192(%r15) # 8-byte Folded Reload
3138 ; SZ13-NEXT: vst %v0, 0(%r13)
3139 ; SZ13-NEXT: lmg %r13, %r15, 304(%r15)
3140 ; SZ13-NEXT: br %r14
3141 entry:
3142 %b = load <3 x double>, <3 x double>* %a
3143 %exp2 = call <3 x double> @llvm.experimental.constrained.exp2.v3f64(
3144 <3 x double> %b,
3145 metadata !"round.dynamic",
3146 metadata !"fpexcept.strict")
3147 store <3 x double> %exp2, <3 x double>* %a
3148 ret void
3149 }
3150
3151 define <4 x double> @constrained_vector_exp2_v4f64() {
3152 ; S390X-LABEL: constrained_vector_exp2_v4f64:
3153 ; S390X: # %bb.0: # %entry
3154 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
3155 ; S390X-NEXT: .cfi_offset %r14, -48
3156 ; S390X-NEXT: .cfi_offset %r15, -40
3157 ; S390X-NEXT: aghi %r15, -184
3158 ; S390X-NEXT: .cfi_def_cfa_offset 344
3159 ; S390X-NEXT: std %f8, 176(%r15) # 8-byte Folded Spill
3160 ; S390X-NEXT: std %f9, 168(%r15) # 8-byte Folded Spill
3161 ; S390X-NEXT: std %f10, 160(%r15) # 8-byte Folded Spill
3162 ; S390X-NEXT: .cfi_offset %f8, -168
3163 ; S390X-NEXT: .cfi_offset %f9, -176
3164 ; S390X-NEXT: .cfi_offset %f10, -184
3165 ; S390X-NEXT: larl %r1, .LCPI59_0
3166 ; S390X-NEXT: ld %f0, 0(%r1)
3167 ; S390X-NEXT: brasl %r14, exp2@PLT
3168 ; S390X-NEXT: larl %r1, .LCPI59_1
3169 ; S390X-NEXT: ld %f1, 0(%r1)
3170 ; S390X-NEXT: ldr %f8, %f0
3171 ; S390X-NEXT: ldr %f0, %f1
3172 ; S390X-NEXT: brasl %r14, exp2@PLT
3173 ; S390X-NEXT: larl %r1, .LCPI59_2
3174 ; S390X-NEXT: ld %f1, 0(%r1)
3175 ; S390X-NEXT: ldr %f9, %f0
3176 ; S390X-NEXT: ldr %f0, %f1
3177 ; S390X-NEXT: brasl %r14, exp2@PLT
3178 ; S390X-NEXT: larl %r1, .LCPI59_3
3179 ; S390X-NEXT: ld %f1, 0(%r1)
3180 ; S390X-NEXT: ldr %f10, %f0
3181 ; S390X-NEXT: ldr %f0, %f1
3182 ; S390X-NEXT: brasl %r14, exp2@PLT
3183 ; S390X-NEXT: ldr %f6, %f0
3184 ; S390X-NEXT: ldr %f0, %f8
3185 ; S390X-NEXT: ldr %f2, %f9
3186 ; S390X-NEXT: ldr %f4, %f10
3187 ; S390X-NEXT: ld %f8, 176(%r15) # 8-byte Folded Reload
3188 ; S390X-NEXT: ld %f9, 168(%r15) # 8-byte Folded Reload
3189 ; S390X-NEXT: ld %f10, 160(%r15) # 8-byte Folded Reload
3190 ; S390X-NEXT: lmg %r14, %r15, 296(%r15)
3191 ; S390X-NEXT: br %r14
3192 ;
3193 ; SZ13-LABEL: constrained_vector_exp2_v4f64:
3194 ; SZ13: # %bb.0: # %entry
3195 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
3196 ; SZ13-NEXT: .cfi_offset %r14, -48
3197 ; SZ13-NEXT: .cfi_offset %r15, -40
3198 ; SZ13-NEXT: aghi %r15, -192
3199 ; SZ13-NEXT: .cfi_def_cfa_offset 352
3200 ; SZ13-NEXT: larl %r1, .LCPI59_0
3201 ; SZ13-NEXT: ld %f0, 0(%r1)
3202 ; SZ13-NEXT: brasl %r14, exp2@PLT
3203 ; SZ13-NEXT: larl %r1, .LCPI59_1
3204 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
3205 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
3206 ; SZ13-NEXT: ld %f0, 0(%r1)
3207 ; SZ13-NEXT: brasl %r14, exp2@PLT
3208 ; SZ13-NEXT: vl %v1, 176(%r15) # 16-byte Folded Reload
3209 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
3210 ; SZ13-NEXT: vmrhg %v0, %v0, %v1
3211 ; SZ13-NEXT: larl %r1, .LCPI59_2
3212 ; SZ13-NEXT: vst %v0, 176(%r15) # 16-byte Folded Spill
3213 ; SZ13-NEXT: ld %f0, 0(%r1)
3214 ; SZ13-NEXT: brasl %r14, exp2@PLT
3215 ; SZ13-NEXT: larl %r1, .LCPI59_3
3216 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
3217 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
3218 ; SZ13-NEXT: ld %f0, 0(%r1)
3219 ; SZ13-NEXT: brasl %r14, exp2@PLT
3220 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
3221 ; SZ13-NEXT: vl %v24, 176(%r15) # 16-byte Folded Reload
3222 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
3223 ; SZ13-NEXT: vmrhg %v26, %v0, %v1
3224 ; SZ13-NEXT: lmg %r14, %r15, 304(%r15)
3225 ; SZ13-NEXT: br %r14
3226 entry:
3227 %exp2 = call <4 x double> @llvm.experimental.constrained.exp2.v4f64(
3228 <4 x double>
3229 double 42.3, double 42.4>,
3230 metadata !"round.dynamic",
3231 metadata !"fpexcept.strict")
3232 ret <4 x double> %exp2
3233 }
3234
3235 define <1 x float> @constrained_vector_log_v1f32() {
3236 ; S390X-LABEL: constrained_vector_log_v1f32:
3237 ; S390X: # %bb.0: # %entry
3238 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
3239 ; S390X-NEXT: .cfi_offset %r14, -48
3240 ; S390X-NEXT: .cfi_offset %r15, -40
3241 ; S390X-NEXT: aghi %r15, -160
3242 ; S390X-NEXT: .cfi_def_cfa_offset 320
3243 ; S390X-NEXT: larl %r1, .LCPI60_0
3244 ; S390X-NEXT: le %f0, 0(%r1)
3245 ; S390X-NEXT: brasl %r14, logf@PLT
3246 ; S390X-NEXT: lmg %r14, %r15, 272(%r15)
3247 ; S390X-NEXT: br %r14
3248 ;
3249 ; SZ13-LABEL: constrained_vector_log_v1f32:
3250 ; SZ13: # %bb.0: # %entry
3251 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
3252 ; SZ13-NEXT: .cfi_offset %r14, -48
3253 ; SZ13-NEXT: .cfi_offset %r15, -40
3254 ; SZ13-NEXT: aghi %r15, -160
3255 ; SZ13-NEXT: .cfi_def_cfa_offset 320
3256 ; SZ13-NEXT: larl %r1, .LCPI60_0
3257 ; SZ13-NEXT: lde %f0, 0(%r1)
3258 ; SZ13-NEXT: brasl %r14, logf@PLT
3259 ; SZ13-NEXT: # kill: def $f0s killed $f0s def $v0
3260 ; SZ13-NEXT: vlr %v24, %v0
3261 ; SZ13-NEXT: lmg %r14, %r15, 272(%r15)
3262 ; SZ13-NEXT: br %r14
3263 entry:
3264 %log = call <1 x float> @llvm.experimental.constrained.log.v1f32(
3265 <1 x float> ,
3266 metadata !"round.dynamic",
3267 metadata !"fpexcept.strict")
3268 ret <1 x float> %log
3269 }
3270
3271 define <2 x double> @constrained_vector_log_v2f64() {
3272 ; S390X-LABEL: constrained_vector_log_v2f64:
3273 ; S390X: # %bb.0: # %entry
3274 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
3275 ; S390X-NEXT: .cfi_offset %r14, -48
3276 ; S390X-NEXT: .cfi_offset %r15, -40
3277 ; S390X-NEXT: aghi %r15, -168
3278 ; S390X-NEXT: .cfi_def_cfa_offset 328
3279 ; S390X-NEXT: std %f8, 160(%r15) # 8-byte Folded Spill
3280 ; S390X-NEXT: .cfi_offset %f8, -168
3281 ; S390X-NEXT: larl %r1, .LCPI61_0
3282 ; S390X-NEXT: ldeb %f0, 0(%r1)
3283 ; S390X-NEXT: brasl %r14, log@PLT
3284 ; S390X-NEXT: larl %r1, .LCPI61_1
3285 ; S390X-NEXT: ld %f1, 0(%r1)
3286 ; S390X-NEXT: ldr %f8, %f0
3287 ; S390X-NEXT: ldr %f0, %f1
3288 ; S390X-NEXT: brasl %r14, log@PLT
3289 ; S390X-NEXT: ldr %f2, %f0
3290 ; S390X-NEXT: ldr %f0, %f8
3291 ; S390X-NEXT: ld %f8, 160(%r15) # 8-byte Folded Reload
3292 ; S390X-NEXT: lmg %r14, %r15, 280(%r15)
3293 ; S390X-NEXT: br %r14
3294 ;
3295 ; SZ13-LABEL: constrained_vector_log_v2f64:
3296 ; SZ13: # %bb.0: # %entry
3297 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
3298 ; SZ13-NEXT: .cfi_offset %r14, -48
3299 ; SZ13-NEXT: .cfi_offset %r15, -40
3300 ; SZ13-NEXT: aghi %r15, -176
3301 ; SZ13-NEXT: .cfi_def_cfa_offset 336
3302 ; SZ13-NEXT: larl %r1, .LCPI61_0
3303 ; SZ13-NEXT: ld %f0, 0(%r1)
3304 ; SZ13-NEXT: brasl %r14, log@PLT
3305 ; SZ13-NEXT: larl %r1, .LCPI61_1
3306 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
3307 ; SZ13-NEXT: vst %v0, 160(%r15) # 16-byte Folded Spill
3308 ; SZ13-NEXT: ldeb %f0, 0(%r1)
3309 ; SZ13-NEXT: brasl %r14, log@PLT
3310 ; SZ13-NEXT: vl %v1, 160(%r15) # 16-byte Folded Reload
3311 ; SZ13-NEXT: # kill: def $f0d killed $f0d def $v0
3312 ; SZ13-NEXT: vmrhg %v24, %v0, %v1
3313 ; SZ13-NEXT: lmg %r14, %r15, 288(%r15)
3314 ; SZ13-NEXT: br %r14
3315 entry:
3316 %log = call <2 x double> @llvm.experimental.constrained.log.v2f64(
3317 <2 x double> ,
3318 metadata !"round.dynamic",
3319 metadata !"fpexcept.strict")
3320 ret <2 x double> %log
3321 }
3322
3323 define <3 x float> @constrained_vector_log_v3f32() {
3324 ; S390X-LABEL: constrained_vector_log_v3f32:
3325 ; S390X: # %bb.0: # %entry
3326 ; S390X-NEXT: stmg %r14, %r15, 112(%r15)
3327 ; S390X-NEXT: .cfi_offset %r14, -48
3328 ; S390X-NEXT: .cfi_offset %r15, -40
3329 ; S390X-NEXT: aghi %r15, -176
3330 ; S390X-NEXT: .cfi_def_cfa_offset 336
3331 ; S390X-NEXT: std %f8, 168(%r15) # 8-byte Folded Spill
3332 ; S390X-NEXT: std %f9, 160(%r15) # 8-byte Folded Spill
3333 ; S390X-NEXT: .cfi_offset %f8, -168
3334 ; S390X-NEXT: .cfi_offset %f9, -176
3335 ; S390X-NEXT: larl %r1, .LCPI62_0
3336 ; S390X-NEXT: le %f0, 0(%r1)
3337 ; S390X-NEXT: brasl %r14, logf@PLT
3338 ; S390X-NEXT: larl %r1, .LCPI62_1
3339 ; S390X-NEXT: le %f1, 0(%r1)
3340 ; S390X-NEXT: ler %f8, %f0
3341 ; S390X-NEXT: ler %f0, %f1
3342 ; S390X-NEXT: brasl %r14, logf@PLT
3343 ; S390X-NEXT: larl %r1, .LCPI62_2
3344 ; S390X-NEXT: le %f1, 0(%r1)
3345 ; S390X-NEXT: ler %f9, %f0
3346 ; S390X-NEXT: ler %f0, %f1
3347 ; S390X-NEXT: brasl %r14, logf@PLT
3348 ; S390X-NEXT: ler %f4, %f0
3349 ; S390X-NEXT: ler %f0, %f8
3350 ; S390X-NEXT: ler %f2, %f9
3351 ; S390X-NEXT: ld %f8, 168(%r15) # 8-byte Folded Reload
3352 ; S390X-NEXT: ld %f9, 160(%r15) # 8-byte Folded Reload
3353 ; S390X-NEXT: lmg %r14, %r15, 288(%r15)
3354 ; S390X-NEXT: br %r14
3355 ;
3356 ; SZ13-LABEL: constrained_vector_log_v3f32:
3357 ; SZ13: # %bb.0: # %entry
3358 ; SZ13-NEXT: stmg %r14, %r15, 112(%r15)
3359 ; SZ13-NEXT: .cfi_offset %r14, -48
3360 ; SZ13-NEXT: .cfi_offset %r15, -40
3361 ; SZ13-NEXT: aghi %r15, -192
3362 ; SZ13-NEXT: .cfi_def_cfa_offset 352
3363 ; SZ13-NEXT: larl %r1, .LCPI62_0
3364 ; SZ13-NEXT: lde %f0, 0(%r1)
3365 ; SZ13-NEXT: brasl %r14, logf@PLT
3366 ; S