inline void addition(double * x, const double * vx,uint32_t size){
/*for (uint32_t i=0;i<size;++i){
x[i] = x[i] + vx[i];
}*/
__asm__ __volatile__ (
"1: \n\t"
"vmovupd -32(%0), %%ymm1\n\t"
"vmovupd (%0), %%ymm0\n\t"
"vaddpd -32(%1), %%ymm0, %%ymm0\n\t"
"vaddpd (%1), %%ymm1, %%ymm1\n\t"
"vmovupd %%ymm0, -32(%0)\n\t"
"vmovupd %%ymm1, (%0)\n\t"
"addq $128, %0\n\t"
"addq $128, %1\n\t"
"addl $-8, %2\n\t"
"jne 1b"
:
: "r" (x),"r"(vx),"r"(size)
: "ymm0", "ymm1"
);
}
我现在正在练习汇编(AVX指令),所以我在内联汇编中编写了上面这段代码,以替换原函数中的c代码(已注释掉)。编译过程是成功的,但是当我尝试运行该程序时,出现错误:Bus error: 10
对此错误的任何想法?我不知道这里有什么问题。编译器版本是clang 602.0.53。谢谢!如何更新矢量化程序集(AVX)中的数组?
也许你可以问问*铛*生成(从C代码)为您汇编代码,并与您的版本进行比较? –
@ringø除了一些标签不同且寄存器被指定外,它几乎是一样的。 – PLNewbie
你的问题不是关于C,而是汇编。 – Olaf