@@ -144,6 +144,8 @@ const LowerOrUnitLowerTriangular{T,S<:AbstractMatrix{T}} = Union{LowerTriangular
144144const UpperOrLowerTriangular{T,S<: AbstractMatrix{T} } = Union{UpperOrUnitUpperTriangular{T,S}, LowerOrUnitLowerTriangular{T,S}}
145145const UnitUpperOrUnitLowerTriangular{T,S<: AbstractMatrix{T} } = Union{UnitUpperTriangular{T,S}, UnitLowerTriangular{T,S}}
146146
147+ const UpperOrLowerTriangularStrided{T,S<: StridedMatrix{T} } = UpperOrLowerTriangular{T,S}
148+
147149uppertriangular (M) = UpperTriangular (M)
148150lowertriangular (M) = LowerTriangular (M)
149151
@@ -1116,11 +1118,20 @@ for (TA, TB) in ((:AbstractTriangular, :AbstractMatrix),
11161118 if isone (alpha) && iszero (beta)
11171119 return _trimul! (C, A, B)
11181120 else
1119- return generic_matmatmul ! (C, ' N ' , ' N ' , A, B, alpha, beta)
1121+ return generic_matmatmulNN ! (C, A, B, alpha, beta)
11201122 end
11211123 end
11221124end
11231125
1126+ generic_matmatmulNN! (C, A, B, alpha, beta) = generic_matmatmul! (C, ' N' , ' N' , A, B, alpha, beta)
1127+ # Optimization for strided matrices, where we know that _generic_matmatmul! will be taken
1128+ for (TA, TB) in ((:UpperOrLowerTriangularStrided , :StridedMatrix ),
1129+ (:StridedMatrix , :UpperOrLowerTriangularStrided ),
1130+ (:UpperOrLowerTriangularStrided , :UpperOrLowerTriangularStrided )
1131+ )
1132+ @eval generic_matmatmulNN! (C, A:: $TA , B:: $TB , alpha, beta) = _generic_matmatmul! (C, A, B, alpha, beta)
1133+ end
1134+
11241135ldiv! (C:: AbstractVecOrMat , A:: AbstractTriangular , B:: AbstractVecOrMat ) = _ldiv! (C, A, B)
11251136# generic fallback for AbstractTriangular, directs to 2-arg [l/r]div!
11261137_ldiv! (C:: AbstractVecOrMat , A:: AbstractTriangular , B:: AbstractVecOrMat ) =
0 commit comments