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



             Bug #: 56884

           Summary: ARM thumb16 mnemonic lsls not recognized for CPU

                    cortex-m0.

    Classification: Unclassified

           Product: gcc

           Version: unknown

            Status: UNCONFIRMED

          Severity: minor

          Priority: P3

         Component: inline-asm

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: eleven...@gmail.com





It looks like the inline assembler when -mcpu=cortex=m0 is selected doesn't

recognize the "lsls" mnemonic.  It assembles "lsl" and emits the instruction

that the disassembler identifies as "lsls".



The hitch is that this mismatch requires different inline assembler when the

cpu changes between M0 and M3/M4.  On M3, the "lsl" instruction will not set

the condition flags.



  ---



Given a source file:



void test () {

  __asm volatile ("lsls r0, #1");

}





For Cortex-M0,



elf@cerise lsl-bug > /opt/gcc/bin/arm-none-eabi-gcc -g -Os -c -mcpu=cortex-m0

-mthumb lsl.c -o lsl.o

/tmp/ccuEyZSU.s: Assembler messages:

/tmp/ccuEyZSU.s:29: Error: instruction not supported in Thumb16 mode -- `lsls

r0,#1'



If the instruction is changed to "lsl r0, #1" the compiler is happy and the

emitted machine code is correct.  The disassembler accurately identifies the

instruction as lsls because that's the only form of lsl that the M0 supports.



void test ()

{

  __asm volatile ("lsl r0, #1");

   0:   0040            lsls    r0, r0, #1

}

   2:   4770            bx      lr





So, I think that the issue is only in the inline assembler in that it doesn't

accept the "lsls" opcode....or is there another explanation?





 ---



For references:



elf@cerise lsl-bug > /opt/gcc/bin/arm-none-eabi-gcc -v -mcpu=cortex-m0 -mthumb

Using built-in specs.

COLLECT_GCC=/opt/gcc/bin/arm-none-eabi-gcc

COLLECT_LTO_WRAPPER=/opt/gcc/libexec/gcc/arm-none-eabi/4.7.2/lto-wrapper

Target: arm-none-eabi

Configured with: ../gcc-4.7.2/configure --target=arm-none-eabi

--prefix=/opt/gcc --enable-multilib --enable-languages=c,c++ --with-newlib

--with-gnu-as --with-gnu-ld --disable-nls --disable-shared --disable-threads

--with-headers=newlib/libc/include --disable-libssp --disable-libstdcxx-pch

--disable-libmudflap --disable-libgomp --disable-werror --with-system-zlib

--disable-newlib-supplied-syscalls

Thread model: single

gcc version 4.7.2 (GCC)

Reply via email to