2016-05-27 32 views
1

我正在嘗試使用SSE進行一些添加,並且我正在使用這個C程序集。爲什麼這樣的東西不起作用?C中的程序集數組

struct vector { 
    float x1, x2, x3, x4; 
}; 

struct vector *dodawanie(const struct vector v1[], const struct vector v2[], int size) { 

struct vector vec[size]; 
int i; 
for(i = 0; i < size; i++) { 
     asm(
      "MOV %1, %%rax \n" 
      "MOV %2, %%rdx \n" 

      "MOVUPS (%%rax), %%xmm0 \n" 
      "MOVUPS (%%rdx), %%xmm1 \n" 
      "ADDPS %%xmm0, %%xmm1 \n" 

      "MOVUPS %%xmm1, %0 \n" 

      :"=g"(vec[i])  //wyjscie 
      :"g"(v1[i]), "g"(v2[i]) //wejscie 
      :"%rax", "%rdx" 
     ); 
} 
return vec; 
} 

我得到錯誤:線程1:EXC_BAD_ACCESS(CODE = EXC_I386_GPFLT)

但是,當代替V1 [I],V2 [I]我把V1,V2等這個工作正常,但當然只有數組的第一個元素。

我的代碼有什麼問題?

+1

1.看看生成的asm,可能會發生%1和%2被'rax' /'rdx'傳遞。 2.嘗試通過'rax'和'rdx'直接傳遞%1和%2。看看這裏:https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints for x86 specific constraints –

+0

首先,我會傾向於使用'addps'的編譯器內在函數。如果您打算使用內聯彙編程序,我會遵循Michal的建議,希望獲得彙編程序模板來完成大部分工作。假設v1,v2和vec都是向量數組(__m128),那麼類似這樣的東西可能會工作'asm( 「MOVAPS%[v1],%[out] \ n \ t」 「ADDPS%[v2],% [out] \ n \ t「[out]」=&x,m「(vec [i]) :[v1]」mx,x「(v1 [i]),[v2]」mx,x「 (v2 [i]) );' –

+1

您的代碼似乎正在返回一個指向局部變量的指針,這可能會導致一些意外的行爲,因爲您依賴於函數返回後並且在使用數據之前不會轉儲堆棧。 –

回答

3

您正在使用表中的值(v1[i],v2[i]),並將它們視爲地址("MOVUPS (%%rax), %%xmm0 \n")。分別使用&v1[i]&v2[i]

這也是爲什麼表格v1v2工作,因爲在這種情況下地址正在通過。

+0

非常感謝,很明顯,我沒有看到這一點。感謝你我省了幾分鐘。 – demoo