关于MMX汇编

hooligan 2002-03-04 08:13:49
下面这段代码从函数名来看是求向量内积的,但我不能确定,有没有哪位高手来帮忙看看。另外现在我编译的时候错误信息如下:
error C2400: inline assembler syntax error in 'opcode'; found 'data type'
请问是怎么回事?(我已经在code generation中指定了pentium)。
还有如果用c来实现下面这一段代码的话,是什么样的。
各位高手,快来帮忙啊!谢谢了。。。。


int
idot_product_char(signed char *a, signed char *b, int n)
{
int r;
int i;

/*
Fast version
- software pipeline
- 8 parallel execution
*/
_asm volatile("pxor %%mm0, %%mm0"::); /* mm0 = 0 */
for (i = 0; i < n; i += 8) {
_asm volatile("movq %0, %%mm1"::"m"(a[i])); /* load a */
_asm volatile("movq %0, %%mm2"::"m"(b[i])); /* load b */
_asm volatile("punpcklbw %%mm1, %%mm6"::);
_asm volatile("punpcklbw %%mm2, %%mm7"::);
_asm volatile("psraw $8, %%mm6"::);
_asm volatile("psraw $8, %%mm7"::);
_asm volatile("punpckhbw %%mm1, %%mm4"::);
_asm volatile("punpckhbw %%mm2, %%mm5"::);
_asm volatile("psraw $8, %%mm4"::);
_asm volatile("psraw $8, %%mm5"::);
_asm volatile("pmaddwd %%mm7, %%mm6"::); /* mm1 = mul+add */
_asm volatile("pmaddwd %%mm5, %%mm4"::); /* mm4 = mul+add */
_asm volatile("paddd %%mm6, %%mm0"::); /* mm0 += mm1 */
_asm volatile("paddd %%mm4, %%mm0"::); /* mm0 += mm4 */
}

_asm volatile("movq %%mm0, %%mm1"::);
_asm volatile("psrlq $32, %%mm1"::);
_asm volatile("paddd %%mm1, %%mm0"::);
_asm volatile("movd %%mm0, %0 "::"m"(r));

_asm volatile("emms"); // insert this line before
//floating-point calc.

return r;
}
...全文
285 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hooligan 2002-03-13
  • 打赏
  • 举报
回复
虽然还有点小问题,但基本上可以用。多谢 congling(congling) 了。
hooligan 2002-03-05
  • 打赏
  • 举报
回复
太好了总算找到一个明白人了。

to ZHLMNET(游水去喏!!!!):
psdk是指platform sdk吗?我已经装了platform sdk. 你说的vpp5是什么东东?在微软下吗?sp5我也已经装过了。不胜感谢!!!
ZHLMNET 2002-03-05
  • 打赏
  • 举报
回复
你需要SP5+VPP5,去找找安装只后就可以用MMX了,最好把PSDK也当下来
hooligan 2002-03-05
  • 打赏
  • 举报
回复
没有高手了吗???
wjy88 2002-03-05
  • 打赏
  • 举报
回复
学习
congling 2002-03-05
  • 打赏
  • 举报
回复
你的程序可以改成这样就可以在VC6上编译了,自己看吧!



int
idot_product_char(signed char *a, signed char *b, int n)
{
int r;
int i;

/*
Fast version
- software pipeline
- 8 parallel execution
*/
_asm pxor xmm0,xmm0;

//_asm volatile("pxor %%mm0, %%mm0"::); // mm0 = 0
for (i = 0; i < n; i += 8) {
/*
_asm volatile("movq %0, %%mm1"::"m"(a[i])); // load a
_asm volatile("movq %0, %%mm2"::"m"(b[i])); // load b
_asm volatile("punpcklbw %%mm1, %%mm6"::);
_asm volatile("punpcklbw %%mm2, %%mm7"::);
_asm volatile("psraw $8, %%mm6"::);
_asm volatile("psraw $8, %%mm7"::);
_asm volatile("punpckhbw %%mm1, %%mm4"::);
_asm volatile("punpckhbw %%mm2, %%mm5"::);
_asm volatile("psraw $8, %%mm4"::);
_asm volatile("psraw $8, %%mm5"::);
_asm volatile("pmaddwd %%mm7, %%mm6"::); // mm1 = mul+add
_asm volatile("pmaddwd %%mm5, %%mm4"::); // mm4 = mul+add
_asm volatile("paddd %%mm6, %%mm0"::); // mm0 += mm1
_asm volatile("paddd %%mm4, %%mm0"::); // mm0 += mm4
*/
_asm{
movq mm1,a[i]
movq mm2,b[i]
punpcklbw mm6,mm1
punpcklbw mm7,mm2
psraw mm6,8
psraw mm7,8
punpcklbw mm4,mm1
punpcklbw mm5,mm2
psraw mm4,8
psraw mm6,8
pmaddwd mm6,mm7
pmaddwd mm4,mm5
paddd mm0,mm6
paddd mm0,mm4
}
}
/*
_asm volatile("movq %%mm0, %%mm1"::);
_asm volatile("psrlq $32, %%mm1"::);
_asm volatile("paddd %%mm1, %%mm0"::);
_asm volatile("movd %%mm0, %0 "::"m"(r));
_asm volatile("emms"); // insert this line before
//floating-point calc.
*/
_asm{
movq mm1,mm0
psrlq mm1,32
paddd mm0,mm1
movd r,mm0
emms
}
return r;
}
hooligan 2002-03-05
  • 打赏
  • 举报
回复
请问如果我用c来改写是不是这样的:
int idot_product_char(signed char *a, signed char *b, int n)
{
int r = 0;
int i;
for(i = 0 ; i < n ; i ++ )
{
r = r + a[i] * b[i];
}
return r;
}
谢谢。。。。
congling 2002-03-05
  • 打赏
  • 举报
回复
你这个是AT&T的ASM调用规范,VC下使用的是Intel的一套法则,不支持AT&T的法则。
quengzi 2002-03-04
  • 打赏
  • 举报
回复
xuexi

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧