2009-11-13 108 views
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-通用。

回答

4

检查a和b的地址。我怀疑你会发现它们必须与16字节的边界对齐才能避免出现段错误。在声明后添加__ attribute __((aligned(16)))应该可以做到。

这是属性两侧的下划线,并连接到它,顺便说一句。

+0

嗯,我认为movups是为未对齐的数据 - 和movaps是为了对齐? :) – horseyguy 2009-11-13 11:58:00

+0

它的工作原理!谢谢! ...虽然即时通讯仍然困惑,为什么它是在使用movups专门用于未对齐的数据时的segfaulting? – horseyguy 2009-11-13 14:32:08

+0

这是试图访问b的mulps。 gdb应该能够显示哪条指令触发段错误。 – 2009-11-13 15:56:17

相关问题