[Bug target/13423] sh-elf: V4SFmode passed in integer registers

olegendo at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sat Mar 9 15:07:00 GMT 2013


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



More information about the Gcc-bugs mailing list