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