繁体   English   中英

函数参数为xmm0

[英]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声明之后,它就可以工作。 为什么?

问题在于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寄存器来取消引用变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM