[英]function parameter to xmm0
我正在尝试将ALIGNED float数组移到xmm寄存器中
#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]
};
在vector1声明之后,它就可以工作。 为什么?
问题在于v1
, v2
和vrec
是指向浮点数数组的指针。 您需要取消引用每个指针以获取实际的数组。 这样的事情可能会起作用:
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
};
}
在这种情况下,我使用调用者保存的EAX , ECX和EDX寄存器来取消引用变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.