Always vectorize abs2() for non-complex types.

For several packet types, `abs2` was not vectorized even if it only requires `pmul`. Get rid of the confusing and redundant `HasAbs2` enum and instead check `HasMul` in addition to making sure the scalar type is not complex.

See merge request libeigen/eigen!2048
This commit is contained in:
Rasmus Munk Larsen
2025-10-30 02:42:56 +00:00
parent 60122df698
commit ece9a4c0b6
9 changed files with 4 additions and 32 deletions

View File

@@ -179,7 +179,6 @@ struct packet_traits<Eigen::half> : default_packet_traits {
HasCos = EIGEN_FAST_MATH,
HasNegate = 1,
HasAbs = 1,
HasAbs2 = 0,
HasMin = 1,
HasMax = 1,
HasConj = 1,
@@ -218,7 +217,6 @@ struct packet_traits<bfloat16> : default_packet_traits {
HasCos = EIGEN_FAST_MATH,
HasNegate = 1,
HasAbs = 1,
HasAbs2 = 0,
HasMin = 1,
HasMax = 1,
HasConj = 1,

View File

@@ -84,7 +84,6 @@ struct packet_traits<half> : default_packet_traits {
HasDiv = 1,
HasNegate = 1,
HasAbs = 1,
HasAbs2 = 0,
HasMin = 1,
HasMax = 1,
HasConj = 1,

View File

@@ -42,7 +42,6 @@ struct packet_traits<half> : default_packet_traits {
HasDiv = 1,
HasNegate = 1,
HasAbs = 1,
HasAbs2 = 0,
HasMin = 1,
HasMax = 1,
HasConj = 1,

View File

@@ -152,7 +152,6 @@ struct packet_traits<float> : default_packet_traits {
HasNegate = 1,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 0,
HasAbsDiff = 0,
HasMin = 1,
HasMax = 1,

View File

@@ -169,7 +169,6 @@ struct packet_traits<int8_t> : default_packet_traits {
AlignedOnScalar = 1,
size = 16,
HasAbs2 = 0,
HasSetLinear = 0,
HasCmp = 1,
HasBlend = 0
@@ -185,7 +184,6 @@ struct packet_traits<int16_t> : default_packet_traits {
AlignedOnScalar = 1,
size = 8,
HasAbs2 = 0,
HasSetLinear = 0,
HasCmp = 1,
HasDiv = 1,
@@ -202,7 +200,6 @@ struct packet_traits<int32_t> : default_packet_traits {
AlignedOnScalar = 1,
size = 4,
HasAbs2 = 0,
HasSetLinear = 0,
HasCmp = 1,
HasDiv = 1,
@@ -219,7 +216,6 @@ struct packet_traits<int64_t> : default_packet_traits {
AlignedOnScalar = 1,
size = 2,
HasAbs2 = 0,
HasSetLinear = 0,
HasCmp = 1,
HasDiv = 1,
@@ -236,7 +232,6 @@ struct packet_traits<uint8_t> : default_packet_traits {
AlignedOnScalar = 1,
size = 16,
HasAbs2 = 0,
HasSetLinear = 0,
HasNegate = 0,
HasCmp = 1,
@@ -253,7 +248,6 @@ struct packet_traits<uint16_t> : default_packet_traits {
AlignedOnScalar = 1,
size = 8,
HasAbs2 = 0,
HasSetLinear = 0,
HasNegate = 0,
HasCmp = 1,
@@ -271,7 +265,6 @@ struct packet_traits<uint32_t> : default_packet_traits {
AlignedOnScalar = 1,
size = 4,
HasAbs2 = 0,
HasSetLinear = 0,
HasNegate = 0,
HasCmp = 1,
@@ -289,7 +282,6 @@ struct packet_traits<uint64_t> : default_packet_traits {
AlignedOnScalar = 1,
size = 2,
HasAbs2 = 0,
HasSetLinear = 0,
HasNegate = 0,
HasCmp = 1,
@@ -307,7 +299,6 @@ struct packet_traits<float> : default_packet_traits {
AlignedOnScalar = 1,
size = 4,
HasAbs2 = 0,
HasSetLinear = 0,
HasBlend = 0,
HasSign = 0,
@@ -328,7 +319,6 @@ struct packet_traits<double> : default_packet_traits {
AlignedOnScalar = 1,
size = 2,
HasAbs2 = 0,
HasSetLinear = 0,
HasBlend = 0,
HasSign = 0,

View File

@@ -189,7 +189,6 @@ struct packet_traits<float> : default_packet_traits {
HasNegate = 1,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasAbsDiff = 1,
HasMin = 1,
HasMax = 1,
@@ -235,7 +234,6 @@ struct packet_traits<int8_t> : default_packet_traits {
HasAbs = 1,
HasAbsDiff = 1,
HasArg = 0,
HasAbs2 = 1,
HasMin = 1,
HasMax = 1,
HasConj = 1,
@@ -262,7 +260,6 @@ struct packet_traits<uint8_t> : default_packet_traits {
HasAbs = 1,
HasAbsDiff = 1,
HasArg = 0,
HasAbs2 = 1,
HasMin = 1,
HasMax = 1,
HasConj = 1,
@@ -291,7 +288,6 @@ struct packet_traits<int16_t> : default_packet_traits {
HasAbs = 1,
HasAbsDiff = 1,
HasArg = 0,
HasAbs2 = 1,
HasMin = 1,
HasMax = 1,
HasConj = 1,
@@ -318,7 +314,6 @@ struct packet_traits<uint16_t> : default_packet_traits {
HasAbs = 1,
HasAbsDiff = 1,
HasArg = 0,
HasAbs2 = 1,
HasMin = 1,
HasMax = 1,
HasConj = 1,
@@ -345,7 +340,6 @@ struct packet_traits<int32_t> : default_packet_traits {
HasNegate = 1,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasAbsDiff = 1,
HasMin = 1,
HasMax = 1,
@@ -372,7 +366,6 @@ struct packet_traits<uint32_t> : default_packet_traits {
HasNegate = 0,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasAbsDiff = 1,
HasMin = 1,
HasMax = 1,
@@ -401,7 +394,6 @@ struct packet_traits<int64_t> : default_packet_traits {
HasNegate = 1,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasAbsDiff = 1,
HasMin = 1,
HasMax = 1,
@@ -428,7 +420,6 @@ struct packet_traits<uint64_t> : default_packet_traits {
HasNegate = 0,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasAbsDiff = 1,
HasMin = 1,
HasMax = 1,
@@ -4663,7 +4654,6 @@ struct packet_traits<bfloat16> : default_packet_traits {
HasNegate = 1,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasAbsDiff = 1,
HasMin = 1,
HasMax = 1,
@@ -5048,7 +5038,6 @@ struct packet_traits<double> : default_packet_traits {
HasNegate = 1,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasAbsDiff = 1,
HasMin = 1,
HasMax = 1,
@@ -5424,7 +5413,6 @@ struct packet_traits<Eigen::half> : default_packet_traits {
HasNegate = 1,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasAbsDiff = 0,
HasMin = 1,
HasMax = 1,

View File

@@ -290,7 +290,6 @@ struct packet_traits<bool> : default_packet_traits {
HasCmp = 1,
HasShift = 0,
HasAbs = 0,
HasAbs2 = 0,
HasMin = 0,
HasMax = 0,
HasConj = 0,
@@ -2194,7 +2193,6 @@ struct packet_traits<Eigen::half> : default_packet_traits {
HasDiv = 1,
HasNegate = 0,
HasAbs = 0,
HasAbs2 = 0,
HasMin = 0,
HasMax = 0,
HasConj = 0,

View File

@@ -49,7 +49,6 @@ struct packet_traits<numext::int32_t> : default_packet_traits {
HasNegate = 1,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasMin = 1,
HasMax = 1,
HasConj = 1,
@@ -344,7 +343,6 @@ struct packet_traits<float> : default_packet_traits {
HasNegate = 1,
HasAbs = 1,
HasArg = 0,
HasAbs2 = 1,
HasMin = 1,
HasMax = 1,
HasConj = 1,

View File

@@ -100,7 +100,10 @@ struct scalar_abs2_op {
};
template <typename Scalar>
struct functor_traits<scalar_abs2_op<Scalar>> {
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 };
enum {
Cost = NumTraits<Scalar>::MulCost,
PacketAccess = packet_traits<Scalar>::HasMul && !NumTraits<Scalar>::IsComplex
};
};
template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>