On 19/07/17 22:02, Ian Tessier via newlib wrote: > With this change the arm platform can now be fully compiled with Clang. > > Tested by comparing the output with GCC 4.8.2, and Clang 4.0, using a > variety of arches, big/little endianness, and arm/thumb mode to verify > the generated assembly output matches between GCC vs Clang with UAL, and > also GCC with UAL vs GCC with non-UAL, for all preprocessor code blocks. > > The only difference found is an extra nop at the end of the function > when compiled with GCC using armv7-a/thumb/little-endian/-O2 compared to > Clang. The nop is not emitted when compiled in big-endian mode. > --- > newlib/libc/machine/arm/strcpy.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/newlib/libc/machine/arm/strcpy.c b/newlib/libc/machine/arm/strcpy.c > index f1205b9c1..154451110 100644 > --- a/newlib/libc/machine/arm/strcpy.c > +++ b/newlib/libc/machine/arm/strcpy.c > @@ -42,6 +42,7 @@ char* __attribute__((naked)) > strcpy (char* dst, const char* src) > { > asm ( > + ".syntax unified\n\t" > #if !(defined(__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) || \ > (defined (__thumb__) && !defined (__thumb2__))) > #ifdef _ISA_ARM_7 > @@ -127,15 +128,15 @@ strcpy (char* dst, const char* src) > #ifdef __ARMEB__ > "tst r2, #0xff00\n\t" > "iteet ne\n\t" > - "strneh r2, [ip], #2\n\t" > + "strhne r2, [ip], #2\n\t" > "lsreq r2, r2, #8\n\t" > - "streqb r2, [ip]\n\t" > + "strbeq r2, [ip]\n\t" > "tstne r2, #0xff\n\t" > #else > "tst r2, #0xff\n\t" > "itet ne\n\t" > - "strneh r2, [ip], #2\n\t" > - "streqb r2, [ip]\n\t" > + "strhne r2, [ip], #2\n\t" > + "strbeq r2, [ip]\n\t" > "tstne r2, #0xff00\n\t" > #endif > "bne 5b\n\t" > @@ -162,9 +163,9 @@ strcpy (char* dst, const char* src) > "mov r3, r0\n\t" > "1:\n\t" > "ldrb r2, [r1]\n\t" > - "add r1, r1, #1\n\t" > + "adds r1, #1\n\t" > "strb r2, [r3]\n\t" > - "add r3, r3, #1\n\t" > + "adds r3, #1\n\t" > "cmp r2, #0\n\t" > "bne 1b\n\t" > "bx lr\n\t" > This doesn't compile on ARMv4t - you've missed the "mov r3, r0" instruction in the final hunk. Fixed thusly (pushed). ------------- ARMv4t does not support mov between two low registers. Now we use unified syntax mov instructions need converting to movs. --- newlib/libc/machine/arm/strcpy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)