// -*- c++ -*- // Version for non-SSE2 #ifndef IS_C #ifdef SKIP_SEARCH "movq %%mm6, %%mm0\n\t" // just use the results of our wierd bob #else // JA 9/Dec/2002 // failed experiment // but leave in placeholder for me to play about #ifdef DONT_USE_STRANGE_BOB // Use the best weave if diffs less than 10 as that // means the image is still or moving cleanly // if there is motion we will clip which will catch anything "psubusb "_FOURS", %%mm7\n\t" // sets bits to zero if weave diff < 4 "pxor %%mm0, %%mm0\n\t" "pcmpeqb %%mm0, %%mm7\n\t" // all ff where weave better, else 00 "pcmpeqb %%mm7, %%mm0\n\t" // all ff where bob better, else 00 "pand %%mm6, %%mm0\n\t" // use bob for these pixel values "pand %%mm5, %%mm7\n\t" // use weave for these "por %%mm7, %%mm0\n\t" // combine both #else // Use the better of bob or weave // pminub mm4, TENS // the most we care about V_PMINUB ("%%mm4", _TENS, "%%mm0") // the most we care about "psubusb %%mm4, %%mm7\n\t" // foregive that much from weave est? "psubusb "_FOURS", %%mm7\n\t" // bias it a bit toward weave "pxor %%mm0, %%mm0\n\t" "pcmpeqb %%mm0, %%mm7\n\t" // all ff where weave better, else 00 "pcmpeqb %%mm7, %%mm0\n\t" // all ff where bob better, else 00 "pand %%mm6, %%mm0\n\t" // use bob for these pixel values "pand %%mm5, %%mm7\n\t" // use weave for these "por %%mm7, %%mm0\n\t" // combine both #endif // pminub mm0, Max_Vals // but clip to catch the stray error V_PMINUB ("%%mm0", _Max_Vals, "%%mm1") // but clip to catch the stray error // pmaxub mm0, Min_Vals V_PMAXUB ("%%mm0", _Min_Vals) #endif MOVX" "_pDest", %%"XAX"\n\t" #ifdef USE_VERTICAL_FILTER "movq %%mm0, %%mm1\n\t" // pavgb mm0, qword ptr["XBX"] V_PAVGB ("%%mm0", "(%%"XBX")", "%%mm2", _ShiftMask) // movntq qword ptr["XAX"+"XDX"], mm0 V_MOVNTQ ("(%"XAX", %%"XDX")", "%%mm0") // pavgb mm1, qword ptr["XBX"+"XCX"] V_PAVGB ("%%mm1", "(%%"XBX", %%"XCX")", "%%mm2", _ShiftMask) //FIXME: XDX or XAX!! "addq "_dst_pitchw", %%"XBX // movntq qword ptr["XAX"+"XDX"], mm1 V_MOVNTQ ("(%%"XAX", %%"XDX")", "%%mm1") #else // movntq qword ptr["XAX"+"XDX"], mm0 V_MOVNTQ ("(%%"XAX", %%"XDX")", "%%mm0") #endif LEAX" 8(%%"XDX"), %%"XDX"\n\t" // bump offset pointer CMPX" "_Last8", %%"XDX"\n\t" // done with line? "jb 1b\n\t" // y MOVX" "_oldbx", %%"XBX"\n\t" : /* no outputs */ : "m"(pBob), "m"(src_pitch2), "m"(ShiftMask), "m"(pDest), "m"(dst_pitchw), "m"(Last8), "m"(pSrc), "m"(pSrcP), "m"(pBobP), "m"(DiffThres), "m"(Min_Vals), "m"(Max_Vals), "m"(FOURS), "m"(TENS), "m"(ONES), "m"(UVMask), "m"(Max_Mov), "m"(YMask), "m"(oldbx) : XAX, XCX, XDX, XSI, XDI, "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)", #ifdef __MMX__ "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", #endif "memory", "cc" ); // adjust for next line pSrc += src_pitch2; pSrcP += src_pitch2; pDest += dst_pitch2; pBob += src_pitch2; pBobP += src_pitch2; } return 0; #else #ifdef SKIP_SEARCH out[0] = best[0]; // just use the results of our wierd bob out[1] = best[1]; #else diff[0] = diff[0] - MIN (diff[0], 10) - 4; diff[1] = diff[1] - MIN (diff[1] - 10) - 4; if (diff[0] < 0) out[0] = weave[0]; else out[0] = best[0]; if (diff[1] < 0) out[1] = weave[1]; else out[1] = best[1]; out[0] = CLAMP (out[0], MinVals[0], MaxVals[0]); out[1] = CLAMP (out[1], MinVals[1], MaxVals[1]); #endif #ifdef USE_VERTICAL_FILTER pDest[x] = (out[0] + pBob[0]) / 2; pDest[x + dst_pitchw] = (pBob[src_pitch2] + out[0]) / 2; pDest[x + 1] = (out[1] + pBob[1]) / 2; pDest[x + 1 + dst_pitchw] = (pBob[src_pitch2 + 1] + out[1]) / 2; #else pDest[x] = out[0]; pDest[x+1] = out[1]; #endif pBob += 2; pBobP += 2; pSrc += 2; pSrcP += 2; } // adjust for next line pSrc = src_pitch2 * (y+1) + pWeaveSrc; pSrcP = src_pitch2 * (y+1) + pWeaveSrcP; pDest = dst_pitch2 * (y+1) + pWeaveDest + dst_pitch2; if (TopFirst) { pBob = pCopySrc + src_pitch2; pBobP = pCopySrcP + src_pitch2; } else { pBob = pCopySrc; pBobP = pCopySrcP; } pBob += src_pitch2 * (y+1); pBobP += src_pitch2 * (y+1); } return 0; #endif