我想把一个XMM寄存器中存储的数据与单精度浮点值相乘,并将结果保存在另一个XMM寄存器中。我画了一张小图来更好地解释一下。
如您所见,我有一个XMM0寄存器,其中包含我的数据。例如,它包含:
xmm0 = |4.0|2.5|3.5|2.0|
每个浮点数都以4个字节存储。我的xmm0寄存器是128位,16个字节长。
这很好用。现在我想在另一个XMM寄存器(例如XMM1)中存储0.5,并将该寄存器与xmm0寄存器相乘,以便将存储在xmm0中的每个值乘以0.5。
我完全不知道如何将0.5存储在XMM寄存器中。您有什么建议吗?
顺便说一下:这是C++中的联机汇编。
如您所见,我有一个XMM0寄存器,其中包含我的数据。例如,它包含:
xmm0 = |4.0|2.5|3.5|2.0|
每个浮点数都以4个字节存储。我的xmm0寄存器是128位,16个字节长。
这很好用。现在我想在另一个XMM寄存器(例如XMM1)中存储0.5,并将该寄存器与xmm0寄存器相乘,以便将存储在xmm0中的每个值乘以0.5。
我完全不知道如何将0.5存储在XMM寄存器中。您有什么建议吗?
顺便说一下:这是C++中的联机汇编。
void filter(image* src_image, image* dst_image)
{
float* src = src_image->data;
float* dst = dst_image->data;
__asm__ __volatile__ (
"movaps (%%esi), %%xmm0\n"
// Multiply %xmm0 with a float, e.g. 0.5
"movaps %%xmm0, (%%edi)\n"
:
: "S"(src), "D"(dst) :
);
}
我想做的事情非常简单。我有一些图像数据存储在浮点数组中。这些数组的指针传递给汇编程序。movaps获取数组的前4个浮点值,将这16个字节存储在xmm0寄存器中。之后,xmm0应该乘以例如0.5。然后,“新”的值应该存储在edi中的数组中。