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

            Bug ID: 89165
           Summary: miscompile calling SSE function from non-SSE code
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nbkolchin at gmail dot com
  Target Milestone: ---

BUG: calling SSE function with vector argument
from non-SSE code (admittedly, Bad Idea) silently
miscompiles (breaking calling convention).
I would appreciate an error message instead.

https://godbolt.org/z/pIpM95

GCC Version: 8.2

Command line arguments: -m32 -mno-sse -O2

Source code:

typedef float __attribute__((vector_size(16))) simd4f;

__attribute__((target("sse2")))
simd4f f(simd4f a) {return a*a;}

simd4f g(simd4f a,simd4f b) {return f(a)+f(b);}

Generated assembler:

f(float __vector(4)):
        mulps   %xmm0, %xmm0
        ret
g(float __vector(4), float __vector(4)):
        subl    $76, %esp
        movl    80(%esp), %eax
        leal    16(%esp), %edx
        pushl   108(%esp)
        pushl   108(%esp)
        pushl   108(%esp)
        pushl   108(%esp)
        subl    $12, %esp
        pushl   %edx
        call    f(float __vector(4))
        leal    60(%esp), %edx
        addl    $28, %esp
        pushl   124(%esp)
        pushl   124(%esp)
        pushl   124(%esp)
        pushl   124(%esp)
        subl    $12, %esp
        pushl   %edx
        call    f(float __vector(4))
        flds    44(%esp)
        fadds   60(%esp)
        fstps   28(%esp)
        flds    48(%esp)
        fadds   64(%esp)
        movl    28(%esp), %edx
        fstps   32(%esp)
        flds    52(%esp)
        fadds   68(%esp)
        fstps   36(%esp)
        flds    56(%esp)
        fadds   72(%esp)
        fstps   40(%esp)
        movl    %edx, (%eax)
        movl    32(%esp), %edx
        movl    %edx, 4(%eax)
        movl    36(%esp), %edx
        movl    %edx, 8(%eax)
        movl    40(%esp), %edx
        movl    %edx, 12(%eax)
        addl    $104, %esp
        ret     $4

P.S. Originally found here
https://gamedev.ru/code/forum/?id=233033&page=24#m356

Reply via email to