mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-21 07:19:46 +08:00
Merged eigen/eigen into default
This commit is contained in:
commit
d7eeee0c1d
@ -1034,7 +1034,7 @@ double tan(const double &x) { return ::tan(x); }
|
||||
|
||||
template<typename T>
|
||||
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
||||
T abs(const T &x) {
|
||||
typename NumTraits<T>::Real abs(const T &x) {
|
||||
EIGEN_USING_STD_MATH(abs);
|
||||
return abs(x);
|
||||
}
|
||||
|
@ -177,7 +177,9 @@ template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, co
|
||||
return pset1<Packet4i>(0);
|
||||
}
|
||||
|
||||
#ifdef __ARM_FEATURE_FMA
|
||||
// Clang/ARM wrongly advertises __ARM_FEATURE_FMA even when it's not available,
|
||||
// then implements a slow software scalar fallback calling fmaf()!
|
||||
#if (defined __ARM_FEATURE_FMA) && !(EIGEN_COMP_CLANG && EIGEN_ARCH_ARM)
|
||||
// See bug 936.
|
||||
// FMA is available on VFPv4 i.e. when compiling with -mfpu=neon-vfpv4.
|
||||
// FMA is a true fused multiply-add i.e. only 1 rounding at the end, no intermediate rounding.
|
||||
@ -186,7 +188,25 @@ template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, co
|
||||
// MLA: 10 GFlop/s ; FMA: 12 GFlops/s.
|
||||
template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vfmaq_f32(c,a,b); }
|
||||
#else
|
||||
template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vmlaq_f32(c,a,b); }
|
||||
template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
|
||||
#if EIGEN_COMP_CLANG && EIGEN_ARCH_ARM
|
||||
// Clang/ARM will replace VMLA by VMUL+VADD at least for some values of -mcpu,
|
||||
// at least -mcpu=cortex-a8 and -mcpu=cortex-a7. Since the former is the default on
|
||||
// -march=armv7-a, that is a very common case.
|
||||
// See e.g. this thread:
|
||||
// http://lists.llvm.org/pipermail/llvm-dev/2013-December/068806.html
|
||||
Packet4f r = c;
|
||||
asm volatile(
|
||||
"vmla.f32 %q[r], %q[a], %q[b]"
|
||||
: [r] "+w" (r)
|
||||
: [a] "w" (a),
|
||||
[b] "w" (b)
|
||||
: );
|
||||
return r;
|
||||
#else
|
||||
return vmlaq_f32(c,a,b);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
// No FMA instruction for int, so use MLA unconditionally.
|
||||
|
@ -41,7 +41,7 @@ struct functor_traits<scalar_opposite_op<Scalar> >
|
||||
template<typename Scalar> struct scalar_abs_op {
|
||||
EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op)
|
||||
typedef typename NumTraits<Scalar>::Real result_type;
|
||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using std::abs; return abs(a); }
|
||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs(a); }
|
||||
template<typename Packet>
|
||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
||||
{ return internal::pabs(a); }
|
||||
|
@ -26,7 +26,7 @@ function(DetermineShortWindowsName WIN_VERSION win_num_version)
|
||||
endfunction()
|
||||
|
||||
function(DetermineOSVersion OS_VERSION)
|
||||
if (WIN32)
|
||||
if (WIN32 AND CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
|
||||
file (TO_NATIVE_PATH "$ENV{COMSPEC}" SHELL)
|
||||
exec_program( ${SHELL} ARGS "/c" "ver" OUTPUT_VARIABLE ver_output)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user