关于MMX汇编
下面这段代码从函数名来看是求向量内积的,但我不能确定,有没有哪位高手来帮忙看看。另外现在我编译的时候错误信息如下:
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;
}