AT&T汇编代码改为INTEL汇编代码
标红的部分,不很清楚,谢谢
static void mmx_blur(uint8_t *buffer, int width, int height)
{
__asm __volatile
("\n\t pxor %%mm6, %%mm6"
::);
int scrsh = (width * height) >> 1;
int i;
int len = (width * height);
uint8_t *buf = buffer;
/* Prepare substraction register */
for (i = 0; i < scrsh; i += 4) {
__asm __volatile
("\n\t movd %[buf], %%mm0"
"\n\t movd %[add1], %%mm1"
"\n\t punpcklbw %%mm6, %%mm0"
"\n\t movd %[add2], %%mm2"
"\n\t punpcklbw %%mm6, %%mm1"
"\n\t movd %[add3], %%mm3"
"\n\t punpcklbw %%mm6, %%mm2"
"\n\t paddw %%mm1, %%mm0"
"\n\t punpcklbw %%mm6, %%mm3"
"\n\t paddw %%mm2, %%mm0"
"\n\t paddw %%mm3, %%mm0"
"\n\t psrlw $2, %%mm0"
"\n\t packuswb %%mm6, %%mm0"
"\n\t movd %%mm0, %[buf]"
:: [buf] "m" (*(buf + i))
, [add1] "m" (*(buf + i + width))
, [add2] "m" (*(buf + i + width + 1))
, [add3] "m" (*(buf + i + width - 1))
);
// : "mm0", "mm1", "mm2", "mm3", "mm6");
}
len = (width*height)-1;
for (i = len-1; i > scrsh; i -= 4) {
__asm __volatile
("\n\t movd %[buf], %%mm0"
"\n\t movd %[add1], %%mm1"
"\n\t punpcklbw %%mm6, %%mm0"
"\n\t movd %[add2], %%mm2"
"\n\t punpcklbw %%mm6, %%mm1"
"\n\t movd %[add3], %%mm3"
"\n\t punpcklbw %%mm6, %%mm2"
"\n\t paddw %%mm1, %%mm0"
"\n\t punpcklbw %%mm6, %%mm3"
"\n\t paddw %%mm2, %%mm0"
"\n\t paddw %%mm3, %%mm0"
"\n\t psrlw $2, %%mm0"
"\n\t packuswb %%mm6, %%mm0"
"\n\t movd %%mm0, %[buf]"
:: [buf] "m" (*(buf + i))
, [add1] "m" (*(buf + i - width))
, [add2] "m" (*(buf + i - width + 1))
, [add3] "m" (*(buf + i - width - 1))
);// : "mm0", "mm1", "mm2", "mm3", "mm6");
}
__asm__ __volatile__ ( _EMMS:::"memory");
}