* gnu/packages/patches/eigen-arm-neon-fixes.patch: New patch. * gnu/packages/algebra.scm (eigen): Update to 3.3.4. [source]: Use patch. Disable svd-preallocation test for BDCSVD. [arguments]: Set "EIGEN_SEED" environment variable in check phase. * gnu/local.mk (dist_patch_DATA): Add patch.
		
			
				
	
	
		
			245 lines
		
	
	
	
		
			9.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
	
		
			9.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| # HG changeset patch
 | |
| # User Gael Guennebaud <g.gael@free.fr>
 | |
| # Date 1497514590 -7200
 | |
| # Node ID d781c1de98342c5ca29c2fe719d8d3c96a35dcd4
 | |
| # Parent  48cd83b2b459aa9f3f5dca135d38760fe0b02a2f
 | |
| Bug 1436: fix compilation of Jacobi rotations with ARM NEON, some specializations of internal::conj_helper were missing.
 | |
| 
 | |
| diff --git a/Eigen/Core b/Eigen/Core
 | |
| --- a/Eigen/Core
 | |
| +++ b/Eigen/Core
 | |
| @@ -371,6 +371,7 @@
 | |
|  #include "src/Core/MathFunctions.h"
 | |
|  #include "src/Core/GenericPacketMath.h"
 | |
|  #include "src/Core/MathFunctionsImpl.h"
 | |
| +#include "src/Core/arch/Default/ConjHelper.h"
 | |
|  
 | |
|  #if defined EIGEN_VECTORIZE_AVX512
 | |
|    #include "src/Core/arch/SSE/PacketMath.h"
 | |
| diff --git a/Eigen/src/Core/arch/AVX/Complex.h b/Eigen/src/Core/arch/AVX/Complex.h
 | |
| --- a/Eigen/src/Core/arch/AVX/Complex.h
 | |
| +++ b/Eigen/src/Core/arch/AVX/Complex.h
 | |
| @@ -204,23 +204,7 @@
 | |
|    }
 | |
|  };
 | |
|  
 | |
| -template<> struct conj_helper<Packet8f, Packet4cf, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet4cf pmadd(const Packet8f& x, const Packet4cf& y, const Packet4cf& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet4cf pmul(const Packet8f& x, const Packet4cf& y) const
 | |
| -  { return Packet4cf(Eigen::internal::pmul(x, y.v)); }
 | |
| -};
 | |
| -
 | |
| -template<> struct conj_helper<Packet4cf, Packet8f, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet4cf pmadd(const Packet4cf& x, const Packet8f& y, const Packet4cf& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet4cf pmul(const Packet4cf& x, const Packet8f& y) const
 | |
| -  { return Packet4cf(Eigen::internal::pmul(x.v, y)); }
 | |
| -};
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet4cf,Packet8f)
 | |
|  
 | |
|  template<> EIGEN_STRONG_INLINE Packet4cf pdiv<Packet4cf>(const Packet4cf& a, const Packet4cf& b)
 | |
|  {
 | |
| @@ -400,23 +384,7 @@
 | |
|    }
 | |
|  };
 | |
|  
 | |
| -template<> struct conj_helper<Packet4d, Packet2cd, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet2cd pmadd(const Packet4d& x, const Packet2cd& y, const Packet2cd& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet2cd pmul(const Packet4d& x, const Packet2cd& y) const
 | |
| -  { return Packet2cd(Eigen::internal::pmul(x, y.v)); }
 | |
| -};
 | |
| -
 | |
| -template<> struct conj_helper<Packet2cd, Packet4d, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet2cd pmadd(const Packet2cd& x, const Packet4d& y, const Packet2cd& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet2cd pmul(const Packet2cd& x, const Packet4d& y) const
 | |
| -  { return Packet2cd(Eigen::internal::pmul(x.v, y)); }
 | |
| -};
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cd,Packet4d)
 | |
|  
 | |
|  template<> EIGEN_STRONG_INLINE Packet2cd pdiv<Packet2cd>(const Packet2cd& a, const Packet2cd& b)
 | |
|  {
 | |
| diff --git a/Eigen/src/Core/arch/AltiVec/Complex.h b/Eigen/src/Core/arch/AltiVec/Complex.h
 | |
| --- a/Eigen/src/Core/arch/AltiVec/Complex.h
 | |
| +++ b/Eigen/src/Core/arch/AltiVec/Complex.h
 | |
| @@ -224,23 +224,7 @@
 | |
|    }
 | |
|  };
 | |
|  
 | |
| -template<> struct conj_helper<Packet4f, Packet2cf, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet4f& x, const Packet2cf& y, const Packet2cf& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet4f& x, const Packet2cf& y) const
 | |
| -  { return Packet2cf(internal::pmul<Packet4f>(x, y.v)); }
 | |
| -};
 | |
| -
 | |
| -template<> struct conj_helper<Packet2cf, Packet4f, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet4f& y, const Packet2cf& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& x, const Packet4f& y) const
 | |
| -  { return Packet2cf(internal::pmul<Packet4f>(x.v, y)); }
 | |
| -};
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf,Packet4f)
 | |
|  
 | |
|  template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
 | |
|  {
 | |
| @@ -416,23 +400,8 @@
 | |
|      return pconj(internal::pmul(a, b));
 | |
|    }
 | |
|  };
 | |
| -template<> struct conj_helper<Packet2d, Packet1cd, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet2d& x, const Packet1cd& y, const Packet1cd& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
|  
 | |
| -  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet2d& x, const Packet1cd& y) const
 | |
| -  { return Packet1cd(internal::pmul<Packet2d>(x, y.v)); }
 | |
| -};
 | |
| -
 | |
| -template<> struct conj_helper<Packet1cd, Packet2d, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet2d& y, const Packet1cd& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& x, const Packet2d& y) const
 | |
| -  { return Packet1cd(internal::pmul<Packet2d>(x.v, y)); }
 | |
| -};
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd,Packet2d)
 | |
|  
 | |
|  template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
 | |
|  {
 | |
| diff --git a/Eigen/src/Core/arch/Default/ConjHelper.h b/Eigen/src/Core/arch/Default/ConjHelper.h
 | |
| new file mode 100644
 | |
| --- /dev/null
 | |
| +++ b/Eigen/src/Core/arch/Default/ConjHelper.h
 | |
| @@ -0,0 +1,29 @@
 | |
| +
 | |
| +// This file is part of Eigen, a lightweight C++ template library
 | |
| +// for linear algebra.
 | |
| +//
 | |
| +// Copyright (C) 2017 Gael Guennebaud <gael.guennebaud@inria.fr>
 | |
| +//
 | |
| +// This Source Code Form is subject to the terms of the Mozilla
 | |
| +// Public License v. 2.0. If a copy of the MPL was not distributed
 | |
| +// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | |
| +
 | |
| +#ifndef EIGEN_ARCH_CONJ_HELPER_H
 | |
| +#define EIGEN_ARCH_CONJ_HELPER_H
 | |
| +
 | |
| +#define EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(PACKET_CPLX, PACKET_REAL)                                                          \
 | |
| +  template<> struct conj_helper<PACKET_REAL, PACKET_CPLX, false,false> {                                          \
 | |
| +    EIGEN_STRONG_INLINE PACKET_CPLX pmadd(const PACKET_REAL& x, const PACKET_CPLX& y, const PACKET_CPLX& c) const \
 | |
| +    { return padd(c, pmul(x,y)); }                                                                                \
 | |
| +    EIGEN_STRONG_INLINE PACKET_CPLX pmul(const PACKET_REAL& x, const PACKET_CPLX& y) const                        \
 | |
| +    { return PACKET_CPLX(Eigen::internal::pmul<PACKET_REAL>(x, y.v)); }                                           \
 | |
| +  };                                                                                                              \
 | |
| +                                                                                                                  \
 | |
| +  template<> struct conj_helper<PACKET_CPLX, PACKET_REAL, false,false> {                                          \
 | |
| +    EIGEN_STRONG_INLINE PACKET_CPLX pmadd(const PACKET_CPLX& x, const PACKET_REAL& y, const PACKET_CPLX& c) const \
 | |
| +    { return padd(c, pmul(x,y)); }                                                                                \
 | |
| +    EIGEN_STRONG_INLINE PACKET_CPLX pmul(const PACKET_CPLX& x, const PACKET_REAL& y) const                        \
 | |
| +    { return PACKET_CPLX(Eigen::internal::pmul<PACKET_REAL>(x.v, y)); }                                           \
 | |
| +  };
 | |
| +
 | |
| +#endif // EIGEN_ARCH_CONJ_HELPER_H
 | |
| diff --git a/Eigen/src/Core/arch/NEON/Complex.h b/Eigen/src/Core/arch/NEON/Complex.h
 | |
| --- a/Eigen/src/Core/arch/NEON/Complex.h
 | |
| +++ b/Eigen/src/Core/arch/NEON/Complex.h
 | |
| @@ -265,6 +265,8 @@
 | |
|    }
 | |
|  };
 | |
|  
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf,Packet4f)
 | |
| +
 | |
|  template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
 | |
|  {
 | |
|    // TODO optimize it for NEON
 | |
| @@ -456,6 +458,8 @@
 | |
|    }
 | |
|  };
 | |
|  
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd,Packet2d)
 | |
| +
 | |
|  template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
 | |
|  {
 | |
|    // TODO optimize it for NEON
 | |
| diff --git a/Eigen/src/Core/arch/SSE/Complex.h b/Eigen/src/Core/arch/SSE/Complex.h
 | |
| --- a/Eigen/src/Core/arch/SSE/Complex.h
 | |
| +++ b/Eigen/src/Core/arch/SSE/Complex.h
 | |
| @@ -229,23 +229,7 @@
 | |
|    }
 | |
|  };
 | |
|  
 | |
| -template<> struct conj_helper<Packet4f, Packet2cf, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet4f& x, const Packet2cf& y, const Packet2cf& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet4f& x, const Packet2cf& y) const
 | |
| -  { return Packet2cf(Eigen::internal::pmul<Packet4f>(x, y.v)); }
 | |
| -};
 | |
| -
 | |
| -template<> struct conj_helper<Packet2cf, Packet4f, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet4f& y, const Packet2cf& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& x, const Packet4f& y) const
 | |
| -  { return Packet2cf(Eigen::internal::pmul<Packet4f>(x.v, y)); }
 | |
| -};
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf,Packet4f)
 | |
|  
 | |
|  template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
 | |
|  {
 | |
| @@ -430,23 +414,7 @@
 | |
|    }
 | |
|  };
 | |
|  
 | |
| -template<> struct conj_helper<Packet2d, Packet1cd, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet2d& x, const Packet1cd& y, const Packet1cd& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet2d& x, const Packet1cd& y) const
 | |
| -  { return Packet1cd(Eigen::internal::pmul<Packet2d>(x, y.v)); }
 | |
| -};
 | |
| -
 | |
| -template<> struct conj_helper<Packet1cd, Packet2d, false,false>
 | |
| -{
 | |
| -  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet2d& y, const Packet1cd& c) const
 | |
| -  { return padd(c, pmul(x,y)); }
 | |
| -
 | |
| -  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& x, const Packet2d& y) const
 | |
| -  { return Packet1cd(Eigen::internal::pmul<Packet2d>(x.v, y)); }
 | |
| -};
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd,Packet2d)
 | |
|  
 | |
|  template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
 | |
|  {
 | |
| diff --git a/Eigen/src/Core/arch/ZVector/Complex.h b/Eigen/src/Core/arch/ZVector/Complex.h
 | |
| --- a/Eigen/src/Core/arch/ZVector/Complex.h
 | |
| +++ b/Eigen/src/Core/arch/ZVector/Complex.h
 | |
| @@ -336,6 +336,9 @@
 | |
|    }
 | |
|  };
 | |
|  
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf,Packet4f)
 | |
| +EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd,Packet2d)
 | |
| +
 | |
|  template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
 | |
|  {
 | |
|    // TODO optimize it for AltiVec
 |