https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77599

            Bug ID: 77599
           Summary: M68K: __builtin_bswap32() isn't compiled correctly
                    with -mshort
           Product: gcc
           Version: 6.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dhowells at redhat dot com
  Target Milestone: ---

The following test code:

        unsigned long x(unsigned long y)
        {
                return __builtin_bswap32(y);
        }

is miscompiled for m68k when -mshort is specified.  Compiling with

    m68k-linux-gnu-gcc -m68000 -S /tmp/3.c -o - -mshort

I see:

    x:
        link.w %fp,#0
        move.l 8(%fp),%d0
        ror.w #8,%d0
        move.w %d0,%d0
        and.l #65535,%d0
        unlk %fp
        rts

dropping the -mshort I see:

    x:
        link.w %fp,#0
        move.l 8(%fp),%d0
        ror.w #8,%d0
        swap %d0
        ror.w #8,%d0
        unlk %fp
        rts

I'm using a gcc-6.1.1 cross-compiler built for x86_64, but the problem also
shows up on gcc-5.3.1.  The gcc-6.1.1 compiler is svn rev 237634, dated 
20160621.

Reply via email to