2
这个问题让我有点疯狂。该代码似乎segmentation faulting没有很好的理由:,只要我有两个“之前”和“之后”的变量是分段错误定义使用SSE指令时导致此分段错误的原因是什么?
#define MULT_FLOAT4(X, Y) ({ \
asm volatile (\
"movups (%0), %%xmm0\n\t" \
"mulps (%1), %%xmm0\n\t" \
"movups %%xmm0, (%1)" \
:: "r" (X), "r" (Y)); })
int main(void)
{
int before;
float a[4] = { 10, 20, 30, 40 };
float b[4] = { 0.1, 0.1, 0.1, 0.1 };
/* Segmentation faults if I uncomment this line below, otherwise works fine. Why?? */
int after;
MULT_FLOAT4(a, b);
return 0;
}
注意。如果我只有'之前'或者'之后',那么它可以正常工作。
我在Ubuntu Hardy(8.04),GCC版本4.2.4(Ubuntu 4.2.4-1ubuntu4)。 Linux内核:2.6.24-16-通用。
嗯,我认为movups是为未对齐的数据 - 和movaps是为了对齐? :) – horseyguy 2009-11-13 11:58:00
它的工作原理!谢谢! ...虽然即时通讯仍然困惑,为什么它是在使用movups专门用于未对齐的数据时的segfaulting? – horseyguy 2009-11-13 14:32:08
这是试图访问b的mulps。 gdb应该能够显示哪条指令触发段错误。 – 2009-11-13 15:56:17