compare
This commit is contained in:
parent
8d48632ebe
commit
a2a8ba17fc
@ -3268,6 +3268,130 @@ struct Cmp_SIMD<float>
|
|||||||
uint8x8_t v_mask;
|
uint8x8_t v_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#elif CV_SSE2
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Cmp_SIMD<schar>
|
||||||
|
{
|
||||||
|
explicit Cmp_SIMD(int code_) :
|
||||||
|
code(code_)
|
||||||
|
{
|
||||||
|
CV_Assert(code == CMP_GT || code == CMP_LE ||
|
||||||
|
code == CMP_EQ || code == CMP_NE);
|
||||||
|
|
||||||
|
haveSSE = checkHardwareSupport(CV_CPU_SSE2);
|
||||||
|
|
||||||
|
v_mask = _mm_set1_epi8(0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
int operator () (const schar * src1, const schar * src2, uchar * dst, int width) const
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
|
||||||
|
if (!haveSSE)
|
||||||
|
return x;
|
||||||
|
|
||||||
|
if (code == CMP_GT)
|
||||||
|
for ( ; x <= width - 16; x += 16)
|
||||||
|
_mm_storeu_si128((__m128i *)(dst + x), _mm_cmpgt_epi8(_mm_loadu_si128((const __m128i *)(src1 + x)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x))));
|
||||||
|
else if (code == CMP_LE)
|
||||||
|
for ( ; x <= width - 16; x += 16)
|
||||||
|
{
|
||||||
|
__m128i v_gt = _mm_cmpgt_epi8(_mm_loadu_si128((const __m128i *)(src1 + x)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x)));
|
||||||
|
_mm_storeu_si128((__m128i *)(dst + x), _mm_xor_si128(v_mask, v_gt));
|
||||||
|
}
|
||||||
|
else if (code == CMP_EQ)
|
||||||
|
for ( ; x <= width - 16; x += 16)
|
||||||
|
_mm_storeu_si128((__m128i *)(dst + x), _mm_cmpeq_epi8(_mm_loadu_si128((const __m128i *)(src1 + x)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x))));
|
||||||
|
else if (code == CMP_NE)
|
||||||
|
for ( ; x <= width - 16; x += 16)
|
||||||
|
{
|
||||||
|
__m128i v_eq = _mm_cmpeq_epi8(_mm_loadu_si128((const __m128i *)(src1 + x)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x)));
|
||||||
|
_mm_storeu_si128((__m128i *)(dst + x), _mm_xor_si128(v_mask, v_eq));
|
||||||
|
}
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int code;
|
||||||
|
__m128i v_mask;
|
||||||
|
bool haveSSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Cmp_SIMD<int>
|
||||||
|
{
|
||||||
|
explicit Cmp_SIMD(int code_) :
|
||||||
|
code(code_)
|
||||||
|
{
|
||||||
|
CV_Assert(code == CMP_GT || code == CMP_LE ||
|
||||||
|
code == CMP_EQ || code == CMP_NE);
|
||||||
|
|
||||||
|
haveSSE = checkHardwareSupport(CV_CPU_SSE2);
|
||||||
|
|
||||||
|
v_mask = _mm_set1_epi32(0xffffffff);
|
||||||
|
}
|
||||||
|
|
||||||
|
int operator () (const int * src1, const int * src2, uchar * dst, int width) const
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
|
||||||
|
if (!haveSSE)
|
||||||
|
return x;
|
||||||
|
|
||||||
|
if (code == CMP_GT)
|
||||||
|
for ( ; x <= width - 8; x += 8)
|
||||||
|
{
|
||||||
|
__m128i v_dst0 = _mm_cmpgt_epi32(_mm_loadu_si128((const __m128i *)(src1 + x)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x)));
|
||||||
|
__m128i v_dst1 = _mm_cmpgt_epi32(_mm_loadu_si128((const __m128i *)(src1 + x + 4)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x + 4)));
|
||||||
|
|
||||||
|
_mm_storel_epi64((__m128i *)(dst + x), _mm_packs_epi16(_mm_packs_epi32(v_dst0, v_dst1), v_mask));
|
||||||
|
}
|
||||||
|
else if (code == CMP_LE)
|
||||||
|
for ( ; x <= width - 8; x += 8)
|
||||||
|
{
|
||||||
|
__m128i v_dst0 = _mm_cmpgt_epi32(_mm_loadu_si128((const __m128i *)(src1 + x)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x)));
|
||||||
|
__m128i v_dst1 = _mm_cmpgt_epi32(_mm_loadu_si128((const __m128i *)(src1 + x + 4)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x + 4)));
|
||||||
|
|
||||||
|
_mm_storel_epi64((__m128i *)(dst + x), _mm_xor_si128(_mm_packs_epi16(_mm_packs_epi32(v_dst0, v_dst1), v_mask), v_mask));
|
||||||
|
}
|
||||||
|
else if (code == CMP_EQ)
|
||||||
|
for ( ; x <= width - 8; x += 8)
|
||||||
|
{
|
||||||
|
__m128i v_dst0 = _mm_cmpeq_epi32(_mm_loadu_si128((const __m128i *)(src1 + x)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x)));
|
||||||
|
__m128i v_dst1 = _mm_cmpeq_epi32(_mm_loadu_si128((const __m128i *)(src1 + x + 4)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x + 4)));
|
||||||
|
|
||||||
|
_mm_storel_epi64((__m128i *)(dst + x), _mm_packs_epi16(_mm_packs_epi32(v_dst0, v_dst1), v_mask));
|
||||||
|
}
|
||||||
|
else if (code == CMP_NE)
|
||||||
|
for ( ; x <= width - 8; x += 8)
|
||||||
|
{
|
||||||
|
__m128i v_dst0 = _mm_cmpeq_epi32(_mm_loadu_si128((const __m128i *)(src1 + x)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x)));
|
||||||
|
__m128i v_dst1 = _mm_cmpeq_epi32(_mm_loadu_si128((const __m128i *)(src1 + x + 4)),
|
||||||
|
_mm_loadu_si128((const __m128i *)(src2 + x + 4)));
|
||||||
|
|
||||||
|
_mm_storel_epi64((__m128i *)(dst + x), _mm_xor_si128(v_mask, _mm_packs_epi16(_mm_packs_epi32(v_dst0, v_dst1), v_mask)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int code;
|
||||||
|
__m128i v_mask;
|
||||||
|
bool haveSSE;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template<typename T> static void
|
template<typename T> static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user