diff options
Diffstat (limited to 'ports/sysdeps/arm')
-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 |