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

            Bug ID: 127114
           Summary: i386: Bad convert-storm on roundf16 vectorization
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hongyuw at gcc dot gnu.org
  Target Milestone: ---

For 

void
round_hf_narrow (_Float16 *__restrict a, _Float16 *__restrict b, int n)
{
  for (int i = 0; i < n; i++)
    a[i] = (_Float16) __builtin_round (b[i]);
}

Compiled with -march=sapphirerapids -fno-trapping-math -fno-rounding-math -O2
Will get forced converting sequence to double, and truncate back like

.L4:
        vmovdqu ymm0, YMMWORD PTR [rsi+rdx]
        vmovapd ymm5, ymm3
        vcvtph2psx      ymm1, xmm0
        vcvtps2pd       ymm2, xmm1
        vpternlogq      ymm5, ymm2, ymm4, 234
        vextractf32x4   xmm1, ymm1, 0x1
        vextracti32x4   xmm0, ymm0, 0x1
        vaddpd  ymm2, ymm2, ymm5
        vmovapd ymm5, ymm3
        vcvtps2pd       ymm1, xmm1
        vcvtph2psx      ymm0, xmm0
        vpternlogq      ymm5, ymm1, ymm4, 234
        vaddpd  ymm1, ymm1, ymm5
        vmovapd ymm5, ymm3
        vrndscalepd     ymm2, ymm2, 3
        vrndscalepd     ymm1, ymm1, 3
        vcvtpd2ps       xmm2, ymm2
        vcvtpd2ps       xmm1, ymm1
        vinsertf32x4    ymm2, ymm2, xmm1, 0x1
        vcvtps2pd       ymm1, xmm0
        vpternlogq      ymm5, ymm1, ymm4, 234
        vextractf32x4   xmm0, ymm0, 0x1
        vaddpd  ymm1, ymm1, ymm5
        vmovapd ymm5, ymm3
        vcvtps2pd       ymm0, xmm0
        vpternlogq      ymm5, ymm0, ymm4, 234
        vaddpd  ymm0, ymm0, ymm5
        vrndscalepd     ymm1, ymm1, 3
        vrndscalepd     ymm0, ymm0, 3
        vcvtpd2ps       xmm1, ymm1
        vcvtpd2ps       xmm0, ymm0
        vinsertf32x4    ymm1, ymm1, xmm0, 0x1
        vcvtps2phx      xmm0, ymm2
        vcvtps2phx      xmm1, ymm1
        vinserti32x4    ymm0, ymm0, xmm1, 0x1
        vmovdqu YMMWORD PTR [rdi+rdx], ymm0
        add     rdx, 32
        cmp     rdx, r8
        jne     .L4
        sal     eax, 4
        cmp     ecx, eax
        je      .L9

See https://compiler-explorer.com/z/YGvYjnhG4

Reply via email to