clang: lib/CodeGen/TargetBuiltins/SystemZ.cpp Source File (original) (raw)
25 unsigned IntrinsicID,
27 unsigned NumArgs = E->getNumArgs() - 1;
29 for (unsigned I = 0; I < NumArgs; ++I)
36 return CGF.Builder.CreateExtractValue(Call, 0);
37}
41 switch (BuiltinID) {
42 case SystemZ::BI__builtin_tbegin: {
44 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c);
45 Function *F = CGM.getIntrinsic(Intrinsic::s390_tbegin);
46 return Builder.CreateCall(F, {TDB, Control});
47 }
48 case SystemZ::BI__builtin_tbegin_nofloat: {
50 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff0c);
51 Function *F = CGM.getIntrinsic(Intrinsic::s390_tbegin_nofloat);
52 return Builder.CreateCall(F, {TDB, Control});
53 }
54 case SystemZ::BI__builtin_tbeginc: {
55 Value *TDB = llvm::ConstantPointerNull::get(Int8PtrTy);
56 Value *Control = llvm::ConstantInt::get(Int32Ty, 0xff08);
57 Function *F = CGM.getIntrinsic(Intrinsic::s390_tbeginc);
58 return Builder.CreateCall(F, {TDB, Control});
59 }
60 case SystemZ::BI__builtin_tabort: {
62 Function *F = CGM.getIntrinsic(Intrinsic::s390_tabort);
64 }
65 case SystemZ::BI__builtin_non_tx_store: {
68 Function *F = CGM.getIntrinsic(Intrinsic::s390_ntstg);
70 }
71
72
73
74
75
76
77 case SystemZ::BI__builtin_s390_vclzb:
78 case SystemZ::BI__builtin_s390_vclzh:
79 case SystemZ::BI__builtin_s390_vclzf:
80 case SystemZ::BI__builtin_s390_vclzg:
81 case SystemZ::BI__builtin_s390_vclzq: {
84 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);
85 Function *F = CGM.getIntrinsic(Intrinsic::ctlz, ResultType);
86 return Builder.CreateCall(F, {X, Undef});
87 }
88
89 case SystemZ::BI__builtin_s390_vctzb:
90 case SystemZ::BI__builtin_s390_vctzh:
91 case SystemZ::BI__builtin_s390_vctzf:
92 case SystemZ::BI__builtin_s390_vctzg:
93 case SystemZ::BI__builtin_s390_vctzq: {
96 Value *Undef = ConstantInt::get(Builder.getInt1Ty(), false);
97 Function *F = CGM.getIntrinsic(Intrinsic::cttz, ResultType);
98 return Builder.CreateCall(F, {X, Undef});
99 }
100
101 case SystemZ::BI__builtin_s390_verllb:
102 case SystemZ::BI__builtin_s390_verllh:
103 case SystemZ::BI__builtin_s390_verllf:
104 case SystemZ::BI__builtin_s390_verllg: {
108
110 Amt = Builder.CreateIntCast(Amt, ResultType->getScalarType(), false);
111 Amt = Builder.CreateVectorSplat(NumElts, Amt);
112 Function *F = CGM.getIntrinsic(Intrinsic::fshl, ResultType);
113 return Builder.CreateCall(F, { Src, Src, Amt });
114 }
115
116 case SystemZ::BI__builtin_s390_verllvb:
117 case SystemZ::BI__builtin_s390_verllvh:
118 case SystemZ::BI__builtin_s390_verllvf:
119 case SystemZ::BI__builtin_s390_verllvg: {
123 Function *F = CGM.getIntrinsic(Intrinsic::fshl, ResultType);
124 return Builder.CreateCall(F, { Src, Src, Amt });
125 }
126
127 case SystemZ::BI__builtin_s390_vfsqsb:
128 case SystemZ::BI__builtin_s390_vfsqdb: {
131 if (Builder.getIsFPConstrained()) {
132 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_sqrt, ResultType);
133 return Builder.CreateConstrainedFPCall(F, { X });
134 } else {
135 Function *F = CGM.getIntrinsic(Intrinsic::sqrt, ResultType);
136 return Builder.CreateCall(F, X);
137 }
138 }
139 case SystemZ::BI__builtin_s390_vfmasb:
140 case SystemZ::BI__builtin_s390_vfmadb: {
145 if (Builder.getIsFPConstrained()) {
146 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
147 return Builder.CreateConstrainedFPCall(F, {X, Y, Z});
148 } else {
149 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
150 return Builder.CreateCall(F, {X, Y, Z});
151 }
152 }
153 case SystemZ::BI__builtin_s390_vfmssb:
154 case SystemZ::BI__builtin_s390_vfmsdb: {
159 if (Builder.getIsFPConstrained()) {
160 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
161 return Builder.CreateConstrainedFPCall(F, {X, Y, Builder.CreateFNeg(Z, "neg")});
162 } else {
163 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
164 return Builder.CreateCall(F, {X, Y, Builder.CreateFNeg(Z, "neg")});
165 }
166 }
167 case SystemZ::BI__builtin_s390_vfnmasb:
168 case SystemZ::BI__builtin_s390_vfnmadb: {
173 if (Builder.getIsFPConstrained()) {
174 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
175 return Builder.CreateFNeg(Builder.CreateConstrainedFPCall(F, {X, Y, Z}), "neg");
176 } else {
177 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
178 return Builder.CreateFNeg(Builder.CreateCall(F, {X, Y, Z}), "neg");
179 }
180 }
181 case SystemZ::BI__builtin_s390_vfnmssb:
182 case SystemZ::BI__builtin_s390_vfnmsdb: {
187 if (Builder.getIsFPConstrained()) {
188 Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
190 return Builder.CreateFNeg(Builder.CreateConstrainedFPCall(F, {X, Y, NegZ}));
191 } else {
192 Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
194 return Builder.CreateFNeg(Builder.CreateCall(F, {X, Y, NegZ}));
195 }
196 }
197 case SystemZ::BI__builtin_s390_vflpsb:
198 case SystemZ::BI__builtin_s390_vflpdb: {
201 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
202 return Builder.CreateCall(F, X);
203 }
204 case SystemZ::BI__builtin_s390_vflnsb:
205 case SystemZ::BI__builtin_s390_vflndb: {
208 Function *F = CGM.getIntrinsic(Intrinsic::fabs, ResultType);
209 return Builder.CreateFNeg(Builder.CreateCall(F, X), "neg");
210 }
211 case SystemZ::BI__builtin_s390_vfisb:
212 case SystemZ::BI__builtin_s390_vfidb: {
215
218
219
220 Intrinsic::ID ID = Intrinsic::not_intrinsic;
221 Intrinsic::ID CI;
222 switch (M4.getZExtValue()) {
223 default: break;
224 case 0:
225 switch (M5.getZExtValue()) {
226 default: break;
227 case 0: ID = Intrinsic::rint;
228 CI = Intrinsic::experimental_constrained_rint; break;
229 }
230 break;
231 case 4:
232 switch (M5.getZExtValue()) {
233 default: break;
234 case 0: ID = Intrinsic::nearbyint;
235 CI = Intrinsic::experimental_constrained_nearbyint; break;
236 case 1: ID = Intrinsic::round;
237 CI = Intrinsic::experimental_constrained_round; break;
238 case 4: ID = Intrinsic::roundeven;
239 CI = Intrinsic::experimental_constrained_roundeven; break;
240 case 5: ID = Intrinsic::trunc;
241 CI = Intrinsic::experimental_constrained_trunc; break;
242 case 6: ID = Intrinsic::ceil;
243 CI = Intrinsic::experimental_constrained_ceil; break;
244 case 7: ID = Intrinsic::floor;
245 CI = Intrinsic::experimental_constrained_floor; break;
246 }
247 break;
248 }
249 if (ID != Intrinsic::not_intrinsic) {
250 if (Builder.getIsFPConstrained()) {
251 Function *F = CGM.getIntrinsic(CI, ResultType);
252 return Builder.CreateConstrainedFPCall(F, X);
253 } else {
254 Function *F = CGM.getIntrinsic(ID, ResultType);
255 return Builder.CreateCall(F, X);
256 }
257 }
258 switch (BuiltinID) {
259 case SystemZ::BI__builtin_s390_vfisb: ID = Intrinsic::s390_vfisb; break;
260 case SystemZ::BI__builtin_s390_vfidb: ID = Intrinsic::s390_vfidb; break;
261 default: llvm_unreachable("Unknown BuiltinID");
262 }
266 return Builder.CreateCall(F, {X, M4Value, M5Value});
267 }
268 case SystemZ::BI__builtin_s390_vfmaxsb:
269 case SystemZ::BI__builtin_s390_vfmaxdb: {
273
275
276
277 Intrinsic::ID ID = Intrinsic::not_intrinsic;
278 Intrinsic::ID CI;
279 switch (M4.getZExtValue()) {
280 default: break;
281 case 4: ID = Intrinsic::maxnum;
282 CI = Intrinsic::experimental_constrained_maxnum; break;
283 }
284 if (ID != Intrinsic::not_intrinsic) {
285 if (Builder.getIsFPConstrained()) {
286 Function *F = CGM.getIntrinsic(CI, ResultType);
287 return Builder.CreateConstrainedFPCall(F, {X, Y});
288 } else {
289 Function *F = CGM.getIntrinsic(ID, ResultType);
290 return Builder.CreateCall(F, {X, Y});
291 }
292 }
293 switch (BuiltinID) {
294 case SystemZ::BI__builtin_s390_vfmaxsb: ID = Intrinsic::s390_vfmaxsb; break;
295 case SystemZ::BI__builtin_s390_vfmaxdb: ID = Intrinsic::s390_vfmaxdb; break;
296 default: llvm_unreachable("Unknown BuiltinID");
297 }
300 return Builder.CreateCall(F, {X, Y, M4Value});
301 }
302 case SystemZ::BI__builtin_s390_vfminsb:
303 case SystemZ::BI__builtin_s390_vfmindb: {
307
309
310
311 Intrinsic::ID ID = Intrinsic::not_intrinsic;
312 Intrinsic::ID CI;
313 switch (M4.getZExtValue()) {
314 default: break;
315 case 4: ID = Intrinsic::minnum;
316 CI = Intrinsic::experimental_constrained_minnum; break;
317 }
318 if (ID != Intrinsic::not_intrinsic) {
319 if (Builder.getIsFPConstrained()) {
320 Function *F = CGM.getIntrinsic(CI, ResultType);
321 return Builder.CreateConstrainedFPCall(F, {X, Y});
322 } else {
323 Function *F = CGM.getIntrinsic(ID, ResultType);
324 return Builder.CreateCall(F, {X, Y});
325 }
326 }
327 switch (BuiltinID) {
328 case SystemZ::BI__builtin_s390_vfminsb: ID = Intrinsic::s390_vfminsb; break;
329 case SystemZ::BI__builtin_s390_vfmindb: ID = Intrinsic::s390_vfmindb; break;
330 default: llvm_unreachable("Unknown BuiltinID");
331 }
334 return Builder.CreateCall(F, {X, Y, M4Value});
335 }
336
337 case SystemZ::BI__builtin_s390_vlbrh:
338 case SystemZ::BI__builtin_s390_vlbrf:
339 case SystemZ::BI__builtin_s390_vlbrg:
340 case SystemZ::BI__builtin_s390_vlbrq: {
343 Function *F = CGM.getIntrinsic(Intrinsic::bswap, ResultType);
344 return Builder.CreateCall(F, X);
345 }
346
347
348
349#define INTRINSIC_WITH_CC(NAME) \
350 case SystemZ::BI__builtin_##NAME: \
351 return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E)
352
356
360
366
372
378
382
386
390
394
398
402
406
410
414
421
424
428
432
433#undef INTRINSIC_WITH_CC
434
435 default:
436 return nullptr;
437 }
438}