diff options
author | Roland McGrath <roland@hack.frob.com> | 2013-05-13 15:41:46 -0700 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2013-05-13 16:13:14 -0700 |
commit | 5d5ef5dbfc5be7aec31e5d33d28b2e93dc4b8a8d (patch) | |
tree | 746611ebd932a6585a002734aab5872db8dd18dc /ports/sysdeps | |
parent | 68fc074ca056cd0b854031a3a855ba2c98c9d866 (diff) | |
download | glibc-5d5ef5dbfc5be7aec31e5d33d28b2e93dc4b8a8d.tar.gz glibc-5d5ef5dbfc5be7aec31e5d33d28b2e93dc4b8a8d.tar.xz glibc-5d5ef5dbfc5be7aec31e5d33d28b2e93dc4b8a8d.zip |
ARM: Make multiarch memcpy always use NEON when compiler does
Diffstat (limited to 'ports/sysdeps')
-rw-r--r-- | ports/sysdeps/arm/armv7/multiarch/ifunc-impl-list.c | 9 | ||||
-rw-r--r-- | ports/sysdeps/arm/armv7/multiarch/memcpy.S | 15 | ||||
-rw-r--r-- | ports/sysdeps/arm/armv7/multiarch/memcpy_neon.S | 8 | ||||
-rw-r--r-- | ports/sysdeps/arm/armv7/multiarch/memcpy_vfp.S | 10 |
4 files changed, 31 insertions, 11 deletions
diff --git a/ports/sysdeps/arm/armv7/multiarch/ifunc-impl-list.c b/ports/sysdeps/arm/armv7/multiarch/ifunc-impl-list.c index 0dcdcd6244..9c2487fd22 100644 --- a/ports/sysdeps/arm/armv7/multiarch/ifunc-impl-list.c +++ b/ports/sysdeps/arm/armv7/multiarch/ifunc-impl-list.c @@ -35,9 +35,16 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, IFUNC_IMPL (i, name, memcpy, IFUNC_IMPL_ADD (array, i, memcpy, hwcap & HWCAP_ARM_NEON, - __memcpy_neon) +#ifdef __ARM_NEON__ + memcpy +#else + __memcpy_neon +#endif + ) +#ifndef __ARM_NEON__ IFUNC_IMPL_ADD (array, i, memcpy, hwcap & HWCAP_ARM_VFP, __memcpy_vfp) +#endif IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_arm)); return i; diff --git a/ports/sysdeps/arm/armv7/multiarch/memcpy.S b/ports/sysdeps/arm/armv7/multiarch/memcpy.S index 1b12465a8b..81c01d3eac 100644 --- a/ports/sysdeps/arm/armv7/multiarch/memcpy.S +++ b/ports/sysdeps/arm/armv7/multiarch/memcpy.S @@ -22,27 +22,29 @@ #include <sysdep.h> #include <rtld-global-offsets.h> -#if !defined NOT_IN_libc +#ifndef NOT_IN_libc +/* Under __ARM_NEON__, memcpy_neon.S defines the name memcpy. */ +# ifndef __ARM_NEON__ .text ENTRY(memcpy) .type memcpy, %gnu_indirect_function -#ifdef __SOFTFP__ +# ifdef __SOFTFP__ ldr r1, .Lmemcpy_arm tst r0, #HWCAP_ARM_VFP ldrne r1, .Lmemcpy_vfp -#else +# else ldr r1, .Lmemcpy_vfp -#endif +# endif tst r0, #HWCAP_ARM_NEON ldrne r1, .Lmemcpy_neon 1: add r0, r1, pc DO_RET(lr) -#ifdef __SOFTFP__ +# ifdef __SOFTFP__ .Lmemcpy_arm: .long C_SYMBOL_NAME(__memcpy_arm) - 1b - PC_OFS -#endif +# endif .Lmemcpy_neon: .long C_SYMBOL_NAME(__memcpy_neon) - 1b - PC_OFS .Lmemcpy_vfp: @@ -51,6 +53,7 @@ ENTRY(memcpy) END(memcpy) libc_hidden_builtin_def (memcpy) +#endif /* Not __ARM_NEON__. */ /* These versions of memcpy are defined not to clobber any VFP or NEON registers so they must always call the ARM variant of the memcpy code. */ diff --git a/ports/sysdeps/arm/armv7/multiarch/memcpy_neon.S b/ports/sysdeps/arm/armv7/multiarch/memcpy_neon.S index c0ef1f8983..e60d1cc0e1 100644 --- a/ports/sysdeps/arm/armv7/multiarch/memcpy_neon.S +++ b/ports/sysdeps/arm/armv7/multiarch/memcpy_neon.S @@ -1,3 +1,9 @@ +#ifdef __ARM_NEON__ +/* Under __ARM_NEON__, this file defines memcpy directly. */ +libc_hidden_builtin_def (memcpy) +#else +# define memcpy __memcpy_neon +#endif + #define MEMCPY_NEON -#define memcpy __memcpy_neon #include "memcpy_impl.S" diff --git a/ports/sysdeps/arm/armv7/multiarch/memcpy_vfp.S b/ports/sysdeps/arm/armv7/multiarch/memcpy_vfp.S index d21b702e90..e008c041ed 100644 --- a/ports/sysdeps/arm/armv7/multiarch/memcpy_vfp.S +++ b/ports/sysdeps/arm/armv7/multiarch/memcpy_vfp.S @@ -1,3 +1,7 @@ -#define MEMCPY_VFP -#define memcpy __memcpy_vfp -#include "memcpy_impl.S" +/* Under __ARM_NEON__, memcpy_neon.S defines memcpy directly + and the __memcpy_vfp code will never be used. */ +#ifndef __ARM_NEON__ +# define MEMCPY_VFP +# define memcpy __memcpy_vfp +# include "memcpy_impl.S" +#endif |