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

            Bug ID: 68952
           Summary: Wrong code with AVX inline-asm in 32-bit mode
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: inline-asm
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jamrial at gmail dot com
  Target Milestone: ---

Regression since GCC 4.9.0. -O0, -O1, -O2 and -O3 are all affected. -Os works
as intended.

float clipf(float a, float amin, float amax)
{
    float ret;
    __asm__ ("vminss %1, %3, %0 \n\t"
             "vmaxss %2, %0, %0 \n\t"
             : "=x"(ret) : "xm"(a), "x"(amin), "x"(amax));
    return ret;
}

gcc-trunk -O2 -mavx -m32
gcc-5.3 -O2 -mavx -m32
gcc-4.9.2 -O2 -mavx -m32
        subl    $4, %esp
        vmovss  16(%esp), %xmm1
        vmovss  12(%esp), %xmm0
        vminss 8(%esp), %xmm1, %xmm0  <--- amin overwritten
        vmaxss %xmm0, %xmm0, %xmm0 
        vmovss  %xmm0, (%esp)
        flds    (%esp)
        addl    $4, %esp
        ret

gcc-4.8.2 -O2 -mavx -m32
        subl    $4, %esp
        vmovss  16(%esp), %xmm1
        vmovss  12(%esp), %xmm0
        vminss 8(%esp), %xmm1, %xmm2 
        vmaxss %xmm0, %xmm2, %xmm2 
        vmovss  %xmm2, (%esp)
        flds    (%esp)
        addl    $4, %esp
        ret

gcc-trunk -Os -mavx -m32
gcc-5.3 -Os -mavx -m32
gcc-4.9.2 -Os -mavx -m32
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %eax
        vmovss  16(%ebp), %xmm1
        vmovss  12(%ebp), %xmm0
        vminss 8(%ebp), %xmm1, %xmm2 
        vmaxss %xmm0, %xmm2, %xmm2 
        vmovss  %xmm2, -4(%ebp)
        flds    -4(%ebp)
        leave
        ret

Reply via email to