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