Skip to content

Commit 5a1a522

Browse files
authored
[SPIRV][HLSL] Add mad intrinsic lowering for spirv (#89130)
- `clang/lib/CodeGen/CGBuiltin.cpp` - Add a generic mull add implementation. Make DXIL implementation tied to target. resolves #88944
1 parent d8503a3 commit 5a1a522

File tree

5 files changed

+479
-113
lines changed

5 files changed

+479
-113
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18296,20 +18296,28 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
1829618296
Value *M = EmitScalarExpr(E->getArg(0));
1829718297
Value *A = EmitScalarExpr(E->getArg(1));
1829818298
Value *B = EmitScalarExpr(E->getArg(2));
18299-
if (E->getArg(0)->getType()->hasFloatingRepresentation()) {
18299+
if (E->getArg(0)->getType()->hasFloatingRepresentation())
1830018300
return Builder.CreateIntrinsic(
1830118301
/*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+
1830418304
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);
1830818312
}
1830918313
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);
1831318321
}
1831418322
case Builtin::BI__builtin_hlsl_elementwise_rcp: {
1831518323
Value *Op0 = EmitScalarExpr(E->getArg(0));

0 commit comments

Comments
 (0)