@@ -18186,6 +18186,40 @@ Intrinsic::ID getDotProductIntrinsic(QualType QT, int elementCount) {
18186
18186
return Intrinsic::dx_udot;
18187
18187
}
18188
18188
18189
+ Value *CodeGenFunction::EmitHLSLMadIntrinsic(const CallExpr *E) {
18190
+ Value *M = EmitScalarExpr(E->getArg(0));
18191
+ Value *A = EmitScalarExpr(E->getArg(1));
18192
+ Value *B = EmitScalarExpr(E->getArg(2));
18193
+ if (E->getArg(0)->getType()->hasFloatingRepresentation())
18194
+ return Builder.CreateIntrinsic(
18195
+ /*ReturnType*/ M->getType(), Intrinsic::fmuladd,
18196
+ ArrayRef<Value *>{M, A, B}, nullptr, "hlsl.fmad");
18197
+
18198
+ auto EmitHLSLIMadDirectX = [E, M, A, B, this]() -> Value * {
18199
+ if (E->getArg(0)->getType()->hasSignedIntegerRepresentation())
18200
+ return Builder.CreateIntrinsic(
18201
+ /*ReturnType*/ M->getType(), Intrinsic::dx_imad,
18202
+ ArrayRef<Value *>{M, A, B}, nullptr, "dx.imad");
18203
+ assert(E->getArg(0)->getType()->hasUnsignedIntegerRepresentation());
18204
+ return Builder.CreateIntrinsic(
18205
+ /*ReturnType=*/M->getType(), Intrinsic::dx_umad,
18206
+ ArrayRef<Value *>{M, A, B}, nullptr, "dx.umad");
18207
+ };
18208
+
18209
+ auto EmitHLSLIMadGeneric = [E, M, A, B, this]() -> Value * {
18210
+ if (E->getArg(0)->getType()->hasSignedIntegerRepresentation()) {
18211
+ Value *Mul = Builder.CreateNSWMul(M, A);
18212
+ return Builder.CreateNSWAdd(Mul, B);
18213
+ }
18214
+ assert(E->getArg(0)->getType()->hasUnsignedIntegerRepresentation());
18215
+ Value *Mul = Builder.CreateNUWMul(M, A);
18216
+ return Builder.CreateNUWAdd(Mul, B);
18217
+ };
18218
+
18219
+ return CGM.getHLSLRuntime().emitHLSLIntrinsic(
18220
+ EmitHLSLIMadDirectX, EmitHLSLIMadGeneric, EmitHLSLIMadGeneric);
18221
+ }
18222
+
18189
18223
Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
18190
18224
const CallExpr *E) {
18191
18225
if (!getLangOpts().HLSL)
@@ -18291,23 +18325,7 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
18291
18325
ArrayRef<Value *>{Op0}, nullptr, "dx.isinf");
18292
18326
}
18293
18327
case Builtin::BI__builtin_hlsl_mad: {
18294
- Value *M = EmitScalarExpr(E->getArg(0));
18295
- Value *A = EmitScalarExpr(E->getArg(1));
18296
- Value *B = EmitScalarExpr(E->getArg(2));
18297
- if (E->getArg(0)->getType()->hasFloatingRepresentation()) {
18298
- return Builder.CreateIntrinsic(
18299
- /*ReturnType*/ M->getType(), Intrinsic::fmuladd,
18300
- ArrayRef<Value *>{M, A, B}, nullptr, "dx.fmad");
18301
- }
18302
- if (E->getArg(0)->getType()->hasSignedIntegerRepresentation()) {
18303
- return Builder.CreateIntrinsic(
18304
- /*ReturnType*/ M->getType(), Intrinsic::dx_imad,
18305
- ArrayRef<Value *>{M, A, B}, nullptr, "dx.imad");
18306
- }
18307
- assert(E->getArg(0)->getType()->hasUnsignedIntegerRepresentation());
18308
- return Builder.CreateIntrinsic(
18309
- /*ReturnType=*/M->getType(), Intrinsic::dx_umad,
18310
- ArrayRef<Value *>{M, A, B}, nullptr, "dx.umad");
18328
+ return EmitHLSLMadIntrinsic(E);
18311
18329
}
18312
18330
case Builtin::BI__builtin_hlsl_elementwise_rcp: {
18313
18331
Value *Op0 = EmitScalarExpr(E->getArg(0));
0 commit comments