To solve this problem with ARM cortex m3 I changed the supplied CMSIS file core_cm3.c
I'm now using: uint32_t __STREXH(uint16_t value, uint16_t *addr) { //uint32_t result=0; register uint32_t result asm ("r2"); __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); } ... uint32_t __STREXB(uint8_t value, uint8_t *addr) { //uint32_t result=0; register uint32_t result asm ("r2"); __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); } instead of: uint32_t __STREXH(uint16_t value, uint16_t *addr) { uint32_t result=0; __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); } ... uint32_t __STREXB(uint8_t value, uint8_t *addr) { uint32_t result=0; __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); } Bugzilla from sourceware-bugzi...@sourceware.org wrote: > > http://sourceware.org/bugzilla/show_bug.cgi?id=13215 > > Bug #: 13215 > Summary: ARM Cortex M3 strexh strexb instructions with same > registers generates error > Product: binutils > Version: 2.21 > Status: NEW > Severity: critical > Priority: P2 > Component: gas > AssignedTo: unassig...@sources.redhat.com > ReportedBy: hazelnu...@gmail.com > Classification: Unclassified > > > Created attachment 5939 > --> http://sourceware.org/bugzilla/attachment.cgi?id=5939 > example of ARM provided code that makes use of strexh strexb with same > registers > > In gas version 2.21.53, when compiling for the Cortex-M3 with > -mcpu=cortex-m3 > -march=armv7-m, the following instructions generate assembler errors: > > strexh r0, r0, [r1] > strexb r0, r0, [r1] > > The error messages are: > Error: registers may not be the same -- `strexh r0,r0,[r1]' > Error: registers may not be the same -- `strexb r0,r0,[r1]' > > However, according to the ARM documentation of STREX for the Cortex M3 > [0], > only the word sized (32-bit) version of the instruction strex has the > restriction that the three registers be unique: > > for STREX, Rd must be different from both Rt and Rn > > This problem shows up, for example, when trying to compile vendor provided > peripheral libraries that make use of CMSIS. In particular, the > core_cm3.[ch] > of CMSIS v1.3, and core_cmInstr.h of CMSIS v2.0 have all of these > instructions. > Curiously, even strex r0, r0, [r1] shows up in CMSIS, even though this is > explicitly restricted in [0]. So perhaps even some of the CMSIS code is > breaking the specification of the ARM documentation, not sure. > > [0] -- > http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/BABFFBJB.html > > -- > Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email > ------- You are receiving this mail because: ------- > You are on the CC list for the bug. > > _______________________________________________ > bug-binutils mailing list > bug-binutils@gnu.org > https://lists.gnu.org/mailman/listinfo/bug-binutils > > -- View this message in context: http://old.nabble.com/-Bug-gas-13215--New%3A-ARM-Cortex-M3-strexh-strexb-instructions-with-same-registers-generates-error-tp32516436p33011958.html Sent from the Gnu - Binutils - Bugs mailing list archive at Nabble.com. _______________________________________________ bug-binutils mailing list bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils