AT&T汇编代码改为INTEL汇编代码

wazdxm1980 2008-04-01 10:55:53
标红的部分,不很清楚,谢谢
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");

}
...全文
111 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐
发帖
汇编语言

2.1w+

社区成员

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
帖子事件
创建了帖子
2008-04-01 10:55
社区公告
暂无公告