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

            Bug ID: 79357
           Summary: Doubling a single complex float is not vectorised
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: drraph at gmail dot com
  Target Milestone: ---

Consider the following code:

#include <complex.h>
complex float f(complex float x) {
  return 2*x;
}

gcc with -O3  -march=core-avx2  gives:

f:
        vmovq   QWORD PTR [rsp-8], xmm0
        vmovss  xmm1, DWORD PTR [rsp-8]
        vmovss  xmm0, DWORD PTR [rsp-4]
        vaddss  xmm1, xmm1, xmm1
        vaddss  xmm0, xmm0, xmm0
        vmovss  DWORD PTR [rsp-16], xmm1
        vmovss  DWORD PTR [rsp-12], xmm0
        vmovq   xmm0, QWORD PTR [rsp-16]
        ret

Better and still suitable without -ffast-math would be:

f:
        vmulps    xmm0, xmm0, XMMWORD PTR .L_2il0floatpacket.1[rip] #3.12
        ret

Reply via email to