2016-08-11 30 views
2

我試圖創建一些類似於SIMD內在函數的宏。我想創建這些宏的原因是我正在使用不支持SIMD的名爲「Gem5」的模擬器。類似於SIMD指令的宏

那麼,首先,我創建定義爲4的矢量打包單精度浮點元素像這樣的結構:

typedef struct 
    { 
    float vec1; 
    float vec2; 
    float vec3; 
    float vec4; 
    } __m128 __attribute__((aligned(16))); 

然後我已經創建了ADD宏:

#define __M128_MM_ADD_PS(dest, a,b) \ 
    {         \ 
    (dest)->vec1 = (a)->vec1 + (b)->vec1; \ 
    (dest)->vec2 = (a)->vec2 + (b)->vec2; \ 
    (dest)->vec3 = (a)->vec3 + (b)->vec3; \ 
    (dest)->vec4 = (a)->vec4 + (b)->vec4; \ 
    } 

和另一個宏,用於存儲在一個浮陣列的結果:

#define __M128_MM_MOVA_PS(dest, a) \ 
    { \ 
    dest[0] = a->vec1; \ 
    dest[1] = a->vec2; \ 
    dest[2] = a->vec3; \ 
    dest[3] = a->vec4; \ 
    } 

並他們我已經聲明的變量爲__m128和float數組存儲結果,這種方式(一個小例子):

void foo(){ 
__m128 bfly0_rv, x_n2_vec, x_N2_vec; 
float *x; 

__M128_MM_ADD_PS(bfly0_rv,x_n2_vec,x_N2_vec); 
__M128_MM_MOVA_PS(&x[n2],bfly0_rv); 
} 

和我得到這些類型的錯誤消息:

對於ADD宏 錯誤:無效類型參數' - >'(有'__m128') (dest) - > vec4 =(a) - > vec4 +(b) - > vec4;

用於存儲宏 錯誤:無效類型參數「 - >」(有「__m128」) DEST [3] = A-> vec4;

任何人都可以有一個想法嗎?

回答

4

你所有的宏都可以使用指向__m128的指針,但你只能通過__m128而不是__m128 *。只是.內宏與&更換->或者附加宏參數:

__M128_MM_ADD_PS(&bfly0_rv, &x_n2_vec, &x_N2_vec); 
__M128_MM_MOVA_PS(&x[n2], &bfly0_rv); 

也不要忘記附上desta在括號中__M128_MM_MOVA_PS

P.S.在宏定義中使用do { ... } while(0)而不是{ ... }會更好。

+0

除Storing宏外,所有錯誤都消失了,它向我顯示以下消息:** error:下標值既不是數組也不是指針,也不是向量dest [0] = a.vec1 **,它指向dest [0 ]。 –

+0

@ A.nechi您是否在'dest'周圍添加了大括號?沒有它們,它會擴展到'&x [n2] [0]',這肯定不是你想要的。 – Sergio

+0

你真是太棒了:) –