www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 23046] New: [REG][CODEGEN] __simd(XMM.LODLPS) bad codegen

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

          Issue ID: 23046
           Summary: [REG][CODEGEN] __simd(XMM.LODLPS) bad codegen
           Product: D
           Version: D2
          Hardware: x86_64
                OS: All
            Status: NEW
          Severity: regression
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: aliloko gmail.com

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

Hello,
Here is a new shipment of DMD codegen bugs.


With latest DMD v2.100.0-beta.1-dirty
Consider the following program, and built it with
  $ dmd -m64 main.d


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

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

alias __m128 = float4;
alias __m128i = int4;
alias __m64 = long1;

struct long1
{
    long[1] array;
}

__m128 _mm_loadl_pi (__m128 a, const(__m64)* mem_addr) pure  trusted
{
    return cast(__m128) __simd(XMM.LODLPS, a, *cast(const(__m128)*)mem_addr);   
}

__m64 to_m64(__m128i a) pure  trusted
{
    long2 la = cast(long2)a;
    long1 r;
    r.array[0] = la.array[0];
    return r;
}

void _mm_print_ps(__m128 v)  trusted
{
    float[4] C = (cast(float4)v).array;
    printf("%f %f %f %f\n", C[0], C[1], C[2], C[3]);
}

void main()
{
    float4 A = [1.0f, 2.0f, 3.0f, 4.0f];
    float4 B = [5.0f, 6.0f, 7.0f, 8.0f];
    __m64 M = to_m64(cast(__m128i)B);
    __m128 R = _mm_loadl_pi(A, &M);
    _mm_print_ps(R);
    float[4] correct = [5.0f, 6.0f, 3.0f, 4.0f];
    assert(R.array == correct);
}


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

Output with DMD 2.095.1:

5.000000 6.000000 3.000000 4.000000 


Output with DMD 2.097.0 all the way to DMD v2.100.0-beta:

0.000000 0.000000 3.000000 4.000000 




Notes:
  - superficially looks related to
https://issues.dlang.org/show_bug.cgi?id=21673 ?

--
Apr 22 2022