Truncation of unsigned to byte is not translated to uxtb insn, but truncation
to short is translated to uxth.

invocation:

gcc -mcpu=cortex-m3 -mthumb -O3 -S a.c

code (a.c):

unsigned a();
extern unsigned b;
main()
{
        b = a() & 0xFF;
        b = (unsigned char)a();
        b = a() & 0xFFFF;
        b = (unsigned short)a();
}

resulting asm fragment (a.s):
[...]
        bl      a
        and     r0, r0, #255
        str     r0, [r4, #0]

        bl      a
        uxtb    r0, r0
        str     r0, [r4, #0]

        bl      a
        uxth    r0, r0
        str     r0, [r4, #0]

        bl      a
        uxth    r0, r0
        str     r0, [r4, #0]
[...]


-- 
           Summary: unsigned int var; (var & 0xFF) not translated to uxtb
                    insn in Thumb mode
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Severity: minor
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: mirq-gccboogs at rere dot qmqm dot pl
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: arm-none-eabi


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

Reply via email to