mirror of
https://github.com/opencv/opencv.git
synced 2025-06-12 20:42:53 +08:00
Merge pull request #10136 from alalek:issue_10134
This commit is contained in:
commit
e4aa2ccd66
@ -1024,24 +1024,28 @@ OPENCV_HAL_IMPL_SSE_SHIFT_OP(v_uint64x2, v_int64x2, epi64, v_srai_epi64)
|
|||||||
template<int imm, typename _Tpvec>
|
template<int imm, typename _Tpvec>
|
||||||
inline _Tpvec v_rotate_right(const _Tpvec &a)
|
inline _Tpvec v_rotate_right(const _Tpvec &a)
|
||||||
{
|
{
|
||||||
return _Tpvec(_mm_srli_si128(a.val, imm*(sizeof(typename _Tpvec::lane_type))));
|
enum { CV_SHIFT = imm*(sizeof(typename _Tpvec::lane_type)) };
|
||||||
|
return _Tpvec(_mm_srli_si128(a.val, CV_SHIFT));
|
||||||
}
|
}
|
||||||
template<int imm, typename _Tpvec>
|
template<int imm, typename _Tpvec>
|
||||||
inline _Tpvec v_rotate_left(const _Tpvec &a)
|
inline _Tpvec v_rotate_left(const _Tpvec &a)
|
||||||
{
|
{
|
||||||
return _Tpvec(_mm_slli_si128(a.val, imm*(sizeof(typename _Tpvec::lane_type))));
|
enum { CV_SHIFT = imm*(sizeof(typename _Tpvec::lane_type)) };
|
||||||
|
return _Tpvec(_mm_slli_si128(a.val, CV_SHIFT));
|
||||||
}
|
}
|
||||||
template<int imm, typename _Tpvec>
|
template<int imm, typename _Tpvec>
|
||||||
inline _Tpvec v_rotate_right(const _Tpvec &a, const _Tpvec &b)
|
inline _Tpvec v_rotate_right(const _Tpvec &a, const _Tpvec &b)
|
||||||
{
|
{
|
||||||
const int cWidth = sizeof(typename _Tpvec::lane_type);
|
enum { CV_SHIFT1 = imm*(sizeof(typename _Tpvec::lane_type)) };
|
||||||
return _Tpvec(_mm_or_si128(_mm_srli_si128(a.val, imm*cWidth), _mm_slli_si128(b.val, (16 - imm*cWidth))));
|
enum { CV_SHIFT2 = 16 - imm*(sizeof(typename _Tpvec::lane_type)) };
|
||||||
|
return _Tpvec(_mm_or_si128(_mm_srli_si128(a.val, CV_SHIFT1), _mm_slli_si128(b.val, CV_SHIFT2)));
|
||||||
}
|
}
|
||||||
template<int imm, typename _Tpvec>
|
template<int imm, typename _Tpvec>
|
||||||
inline _Tpvec v_rotate_left(const _Tpvec &a, const _Tpvec &b)
|
inline _Tpvec v_rotate_left(const _Tpvec &a, const _Tpvec &b)
|
||||||
{
|
{
|
||||||
const int cWidth = sizeof(typename _Tpvec::lane_type);
|
enum { CV_SHIFT1 = imm*(sizeof(typename _Tpvec::lane_type)) };
|
||||||
return _Tpvec(_mm_or_si128(_mm_slli_si128(a.val, imm*cWidth), _mm_srli_si128(b.val, (16 - imm*cWidth))));
|
enum { CV_SHIFT2 = 16 - imm*(sizeof(typename _Tpvec::lane_type)) };
|
||||||
|
return _Tpvec(_mm_or_si128(_mm_slli_si128(a.val, CV_SHIFT1), _mm_srli_si128(b.val, CV_SHIFT2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(_Tpvec, _Tp) \
|
#define OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(_Tpvec, _Tp) \
|
||||||
|
@ -634,19 +634,19 @@ OPENCV_IMPL_VSX_ROTATE_LR(v_int64x2, vec_dword2)
|
|||||||
template<int imm, typename _Tpvec>
|
template<int imm, typename _Tpvec>
|
||||||
inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b)
|
inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b)
|
||||||
{
|
{
|
||||||
const int wd = imm * sizeof(typename _Tpvec::lane_type);
|
enum { CV_SHIFT = 16 - imm * (sizeof(typename _Tpvec::lane_type)) };
|
||||||
if (wd == 0)
|
if (CV_SHIFT == 16)
|
||||||
return a;
|
return a;
|
||||||
return _Tpvec(vec_sld(b.val, a.val, 16 - wd));
|
return _Tpvec(vec_sld(b.val, a.val, CV_SHIFT));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<int imm, typename _Tpvec>
|
template<int imm, typename _Tpvec>
|
||||||
inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b)
|
inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b)
|
||||||
{
|
{
|
||||||
const int wd = imm * sizeof(typename _Tpvec::lane_type);
|
enum { CV_SHIFT = imm * (sizeof(typename _Tpvec::lane_type)) };
|
||||||
if (wd == 16)
|
if (CV_SHIFT == 16)
|
||||||
return b;
|
return b;
|
||||||
return _Tpvec(vec_sld(a.val, b.val, wd));
|
return _Tpvec(vec_sld(a.val, b.val, CV_SHIFT));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OPENCV_IMPL_VSX_ROTATE_64(_Tpvec, suffix, rg1, rg2) \
|
#define OPENCV_IMPL_VSX_ROTATE_64(_Tpvec, suffix, rg1, rg2) \
|
||||||
|
Loading…
Reference in New Issue
Block a user