Module Name: src Committed By: matt Date: Sun Sep 8 13:24:16 UTC 2013
Modified Files: src/common/lib/libc/arch/arm/gen: divsi3.S udivsi3.S Log Message: Support using hwdiv instructions if those are available. But only for EABI. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/common/lib/libc/arch/arm/gen/divsi3.S cvs rdiff -u -r1.5 -r1.6 src/common/lib/libc/arch/arm/gen/udivsi3.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/common/lib/libc/arch/arm/gen/divsi3.S diff -u src/common/lib/libc/arch/arm/gen/divsi3.S:1.9 src/common/lib/libc/arch/arm/gen/divsi3.S:1.10 --- src/common/lib/libc/arch/arm/gen/divsi3.S:1.9 Thu Sep 5 05:16:08 2013 +++ src/common/lib/libc/arch/arm/gen/divsi3.S Sun Sep 8 13:24:16 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: divsi3.S,v 1.9 2013/09/05 05:16:08 matt Exp $ */ +/* $NetBSD: divsi3.S,v 1.10 2013/09/08 13:24:16 matt Exp $ */ /* * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND @@ -16,7 +16,11 @@ #include <machine/asm.h> +#if defined(__thumb__) && !defined(_ARM_ARCH_T2) +ARM_ENTRY(__divsi3) +#else ENTRY(__divsi3) +#endif #if defined(__ARM_ARCH_EXT_IDIV__) # if defined(__ARM_EABI__) mov r3, r0 @ save for mls @@ -26,25 +30,38 @@ ENTRY(__divsi3) mls r1, r0, r1, r3 @ return modulus in r1 # endif RET -#elif !defined(__thumb__) || defined(_ARM_ARCH_T2) - b __divide +#elif defined(__ARM_EABI__) && defined(_LIBC) +#ifdef _ARM_ARCH_7 + movw r2, #:lower16:REL_SYM(__libc_arm_hwdiv_present, .LPIC0) + movt r2, #:upper16:REL_SYM(__libc_arm_hwdiv_present, .LPIC0) #else -#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) - .fnstart - .cfi_startproc -#endif - push {r4, lr} -#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) - .cfi_def_cfa_offset 8 - .cfi_offset 14, -4 - .cfi_offset 4, -8 -#endif - bl __divide - pop {r4, pc} -#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) - .cfi_endproc - .fnend + ldr r2, .Lhwdiv_present #endif +# ifdef PIC + add r2, r2, pc +# endif + ldr r2, [r2] +.LPIC0: cmp r2, #0 + beq __divide + mov r3, r0 +#if defined(__ARM_ARCH_EXT_IDIV__) + sdiv r0, r0, r1 + mls r1, r0, r1, r3 /* return modulus in r1 */ +#elif defined(__thumb__) && defined(_ARM_ARCH_T2) + .inst.w 0xfb90f0f1 + .inst.w 0xfb003111 +#else + .inst 0xe710f110 + .inst 0xe0613190 +#endif + RET +#ifndef _ARM_ARCH_7 + .align 0 +.Lhwdiv_present: + .word REL_SYM(__libc_arm_hwdiv_present, .LPIC0) +#endif +#else /* !__ARM_EABI__ */ + b __divide #endif END(__divsi3) Index: src/common/lib/libc/arch/arm/gen/udivsi3.S diff -u src/common/lib/libc/arch/arm/gen/udivsi3.S:1.5 src/common/lib/libc/arch/arm/gen/udivsi3.S:1.6 --- src/common/lib/libc/arch/arm/gen/udivsi3.S:1.5 Thu Sep 5 05:16:08 2013 +++ src/common/lib/libc/arch/arm/gen/udivsi3.S Sun Sep 8 13:24:16 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: udivsi3.S,v 1.5 2013/09/05 05:16:08 matt Exp $ */ +/* $NetBSD: udivsi3.S,v 1.6 2013/09/08 13:24:16 matt Exp $ */ /* * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND @@ -16,7 +16,11 @@ #include <machine/asm.h> +#if defined(__ARM_EABI__) && defined(__thumb__) && !defined(_ARM_ARCH_T2) +ARM_ENTRY(__udivsi3) +#else ENTRY(__udivsi3) +#endif #if defined(__ARM_ARCH_EXT_IDIV__) # if defined(__ARM_EABI__) mov r3, r0 @ save for mls @@ -26,26 +30,38 @@ ENTRY(__udivsi3) mls r1, r0, r1, r3 @ return modulus in r1 # endif RET -#elif !defined(__thumb__) || defined(_ARM_ARCH_T2) - b __udivide +#elif defined(__ARM_EABI__) && defined(_LIBC) +#ifdef _ARM_ARCH_7 + movw r2, #:lower16:REL_SYM(__libc_arm_hwdiv_present, .LPIC0) + movt r2, #:upper16:REL_SYM(__libc_arm_hwdiv_present, .LPIC0) +#else + ldr r2, .Lhwdiv_present +#endif +#ifdef PIC + add r2, r2, pc +#endif + ldr r2, [r2] +.LPIC0: cmp r2, #0 + beq __udivide + mov r3, r0 +#if defined(__ARM_ARCH_EXT_IDIV__) + udiv r0, r0, r1 + mls r1, r0, r1, r3 /* return modulus in r1 */ +#elif defined(__thumb__) && defined(_ARM_ARCH_T2) + .inst.w 0xfbb0f0f1 + .inst.w 0xfb003111 #else -#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) - .fnstart - .cfi_startproc -#endif - push {r4, lr} -#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) - .save {r4, lr} - .cfi_def_cfa_offset 8 - .cfi_offset 14, -4 - .cfi_offset 4, -8 -#endif - bl __udivide - pop {r4, pc} -#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) - .cfi_endproc - .fnend + .inst 0xe730f110 + .inst 0xe0613190 +#endif + RET +#ifndef _ARM_ARCH_7 + .align 0 +.Lhwdiv_present: + .word REL_SYM(__libc_arm_hwdiv_present, .LPIC0) #endif +#else + b __udivide #endif END(__udivsi3)