From 1550c9954112a07d2812183efeff528bfbac052b Mon Sep 17 00:00:00 2001 From: Charles Schlosser Date: Fri, 19 Apr 2024 17:52:34 +0000 Subject: [PATCH] Eigen select --- Eigen/src/Core/CoreEvaluators.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Eigen/src/Core/CoreEvaluators.h b/Eigen/src/Core/CoreEvaluators.h index c6206005e..5e1cbf6ec 100644 --- a/Eigen/src/Core/CoreEvaluators.h +++ b/Eigen/src/Core/CoreEvaluators.h @@ -840,6 +840,27 @@ struct ternary_evaluator, IndexBased Data m_d; }; +// specialization for expresions like (a < b).select(c, d) to enable full vectorization +template +struct evaluator, Arg1, Arg2, + CwiseBinaryOp, CmpLhsType, CmpRhsType>>> + : public ternary_evaluator< + CwiseTernaryOp, Arg1, Arg2, + CwiseBinaryOp, CmpLhsType, CmpRhsType>>> { + using DummyTernaryOp = scalar_boolean_select_op; + using DummyArg3 = CwiseBinaryOp, CmpLhsType, CmpRhsType>; + using DummyXprType = CwiseTernaryOp; + + using TernaryOp = scalar_boolean_select_op; + using Arg3 = CwiseBinaryOp, CmpLhsType, CmpRhsType>; + using XprType = CwiseTernaryOp; + + using Base = ternary_evaluator; + + EIGEN_DEVICE_FUNC explicit evaluator(const DummyXprType& xpr) + : Base(XprType(xpr.arg1(), xpr.arg2(), Arg3(xpr.arg3().lhs(), xpr.arg3().rhs()))) {} +}; + // -------------------- CwiseBinaryOp -------------------- // this is a binary expression