================
@@ -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");
----------------
farzonl 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.
@llvm-beanz
Wait this isn't retuning a zero'd matrix. This is to handle the case so that we
just do an `CreateExtractElement` of index 0.
```hlsl
int trunc_cast6(int4x4 i44) {
int i1 = i44;
return i1;
}
```
https://github.com/llvm/llvm-project/pull/168915
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits