Str*_*ers 6 sse d inline-assembly
我一直在玩D的内联汇编程序和SSE,但发现了一些我不理解的东西.当我尝试在声明后立即添加两个float4向量时,计算是正确的.如果我把计算放在一个单独的函数中,我得到一系列的nans.
//function contents identical to code section in unittest
float4 add(float4 lhs, float4 rhs)
{
float4 res;
auto lhs_addr = &lhs;
auto rhs_addr = &rhs;
asm
{
mov RAX, lhs_addr;
mov RBX, rhs_addr;
movups XMM0, [RAX];
movups XMM1, [RBX];
addps XMM0, XMM1;
movups res, XMM0;
}
return res;
}
unittest
{
float4 lhs = {1, 2, 3, 4};
float4 rhs = {4, 3, 2, 1};
println(add(lhs, rhs)); //float4(nan, nan, nan, nan)
//identical code starts here
float4 res;
auto lhs_addr = &lhs;
auto rhs_addr = &rhs;
asm
{
mov RAX, lhs_addr;
mov RBX, rhs_addr;
movups XMM0, [RAX];
movups XMM1, [RBX];
addps XMM0, XMM1;
movups res, XMM0;
} //end identical code
println(res); //float4(5, 5, 5, 5)
}
Run Code Online (Sandbox Code Playgroud)
该组件在功能上与此链接相同(据我所知).
编辑:我正在使用自定义float4结构(现在,它只是一个数组),因为我希望能够有一个类似的添加函数float4 add(float4 lhs, float rhs).目前,这会导致编译器错误,如下所示:
错误:预期浮点常量表达式而不是rhs
注意:我正在使用DMD 2.071.0
你的代码很奇怪,你使用什么版本的dmd?这按预期工作:
import std.stdio;
import core.simd;
float4 add(float4 lhs, float4 rhs)
{
float4 res;
auto lhs_addr = &lhs;
auto rhs_addr = &rhs;
asm
{
mov RAX, lhs_addr;
mov RBX, rhs_addr;
movups XMM0, [RAX];
movups XMM1, [RBX];
addps XMM0, XMM1;
movups res, XMM0;
}
return res;
}
void main()
{
float4 lhs = [1, 2, 3, 4];
float4 rhs = [4, 3, 2, 1];
auto r = add(lhs, rhs);
writeln(r.array); //float4(5, 5, 5, 5)
//identical code starts here
float4 res;
auto lhs_addr = &lhs;
auto rhs_addr = &rhs;
asm
{
mov RAX, lhs_addr;
mov RBX, rhs_addr;
movups XMM0, [RAX];
movups XMM1, [RBX];
addps XMM0, XMM1;
movups res, XMM0;
} //end identical code
writeln(res.array); //float4(5, 5, 5, 5)
}
Run Code Online (Sandbox Code Playgroud)