http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13423
Oleg Endo <olegendo at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |olegendo at gcc dot gnu.org
--- Comment #3 from Oleg Endo <olegendo at gcc dot gnu.org> 2013-03-09 15:07:11
UTC ---
Although this is an ABI issue, passing float vector by reference should not
actually suffer from this problem, but it does:
typedef float v4sf __attribute__ ((vector_size (16)));
void test00 (v4sf& a, const v4sf& b)
{
a += b;
}
compiled with '-O2 -m4-single -ml' (rev 196483) results in:
mov.l @r5,r1
mov #4,r0
fmov.s @r4,fr5
lds r1,fpul
mov.l @(4,r5),r1
fsts fpul,fr4
fadd fr5,fr4
lds r1,fpul
mov.l @(8,r5),r1
fsts fpul,fr3
lds r1,fpul
mov.l @(12,r5),r1
fmov.s @(r0,r4),fr5
mov #8,r0
fsts fpul,fr2
lds r1,fpul
fadd fr5,fr3
fsts fpul,fr1
flds fr4,fpul
sts fpul,r1
fmov.s @(r0,r4),fr5
mov #12,r0
flds fr3,fpul
fadd fr5,fr2
fmov.s @(r0,r4),fr5
mov.l r1,@r4
sts fpul,r1
fadd fr5,fr1
flds fr2,fpul
mov.l r1,@(4,r4)
sts fpul,r1
flds fr1,fpul
mov.l r1,@(8,r4)
sts fpul,r1
rts
mov.l r1,@(12,r4)
ideally, this would be something like (no insn scheduling applied):
fmov.s @r4+,fr0
fmov.s @r4+,fr1
fmov.s @r4+,fr2
fmov.s @r4+,fr3
fmov.s @r5+,fr4
fmov.s @r5+,fr5
fmov.s @r5+,fr6
fmov.s @r5+,fr7
fadd fr4,fr0
fadd fr5,fr1
fadd fr6,fr2
fadd fr7,fr3
fmov.s fr3,@-r4
fmov.s fr2,@-r4
fmov.s fr1,@-r4
fmov.s fr0,@-r4