SSE与函数的陌生感

时间:2016-04-20 03:11:53

标签: d sse inline-assembly

我一直在玩D的内联汇编程序和SSE,但发现了一些我不理解的东西。当我尝试在声明后立即添加两个float4向量时,计算是正确的。如果我将计算放在一个单独的函数中,我会得到一系列nan s。

//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)
}

汇编在功能上与this link完全相同(据我所知)。

编辑:我正在使用自定义的float4结构(现在,它只是一个数组),因为我希望能够有一个像float4 add(float4 lhs, float rhs)这样的添加函数。目前,这会导致编译器错误,如下所示:

  

错误:预期浮点常量表达式而不是rhs

注意:我正在使用DMD 2.071.0

1 个答案:

答案 0 :(得分:2)

您的代码很奇怪,您使用的是什么版本的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)
}