2017-04-02 187 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做解引用变量。