89 case SystemZ::BI__builtin_tbegin: {
91 Value *Control = llvm::ConstantInt::get(
Int32Ty, 0xff0c);
92 Function *F =
CGM.getIntrinsic(Intrinsic::s390_tbegin);
93 return Builder.CreateCall(F, {TDB, Control});
95 case SystemZ::BI__builtin_tbegin_nofloat: {
97 Value *Control = llvm::ConstantInt::get(
Int32Ty, 0xff0c);
98 Function *F =
CGM.getIntrinsic(Intrinsic::s390_tbegin_nofloat);
99 return Builder.CreateCall(F, {TDB, Control});
101 case SystemZ::BI__builtin_tbeginc: {
103 Value *Control = llvm::ConstantInt::get(
Int32Ty, 0xff08);
104 Function *F =
CGM.getIntrinsic(Intrinsic::s390_tbeginc);
105 return Builder.CreateCall(F, {TDB, Control});
107 case SystemZ::BI__builtin_tabort: {
109 Function *F =
CGM.getIntrinsic(Intrinsic::s390_tabort);
112 case SystemZ::BI__builtin_non_tx_store: {
115 Function *F =
CGM.getIntrinsic(Intrinsic::s390_ntstg);
118 case SystemZ::BI__cs: {
121 case SystemZ::BI__cs1: {
124 case SystemZ::BI__csg:
125 case SystemZ::BI__cds1: {
128 case SystemZ::BI__cdsg: {
129 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
138 case SystemZ::BI__builtin_s390_vclzb:
139 case SystemZ::BI__builtin_s390_vclzh:
140 case SystemZ::BI__builtin_s390_vclzf:
141 case SystemZ::BI__builtin_s390_vclzg:
142 case SystemZ::BI__builtin_s390_vclzq: {
145 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
146 Function *F =
CGM.getIntrinsic(Intrinsic::ctlz, ResultType);
147 return Builder.CreateCall(F, {
X, Undef});
150 case SystemZ::BI__builtin_s390_vctzb:
151 case SystemZ::BI__builtin_s390_vctzh:
152 case SystemZ::BI__builtin_s390_vctzf:
153 case SystemZ::BI__builtin_s390_vctzg:
154 case SystemZ::BI__builtin_s390_vctzq: {
157 Value *Undef = ConstantInt::get(
Builder.getInt1Ty(),
false);
158 Function *F =
CGM.getIntrinsic(Intrinsic::cttz, ResultType);
159 return Builder.CreateCall(F, {
X, Undef});
162 case SystemZ::BI__builtin_s390_verllb:
163 case SystemZ::BI__builtin_s390_verllh:
164 case SystemZ::BI__builtin_s390_verllf:
165 case SystemZ::BI__builtin_s390_verllg: {
171 Amt =
Builder.CreateIntCast(Amt, ResultType->getScalarType(),
false);
172 Amt =
Builder.CreateVectorSplat(NumElts, Amt);
173 Function *F =
CGM.getIntrinsic(Intrinsic::fshl, ResultType);
174 return Builder.CreateCall(F, { Src, Src, Amt });
177 case SystemZ::BI__builtin_s390_verllvb:
178 case SystemZ::BI__builtin_s390_verllvh:
179 case SystemZ::BI__builtin_s390_verllvf:
180 case SystemZ::BI__builtin_s390_verllvg: {
184 Function *F =
CGM.getIntrinsic(Intrinsic::fshl, ResultType);
185 return Builder.CreateCall(F, { Src, Src, Amt });
188 case SystemZ::BI__builtin_s390_vfsqsb:
189 case SystemZ::BI__builtin_s390_vfsqdb: {
192 if (
Builder.getIsFPConstrained()) {
193 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_sqrt, ResultType);
194 return Builder.CreateConstrainedFPCall(F, {
X });
196 Function *F =
CGM.getIntrinsic(Intrinsic::sqrt, ResultType);
200 case SystemZ::BI__builtin_s390_vfmasb:
201 case SystemZ::BI__builtin_s390_vfmadb: {
206 if (
Builder.getIsFPConstrained()) {
207 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
208 return Builder.CreateConstrainedFPCall(F, {
X, Y, Z});
210 Function *F =
CGM.getIntrinsic(Intrinsic::fma, ResultType);
211 return Builder.CreateCall(F, {
X, Y, Z});
214 case SystemZ::BI__builtin_s390_vfmssb:
215 case SystemZ::BI__builtin_s390_vfmsdb: {
220 if (
Builder.getIsFPConstrained()) {
221 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
222 return Builder.CreateConstrainedFPCall(F, {
X, Y,
Builder.CreateFNeg(Z,
"neg")});
224 Function *F =
CGM.getIntrinsic(Intrinsic::fma, ResultType);
228 case SystemZ::BI__builtin_s390_vfnmasb:
229 case SystemZ::BI__builtin_s390_vfnmadb: {
234 if (
Builder.getIsFPConstrained()) {
235 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
236 return Builder.CreateFNeg(
Builder.CreateConstrainedFPCall(F, {X, Y, Z}),
"neg");
238 Function *F =
CGM.getIntrinsic(Intrinsic::fma, ResultType);
239 return Builder.CreateFNeg(
Builder.CreateCall(F, {X, Y, Z}),
"neg");
242 case SystemZ::BI__builtin_s390_vfnmssb:
243 case SystemZ::BI__builtin_s390_vfnmsdb: {
248 if (
Builder.getIsFPConstrained()) {
249 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
251 return Builder.CreateFNeg(
Builder.CreateConstrainedFPCall(F, {X, Y, NegZ}));
253 Function *F =
CGM.getIntrinsic(Intrinsic::fma, ResultType);
258 case SystemZ::BI__builtin_s390_vflpsb:
259 case SystemZ::BI__builtin_s390_vflpdb: {
263 case SystemZ::BI__builtin_s390_vflnsb:
264 case SystemZ::BI__builtin_s390_vflndb: {
268 case SystemZ::BI__builtin_s390_vfisb:
269 case SystemZ::BI__builtin_s390_vfidb: {
277 Intrinsic::ID ID = Intrinsic::not_intrinsic;
279 switch (M4.getZExtValue()) {
282 switch (M5.getZExtValue()) {
284 case 0: ID = Intrinsic::rint;
285 CI = Intrinsic::experimental_constrained_rint;
break;
289 switch (M5.getZExtValue()) {
291 case 0: ID = Intrinsic::nearbyint;
292 CI = Intrinsic::experimental_constrained_nearbyint;
break;
293 case 1: ID = Intrinsic::round;
294 CI = Intrinsic::experimental_constrained_round;
break;
295 case 4: ID = Intrinsic::roundeven;
296 CI = Intrinsic::experimental_constrained_roundeven;
break;
297 case 5: ID = Intrinsic::trunc;
298 CI = Intrinsic::experimental_constrained_trunc;
break;
299 case 6: ID = Intrinsic::ceil;
300 CI = Intrinsic::experimental_constrained_ceil;
break;
301 case 7: ID = Intrinsic::floor;
302 CI = Intrinsic::experimental_constrained_floor;
break;
306 if (ID != Intrinsic::not_intrinsic) {
307 if (
Builder.getIsFPConstrained()) {
309 return Builder.CreateConstrainedFPCall(F,
X);
316 case SystemZ::BI__builtin_s390_vfisb: ID = Intrinsic::s390_vfisb;
break;
317 case SystemZ::BI__builtin_s390_vfidb: ID = Intrinsic::s390_vfidb;
break;
318 default: llvm_unreachable(
"Unknown BuiltinID");
323 return Builder.CreateCall(F, {
X, M4Value, M5Value});
325 case SystemZ::BI__builtin_s390_vfmaxsb:
326 case SystemZ::BI__builtin_s390_vfmaxdb: {
334 Intrinsic::ID ID = Intrinsic::not_intrinsic;
336 switch (M4.getZExtValue()) {
338 case 4: ID = Intrinsic::maxnum;
339 CI = Intrinsic::experimental_constrained_maxnum;
break;
341 if (ID != Intrinsic::not_intrinsic) {
342 if (
Builder.getIsFPConstrained()) {
344 return Builder.CreateConstrainedFPCall(F, {
X, Y});
347 return Builder.CreateCall(F, {
X, Y});
351 case SystemZ::BI__builtin_s390_vfmaxsb: ID = Intrinsic::s390_vfmaxsb;
break;
352 case SystemZ::BI__builtin_s390_vfmaxdb: ID = Intrinsic::s390_vfmaxdb;
break;
353 default: llvm_unreachable(
"Unknown BuiltinID");
357 return Builder.CreateCall(F, {
X, Y, M4Value});
359 case SystemZ::BI__builtin_s390_vfminsb:
360 case SystemZ::BI__builtin_s390_vfmindb: {
368 Intrinsic::ID ID = Intrinsic::not_intrinsic;
370 switch (M4.getZExtValue()) {
372 case 4: ID = Intrinsic::minnum;
373 CI = Intrinsic::experimental_constrained_minnum;
break;
375 if (ID != Intrinsic::not_intrinsic) {
376 if (
Builder.getIsFPConstrained()) {
378 return Builder.CreateConstrainedFPCall(F, {
X, Y});
381 return Builder.CreateCall(F, {
X, Y});
385 case SystemZ::BI__builtin_s390_vfminsb: ID = Intrinsic::s390_vfminsb;
break;
386 case SystemZ::BI__builtin_s390_vfmindb: ID = Intrinsic::s390_vfmindb;
break;
387 default: llvm_unreachable(
"Unknown BuiltinID");
391 return Builder.CreateCall(F, {
X, Y, M4Value});
394 case SystemZ::BI__builtin_s390_vlbrh:
395 case SystemZ::BI__builtin_s390_vlbrf:
396 case SystemZ::BI__builtin_s390_vlbrg:
397 case SystemZ::BI__builtin_s390_vlbrq: {
400 Function *F =
CGM.getIntrinsic(Intrinsic::bswap, ResultType);
406#define INTRINSIC_WITH_CC(NAME) \
407 case SystemZ::BI__builtin_##NAME: \
408 return EmitSystemZIntrinsicWithCC(*this, Intrinsic::NAME, E)
490#undef INTRINSIC_WITH_CC