xmm0 的函数参数
Posted
技术标签:
【中文标题】xmm0 的函数参数【英文标题】:function parameter to xmm0 【发布时间】:2017-04-02 18:50:02 【问题描述】:我正在尝试将 ALIGNED 浮点数组移动到 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
和rvec
)是压入堆栈的浮点数的指针。在您的 _add_vector 函数中,您需要取消引用这些指针,然后将该数据移动到 xmm0(和 xmm1)
除非您有使用汇编语言的特定要求,否则您将通过使用内在函数为自己节省大量时间和烦恼。
【参考方案1】:
问题在于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 的寄存器来取消引用变量。
【讨论】:
以上是关于xmm0 的函数参数的主要内容,如果未能解决你的问题,请参考以下文章