This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] ARM: Fix strcmp() for Thumb-1


On Sun, May 26, 2013 at 7:27 PM, Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
> The GCC multilib for ARMv4T is broken with the current strcmp()
> implementation.  GCC will pass no architecture flag to AS in case it
> builds a multilib for -mthumb with no further architecture options.  The
> default architecture is ARMv4T in GCC.  The usage of ".syntax unified"
> instructs AS to produce output for the ARMv6T2 architecture.  Thus we
> have (readelf -A):
>
> File: ./arm-rtems4.11/thumb/newlib/libc/machine/arm/lib_a-strcmp.o
> Attribute Section: aeabi
> File Attributes
>   Tag_CPU_arch: v6T2
>   Tag_THUMB_ISA_use: Thumb-2
>
> The change suppresses ".syntax unified" for Thumb-1 and uses only
> Thumb-1 instructions.  This leads to:
>
> File: ./arm-rtems4.11/thumb/newlib/libc/machine/arm/lib_a-strcmp.o
> Attribute Section: aeabi
> File Attributes
>   Tag_CPU_arch: v4T
>   Tag_THUMB_ISA_use: Thumb-1
>
> newlib/ChangeLog
> 2013-05-26  Sebastian Huber <sebastian.huber@embedded-brains.de>
>
>         libc/machine/arm/strcmp.S: Fix Thumb-1 version.
> ---
>  newlib/libc/machine/arm/strcmp.S |    8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/newlib/libc/machine/arm/strcmp.S b/newlib/libc/machine/arm/strcmp.S
> index 0a4057e..c6cb991 100644
> --- a/newlib/libc/machine/arm/strcmp.S
> +++ b/newlib/libc/machine/arm/strcmp.S
> @@ -50,7 +50,9 @@
>  #define LSB 0x000000ff
>  #endif /* not  __ARMEB__ */
>
> +#if !(defined (__thumb__) && !defined (__thumb2__))
>  .syntax         unified
> +#endif
>
>  #if defined (__thumb__)
>          .thumb
> @@ -64,14 +66,14 @@ strcmp:
>  1:
>          ldrb    r2, [r0]
>          ldrb    r3, [r1]
> -        adds    r0, r0, #1
> -        adds    r1, r1, #1
> +        add     r0, r0, #1
> +        add     r1, r1, #1
>          cmp     r2, #0
>          beq     2f
>          cmp     r2, r3
>          beq     1b
>  2:
> -        subs    r0, r2, r3
> +        sub     r0, r2, r3
>          bx      lr
>  #elif (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED))
>  1:
> --
> 1.7.10.4
>
Though I have no right to approve the patch, I would like to have below comment.
UAL is generally preferred, thus you may handle armv6-m specially by
keeping UAL for it. For example,

#if (defined(__thumb__) && defined(__ARM_ARCH_6M__))
//...
#endif

Thanks.

--
Best Regards.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]