@return register object
@note Returned type will be detected from passed pointer type, for example uchar ==> cv::v_uint8x16, int ==> cv::v_int32x4, etc.
+
+@note Alignment requirement:
+if CV_STRONG_ALIGNMENT=1 then passed pointer must be aligned (`sizeof(lane type)` should be enough).
+Do not cast pointer types without runtime check for pointer alignment (like `uchar*` => `int*`).
*/
template<typename _Tp>
inline v_reg<_Tp, V_TypeTraits<_Tp>::nlanes128> v_load(const _Tp* ptr)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
return v_reg<_Tp, V_TypeTraits<_Tp>::nlanes128>(ptr);
}
/** @brief Load register contents from memory (aligned)
-similar to cv::v_load, but source memory block should be aligned (to 16-byte boundary)
+similar to cv::v_load, but source memory block should be aligned (to 16-byte boundary in case of SIMD128, 32-byte - SIMD256, etc)
*/
template<typename _Tp>
inline v_reg<_Tp, V_TypeTraits<_Tp>::nlanes128> v_load_aligned(const _Tp* ptr)
template<typename _Tp>
inline v_reg<_Tp, V_TypeTraits<_Tp>::nlanes128> v_load_low(const _Tp* ptr)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
v_reg<_Tp, V_TypeTraits<_Tp>::nlanes128> c;
for( int i = 0; i < c.nlanes/2; i++ )
{
template<typename _Tp>
inline v_reg<_Tp, V_TypeTraits<_Tp>::nlanes128> v_load_halves(const _Tp* loptr, const _Tp* hiptr)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(loptr));
+ CV_Assert(isAligned<sizeof(_Tp)>(hiptr));
+#endif
v_reg<_Tp, V_TypeTraits<_Tp>::nlanes128> c;
for( int i = 0; i < c.nlanes/2; i++ )
{
inline v_reg<typename V_TypeTraits<_Tp>::w_type, V_TypeTraits<_Tp>::nlanes128 / 2>
v_load_expand(const _Tp* ptr)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
typedef typename V_TypeTraits<_Tp>::w_type w_type;
v_reg<w_type, V_TypeTraits<w_type>::nlanes128> c;
for( int i = 0; i < c.nlanes; i++ )
inline v_reg<typename V_TypeTraits<_Tp>::q_type, V_TypeTraits<_Tp>::nlanes128 / 4>
v_load_expand_q(const _Tp* ptr)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
typedef typename V_TypeTraits<_Tp>::q_type q_type;
v_reg<q_type, V_TypeTraits<q_type>::nlanes128> c;
for( int i = 0; i < c.nlanes; i++ )
template<typename _Tp, int n> inline void v_load_deinterleave(const _Tp* ptr, v_reg<_Tp, n>& a,
v_reg<_Tp, n>& b)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
int i, i2;
for( i = i2 = 0; i < n; i++, i2 += 2 )
{
template<typename _Tp, int n> inline void v_load_deinterleave(const _Tp* ptr, v_reg<_Tp, n>& a,
v_reg<_Tp, n>& b, v_reg<_Tp, n>& c)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
int i, i3;
for( i = i3 = 0; i < n; i++, i3 += 3 )
{
v_reg<_Tp, n>& b, v_reg<_Tp, n>& c,
v_reg<_Tp, n>& d)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
int i, i4;
for( i = i4 = 0; i < n; i++, i4 += 4 )
{
const v_reg<_Tp, n>& b,
hal::StoreMode /*mode*/=hal::STORE_UNALIGNED)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
int i, i2;
for( i = i2 = 0; i < n; i++, i2 += 2 )
{
const v_reg<_Tp, n>& b, const v_reg<_Tp, n>& c,
hal::StoreMode /*mode*/=hal::STORE_UNALIGNED)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
int i, i3;
for( i = i3 = 0; i < n; i++, i3 += 3 )
{
const v_reg<_Tp, n>& d,
hal::StoreMode /*mode*/=hal::STORE_UNALIGNED)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
int i, i4;
for( i = i4 = 0; i < n; i++, i4 += 4 )
{
template<typename _Tp, int n>
inline void v_store(_Tp* ptr, const v_reg<_Tp, n>& a)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
for( int i = 0; i < n; i++ )
ptr[i] = a.s[i];
}
template<typename _Tp, int n>
inline void v_store(_Tp* ptr, const v_reg<_Tp, n>& a, hal::StoreMode /*mode*/)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
v_store(ptr, a);
}
template<typename _Tp, int n>
inline void v_store_low(_Tp* ptr, const v_reg<_Tp, n>& a)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
for( int i = 0; i < (n/2); i++ )
ptr[i] = a.s[i];
}
template<typename _Tp, int n>
inline void v_store_high(_Tp* ptr, const v_reg<_Tp, n>& a)
{
+#if CV_STRONG_ALIGNMENT
+ CV_Assert(isAligned<sizeof(_Tp)>(ptr));
+#endif
for( int i = 0; i < (n/2); i++ )
ptr[i] = a.s[i+(n/2)];
}
return *this;
}
-#if CV_NEON && !defined(__aarch64__)
-#define CV_CHECK_ALIGNMENT 1
-#else
-#define CV_CHECK_ALIGNMENT 0
-#endif
-
#if CV_SIMD128
template<typename V> CV_ALWAYS_INLINE void flipHoriz_single( const uchar* src, size_t sstep, uchar* dst, size_t dstep, Size size, size_t esz )
{
int width_1 = width & -v_uint8x16::nlanes;
int i, j;
-#if CV_CHECK_ALIGNMENT
+#if CV_STRONG_ALIGNMENT
CV_Assert(isAligned<sizeof(T)>(src, dst));
#endif
int end = (int)(size.width*esz);
int width = (end + 1)/2;
-#if CV_CHECK_ALIGNMENT
+#if CV_STRONG_ALIGNMENT
CV_Assert(isAligned<sizeof(T1)>(src, dst));
CV_Assert(isAligned<sizeof(T2)>(src, dst));
#endif
flipHoriz( const uchar* src, size_t sstep, uchar* dst, size_t dstep, Size size, size_t esz )
{
#if CV_SIMD
-#if CV_CHECK_ALIGNMENT
+#if CV_STRONG_ALIGNMENT
size_t alignmentMark = ((size_t)src)|((size_t)dst)|sstep|dstep;
#endif
if (esz == 2 * v_uint8x16::nlanes)
}
}
else if (esz == 8
-#if CV_CHECK_ALIGNMENT
+#if CV_STRONG_ALIGNMENT
&& isAligned<sizeof(uint64)>(alignmentMark)
#endif
)
flipHoriz_single<v_uint64x2>(src, sstep, dst, dstep, size, esz);
}
else if (esz == 4
-#if CV_CHECK_ALIGNMENT
+#if CV_STRONG_ALIGNMENT
&& isAligned<sizeof(unsigned)>(alignmentMark)
#endif
)
flipHoriz_single<v_uint32x4>(src, sstep, dst, dstep, size, esz);
}
else if (esz == 2
-#if CV_CHECK_ALIGNMENT
+#if CV_STRONG_ALIGNMENT
&& isAligned<sizeof(ushort)>(alignmentMark)
#endif
)
flipHoriz_single<v_uint8x16>(src, sstep, dst, dstep, size, esz);
}
else if (esz == 24
-#if CV_CHECK_ALIGNMENT
+#if CV_STRONG_ALIGNMENT
&& isAligned<sizeof(uint64_t)>(alignmentMark)
#endif
)
}
}
}
-#if !CV_CHECK_ALIGNMENT
+#if !CV_STRONG_ALIGNMENT
else if (esz == 12)
{
flipHoriz_double<uint64_t,uint>(src, sstep, dst, dstep, size, esz);
{
int i = 0;
#if CV_SIMD
-#if CV_CHECK_ALIGNMENT
+#if CV_STRONG_ALIGNMENT
if (isAligned<sizeof(int)>(src0, src1, dst0, dst1))
#endif
{
vx_store((int*)(dst1 + i), t0);
}
}
-#if CV_CHECK_ALIGNMENT
+#if CV_STRONG_ALIGNMENT
else
{
for (; i <= size.width - CV_SIMD_WIDTH; i += CV_SIMD_WIDTH)