@@ -18296,20 +18296,28 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
18296
18296
Value *M = EmitScalarExpr(E->getArg(0));
18297
18297
Value *A = EmitScalarExpr(E->getArg(1));
18298
18298
Value *B = EmitScalarExpr(E->getArg(2));
18299
- if (E->getArg(0)->getType()->hasFloatingRepresentation()) {
18299
+ if (E->getArg(0)->getType()->hasFloatingRepresentation())
18300
18300
return Builder.CreateIntrinsic(
18301
18301
/*ReturnType*/ M->getType(), Intrinsic::fmuladd,
18302
- ArrayRef<Value *>{M, A, B}, nullptr, "dx .fmad");
18303
- }
18302
+ ArrayRef<Value *>{M, A, B}, nullptr, "hlsl .fmad");
18303
+
18304
18304
if (E->getArg(0)->getType()->hasSignedIntegerRepresentation()) {
18305
- return Builder.CreateIntrinsic(
18306
- /*ReturnType*/ M->getType(), Intrinsic::dx_imad,
18307
- ArrayRef<Value *>{M, A, B}, nullptr, "dx.imad");
18305
+ if (CGM.getTarget().getTriple().getArch() == llvm::Triple::dxil)
18306
+ return Builder.CreateIntrinsic(
18307
+ /*ReturnType*/ M->getType(), Intrinsic::dx_imad,
18308
+ ArrayRef<Value *>{M, A, B}, nullptr, "dx.imad");
18309
+
18310
+ Value *Mul = Builder.CreateNSWMul(M, A);
18311
+ return Builder.CreateNSWAdd(Mul, B);
18308
18312
}
18309
18313
assert(E->getArg(0)->getType()->hasUnsignedIntegerRepresentation());
18310
- return Builder.CreateIntrinsic(
18311
- /*ReturnType=*/M->getType(), Intrinsic::dx_umad,
18312
- ArrayRef<Value *>{M, A, B}, nullptr, "dx.umad");
18314
+ if (CGM.getTarget().getTriple().getArch() == llvm::Triple::dxil)
18315
+ return Builder.CreateIntrinsic(
18316
+ /*ReturnType=*/M->getType(), Intrinsic::dx_umad,
18317
+ ArrayRef<Value *>{M, A, B}, nullptr, "dx.umad");
18318
+
18319
+ Value *Mul = Builder.CreateNUWMul(M, A);
18320
+ return Builder.CreateNUWAdd(Mul, B);
18313
18321
}
18314
18322
case Builtin::BI__builtin_hlsl_elementwise_rcp: {
18315
18323
Value *Op0 = EmitScalarExpr(E->getArg(0));
0 commit comments