2009-11-13 140 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

相關問題