11 #ifndef EIGEN_GEOMETRY_SIMD_H
12 #define EIGEN_GEOMETRY_SIMD_H
18 template<
class Derived,
class OtherDerived>
31 const float neg_zero = numext::bit_cast<float>(0x80000000u);
32 const float arr[4] = {0.f, 0.f, 0.f, neg_zero};
34 Packet4f a = ae.template packet<AAlignment,Packet4f>(0);
35 Packet4f b = be.template packet<BAlignment,Packet4f>(0);
38 pstoret<float,Packet4f,ResAlignment>(
49 template<
class Derived>
59 const float neg_zero = numext::bit_cast<float>(0x80000000u);
60 const float arr[4] = {neg_zero, neg_zero, neg_zero,0.f};
68 template<
typename VectorLhs,
typename VectorRhs>
75 run(
const VectorLhs& lhs,
const VectorRhs& rhs)
84 pstoret<float,Packet4f,ResAlignment>(&
res.x(),
psub(mul1,mul2));
91 #if (defined EIGEN_VECTORIZE_SSE) || (EIGEN_ARCH_ARM64)
93 template<
class Derived,
class OtherDerived>
94 struct quat_product<Architecture::
Target, Derived, OtherDerived, double>
97 BAlignment = traits<OtherDerived>::Alignment,
98 ResAlignment = traits<Quaternion<double> >::Alignment
101 static inline Quaternion<double>
run(
const QuaternionBase<Derived>& _a,
const QuaternionBase<OtherDerived>& _b)
103 Quaternion<double>
res;
105 evaluator<typename Derived::Coefficients> ae(_a.coeffs());
106 evaluator<typename OtherDerived::Coefficients> be(_b.coeffs());
108 const double*
a = _a.coeffs().data();
109 Packet2d b_xy = be.template packet<BAlignment,Packet2d>(0);
110 Packet2d b_zw = be.template packet<BAlignment,Packet2d>(2);
141 template<
class Derived>
142 struct quat_conj<Architecture::
Target, Derived, double>
145 ResAlignment = traits<Quaternion<double> >::Alignment
147 static inline Quaternion<double>
run(
const QuaternionBase<Derived>&
q)
149 evaluator<typename Derived::Coefficients> qe(
q.coeffs());
150 Quaternion<double>
res;
151 const double neg_zero = numext::bit_cast<double>(0x8000000000000000ull);
152 const double arr1[2] = {neg_zero, neg_zero};
153 const double arr2[2] = {neg_zero, 0.0};
156 pstoret<double,Packet2d,ResAlignment>(&
res.x(),
pxor(mask0, qe.template packet<traits<Derived>::Alignment,
Packet2d>(0)));
157 pstoret<double,Packet2d,ResAlignment>(&
res.z(),
pxor(mask2, qe.template packet<traits<Derived>::Alignment,
Packet2d>(2)));
162 #endif // end EIGEN_VECTORIZE_SSE_OR_EIGEN_ARCH_ARM64
168 #endif // EIGEN_GEOMETRY_SIMD_H