https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107591

--- Comment #19 from Pilar Latiesa <pilarlatiesa at gmail dot com> ---
The testcase:

    #include <cmath>

    struct TVec { double x, y, z; };

    double dot(TVec const &u, TVec const &v)
      { return u.x * v.x + u.y * v.y + u.y * v.y + u.z * v.z; }

    double mag(TVec const &u)
      { return std::sqrt(dot(u, u)); }

with current trunk is compiled as:

        vmovsd  8(%rdi), %xmm0
        vmovsd  (%rdi), %xmm1
        vmulsd  %xmm0, %xmm0, %xmm0
        vmovsd  %xmm1, %xmm1, %xmm2
        vfmadd132sd     %xmm1, %xmm0, %xmm2
        vmovsd  16(%rdi), %xmm1
        vaddsd  %xmm2, %xmm0, %xmm0
        vfmadd132sd     %xmm1, %xmm0, %xmm1
        vsqrtsd %xmm1, %xmm1, %xmm0
        ret

That's excellent. Thanks

Reply via email to