MCPcopy Create free account
hub / github.com/creatale/node-dv / cmp16s

Function cmp16s

deps/opencv/modules/core/src/arithm.cpp:2306–2404  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2304}
2305
2306static 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++ ){

Callers

nothing calls this directly

Calls 4

convert_cmpFunction · 0.85
fixStepsFunction · 0.85
ippiSizeFunction · 0.70
swapFunction · 0.70

Tested by

no test coverage detected