| 2304 | } |
| 2305 | |
| 2306 | static void cmp16s(const short* src1, size_t step1, const short* src2, size_t step2, |
| 2307 | uchar* dst, size_t step, Size size, void* _cmpop) |
| 2308 | { |
| 2309 | #if ARITHM_USE_IPP |
| 2310 | IppCmpOp op = convert_cmp(*(int *)_cmpop); |
| 2311 | if( op > 0 ) |
| 2312 | { |
| 2313 | fixSteps(size, sizeof(dst[0]), step1, step2, step); |
| 2314 | if( ippiCompare_16s_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, ippiSize(size), op) >= 0 ) |
| 2315 | return; |
| 2316 | } |
| 2317 | #endif |
| 2318 | //vz optimized cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop); |
| 2319 | |
| 2320 | int code = *(int*)_cmpop; |
| 2321 | step1 /= sizeof(src1[0]); |
| 2322 | step2 /= sizeof(src2[0]); |
| 2323 | if( code == CMP_GE || code == CMP_LT ) |
| 2324 | { |
| 2325 | std::swap(src1, src2); |
| 2326 | std::swap(step1, step2); |
| 2327 | code = code == CMP_GE ? CMP_LE : CMP_GT; |
| 2328 | } |
| 2329 | |
| 2330 | if( code == CMP_GT || code == CMP_LE ) |
| 2331 | { |
| 2332 | int m = code == CMP_GT ? 0 : 255; |
| 2333 | for( ; size.height--; src1 += step1, src2 += step2, dst += step ) |
| 2334 | { |
| 2335 | int x =0; |
| 2336 | #if CV_SSE2 |
| 2337 | if( USE_SSE2){// |
| 2338 | __m128i m128 = code == CMP_GT ? _mm_setzero_si128() : _mm_set1_epi16 (-1); |
| 2339 | for( ; x <= size.width - 16; x += 16 ) |
| 2340 | { |
| 2341 | __m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x)); |
| 2342 | __m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x)); |
| 2343 | r00 = _mm_xor_si128 ( _mm_cmpgt_epi16 (r00, r10), m128); |
| 2344 | __m128i r01 = _mm_loadu_si128((const __m128i*)(src1 + x + 8)); |
| 2345 | __m128i r11 = _mm_loadu_si128((const __m128i*)(src2 + x + 8)); |
| 2346 | r01 = _mm_xor_si128 ( _mm_cmpgt_epi16 (r01, r11), m128); |
| 2347 | r11 = _mm_packs_epi16(r00, r01); |
| 2348 | _mm_storeu_si128((__m128i*)(dst + x), r11); |
| 2349 | } |
| 2350 | if( x <= size.width-8) |
| 2351 | { |
| 2352 | __m128i r00 = _mm_loadu_si128((const __m128i*)(src1 + x)); |
| 2353 | __m128i r10 = _mm_loadu_si128((const __m128i*)(src2 + x)); |
| 2354 | r00 = _mm_xor_si128 ( _mm_cmpgt_epi16 (r00, r10), m128); |
| 2355 | r10 = _mm_packs_epi16(r00, r00); |
| 2356 | _mm_storel_epi64((__m128i*)(dst + x), r10); |
| 2357 | |
| 2358 | x += 8; |
| 2359 | } |
| 2360 | } |
| 2361 | #endif |
| 2362 | |
| 2363 | for( ; x < size.width; x++ ){ |
nothing calls this directly
no test coverage detected