}
static void inline RENAME(tempNoiseReducer)(uint8_t *src, int stride,				    uint8_t *tempBlured, uint32_t *tempBluredPast, int *maxNoise){	// to save a register (FIXME do this outside of the loops)	tempBluredPast[127]= maxNoise[0];	tempBluredPast[128]= maxNoise[1];	tempBluredPast[129]= maxNoise[2];        #define FAST_L2_DIFF//#define L1_DIFF //u should change the thresholds too if u try that one#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)	asm volatile(		"leal (%2, %2, 2), %%eax			\n\t" // 3*stride		"leal (%2, %2, 4), %%edx			\n\t" // 5*stride		"leal (%%edx, %2, 2), %%ecx			\n\t" // 7*stride//	0	1	2	3	4	5	6	7	8	9//	%x	%x+%2	%x+2%2	%x+eax	%x+4%2	%x+edx	%x+2eax	%x+ecx	%x+8%2//FIXME reorder?#ifdef L1_DIFF //needs mmx2		"movq (%0), %%mm0				\n\t" // L0		"psadbw (%1), %%mm0				\n\t" // |L0-R0|		"movq (%0, %2), %%mm1				\n\t" // L1		"psadbw (%1, %2), %%mm1				\n\t" // |L1-R1|		"movq (%0, %2, 2), %%mm2			\n\t" // L2		"psadbw (%1, %2, 2), %%mm2			\n\t" // |L2-R2|		"movq (%0, %%eax), %%mm3			\n\t" // L3		"psadbw (%1, %%eax), %%mm3			\n\t" // |L3-R3|		"movq (%0, %2, 4), %%mm4			\n\t" // L4		"paddw %%mm1, %%mm0				\n\t"		"psadbw (%1, %2, 4), %%mm4			\n\t" // |L4-R4|		"movq (%0, %%edx), %%mm5			\n\t" // L5		"paddw %%mm2, %%mm0				\n\t"		"psadbw (%1, %%edx), %%mm5			\n\t" // |L5-R5|		"movq (%0, %%eax, 2), %%mm6			\n\t" // L6		"paddw %%mm3, %%mm0				\n\t"		"psadbw (%1, %%eax, 2), %%mm6			\n\t" // |L6-R6|		"movq (%0, %%ecx), %%mm7			\n\t" // L7		"paddw %%mm4, %%mm0				\n\t"		"psadbw (%1, %%ecx), %%mm7			\n\t" // |L7-R7|		"paddw %%mm5, %%mm6				\n\t"		"paddw %%mm7, %%mm6				\n\t"		"paddw %%mm6, %%mm0				\n\t"#elif defined (FAST_L2_DIFF)		"pcmpeqb %%mm7, %%mm7				\n\t"		"movq "MANGLE(b80)", %%mm6			\n\t"		"pxor %%mm0, %%mm0				\n\t"#define L2_DIFF_CORE(a, b)\		"movq " #a ", %%mm5				\n\t"\		"movq " #b ", %%mm2				\n\t"\		"pxor %%mm7, %%mm2				\n\t"\		PAVGB(%%mm2, %%mm5)\		"paddb %%mm6, %%mm5				\n\t"\		"movq %%mm5, %%mm2				\n\t"\		"psllw $8, %%mm5				\n\t"\		"pmaddwd %%mm5, %%mm5				\n\t"\		"pmaddwd %%mm2, %%mm2				\n\t"\		"paddd %%mm2, %%mm5				\n\t"\		"psrld $14, %%mm5				\n\t"\		"paddd %%mm5, %%mm0				\n\t"L2_DIFF_CORE((%0), (%1))L2_DIFF_CORE((%0, %2), (%1, %2))L2_DIFF_CORE((%0, %2, 2), (%1, %2, 2))L2_DIFF_CORE((%0, %%eax), (%1, %%eax))L2_DIFF_CORE((%0, %2, 4), (%1, %2, 4))L2_DIFF_CORE((%0, %%edx), (%1, %%edx))L2_DIFF_CORE((%0, %%eax,2), (%1, %%eax,2))L2_DIFF_CORE((%0, %%ecx), (%1, %%ecx))#else		"pxor %%mm7, %%mm7				\n\t"		"pxor %%mm0, %%mm0				\n\t"#define L2_DIFF_CORE(a, b)\		"movq " #a ", %%mm5				\n\t"\		"movq " #b ", %%mm2				\n\t"\		"movq %%mm5, %%mm1				\n\t"\		"movq %%mm2, %%mm3				\n\t"\		"punpcklbw %%mm7, %%mm5				\n\t"\		"punpckhbw %%mm7, %%mm1				\n\t"\		"punpcklbw %%mm7, %%mm2				\n\t"\		"punpckhbw %%mm7, %%mm3				\n\t"\		"psubw %%mm2, %%mm5				\n\t"\		"psubw %%mm3, %%mm1				\n\t"\		"pmaddwd %%mm5, %%mm5				\n\t"\		"pmaddwd %%mm1, %%mm1				\n\t"\		"paddd %%mm1, %%mm5				\n\t"\		"paddd %%mm5, %%mm0				\n\t"L2_DIFF_CORE((%0), (%1))L2_DIFF_CORE((%0, %2), (%1, %2))L2_DIFF_CORE((%0, %2, 2), (%1, %2, 2))L2_DIFF_CORE((%0, %%eax), (%1, %%eax))L2_DIFF_CORE((%0, %2, 4), (%1, %2, 4))L2_DIFF_CORE((%0, %%edx), (%1, %%edx))L2_DIFF_CORE((%0, %%eax,2), (%1, %%eax,2))L2_DIFF_CORE((%0, %%ecx), (%1, %%ecx))#endif		"movq %%mm0, %%mm4				\n\t"		"psrlq $32, %%mm0				\n\t"		"paddd %%mm0, %%mm4				\n\t"		"movd %%mm4, %%ecx				\n\t"		"shll $2, %%ecx					\n\t"		"movl %3, %%edx					\n\t"		"addl -4(%%edx), %%ecx				\n\t"		"addl 4(%%edx), %%ecx				\n\t"		"addl -1024(%%edx), %%ecx			\n\t"		"addl $4, %%ecx					\n\t"		"addl 1024(%%edx), %%ecx			\n\t"		"shrl $3, %%ecx					\n\t"		"movl %%ecx, (%%edx)				\n\t"//		"movl %3, %%ecx					\n\t"//		"movl %%ecx, test				\n\t"//		"jmp 4f \n\t"		"cmpl 512(%%edx), %%ecx				\n\t"		" jb 2f						\n\t"		"cmpl 516(%%edx), %%ecx				\n\t"		" jb 1f						\n\t"		"leal (%%eax, %2, 2), %%edx			\n\t" // 5*stride		"leal (%%edx, %2, 2), %%ecx			\n\t" // 7*stride		"movq (%0), %%mm0				\n\t" // L0		"movq (%0, %2), %%mm1				\n\t" // L1		"movq (%0, %2, 2), %%mm2			\n\t" // L2		"movq (%0, %%eax), %%mm3			\n\t" // L3		"movq (%0, %2, 4), %%mm4			\n\t" // L4		"movq (%0, %%edx), %%mm5			\n\t" // L5		"movq (%0, %%eax, 2), %%mm6			\n\t" // L6		"movq (%0, %%ecx), %%mm7			\n\t" // L7		"movq %%mm0, (%1)				\n\t" // L0		"movq %%mm1, (%1, %2)				\n\t" // L1		"movq %%mm2, (%1, %2, 2)			\n\t" // L2		"movq %%mm3, (%1, %%eax)			\n\t" // L3		"movq %%mm4, (%1, %2, 4)			\n\t" // L4		"movq %%mm5, (%1, %%edx)			\n\t" // L5		"movq %%mm6, (%1, %%eax, 2)			\n\t" // L6		"movq %%mm7, (%1, %%ecx)			\n\t" // L7		"jmp 4f						\n\t"		"1:						\n\t"		"leal (%%eax, %2, 2), %%edx			\n\t" // 5*stride		"leal (%%edx, %2, 2), %%ecx			\n\t" // 7*stride		"movq (%0), %%mm0				\n\t" // L0		PAVGB((%1), %%mm0)				      // L0		"movq (%0, %2), %%mm1				\n\t" // L1		PAVGB((%1, %2), %%mm1)				      // L1		"movq (%0, %2, 2), %%mm2			\n\t" // L2		PAVGB((%1, %2, 2), %%mm2)			      // L2		"movq (%0, %%eax), %%mm3			\n\t" // L3		PAVGB((%1, %%eax), %%mm3)			      // L3		"movq (%0, %2, 4), %%mm4			\n\t" // L4		PAVGB((%1, %2, 4), %%mm4)			      // L4		"movq (%0, %%edx), %%mm5			\n\t" // L5		PAVGB((%1, %%edx), %%mm5)			      // L5		"movq (%0, %%eax, 2), %%mm6			\n\t" // L6		PAVGB((%1, %%eax, 2), %%mm6)			      // L6		"movq (%0, %%ecx), %%mm7			\n\t" // L7		PAVGB((%1, %%ecx), %%mm7)			      // L7		"movq %%mm0, (%1)				\n\t" // R0		"movq %%mm1, (%1, %2)				\n\t" // R1		"movq %%mm2, (%1, %2, 2)			\n\t" // R2		"movq %%mm3, (%1, %%eax)			\n\t" // R3		"movq %%mm4, (%1, %2, 4)			\n\t" // R4		"movq %%mm5, (%1, %%edx)			\n\t" // R5		"movq %%mm6, (%1, %%eax, 2)			\n\t" // R6		"movq %%mm7, (%1, %%ecx)			\n\t" // R7		"movq %%mm0, (%0)				\n\t" // L0		"movq %%mm1, (%0, %2)				\n\t" // L1		"movq %%mm2, (%0, %2, 2)			\n\t" // L2		"movq %%mm3, (%0, %%eax)			\n\t" // L3		"movq %%mm4, (%0, %2, 4)			\n\t" // L4		"movq %%mm5, (%0, %%edx)			\n\t" // L5		"movq %%mm6, (%0, %%eax, 2)			\n\t" // L6		"movq %%mm7, (%0, %%ecx)			\n\t" // L7		"jmp 4f						\n\t"		"2:						\n\t"		"cmpl 508(%%edx), %%ecx				\n\t"		" jb 3f						\n\t"		"leal (%%eax, %2, 2), %%edx			\n\t" // 5*stride		"leal (%%edx, %2, 2), %%ecx			\n\t" // 7*stride		"movq (%0), %%mm0				\n\t" // L0		"movq (%0, %2), %%mm1				\n\t" // L1		"movq (%0, %2, 2), %%mm2			\n\t" // L2		"movq (%0, %%eax), %%mm3			\n\t" // L3		"movq (%1), %%mm4				\n\t" // R0		"movq (%1, %2), %%mm5				\n\t" // R1		"movq (%1, %2, 2), %%mm6			\n\t" // R2		"movq (%1, %%eax), %%mm7			\n\t" // R3		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		"movq %%mm0, (%1)				\n\t" // R0		"movq %%mm1, (%1, %2)				\n\t" // R1		"movq %%mm2, (%1, %2, 2)			\n\t" // R2		"movq %%mm3, (%1, %%eax)			\n\t" // R3		"movq %%mm0, (%0)				\n\t" // L0		"movq %%mm1, (%0, %2)				\n\t" // L1		"movq %%mm2, (%0, %2, 2)			\n\t" // L2		"movq %%mm3, (%0, %%eax)			\n\t" // L3		"movq (%0, %2, 4), %%mm0			\n\t" // L4		"movq (%0, %%edx), %%mm1			\n\t" // L5		"movq (%0, %%eax, 2), %%mm2			\n\t" // L6		"movq (%0, %%ecx), %%mm3			\n\t" // L7		"movq (%1, %2, 4), %%mm4			\n\t" // R4		"movq (%1, %%edx), %%mm5			\n\t" // R5		"movq (%1, %%eax, 2), %%mm6			\n\t" // R6		"movq (%1, %%ecx), %%mm7			\n\t" // R7		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		"movq %%mm0, (%1, %2, 4)			\n\t" // R4		"movq %%mm1, (%1, %%edx)			\n\t" // R5		"movq %%mm2, (%1, %%eax, 2)			\n\t" // R6		"movq %%mm3, (%1, %%ecx)			\n\t" // R7		"movq %%mm0, (%0, %2, 4)			\n\t" // L4		"movq %%mm1, (%0, %%edx)			\n\t" // L5		"movq %%mm2, (%0, %%eax, 2)			\n\t" // L6		"movq %%mm3, (%0, %%ecx)			\n\t" // L7		"jmp 4f						\n\t"		"3:						\n\t"		"leal (%%eax, %2, 2), %%edx			\n\t" // 5*stride		"leal (%%edx, %2, 2), %%ecx			\n\t" // 7*stride		"movq (%0), %%mm0				\n\t" // L0		"movq (%0, %2), %%mm1				\n\t" // L1		"movq (%0, %2, 2), %%mm2			\n\t" // L2		"movq (%0, %%eax), %%mm3			\n\t" // L3		"movq (%1), %%mm4				\n\t" // R0		"movq (%1, %2), %%mm5				\n\t" // R1		"movq (%1, %2, 2), %%mm6			\n\t" // R2		"movq (%1, %%eax), %%mm7			\n\t" // R3		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		"movq %%mm0, (%1)				\n\t" // R0		"movq %%mm1, (%1, %2)				\n\t" // R1		"movq %%mm2, (%1, %2, 2)			\n\t" // R2		"movq %%mm3, (%1, %%eax)			\n\t" // R3		"movq %%mm0, (%0)				\n\t" // L0		"movq %%mm1, (%0, %2)				\n\t" // L1		"movq %%mm2, (%0, %2, 2)			\n\t" // L2		"movq %%mm3, (%0, %%eax)			\n\t" // L3		"movq (%0, %2, 4), %%mm0			\n\t" // L4		"movq (%0, %%edx), %%mm1			\n\t" // L5		"movq (%0, %%eax, 2), %%mm2			\n\t" // L6		"movq (%0, %%ecx), %%mm3			\n\t" // L7		"movq (%1, %2, 4), %%mm4			\n\t" // R4		"movq (%1, %%edx), %%mm5			\n\t" // R5		"movq (%1, %%eax, 2), %%mm6			\n\t" // R6		"movq (%1, %%ecx), %%mm7			\n\t" // R7		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		PAVGB(%%mm4, %%mm0)		PAVGB(%%mm5, %%mm1)		PAVGB(%%mm6, %%mm2)		PAVGB(%%mm7, %%mm3)		"movq %%mm0, (%1, %2, 4)			\n\t" // R4		"movq %%mm1, (%1, %%edx)			\n\t" // R5		"movq %%mm2, (%1, %%eax, 2)			\n\t" // R6		"movq %%mm3, (%1, %%ecx)			\n\t" // R7		"movq %%mm0, (%0, %2, 4)			\n\t" // L4		"movq %%mm1, (%0, %%edx)			\n\t" // L5		"movq %%mm2, (%0, %%eax, 2)			\n\t" // L6		"movq %%mm3, (%0, %%ecx)			\n\t" // L7		"4:						\n\t"		:: "r" (src), "r" (tempBlured), "r"(stride), "m" (tempBluredPast)		: "%eax", "%edx", "%ecx", "memory"		);//printf("%d\n", test);#else	int y;	int d=0;	int sysd=0;	int i;	for(y=0; y<8; y++)	{		int x;		for(x=0; x<8; x++)		{			int ref= tempBlured[ x + y*stride ];			int cur= src[ x + y*stride ];			int d1=ref - cur;//			if(x==0 || x==7) d1+= d1>>1;//			if(y==0 || y==7) d1+= d1>>1;//			d+= ABS(d1);			d+= d1*d1;			sysd+= d1;		}	}	i=d;	d= 	(		4*d		+(*(tempBluredPast-256))		+(*(tempBluredPast-1))+ (*(tempBluredPast+1))		+(*(tempBluredPast+256))		+4)>>3;	*tempBluredPast=i;//	((*tempBluredPast)*3 + d + 2)>>2;//printf("%d %d %d\n", maxNoise[0], maxNoise[1], maxNoise[2]);/*Switch between 1  0  0  0  0  0  0  (0)64 32 16  8  4  2  1  (1)64 48 36 27 20 15 11 (33) (approx)64 56 49 43 37 33 29 (200) (approx)*/	if(d > maxNoise[1])	{		if(d < maxNoise[2])		{			for(y=0; y<8; y++)			{				int x;				for(x=0; x<8; x++)				{					int ref= tempBlured[ x + y*stride ];					int cur= src[ x + y*stride ];					tempBlured[ x + y*stride ]=					src[ x + y*stride ]=						(ref + cur + 1)>>1;				}			}		}		else		{			for(y=0; y<8; y++)			{				int x;				for(x=0; x<8; x++)				{					tempBlured[ x + y*stride ]= src[ x + y*stride ];				}			}		}	}	else	{		if(d < maxNoise[0])		{			for(y=0; y<8; y++)			{				int x;				for(x=0; x<8; x++)				{					int ref= tempBlured[ x + y*stride ];					int cur= src[ x + y*stride ];					tempBlured[ x + y*stride ]=					src[ x + y*stride ]=						(ref*7 + cur + 4)>>3;				}			}		}		else		{			for(y=0; y<8; y++)			{				int x;				for(x=0; x<8; x++)				{					int ref= tempBlured[ x + y*stride ];					int cur= src[ x + y*stride ];					tempBlured[ x + y*stride ]=					src[ x + y*stride ]=						(ref*3 + cur + 2)>>2;				}			}		}	}#endif}