[Issue 23049] New: [SIMD][CODEGEN] Wrong code for XMM.RCPSS after inlining

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Apr 23 14:36:06 UTC 2022


https://issues.dlang.org/show_bug.cgi?id=23049

          Issue ID: 23049
           Summary: [SIMD][CODEGEN] Wrong code for XMM.RCPSS after
                    inlining
           Product: D
           Version: D2
          Hardware: x86_64
                OS: All
            Status: NEW
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: aliloko at gmail.com

Created attachment 1849
  --> https://issues.dlang.org/attachment.cgi?id=1849&action=edit
main source

With DMD 2.100-beta.1,
Consider the following program:

------------ main.d ------------

import core.simd;
import core.stdc.stdio;

float4 _mm_rcp_ss (float4 a) pure @trusted
{
    return cast(float4) __simd(XMM.RCPSS, a);    
}

void main()
{
    float4 A = [2.34f, -70000.0f, 0.00001f, 345.5f];
    float4 correct = [1 / 2.34f, -70000.0f, 0.00001f, 345.5f];
    float4 R = _mm_rcp_ss(A);

    // sometimes DMD clears to zero the high values.
    assert(R.array[1] == correct.array[1]);
    assert(R.array[2] == correct.array[2]);
    assert(R.array[3] == correct.array[3]);
}

--------------------------------

The first assertion fails when built with:
    $ dmd -inline -m64 main.d


RCPSS is used, but the top of the register/variable is cleared to zero when
XMM.RCPSS is inline into the unittest.

--


More information about the Digitalmars-d-bugs mailing list