diff --git a/Eigen/src/Core/arch/AltiVec/PacketMath.h b/Eigen/src/Core/arch/AltiVec/PacketMath.h index 4de3b5e2e..c5bcf02aa 100644 --- a/Eigen/src/Core/arch/AltiVec/PacketMath.h +++ b/Eigen/src/Core/arch/AltiVec/PacketMath.h @@ -111,7 +111,7 @@ template<> inline v4i ei_pmul(const v4i& a, const v4i& b) USE_CONST_v1i; USE_CONST_v16i_; - // Get the absolute values + // Get the absolute values a1 = vec_abs(a); b1 = vec_abs(b); @@ -146,7 +146,7 @@ template<> inline v4f ei_pdiv(const v4f& a, const v4f& b) { // Altivec does not offer a divide instruction, we have to do a reciprocal approximation y_0 = vec_re(b); - + // Do one Newton-Raphson iteration to get the needed accuracy t = vec_nmsub(y_0, b, v1f); y_1 = vec_madd(y_0, t, y_0); @@ -260,6 +260,17 @@ template<> inline int ei_pfirst(const v4i& a) return ai[0]; } +template<> EIGEN_STRONG_INLINE v4f ei_preverse(const v4f& a) +{ + static const unsigned char __attribute__(aligned(16)) reverse_mask = {12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3}; + return (v4f)vec_perm((__vector unsigned char)a,(__vector unsigned char)a,reverse_mask); +} +template<> EIGEN_STRONG_INLINE v4i ei_preverse(const v4i& a) +{ + static const unsigned char __attribute__(aligned(16)) reverse_mask = {12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3}; + return (v4i)vec_perm((__vector unsigned char)a,(__vector unsigned char)a,reverse_mask); +} + inline v4f ei_preduxp(const v4f* vecs) { v4f v[4], sum[4]; diff --git a/Eigen/src/Geometry/Scaling.h b/Eigen/src/Geometry/Scaling.h index 435efe60d..22e356964 100644 --- a/Eigen/src/Geometry/Scaling.h +++ b/Eigen/src/Geometry/Scaling.h @@ -120,28 +120,28 @@ public: }; /** Constructs a uniform scaling from scale factor \a s */ -inline UniformScaling Scaling(float s) { return UniformScaling(s); } +static inline UniformScaling Scaling(float s) { return UniformScaling(s); } /** Constructs a uniform scaling from scale factor \a s */ -inline UniformScaling Scaling(double s) { return UniformScaling(s); } +static inline UniformScaling Scaling(double s) { return UniformScaling(s); } /** Constructs a uniform scaling from scale factor \a s */ -template inline UniformScaling > -Scaling(const std::complex& s) +template +static inline UniformScaling > Scaling(const std::complex& s) { return UniformScaling >(s); } /** Constructs a 2D axis aligned scaling */ -template inline DiagonalMatrix -Scaling(Scalar sx, Scalar sy) +template +static inline DiagonalMatrix Scaling(Scalar sx, Scalar sy) { return DiagonalMatrix(sx, sy); } /** Constructs a 3D axis aligned scaling */ -template inline DiagonalMatrix -Scaling(Scalar sx, Scalar sy, Scalar sz) +template +static inline DiagonalMatrix Scaling(Scalar sx, Scalar sy, Scalar sz) { return DiagonalMatrix(sx, sy, sz); } /** Constructs an axis aligned scaling expression from vector expression \a coeffs * This is an alias for coeffs.asDiagonal() */ template -inline const DiagonalMatrixWrapper Scaling(const MatrixBase& coeffs) +static inline const DiagonalMatrixWrapper Scaling(const MatrixBase& coeffs) { return coeffs.asDiagonal(); } /** \addtogroup Geometry_Module */ diff --git a/bench/bench_reverse.cpp b/bench/bench_reverse.cpp new file mode 100644 index 000000000..2cedc0d3d --- /dev/null +++ b/bench/bench_reverse.cpp @@ -0,0 +1,83 @@ + +#include +#include +using namespace Eigen; + +#ifndef REPEAT +#define REPEAT 100000 +#endif + +#ifndef TRIES +#define TRIES 20 +#endif + +typedef double Scalar; + +template +__attribute__ ((noinline)) void bench_reverse(const MatrixType& m) +{ + int rows = m.rows(); + int cols = m.cols(); + int size = m.size(); + + int repeats = (REPEAT*1000)/size; + MatrixType a = MatrixType::Random(rows,cols); + MatrixType b = MatrixType::Random(rows,cols); + + BenchTimer timerB, timerH, timerV; + + Scalar acc = 0; + int r = ei_random(0,rows-1); + int c = ei_random(0,cols-1); + for (int t=0; t0; ++i) + { + bench_reverse(Matrix(dynsizes[i],dynsizes[i])); + bench_reverse(Matrix(dynsizes[i]*dynsizes[i])); + } +// bench_reverse(Matrix()); +// bench_reverse(Matrix()); +// bench_reverse(Matrix()); +// bench_reverse(Matrix()); +// bench_reverse(Matrix()); +// bench_reverse(Matrix()); +// bench_reverse(Matrix()); +// bench_reverse(Matrix()); +// bench_reverse(Matrix()); + return 0; +} +