http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50751

             Bug #: 50751
           Summary: SH Target: Displacement addressing does not work for
                    QImode and HImode
    Classification: Unclassified
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: target
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: oleg.e...@t-online.de
                CC: kkoj...@gcc.gnu.org
            Target: sh*-*-*


Displacement addressing is only used for SImode but not
for QImode nor HImode. The following example summarizes the 
problem:

struct X
{
  char    a, b, c, d;
  short e, f;
  int   g, h;
};


int test_func_4 (X* x)
{
  return x->b + x->e + x->g;
}

compiled with: -Os -m4-single -ml -S

    mov    r4,r1
    add    #1,r1
    mov.b    @r1,r0
    add    #3,r1
    mov.w    @r1,r1
    add    r1,r0
    mov.l    @(8,r4),r1
    rts    
    add    r1,r0

would be better as:


    mov.b    @(1,r4),r0
    mov    r0,r1
    mov.w    @(4,r4),r0
    add    r0,r1
    mov.l    @(8,r4),r0
    add    r1,r0
    rts
    nop


Using built-in specs.
COLLECT_GCC=sh-elf-gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/sh-elf/4.7.0/lto-wrapper
Target: sh-elf
Configured with: ../gcc-trunk/configure --target=sh-elf --prefix=/usr/local
--enable-languages=c,c++ --enable-multilib --disable-libssp --disable-nls
--disable-werror --enable-lto --with-newlib --with-gnu-as --with-gnu-ld
--with-system-zlib
Thread model: single
gcc version 4.7.0 20111016 (experimental) (GCC)

Reply via email to