//Reading specs from 
/usr/local/cross-arm/bin/../lib/gcc-lib/arm-linux/3.3.2/specs
//Configured with:
/home/localgjs/tnbt_cvstrees/software/tools/gcc/../../tools/gcc/configure
--target=arm-linux --disable-shared --disable-threads --with-gnu-as
--with-gnu-ld --enable-multilib --enable-languages=c
--prefix=/usr/local/cross_arm
--with-headers=/home/localgjs/tnbt_cvstrees/software/tools/gcc/../../os/linux/include/
//Thread model: single
//gcc version 3.3.2

// This fails if compiled with... /usr/local/cross-arm/bin/arm-linux-gcc -O1
-mbig-endian -march=armv3 -o test.o -c test.c
// It generates code which sets *us to be 0, not 0x800
// With not big-endian, or without optimization, or with a Thumb-capable arch,
it works
void test(unsigned short *us)
{
    *us = (unsigned short)0x800;
    return;
}

Output code from above:
Disassembly of section .text:

00000000 <test>:
   0:   e3a03000        mov     r3, #0  ; 0x0
   4:   e5c03000        strb    r3, [r0]
   8:   e5c03001        strb    r3, [r0, #1]
   c:   e1a0f00e        mov     pc, lr

If built without -big-endian the output is correct:
Disassembly of section .text:

00000000 <test>:
   0:   e3a03000        mov     r3, #0  ; 0x0
   4:   e5c03000        strb    r3, [r0]
   8:   e3a03008        mov     r3, #8  ; 0x8
   c:   e5c03001        strb    r3, [r0, #1]
  10:   e1a0f00e        mov     pc, lr

-- 
           Summary: Optimized ARM 'unsigned short's assignments are
                    incorrect for big-endian ARMv3 targets
           Product: gcc
           Version: 3.3.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: gcc at embisi dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: arm-linux-gcc?
  GCC host triplet: i*86-*-linux
GCC target triplet: arm-linux-elf


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

Reply via email to