2017-04-02 126 views
1

我想對齊的浮動陣列轉移到XMM寄存器功能參數XMM0

#define ALIGNED16 __declspec(align(16)) 

ALIGNED16 float vector1[4] = { 1.0f, 2.0f, 3.0f, 4.0f }; 
ALIGNED16 float vector2[4] = { 1.0f, 2.0f, 3.0f, 4.0f }; 
ALIGNED16 float result[4]; 

_add_vector(vector1, vector2, result); 
.... 

_add_vector(float *__restrict v1, float * __restrict v2, float * __restrict rvec) 
{ 
    __asm 
    { 
    movaps xmm0, xmmword ptr [v1] 
    movaps xmm1, xmmword ptr [v2] 

    addps xmm0, xmm1 

    movaps xmmword ptr [rvec], xmm0 
    }; 
} 

所以當編譯器試圖從V1複製到XMM0我有「讀訪問衝突」 V1 was0xFFFFFFFF

但如果我在做

__asm 
    { 
    movaps xmm0, xmmword ptr [v1] 
    }; 

AFTER vector1聲明然後它的作品。爲什麼?

+1

'v1'(和'v2'和'rvec')是指向堆棧上的浮游物的指針。在_add_vector函數中,需要對這些指針進行解引用,然後將該數據移動到xmm0(和xmm1) –

+0

除非您有特定的要求才能使用匯編語言,否則使用內在函數可以節省大量時間和悲傷。 –

回答

2

問題是v1v2vrec是指向浮點數組的指針。您需要取消引用每個指針以獲取實際的數組。這樣的事情可能工作:

void _add_vector(float *__restrict v1, float * __restrict v2, float * __restrict rvec); 

void _add_vector(float *__restrict v1, float * __restrict v2, float * __restrict rvec) 
{ 
    __asm 
    { 
     mov ecx, [v1] 
     mov edx, [v2] 
     mov eax, [rvec] 

     movaps xmm0, xmmword ptr [ecx] 
     movaps xmm1, xmmword ptr [edx] 

     addps xmm0, xmm1 

     movaps xmmword ptr [eax], xmm0 
    }; 
} 

在這種情況下,我使用調用函數保存的寄存器EAXECXEDX做解引用變量。