================
@@ -2954,15 +2976,47 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
llvm::Value *Zero = llvm::Constant::getNullValue(CGF.SizeTy);
return Builder.CreateExtractElement(Vec, Zero, "cast.vtrunc");
}
+ case CK_HLSLMatrixTruncation: {
+ assert((DestTy->isMatrixType() || DestTy->isBuiltinType()) &&
+ "Destination type must be a matrix or builtin type.");
+ Value *Mat = Visit(E);
+ if (auto *MatTy = DestTy->getAs<ConstantMatrixType>()) {
+ SmallVector<int> Mask;
+ unsigned NumCols = MatTy->getNumColumns();
+ unsigned NumRows = MatTy->getNumRows();
+ unsigned ColOffset = NumCols;
+ if (auto *SrcMatTy = E->getType()->getAs<ConstantMatrixType>())
+ ColOffset = SrcMatTy->getNumColumns();
+ for (unsigned R = 0; R < NumRows; R++) {
+ for (unsigned C = 0; C < NumCols; C++) {
+ unsigned I = R * ColOffset + C;
+ Mask.push_back(I);
+ }
+ }
+
+ return Builder.CreateShuffleVector(Mat, Mask, "trunc");
+ }
+ llvm::Value *Zero = llvm::Constant::getNullValue(CGF.SizeTy);
+ return Builder.CreateExtractElement(Mat, Zero, "cast.mtrunc");
----------------
llvm-beanz wrote:
Is this possible in HLSL? I suspect it isn't, so this should probably be an
assert/error rather than returning a zero'd matrix.
https://github.com/llvm/llvm-project/pull/168915
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits