asm volatile(  #if 0 "pxor %%mm7, %%mm7				\n\t" "leal (%0, %1), %%eax				\n\t" "leal (%%eax, %1, 4), %%ebx			\n\t"      "movq (%0, %1, 2), %%mm0			\n\t" "movq (%0), %%mm1				\n\t" "movq %%mm0, %%mm2				\n\t" PAVGB(%%mm7, %%mm0) PAVGB(%%mm1, %%mm0) PAVGB(%%mm2, %%mm0)  "movq (%%eax), %%mm1				\n\t" "movq (%%eax, %1, 2), %%mm3			\n\t" "movq %%mm1, %%mm4				\n\t" PAVGB(%%mm7, %%mm1) PAVGB(%%mm3, %%mm1) PAVGB(%%mm4, %%mm1)  "movq %%mm0, %%mm4				\n\t" "psubusb %%mm1, %%mm0				\n\t" "psubusb %%mm4, %%mm1				\n\t" "por %%mm0, %%mm1				\n\t"   "movq (%0, %1, 4), %%mm0			\n\t" "movq %%mm0, %%mm4				\n\t" PAVGB(%%mm7, %%mm0) PAVGB(%%mm2, %%mm0) PAVGB(%%mm4, %%mm0)  "movq (%%ebx), %%mm2				\n\t" "movq %%mm3, %%mm5				\n\t" PAVGB(%%mm7, %%mm3) PAVGB(%%mm2, %%mm3) PAVGB(%%mm5, %%mm3)  "movq %%mm0, %%mm6				\n\t" "psubusb %%mm3, %%mm0				\n\t" "psubusb %%mm6, %%mm3				\n\t" "por %%mm0, %%mm3				\n\t" "pcmpeqb %%mm7, %%mm0				\n\t"   "movq (%%ebx, %1), %%mm6			\n\t" "movq %%mm6, %%mm5				\n\t" PAVGB(%%mm7, %%mm6) PAVGB(%%mm4, %%mm6) PAVGB(%%mm5, %%mm6)  "movq (%%ebx, %1, 2), %%mm5			\n\t" "movq %%mm2, %%mm4				\n\t" PAVGB(%%mm7, %%mm2) PAVGB(%%mm5, %%mm2) PAVGB(%%mm4, %%mm2)  "movq %%mm6, %%mm4				\n\t" "psubusb %%mm2, %%mm6				\n\t" "psubusb %%mm4, %%mm2				\n\t" "por %%mm6, %%mm2				\n\t"    PMINUB(%%mm2, %%mm1, %%mm4) "movq pQPb, %%mm4				\n\t" "paddusb b01, %%mm4				\n\t" "pcmpgtb %%mm3, %%mm4				\n\t" "psubusb %%mm1, %%mm3				\n\t" "pand %%mm4, %%mm3				\n\t"  "movq %%mm3, %%mm1				\n\t"  PAVGB(%%mm7, %%mm3) PAVGB(%%mm7, %%mm3) "paddusb %%mm1, %%mm3				\n\t"   "movq (%%eax, %1, 2), %%mm6			\n\t" "movq (%0, %1, 4), %%mm5			\n\t" "movq (%0, %1, 4), %%mm4			\n\t" "psubusb %%mm6, %%mm5				\n\t" "psubusb %%mm4, %%mm6				\n\t" "por %%mm6, %%mm5				\n\t" "pcmpeqb %%mm7, %%mm6				\n\t" "pxor %%mm6, %%mm0				\n\t" "pand %%mm0, %%mm3				\n\t" PMINUB(%%mm5, %%mm3, %%mm0)  "psubusb b01, %%mm3				\n\t" PAVGB(%%mm7, %%mm3)  "movq (%%eax, %1, 2), %%mm0			\n\t" "movq (%0, %1, 4), %%mm2			\n\t" "pxor %%mm6, %%mm0				\n\t" "pxor %%mm6, %%mm2				\n\t" "psubb %%mm3, %%mm0				\n\t" "paddb %%mm3, %%mm2				\n\t" "pxor %%mm6, %%mm0				\n\t" "pxor %%mm6, %%mm2				\n\t" "movq %%mm0, (%%eax, %1, 2)			\n\t" "movq %%mm2, (%0, %1, 4)			\n\t" #endif  "leal (%0, %1), %%eax				\n\t" "pcmpeqb %%mm6, %%mm6				\n\t"      "movq (%%eax, %1, 2), %%mm1			\n\t" "movq (%0, %1, 4), %%mm0			\n\t" "pxor %%mm6, %%mm1				\n\t" PAVGB(%%mm1, %%mm0)   "movq (%%eax, %1, 4), %%mm2			\n\t" "movq (%%eax, %1), %%mm3			\n\t" "pxor %%mm6, %%mm2				\n\t" "movq %%mm2, %%mm5				\n\t" "movq b80, %%mm4				\n\t" "leal (%%eax, %1, 4), %%ebx			\n\t" PAVGB(%%mm3, %%mm2) PAVGB(%%mm0, %%mm4) PAVGB(%%mm2, %%mm4) PAVGB(%%mm0, %%mm4)   "movq (%%eax), %%mm2				\n\t" "pxor %%mm6, %%mm2				\n\t" PAVGB(%%mm3, %%mm2) PAVGB((%0), %%mm1) "movq b80, %%mm3				\n\t" PAVGB(%%mm2, %%mm3) PAVGB(%%mm1, %%mm3) PAVGB(%%mm2, %%mm3)   PAVGB((%%ebx, %1), %%mm5) "movq (%%ebx, %1, 2), %%mm1			\n\t" "pxor %%mm6, %%mm1				\n\t" PAVGB((%0, %1, 4), %%mm1) "movq b80, %%mm2				\n\t" PAVGB(%%mm5, %%mm2) PAVGB(%%mm1, %%mm2) PAVGB(%%mm5, %%mm2)   "movq b00, %%mm1				\n\t" "movq b00, %%mm5				\n\t" "psubb %%mm2, %%mm1				\n\t" "psubb %%mm3, %%mm5				\n\t" PMAXUB(%%mm1, %%mm2) PMAXUB(%%mm5, %%mm3) PMINUB(%%mm2, %%mm3, %%mm1)    "movq b00, %%mm7				\n\t" "movq pQPb, %%mm2				\n\t" PAVGB(%%mm6, %%mm2) "psubb %%mm6, %%mm2				\n\t"  "movq %%mm4, %%mm1				\n\t" "pcmpgtb %%mm7, %%mm1				\n\t" "pxor %%mm1, %%mm4				\n\t" "psubb %%mm1, %%mm4				\n\t" "pcmpgtb %%mm4, %%mm2				\n\t" "psubusb %%mm3, %%mm4				\n\t"   "movq %%mm4, %%mm3				\n\t" "psubusb b01, %%mm4				\n\t" PAVGB(%%mm7, %%mm4) PAVGB(%%mm7, %%mm4) "paddb %%mm3, %%mm4				\n\t" "pand %%mm2, %%mm4				\n\t"  "movq b80, %%mm5				\n\t" "psubb %%mm0, %%mm5				\n\t" "paddsb %%mm6, %%mm5				\n\t" "pcmpgtb %%mm5, %%mm7				\n\t" "pxor %%mm7, %%mm5				\n\t"  PMINUB(%%mm5, %%mm4, %%mm3) "pxor %%mm1, %%mm7				\n\t"  "pand %%mm7, %%mm4				\n\t" "movq (%%eax, %1, 2), %%mm0			\n\t" "movq (%0, %1, 4), %%mm2			\n\t" "pxor %%mm1, %%mm0				\n\t" "pxor %%mm1, %%mm2				\n\t" "paddb %%mm4, %%mm0				\n\t" "psubb %%mm4, %%mm2				\n\t" "pxor %%mm1, %%mm0				\n\t" "pxor %%mm1, %%mm2				\n\t" "movq %%mm0, (%%eax, %1, 2)			\n\t" "movq %%mm2, (%0, %1, 4)			\n\t"  : : "r" (src), "r" (stride) : "%eax", "%ebx" );   #elif defined (HAVE_MMX) src+= stride*4;
static inline void doVertDefFilter(uint8_t src[], int stride, int QP){#ifdef HAVE_MMX	src+= stride*4;	//FIXME try pmul for *5 stuff//	src[0]=0;	asm volatile(		"pxor %%mm7, %%mm7				\n\t"		"leal (%0, %1), %%eax				\n\t"		"leal (%%eax, %1, 4), %%ebx			\n\t"//	0	1	2	3	4	5	6	7//	%0	%0+%1	%0+2%1	eax+2%1	%0+4%1	eax+4%1	ebx+%1	ebx+2%1//	%0	eax	eax+%1	eax+2%1	%0+4%1	ebx	ebx+%1	ebx+2%1		"movq (%0), %%mm0				\n\t"		"movq %%mm0, %%mm1				\n\t"		"punpcklbw %%mm7, %%mm0				\n\t" // low part of line 0		"punpckhbw %%mm7, %%mm1				\n\t" // high part of line 0		"movq (%%eax), %%mm2				\n\t"		"movq %%mm2, %%mm3				\n\t"		"punpcklbw %%mm7, %%mm2				\n\t" // low part of line 1		"punpckhbw %%mm7, %%mm3				\n\t" // high part of line 1		"movq (%%eax, %1), %%mm4			\n\t"		"movq %%mm4, %%mm5				\n\t"		"punpcklbw %%mm7, %%mm4				\n\t" // low part of line 2		"punpckhbw %%mm7, %%mm5				\n\t" // high part of line 2		"paddw %%mm0, %%mm0				\n\t" // 2L0		"paddw %%mm1, %%mm1				\n\t" // 2H0		"psubw %%mm4, %%mm2				\n\t" // L1 - L2		"psubw %%mm5, %%mm3				\n\t" // H1 - H2		"psubw %%mm2, %%mm0				\n\t" // 2L0 - L1 + L2		"psubw %%mm3, %%mm1				\n\t" // 2H0 - H1 + H2		"psllw $2, %%mm2				\n\t" // 4L1 - 4L2		"psllw $2, %%mm3				\n\t" // 4H1 - 4H2		"psubw %%mm2, %%mm0				\n\t" // 2L0 - 5L1 + 5L2		"psubw %%mm3, %%mm1				\n\t" // 2H0 - 5H1 + 5H2		"movq (%%eax, %1, 2), %%mm2			\n\t"		"movq %%mm2, %%mm3				\n\t"		"punpcklbw %%mm7, %%mm2				\n\t" // L3		"punpckhbw %%mm7, %%mm3				\n\t" // H3		"psubw %%mm2, %%mm0				\n\t" // 2L0 - 5L1 + 5L2 - L3		"psubw %%mm3, %%mm1				\n\t" // 2H0 - 5H1 + 5H2 - H3		"psubw %%mm2, %%mm0				\n\t" // 2L0 - 5L1 + 5L2 - 2L3		"psubw %%mm3, %%mm1				\n\t" // 2H0 - 5H1 + 5H2 - 2H3		"movq %%mm0, temp0				\n\t" // 2L0 - 5L1 + 5L2 - 2L3		"movq %%mm1, temp1				\n\t" // 2H0 - 5H1 + 5H2 - 2H3		"movq (%0, %1, 4), %%mm0			\n\t"		"movq %%mm0, %%mm1				\n\t"		"punpcklbw %%mm7, %%mm0				\n\t" // L4		"punpckhbw %%mm7, %%mm1				\n\t" // H4		"psubw %%mm0, %%mm2				\n\t" // L3 - L4		"psubw %%mm1, %%mm3				\n\t" // H3 - H4		"movq %%mm2, temp2				\n\t" // L3 - L4		"movq %%mm3, temp3				\n\t" // H3 - H4		"paddw %%mm4, %%mm4				\n\t" // 2L2		"paddw %%mm5, %%mm5				\n\t" // 2H2		"psubw %%mm2, %%mm4				\n\t" // 2L2 - L3 + L4		"psubw %%mm3, %%mm5				\n\t" // 2H2 - H3 + H4		"psllw $2, %%mm2				\n\t" // 4L3 - 4L4		"psllw $2, %%mm3				\n\t" // 4H3 - 4H4		"psubw %%mm2, %%mm4				\n\t" // 2L2 - 5L3 + 5L4		"psubw %%mm3, %%mm5				\n\t" // 2H2 - 5H3 + 5H4//50 opcodes so far		"movq (%%ebx), %%mm2				\n\t"		"movq %%mm2, %%mm3				\n\t"		"punpcklbw %%mm7, %%mm2				\n\t" // L5		"punpckhbw %%mm7, %%mm3				\n\t" // H5		"psubw %%mm2, %%mm4				\n\t" // 2L2 - 5L3 + 5L4 - L5		"psubw %%mm3, %%mm5				\n\t" // 2H2 - 5H3 + 5H4 - H5		"psubw %%mm2, %%mm4				\n\t" // 2L2 - 5L3 + 5L4 - 2L5		"psubw %%mm3, %%mm5				\n\t" // 2H2 - 5H3 + 5H4 - 2H5		"movq (%%ebx, %1), %%mm6			\n\t"		"punpcklbw %%mm7, %%mm6				\n\t" // L6		"psubw %%mm6, %%mm2				\n\t" // L5 - L6		"movq (%%ebx, %1), %%mm6			\n\t"		"punpckhbw %%mm7, %%mm6				\n\t" // H6		"psubw %%mm6, %%mm3				\n\t" // H5 - H6		"paddw %%mm0, %%mm0				\n\t" // 2L4		"paddw %%mm1, %%mm1				\n\t" // 2H4		"psubw %%mm2, %%mm0				\n\t" // 2L4 - L5 + L6		"psubw %%mm3, %%mm1				\n\t" // 2H4 - H5 + H6		"psllw $2, %%mm2				\n\t" // 4L5 - 4L6		"psllw $2, %%mm3				\n\t" // 4H5 - 4H6		"psubw %%mm2, %%mm0				\n\t" // 2L4 - 5L5 + 5L6		"psubw %%mm3, %%mm1				\n\t" // 2H4 - 5H5 + 5H6		"movq (%%ebx, %1, 2), %%mm2			\n\t"		"movq %%mm2, %%mm3				\n\t"		"punpcklbw %%mm7, %%mm2				\n\t" // L7		"punpckhbw %%mm7, %%mm3				\n\t" // H7		"paddw %%mm2, %%mm2				\n\t" // 2L7		"paddw %%mm3, %%mm3				\n\t" // 2H7		"psubw %%mm2, %%mm0				\n\t" // 2L4 - 5L5 + 5L6 - 2L7		"psubw %%mm3, %%mm1				\n\t" // 2H4 - 5H5 + 5H6 - 2H7		"movq temp0, %%mm2				\n\t" // 2L0 - 5L1 + 5L2 - 2L3		"movq temp1, %%mm3				\n\t" // 2H0 - 5H1 + 5H2 - 2H3#ifdef HAVE_MMX2		"movq %%mm7, %%mm6				\n\t" // 0		"psubw %%mm0, %%mm6				\n\t"		"pmaxsw %%mm6, %%mm0				\n\t" // |2L4 - 5L5 + 5L6 - 2L7|		"movq %%mm7, %%mm6				\n\t" // 0		"psubw %%mm1, %%mm6				\n\t"		"pmaxsw %%mm6, %%mm1				\n\t" // |2H4 - 5H5 + 5H6 - 2H7|		"movq %%mm7, %%mm6				\n\t" // 0		"psubw %%mm2, %%mm6				\n\t"		"pmaxsw %%mm6, %%mm2				\n\t" // |2L0 - 5L1 + 5L2 - 2L3|		"movq %%mm7, %%mm6				\n\t" // 0		"psubw %%mm3, %%mm6				\n\t"		"pmaxsw %%mm6, %%mm3				\n\t" // |2H0 - 5H1 + 5H2 - 2H3|#else		"movq %%mm7, %%mm6				\n\t" // 0		"pcmpgtw %%mm0, %%mm6				\n\t"		"pxor %%mm6, %%mm0				\n\t"		"psubw %%mm6, %%mm0				\n\t" // |2L4 - 5L5 + 5L6 - 2L7|		"movq %%mm7, %%mm6				\n\t" // 0		"pcmpgtw %%mm1, %%mm6				\n\t"		"pxor %%mm6, %%mm1				\n\t"		"psubw %%mm6, %%mm1				\n\t" // |2H4 - 5H5 + 5H6 - 2H7|		"movq %%mm7, %%mm6				\n\t" // 0		"pcmpgtw %%mm2, %%mm6				\n\t"		"pxor %%mm6, %%mm2				\n\t"		"psubw %%mm6, %%mm2				\n\t" // |2L0 - 5L1 + 5L2 - 2L3|		"movq %%mm7, %%mm6				\n\t" // 0		"pcmpgtw %%mm3, %%mm6				\n\t"		"pxor %%mm6, %%mm3				\n\t"		"psubw %%mm6, %%mm3				\n\t" // |2H0 - 5H1 + 5H2 - 2H3|#endif#ifdef HAVE_MMX2		"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		"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		"movd %2, %%mm2					\n\t" // QP		"punpcklwd %%mm2, %%mm2				\n\t"		"punpcklwd %%mm2, %%mm2				\n\t"		"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 w05, %%mm2				\n\t" // 5		"pmullw %%mm2, %%mm4				\n\t"		"pmullw %%mm2, %%mm5				\n\t"		"movq 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 w06, %%mm2				\n\t" // 6		"paddw %%mm2, %%mm4				\n\t"		"paddw %%mm2, %%mm5				\n\t"		"movq w1400, %%mm2				\n\t" // 1400h = 5120 = 5/64*2^16//FIXME if *5/64 is supposed to be /13 then we should use 5041 instead of 5120		"pmulhw %%mm2, %%mm4				\n\t" // hd/13		"pmulhw %%mm2, %%mm5				\n\t" // ld/13*/		"movq temp2, %%mm0				\n\t" // L3 - L4		"movq temp3, %%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 (%%eax, %1, 2), %%mm0			\n\t"		"paddb   %%mm4, %%mm0				\n\t"		"movq %%mm0, (%%eax, %1, 2) 			\n\t"		"movq (%0, %1, 4), %%mm0			\n\t"		"psubb %%mm4, %%mm0				\n\t"		"movq %%mm0, (%0, %1, 4) 			\n\t"		:		: "r" (src), "r" (stride), "r" (QP)		: "%eax", "%ebx"	);#else	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*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}