📄 postprocess_template.c
字号:
"pminsw %%mm2, %%mm0 \n\t" "pminsw %%mm3, %%mm1 \n\t"#else "movq %%mm0, %%mm6 \n\t" "psubusw %%mm2, %%mm6 \n\t" "psubw %%mm6, %%mm0 \n\t" "movq %%mm1, %%mm6 \n\t" "psubusw %%mm3, %%mm6 \n\t" "psubw %%mm6, %%mm1 \n\t"#endif "movd %2, %%mm2 \n\t" // QP "punpcklbw %%mm7, %%mm2 \n\t" "movq %%mm7, %%mm6 \n\t" // 0 "pcmpgtw %%mm4, %%mm6 \n\t" // sign(2L2 - 5L3 + 5L4 - 2L5) "pxor %%mm6, %%mm4 \n\t" "psubw %%mm6, %%mm4 \n\t" // |2L2 - 5L3 + 5L4 - 2L5| "pcmpgtw %%mm5, %%mm7 \n\t" // sign(2H2 - 5H3 + 5H4 - 2H5) "pxor %%mm7, %%mm5 \n\t" "psubw %%mm7, %%mm5 \n\t" // |2H2 - 5H3 + 5H4 - 2H5|// 100 opcodes "psllw $3, %%mm2 \n\t" // 8QP "movq %%mm2, %%mm3 \n\t" // 8QP "pcmpgtw %%mm4, %%mm2 \n\t" "pcmpgtw %%mm5, %%mm3 \n\t" "pand %%mm2, %%mm4 \n\t" "pand %%mm3, %%mm5 \n\t" "psubusw %%mm0, %%mm4 \n\t" // hd "psubusw %%mm1, %%mm5 \n\t" // ld "movq "MANGLE(w05)", %%mm2 \n\t" // 5 "pmullw %%mm2, %%mm4 \n\t" "pmullw %%mm2, %%mm5 \n\t" "movq "MANGLE(w20)", %%mm2 \n\t" // 32 "paddw %%mm2, %%mm4 \n\t" "paddw %%mm2, %%mm5 \n\t" "psrlw $6, %%mm4 \n\t" "psrlw $6, %%mm5 \n\t" "movq 16(%%"REG_c"), %%mm0 \n\t" // L3 - L4 "movq 24(%%"REG_c"), %%mm1 \n\t" // H3 - H4 "pxor %%mm2, %%mm2 \n\t" "pxor %%mm3, %%mm3 \n\t" "pcmpgtw %%mm0, %%mm2 \n\t" // sign (L3-L4) "pcmpgtw %%mm1, %%mm3 \n\t" // sign (H3-H4) "pxor %%mm2, %%mm0 \n\t" "pxor %%mm3, %%mm1 \n\t" "psubw %%mm2, %%mm0 \n\t" // |L3-L4| "psubw %%mm3, %%mm1 \n\t" // |H3-H4| "psrlw $1, %%mm0 \n\t" // |L3 - L4|/2 "psrlw $1, %%mm1 \n\t" // |H3 - H4|/2 "pxor %%mm6, %%mm2 \n\t" "pxor %%mm7, %%mm3 \n\t" "pand %%mm2, %%mm4 \n\t" "pand %%mm3, %%mm5 \n\t"#ifdef HAVE_MMX2 "pminsw %%mm0, %%mm4 \n\t" "pminsw %%mm1, %%mm5 \n\t"#else "movq %%mm4, %%mm2 \n\t" "psubusw %%mm0, %%mm2 \n\t" "psubw %%mm2, %%mm4 \n\t" "movq %%mm5, %%mm2 \n\t" "psubusw %%mm1, %%mm2 \n\t" "psubw %%mm2, %%mm5 \n\t"#endif "pxor %%mm6, %%mm4 \n\t" "pxor %%mm7, %%mm5 \n\t" "psubw %%mm6, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "packsswb %%mm5, %%mm4 \n\t" "movq (%0), %%mm0 \n\t" "paddb %%mm4, %%mm0 \n\t" "movq %%mm0, (%0) \n\t" "movq (%0, %1), %%mm0 \n\t" "psubb %%mm4, %%mm0 \n\t" "movq %%mm0, (%0, %1) \n\t" : "+r" (src) : "r" ((long)stride), "m" (c->pQPb) : "%"REG_a, "%"REG_c );#else //defined (HAVE_MMX2) || defined (HAVE_3DNOW) const int l1= stride; const int l2= stride + l1; const int l3= stride + l2; const int l4= stride + l3; const int l5= stride + l4; const int l6= stride + l5; const int l7= stride + l6; const int l8= stride + l7;// const int l9= stride + l8; int x; src+= stride*3; for(x=0; x<BLOCK_SIZE; x++) { const int middleEnergy= 5*(src[l5] - src[l4]) + 2*(src[l3] - src[l6]); if(ABS(middleEnergy) < 8*c->QP) { const int q=(src[l4] - src[l5])/2; const int leftEnergy= 5*(src[l3] - src[l2]) + 2*(src[l1] - src[l4]); const int rightEnergy= 5*(src[l7] - src[l6]) + 2*(src[l5] - src[l8]); int d= ABS(middleEnergy) - MIN( ABS(leftEnergy), ABS(rightEnergy) ); d= MAX(d, 0); d= (5*d + 32) >> 6; d*= SIGN(-middleEnergy); if(q>0) { d= d<0 ? 0 : d; d= d>q ? q : d; } else { d= d>0 ? 0 : d; d= d<q ? q : d; } src[l4]-= d; src[l5]+= d; } src++; }#endif //defined (HAVE_MMX2) || defined (HAVE_3DNOW)}#endif //HAVE_ALTIVEC#ifndef HAVE_ALTIVECstatic inline void RENAME(dering)(uint8_t src[], int stride, PPContext *c){#if defined (HAVE_MMX2) || defined (HAVE_3DNOW) asm volatile( "pxor %%mm6, %%mm6 \n\t" "pcmpeqb %%mm7, %%mm7 \n\t" "movq %2, %%mm0 \n\t" "punpcklbw %%mm6, %%mm0 \n\t" "psrlw $1, %%mm0 \n\t" "psubw %%mm7, %%mm0 \n\t" "packuswb %%mm0, %%mm0 \n\t" "movq %%mm0, %3 \n\t" "lea (%0, %1), %%"REG_a" \n\t" "lea (%%"REG_a", %1, 4), %%"REG_d" \n\t"// 0 1 2 3 4 5 6 7 8 9// %0 eax eax+%1 eax+2%1 %0+4%1 edx edx+%1 edx+2%1 %0+8%1 edx+4%1#undef FIND_MIN_MAX#ifdef HAVE_MMX2#define REAL_FIND_MIN_MAX(addr)\ "movq " #addr ", %%mm0 \n\t"\ "pminub %%mm0, %%mm7 \n\t"\ "pmaxub %%mm0, %%mm6 \n\t"#else#define REAL_FIND_MIN_MAX(addr)\ "movq " #addr ", %%mm0 \n\t"\ "movq %%mm7, %%mm1 \n\t"\ "psubusb %%mm0, %%mm6 \n\t"\ "paddb %%mm0, %%mm6 \n\t"\ "psubusb %%mm0, %%mm1 \n\t"\ "psubb %%mm1, %%mm7 \n\t"#endif#define FIND_MIN_MAX(addr) REAL_FIND_MIN_MAX(addr)FIND_MIN_MAX((%%REGa))FIND_MIN_MAX((%%REGa, %1))FIND_MIN_MAX((%%REGa, %1, 2))FIND_MIN_MAX((%0, %1, 4))FIND_MIN_MAX((%%REGd))FIND_MIN_MAX((%%REGd, %1))FIND_MIN_MAX((%%REGd, %1, 2))FIND_MIN_MAX((%0, %1, 8)) "movq %%mm7, %%mm4 \n\t" "psrlq $8, %%mm7 \n\t"#ifdef HAVE_MMX2 "pminub %%mm4, %%mm7 \n\t" // min of pixels "pshufw $0xF9, %%mm7, %%mm4 \n\t" "pminub %%mm4, %%mm7 \n\t" // min of pixels "pshufw $0xFE, %%mm7, %%mm4 \n\t" "pminub %%mm4, %%mm7 \n\t"#else "movq %%mm7, %%mm1 \n\t" "psubusb %%mm4, %%mm1 \n\t" "psubb %%mm1, %%mm7 \n\t" "movq %%mm7, %%mm4 \n\t" "psrlq $16, %%mm7 \n\t" "movq %%mm7, %%mm1 \n\t" "psubusb %%mm4, %%mm1 \n\t" "psubb %%mm1, %%mm7 \n\t" "movq %%mm7, %%mm4 \n\t" "psrlq $32, %%mm7 \n\t" "movq %%mm7, %%mm1 \n\t" "psubusb %%mm4, %%mm1 \n\t" "psubb %%mm1, %%mm7 \n\t"#endif "movq %%mm6, %%mm4 \n\t" "psrlq $8, %%mm6 \n\t"#ifdef HAVE_MMX2 "pmaxub %%mm4, %%mm6 \n\t" // max of pixels "pshufw $0xF9, %%mm6, %%mm4 \n\t" "pmaxub %%mm4, %%mm6 \n\t" "pshufw $0xFE, %%mm6, %%mm4 \n\t" "pmaxub %%mm4, %%mm6 \n\t"#else "psubusb %%mm4, %%mm6 \n\t" "paddb %%mm4, %%mm6 \n\t" "movq %%mm6, %%mm4 \n\t" "psrlq $16, %%mm6 \n\t" "psubusb %%mm4, %%mm6 \n\t" "paddb %%mm4, %%mm6 \n\t" "movq %%mm6, %%mm4 \n\t" "psrlq $32, %%mm6 \n\t" "psubusb %%mm4, %%mm6 \n\t" "paddb %%mm4, %%mm6 \n\t"#endif "movq %%mm6, %%mm0 \n\t" // max "psubb %%mm7, %%mm6 \n\t" // max - min "movd %%mm6, %%ecx \n\t" "cmpb "MANGLE(deringThreshold)", %%cl \n\t" " jb 1f \n\t" "lea -24(%%"REG_SP"), %%"REG_c" \n\t" "and "ALIGN_MASK", %%"REG_c" \n\t" PAVGB(%%mm0, %%mm7) // a=(max + min)/2 "punpcklbw %%mm7, %%mm7 \n\t" "punpcklbw %%mm7, %%mm7 \n\t" "punpcklbw %%mm7, %%mm7 \n\t" "movq %%mm7, (%%"REG_c") \n\t" "movq (%0), %%mm0 \n\t" // L10 "movq %%mm0, %%mm1 \n\t" // L10 "movq %%mm0, %%mm2 \n\t" // L10 "psllq $8, %%mm1 \n\t" "psrlq $8, %%mm2 \n\t" "movd -4(%0), %%mm3 \n\t" "movd 8(%0), %%mm4 \n\t" "psrlq $24, %%mm3 \n\t" "psllq $56, %%mm4 \n\t" "por %%mm3, %%mm1 \n\t" // L00 "por %%mm4, %%mm2 \n\t" // L20 "movq %%mm1, %%mm3 \n\t" // L00 PAVGB(%%mm2, %%mm1) // (L20 + L00)/2 PAVGB(%%mm0, %%mm1) // (L20 + L00 + 2L10)/4 "psubusb %%mm7, %%mm0 \n\t" "psubusb %%mm7, %%mm2 \n\t" "psubusb %%mm7, %%mm3 \n\t" "pcmpeqb "MANGLE(b00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -