@@ -13310,45 +13310,71 @@ Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID,
13310
13310
case SystemZ::BI__builtin_s390_vfsqdb: {
13311
13311
llvm::Type *ResultType = ConvertType(E->getType());
13312
13312
Value *X = EmitScalarExpr(E->getArg(0));
13313
- Function *F = CGM.getIntrinsic(Intrinsic::sqrt, ResultType);
13314
- return Builder.CreateCall(F, X);
13313
+ if (Builder.getIsFPConstrained()) {
13314
+ Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_sqrt, ResultType);
13315
+ return Builder.CreateConstrainedFPCall(F, { X });
13316
+ } else {
13317
+ Function *F = CGM.getIntrinsic(Intrinsic::sqrt, ResultType);
13318
+ return Builder.CreateCall(F, X);
13319
+ }
13315
13320
}
13316
13321
case SystemZ::BI__builtin_s390_vfmasb:
13317
13322
case SystemZ::BI__builtin_s390_vfmadb: {
13318
13323
llvm::Type *ResultType = ConvertType(E->getType());
13319
13324
Value *X = EmitScalarExpr(E->getArg(0));
13320
13325
Value *Y = EmitScalarExpr(E->getArg(1));
13321
13326
Value *Z = EmitScalarExpr(E->getArg(2));
13322
- Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
13323
- return Builder.CreateCall(F, {X, Y, Z});
13327
+ if (Builder.getIsFPConstrained()) {
13328
+ Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
13329
+ return Builder.CreateConstrainedFPCall(F, {X, Y, Z});
13330
+ } else {
13331
+ Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
13332
+ return Builder.CreateCall(F, {X, Y, Z});
13333
+ }
13324
13334
}
13325
13335
case SystemZ::BI__builtin_s390_vfmssb:
13326
13336
case SystemZ::BI__builtin_s390_vfmsdb: {
13327
13337
llvm::Type *ResultType = ConvertType(E->getType());
13328
13338
Value *X = EmitScalarExpr(E->getArg(0));
13329
13339
Value *Y = EmitScalarExpr(E->getArg(1));
13330
13340
Value *Z = EmitScalarExpr(E->getArg(2));
13331
- Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
13332
- return Builder.CreateCall(F, {X, Y, Builder.CreateFNeg(Z, "neg")});
13341
+ if (Builder.getIsFPConstrained()) {
13342
+ Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
13343
+ return Builder.CreateConstrainedFPCall(F, {X, Y, Builder.CreateFNeg(Z, "neg")});
13344
+ } else {
13345
+ Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
13346
+ return Builder.CreateCall(F, {X, Y, Builder.CreateFNeg(Z, "neg")});
13347
+ }
13333
13348
}
13334
13349
case SystemZ::BI__builtin_s390_vfnmasb:
13335
13350
case SystemZ::BI__builtin_s390_vfnmadb: {
13336
13351
llvm::Type *ResultType = ConvertType(E->getType());
13337
13352
Value *X = EmitScalarExpr(E->getArg(0));
13338
13353
Value *Y = EmitScalarExpr(E->getArg(1));
13339
13354
Value *Z = EmitScalarExpr(E->getArg(2));
13340
- Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
13341
- return Builder.CreateFNeg(Builder.CreateCall(F, {X, Y, Z}), "neg");
13355
+ if (Builder.getIsFPConstrained()) {
13356
+ Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
13357
+ return Builder.CreateFNeg(Builder.CreateConstrainedFPCall(F, {X, Y, Z}), "neg");
13358
+ } else {
13359
+ Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
13360
+ return Builder.CreateFNeg(Builder.CreateCall(F, {X, Y, Z}), "neg");
13361
+ }
13342
13362
}
13343
13363
case SystemZ::BI__builtin_s390_vfnmssb:
13344
13364
case SystemZ::BI__builtin_s390_vfnmsdb: {
13345
13365
llvm::Type *ResultType = ConvertType(E->getType());
13346
13366
Value *X = EmitScalarExpr(E->getArg(0));
13347
13367
Value *Y = EmitScalarExpr(E->getArg(1));
13348
13368
Value *Z = EmitScalarExpr(E->getArg(2));
13349
- Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
13350
- Value *NegZ = Builder.CreateFNeg(Z, "neg");
13351
- return Builder.CreateFNeg(Builder.CreateCall(F, {X, Y, NegZ}));
13369
+ if (Builder.getIsFPConstrained()) {
13370
+ Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_fma, ResultType);
13371
+ Value *NegZ = Builder.CreateFNeg(Z, "sub");
13372
+ return Builder.CreateFNeg(Builder.CreateConstrainedFPCall(F, {X, Y, NegZ}));
13373
+ } else {
13374
+ Function *F = CGM.getIntrinsic(Intrinsic::fma, ResultType);
13375
+ Value *NegZ = Builder.CreateFNeg(Z, "neg");
13376
+ return Builder.CreateFNeg(Builder.CreateCall(F, {X, Y, NegZ}));
13377
+ }
13352
13378
}
13353
13379
case SystemZ::BI__builtin_s390_vflpsb:
13354
13380
case SystemZ::BI__builtin_s390_vflpdb: {
@@ -13377,30 +13403,42 @@ Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID,
13377
13403
// Check whether this instance can be represented via a LLVM standard
13378
13404
// intrinsic. We only support some combinations of M4 and M5.
13379
13405
Intrinsic::ID ID = Intrinsic::not_intrinsic;
13406
+ Intrinsic::ID CI;
13380
13407
switch (M4.getZExtValue()) {
13381
13408
default: break;
13382
13409
case 0: // IEEE-inexact exception allowed
13383
13410
switch (M5.getZExtValue()) {
13384
13411
default: break;
13385
- case 0: ID = Intrinsic::rint; break;
13412
+ case 0: ID = Intrinsic::rint;
13413
+ CI = Intrinsic::experimental_constrained_rint; break;
13386
13414
}
13387
13415
break;
13388
13416
case 4: // IEEE-inexact exception suppressed
13389
13417
switch (M5.getZExtValue()) {
13390
13418
default: break;
13391
- case 0: ID = Intrinsic::nearbyint; break;
13392
- case 1: ID = Intrinsic::round; break;
13393
- case 5: ID = Intrinsic::trunc; break;
13394
- case 6: ID = Intrinsic::ceil; break;
13395
- case 7: ID = Intrinsic::floor; break;
13419
+ case 0: ID = Intrinsic::nearbyint;
13420
+ CI = Intrinsic::experimental_constrained_nearbyint; break;
13421
+ case 1: ID = Intrinsic::round;
13422
+ CI = Intrinsic::experimental_constrained_round; break;
13423
+ case 5: ID = Intrinsic::trunc;
13424
+ CI = Intrinsic::experimental_constrained_trunc; break;
13425
+ case 6: ID = Intrinsic::ceil;
13426
+ CI = Intrinsic::experimental_constrained_ceil; break;
13427
+ case 7: ID = Intrinsic::floor;
13428
+ CI = Intrinsic::experimental_constrained_floor; break;
13396
13429
}
13397
13430
break;
13398
13431
}
13399
13432
if (ID != Intrinsic::not_intrinsic) {
13400
- Function *F = CGM.getIntrinsic(ID, ResultType);
13401
- return Builder.CreateCall(F, X);
13433
+ if (Builder.getIsFPConstrained()) {
13434
+ Function *F = CGM.getIntrinsic(CI, ResultType);
13435
+ return Builder.CreateConstrainedFPCall(F, X);
13436
+ } else {
13437
+ Function *F = CGM.getIntrinsic(ID, ResultType);
13438
+ return Builder.CreateCall(F, X);
13439
+ }
13402
13440
}
13403
- switch (BuiltinID) {
13441
+ switch (BuiltinID) { // FIXME: constrained version?
13404
13442
case SystemZ::BI__builtin_s390_vfisb: ID = Intrinsic::s390_vfisb; break;
13405
13443
case SystemZ::BI__builtin_s390_vfidb: ID = Intrinsic::s390_vfidb; break;
13406
13444
default: llvm_unreachable("Unknown BuiltinID");
@@ -13423,13 +13461,20 @@ Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID,
13423
13461
// Check whether this instance can be represented via a LLVM standard
13424
13462
// intrinsic. We only support some values of M4.
13425
13463
Intrinsic::ID ID = Intrinsic::not_intrinsic;
13464
+ Intrinsic::ID CI;
13426
13465
switch (M4.getZExtValue()) {
13427
13466
default: break;
13428
- case 4: ID = Intrinsic::maxnum; break;
13467
+ case 4: ID = Intrinsic::maxnum;
13468
+ CI = Intrinsic::experimental_constrained_maxnum; break;
13429
13469
}
13430
13470
if (ID != Intrinsic::not_intrinsic) {
13431
- Function *F = CGM.getIntrinsic(ID, ResultType);
13432
- return Builder.CreateCall(F, {X, Y});
13471
+ if (Builder.getIsFPConstrained()) {
13472
+ Function *F = CGM.getIntrinsic(CI, ResultType);
13473
+ return Builder.CreateConstrainedFPCall(F, {X, Y});
13474
+ } else {
13475
+ Function *F = CGM.getIntrinsic(ID, ResultType);
13476
+ return Builder.CreateCall(F, {X, Y});
13477
+ }
13433
13478
}
13434
13479
switch (BuiltinID) {
13435
13480
case SystemZ::BI__builtin_s390_vfmaxsb: ID = Intrinsic::s390_vfmaxsb; break;
@@ -13453,13 +13498,20 @@ Value *CodeGenFunction::EmitSystemZBuiltinExpr(unsigned BuiltinID,
13453
13498
// Check whether this instance can be represented via a LLVM standard
13454
13499
// intrinsic. We only support some values of M4.
13455
13500
Intrinsic::ID ID = Intrinsic::not_intrinsic;
13501
+ Intrinsic::ID CI;
13456
13502
switch (M4.getZExtValue()) {
13457
13503
default: break;
13458
- case 4: ID = Intrinsic::minnum; break;
13504
+ case 4: ID = Intrinsic::minnum;
13505
+ CI = Intrinsic::experimental_constrained_minnum; break;
13459
13506
}
13460
13507
if (ID != Intrinsic::not_intrinsic) {
13461
- Function *F = CGM.getIntrinsic(ID, ResultType);
13462
- return Builder.CreateCall(F, {X, Y});
13508
+ if (Builder.getIsFPConstrained()) {
13509
+ Function *F = CGM.getIntrinsic(CI, ResultType);
13510
+ return Builder.CreateConstrainedFPCall(F, {X, Y});
13511
+ } else {
13512
+ Function *F = CGM.getIntrinsic(ID, ResultType);
13513
+ return Builder.CreateCall(F, {X, Y});
13514
+ }
13463
13515
}
13464
13516
switch (BuiltinID) {
13465
13517
case SystemZ::BI__builtin_s390_vfminsb: ID = Intrinsic::s390_vfminsb; break;
0 commit comments