On 11/06/14 11:19, Charles Baylis wrote:
> 2014-05-22  Charles Baylis  <charles.bay...@linaro.org>
> 
>       * config/arm/bpabi.S (__aeabi_uldivmod): Optimise stack pointer
>       manipulation.

OK.

R.

> ---
>  libgcc/config/arm/bpabi.S | 54 
> +++++++++++++++++++++++++++++++++++++----------
>  1 file changed, 43 insertions(+), 11 deletions(-)
> 
> diff --git a/libgcc/config/arm/bpabi.S b/libgcc/config/arm/bpabi.S
> index ae76cd3..67246b0 100644
> --- a/libgcc/config/arm/bpabi.S
> +++ b/libgcc/config/arm/bpabi.S
> @@ -120,6 +120,46 @@ ARM_FUNC_START aeabi_ulcmp
>  #endif
>  .endm
>  
> +/* we can use STRD/LDRD on v5TE and later, and any Thumb-2 architecture. */
> +#if (defined(__ARM_EABI__)                                            \
> +     && (defined(__thumb2__)                                          \
> +         || (__ARM_ARCH >= 5 && defined(__TARGET_FEATURE_DSP))))
> +#define CAN_USE_LDRD 1
> +#else
> +#define CAN_USE_LDRD 0
> +#endif
> +
> +/* set up stack from for call to __udivmoddi4. At the end of the macro the
> +   stack is arranged as follows:
> +             sp+12   / space for remainder
> +             sp+8    \ (written by __udivmoddi4)
> +             sp+4    lr
> +             sp+0    sp+8 [rp (remainder pointer) argument for __udivmoddi4]
> +
> + */
> +.macro push_for_divide fname
> +#if defined(__thumb2__) && CAN_USE_LDRD
> +     sub     ip, sp, #8
> +     strd    ip, lr, [sp, #-16]!
> +#else
> +     sub     sp, sp, #8
> +     do_push {sp, lr}
> +#endif
> +98:  cfi_push        98b - \fname, 0xe, -0xc, 0x10
> +.endm
> +
> +/* restore stack */
> +.macro pop_for_divide
> +     ldr     lr, [sp, #4]
> +#if CAN_USE_LDRD
> +     ldrd    r2, r3, [sp, #8]
> +     add     sp, sp, #16
> +#else
> +     add     sp, sp, #8
> +     do_pop  {r2, r3}
> +#endif
> +.endm
> +
>  #ifdef L_aeabi_ldivmod
>  
>  /* Perform 64 bit signed division.
> @@ -165,18 +205,10 @@ ARM_FUNC_START aeabi_uldivmod
>       cfi_start       __aeabi_uldivmod, LSYM(Lend_aeabi_uldivmod)
>       test_div_by_zero        unsigned
>  
> -     sub     sp, sp, #8
> -#if defined(__thumb2__)
> -     mov     ip, sp
> -     push    {ip, lr}
> -#else
> -     do_push {sp, lr}
> -#endif
> -98:  cfi_push 98b - __aeabi_uldivmod, 0xe, -0xc, 0x10
> +     push_for_divide __aeabi_uldivmod
> +     /* arguments in (r0:r1), (r2:r3) and *sp */
>       bl      SYM(__gnu_uldivmod_helper) __PLT__
> -     ldr     lr, [sp, #4]
> -     add     sp, sp, #8
> -     do_pop  {r2, r3}
> +     pop_for_divide
>       RET
>       cfi_end LSYM(Lend_aeabi_uldivmod)
>  
> 


Reply via email to