mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-15 07:10:37 +08:00
Introduce internal's UIntPtr and IntPtr types for pointer to integer conversions.
This fixes "conversion from pointer to same-sized integral type" warnings by ICC. Ideally, we would use the std::[u]intptr_t types all the time, but since they are C99/C++11 only, let's be safe.
This commit is contained in:
parent
40e4637d79
commit
27f0434233
@ -522,7 +522,7 @@ struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, NoUnrolling>
|
|||||||
: int(Kernel::AssignmentTraits::DstAlignment)
|
: int(Kernel::AssignmentTraits::DstAlignment)
|
||||||
};
|
};
|
||||||
const Scalar *dst_ptr = &kernel.dstEvaluator().coeffRef(0,0);
|
const Scalar *dst_ptr = &kernel.dstEvaluator().coeffRef(0,0);
|
||||||
if((!bool(dstIsAligned)) && (size_t(dst_ptr) % sizeof(Scalar))>0)
|
if((!bool(dstIsAligned)) && (UIntPtr(dst_ptr-nullptr) % sizeof(Scalar))>0)
|
||||||
{
|
{
|
||||||
// the pointer is not aligend-on scalar, so alignment is not possible
|
// the pointer is not aligend-on scalar, so alignment is not possible
|
||||||
return dense_assignment_loop<Kernel,DefaultTraversal,NoUnrolling>::run(kernel);
|
return dense_assignment_loop<Kernel,DefaultTraversal,NoUnrolling>::run(kernel);
|
||||||
|
@ -882,7 +882,7 @@ struct block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel, /* HasDirectAc
|
|||||||
: mapbase_evaluator<XprType, typename XprType::PlainObject>(block)
|
: mapbase_evaluator<XprType, typename XprType::PlainObject>(block)
|
||||||
{
|
{
|
||||||
// TODO: for the 3.3 release, this should be turned to an internal assertion, but let's keep it as is for the beta lifetime
|
// TODO: for the 3.3 release, this should be turned to an internal assertion, but let's keep it as is for the beta lifetime
|
||||||
eigen_assert(((size_t(block.data()) % EIGEN_PLAIN_ENUM_MAX(1,evaluator<XprType>::Alignment)) == 0) && "data is not aligned");
|
eigen_assert(((internal::UIntPtr(block.data()) % EIGEN_PLAIN_ENUM_MAX(1,evaluator<XprType>::Alignment)) == 0) && "data is not aligned");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -67,13 +67,13 @@ struct plain_array
|
|||||||
template<typename PtrType>
|
template<typename PtrType>
|
||||||
EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; }
|
EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; }
|
||||||
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
|
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
|
||||||
eigen_assert((reinterpret_cast<size_t>(eigen_unaligned_array_assert_workaround_gcc47(array)) & (sizemask)) == 0 \
|
eigen_assert((internal::UIntPtr(eigen_unaligned_array_assert_workaround_gcc47(array)) & (sizemask)) == 0 \
|
||||||
&& "this assertion is explained here: " \
|
&& "this assertion is explained here: " \
|
||||||
"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
|
"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
|
||||||
" **** READ THIS WEB PAGE !!! ****");
|
" **** READ THIS WEB PAGE !!! ****");
|
||||||
#else
|
#else
|
||||||
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
|
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
|
||||||
eigen_assert((reinterpret_cast<size_t>(array) & (sizemask)) == 0 \
|
eigen_assert((internal::UIntPtr(array) & (sizemask)) == 0 \
|
||||||
&& "this assertion is explained here: " \
|
&& "this assertion is explained here: " \
|
||||||
"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
|
"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
|
||||||
" **** READ THIS WEB PAGE !!! ****");
|
" **** READ THIS WEB PAGE !!! ****");
|
||||||
|
@ -166,7 +166,7 @@ template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
|
|||||||
void checkSanity(typename internal::enable_if<(internal::traits<T>::Alignment>0),void*>::type = 0) const
|
void checkSanity(typename internal::enable_if<(internal::traits<T>::Alignment>0),void*>::type = 0) const
|
||||||
{
|
{
|
||||||
#if EIGEN_MAX_ALIGN_BYTES>0
|
#if EIGEN_MAX_ALIGN_BYTES>0
|
||||||
eigen_assert(( ((size_t(m_data) % internal::traits<Derived>::Alignment) == 0)
|
eigen_assert(( ((internal::UIntPtr(m_data) % internal::traits<Derived>::Alignment) == 0)
|
||||||
|| (cols() * rows() * innerStride() * sizeof(Scalar)) < internal::traits<Derived>::Alignment ) && "data is not aligned");
|
|| (cols() * rows() * innerStride() * sizeof(Scalar)) < internal::traits<Derived>::Alignment ) && "data is not aligned");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -309,8 +309,8 @@ class gemm_blocking_space<StorageOrder,_LhsScalar,_RhsScalar,MaxRows, MaxCols, M
|
|||||||
this->m_blockA = m_staticA;
|
this->m_blockA = m_staticA;
|
||||||
this->m_blockB = m_staticB;
|
this->m_blockB = m_staticB;
|
||||||
#else
|
#else
|
||||||
this->m_blockA = reinterpret_cast<LhsScalar*>((std::size_t(m_staticA) + (EIGEN_DEFAULT_ALIGN_BYTES-1)) & ~std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1));
|
this->m_blockA = reinterpret_cast<LhsScalar*>((internal::UIntPtr(m_staticA) + (EIGEN_DEFAULT_ALIGN_BYTES-1)) & ~std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1));
|
||||||
this->m_blockB = reinterpret_cast<RhsScalar*>((std::size_t(m_staticB) + (EIGEN_DEFAULT_ALIGN_BYTES-1)) & ~std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1));
|
this->m_blockB = reinterpret_cast<RhsScalar*>((internal::UIntPtr(m_staticB) + (EIGEN_DEFAULT_ALIGN_BYTES-1)) & ~std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ EIGEN_DONT_INLINE void general_matrix_vector_product<Index,LhsScalar,LhsMapper,C
|
|||||||
// find how many columns do we have to skip to be aligned with the result (if possible)
|
// find how many columns do we have to skip to be aligned with the result (if possible)
|
||||||
Index skipColumns = 0;
|
Index skipColumns = 0;
|
||||||
// if the data cannot be aligned (TODO add some compile time tests when possible, e.g. for floats)
|
// if the data cannot be aligned (TODO add some compile time tests when possible, e.g. for floats)
|
||||||
if( (lhsAlignmentOffset < 0) || (lhsAlignmentOffset == size) || (size_t(res)%sizeof(ResScalar)) )
|
if( (lhsAlignmentOffset < 0) || (lhsAlignmentOffset == size) || (UIntPtr(res)%sizeof(ResScalar)) )
|
||||||
{
|
{
|
||||||
alignedSize = 0;
|
alignedSize = 0;
|
||||||
alignedStart = 0;
|
alignedStart = 0;
|
||||||
|
@ -135,7 +135,7 @@ class BlasVectorMapper {
|
|||||||
|
|
||||||
template <typename Packet>
|
template <typename Packet>
|
||||||
EIGEN_DEVICE_FUNC bool aligned(Index i) const {
|
EIGEN_DEVICE_FUNC bool aligned(Index i) const {
|
||||||
return (size_t(m_data+i)%sizeof(Packet))==0;
|
return (UIntPtr(m_data+i)%sizeof(Packet))==0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -227,7 +227,7 @@ class blas_data_mapper {
|
|||||||
EIGEN_DEVICE_FUNC const Scalar* data() const { return m_data; }
|
EIGEN_DEVICE_FUNC const Scalar* data() const { return m_data; }
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC Index firstAligned(Index size) const {
|
EIGEN_DEVICE_FUNC Index firstAligned(Index size) const {
|
||||||
if (size_t(m_data)%sizeof(Scalar)) {
|
if (UIntPtr(m_data)%sizeof(Scalar)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return internal::first_default_aligned(m_data, size);
|
return internal::first_default_aligned(m_data, size);
|
||||||
|
@ -445,7 +445,7 @@ EIGEN_DEVICE_FUNC inline Index first_aligned(const Scalar* array, Index size)
|
|||||||
// so that all elements of the array have the same alignment.
|
// so that all elements of the array have the same alignment.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if( (std::size_t(array) & (sizeof(Scalar)-1)) || (Alignment%ScalarSize)!=0)
|
else if( (UIntPtr(array) & (sizeof(Scalar)-1)) || (Alignment%ScalarSize)!=0)
|
||||||
{
|
{
|
||||||
// The array is not aligned to the size of a single scalar, or the requested alignment is not a multiple of the scalar size.
|
// The array is not aligned to the size of a single scalar, or the requested alignment is not a multiple of the scalar size.
|
||||||
// Consequently, no element of the array is well aligned.
|
// Consequently, no element of the array is well aligned.
|
||||||
@ -453,7 +453,7 @@ EIGEN_DEVICE_FUNC inline Index first_aligned(const Scalar* array, Index size)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Index first = (AlignmentSize - (Index((std::size_t(array)/sizeof(Scalar))) & AlignmentMask)) & AlignmentMask;
|
Index first = (AlignmentSize - (Index((UIntPtr(array)/sizeof(Scalar))) & AlignmentMask)) & AlignmentMask;
|
||||||
return (first < size) ? first : size;
|
return (first < size) ? first : size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -487,7 +487,7 @@ template<typename T> EIGEN_DEVICE_FUNC void smart_copy(const T* start, const T*
|
|||||||
template<typename T> struct smart_copy_helper<T,true> {
|
template<typename T> struct smart_copy_helper<T,true> {
|
||||||
EIGEN_DEVICE_FUNC static inline void run(const T* start, const T* end, T* target)
|
EIGEN_DEVICE_FUNC static inline void run(const T* start, const T* end, T* target)
|
||||||
{
|
{
|
||||||
std::ptrdiff_t size = std::ptrdiff_t(end)-std::ptrdiff_t(start);
|
IntPtr size = IntPtr(end)-IntPtr(start);
|
||||||
if(size==0) return;
|
if(size==0) return;
|
||||||
eigen_internal_assert(start!=0 && end!=0 && target!=0);
|
eigen_internal_assert(start!=0 && end!=0 && target!=0);
|
||||||
memcpy(target, start, size);
|
memcpy(target, start, size);
|
||||||
@ -510,7 +510,7 @@ template<typename T> void smart_memmove(const T* start, const T* end, T* target)
|
|||||||
template<typename T> struct smart_memmove_helper<T,true> {
|
template<typename T> struct smart_memmove_helper<T,true> {
|
||||||
static inline void run(const T* start, const T* end, T* target)
|
static inline void run(const T* start, const T* end, T* target)
|
||||||
{
|
{
|
||||||
std::ptrdiff_t size = std::ptrdiff_t(end)-std::ptrdiff_t(start);
|
IntPtr size = IntPtr(end)-IntPtr(start);
|
||||||
if(size==0) return;
|
if(size==0) return;
|
||||||
eigen_internal_assert(start!=0 && end!=0 && target!=0);
|
eigen_internal_assert(start!=0 && end!=0 && target!=0);
|
||||||
std::memmove(target, start, size);
|
std::memmove(target, start, size);
|
||||||
@ -623,7 +623,7 @@ template<typename T> void swap(scoped_array<T> &a,scoped_array<T> &b)
|
|||||||
#if EIGEN_DEFAULT_ALIGN_BYTES>0
|
#if EIGEN_DEFAULT_ALIGN_BYTES>0
|
||||||
// We always manually re-align the result of EIGEN_ALLOCA.
|
// We always manually re-align the result of EIGEN_ALLOCA.
|
||||||
// If alloca is already aligned, the compiler should be smart enough to optimize away the re-alignment.
|
// If alloca is already aligned, the compiler should be smart enough to optimize away the re-alignment.
|
||||||
#define EIGEN_ALIGNED_ALLOCA(SIZE) reinterpret_cast<void*>((reinterpret_cast<std::size_t>(EIGEN_ALLOCA(SIZE+EIGEN_DEFAULT_ALIGN_BYTES-1)) + EIGEN_DEFAULT_ALIGN_BYTES-1) & ~(std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1)))
|
#define EIGEN_ALIGNED_ALLOCA(SIZE) reinterpret_cast<void*>((internal::UIntPtr(EIGEN_ALLOCA(SIZE+EIGEN_DEFAULT_ALIGN_BYTES-1)) + EIGEN_DEFAULT_ALIGN_BYTES-1) & ~(std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1)))
|
||||||
#else
|
#else
|
||||||
#define EIGEN_ALIGNED_ALLOCA(SIZE) EIGEN_ALLOCA(SIZE)
|
#define EIGEN_ALIGNED_ALLOCA(SIZE) EIGEN_ALLOCA(SIZE)
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,6 +27,14 @@ namespace internal {
|
|||||||
* we however don't want to add a dependency to Boost.
|
* we however don't want to add a dependency to Boost.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if EIGEN_COMP_ICC
|
||||||
|
typedef std::intptr_t IntPtr;
|
||||||
|
typedef std::uintptr_t UIntPtr;
|
||||||
|
#else
|
||||||
|
typedef std::ptrdiff_t IntPtr;
|
||||||
|
typedef std::size_t UIntPtr;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct true_type { enum { value = 1 }; };
|
struct true_type { enum { value = 1 }; };
|
||||||
struct false_type { enum { value = 0 }; };
|
struct false_type { enum { value = 0 }; };
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user