diff --git a/libc/Android.bp b/libc/Android.bp index 2bce1f550..62093747b 100644 --- a/libc/Android.bp +++ b/libc/Android.bp @@ -1171,7 +1171,7 @@ cc_library_static { "arch-x86/atom/string/sse2-memset-atom.S", "arch-x86/atom/string/sse2-strlen-atom.S", "arch-x86/atom/string/ssse3-memcmp-atom.S", - "arch-x86/atom/string/ssse3-memcpy-atom.S", + "arch-x86/atom/string/ssse3-memmove-atom.S", "arch-x86/atom/string/ssse3-strcpy-atom.S", "arch-x86/atom/string/ssse3-strncpy-atom.S", "arch-x86/atom/string/ssse3-wmemcmp-atom.S", diff --git a/libc/arch-x86/atom/string/ssse3-memcpy-atom.S b/libc/arch-x86/atom/string/ssse3-memcpy-atom.S index fa6718892..5532e2ef4 100644 --- a/libc/arch-x86/atom/string/ssse3-memcpy-atom.S +++ b/libc/arch-x86/atom/string/ssse3-memcpy-atom.S @@ -34,10 +34,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # define MEMCPY memcpy_atom #endif -#ifndef USE_AS_MEMMOVE -# define USE_AS_MEMMOVE -#endif - #ifndef L # define L(label) .L##label #endif @@ -71,12 +67,6 @@ name: \ cfi_startproc #endif -#ifndef ALIAS_SYMBOL -# define ALIAS_SYMBOL(alias, original) \ - .globl alias; \ - .equ alias, original -#endif - #ifndef END # define END(name) \ cfi_endproc; \ @@ -3132,5 +3122,3 @@ L(bk_ssse3_cpy): #endif END (MEMCPY) - -ALIAS_SYMBOL(memmove_atom, MEMCPY) diff --git a/libc/arch-x86/atom/string/ssse3-memmove-atom.S b/libc/arch-x86/atom/string/ssse3-memmove-atom.S new file mode 100644 index 000000000..3572eac9c --- /dev/null +++ b/libc/arch-x86/atom/string/ssse3-memmove-atom.S @@ -0,0 +1,34 @@ +/* +Copyright (c) 2010, Intel Corporation +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define MEMCPY memmove_atom +#define USE_AS_MEMMOVE +#include "ssse3-memcpy-atom.S" diff --git a/libc/arch-x86/dynamic_function_dispatch.cpp b/libc/arch-x86/dynamic_function_dispatch.cpp index a92519027..66243858c 100644 --- a/libc/arch-x86/dynamic_function_dispatch.cpp +++ b/libc/arch-x86/dynamic_function_dispatch.cpp @@ -93,13 +93,6 @@ DEFINE_IFUNC_FOR(__memset_chk) { RETURN_FUNC(__memset_chk_func, __memset_chk_generic); } -typedef void* memcpy_func(void*, const void*, size_t); -DEFINE_IFUNC_FOR(memcpy) { - __builtin_cpu_init(); - if (cpu_is(ATOM)) RETURN_FUNC(memcpy_func, memcpy_atom); - RETURN_FUNC(memcpy_func, memcpy_generic); -} - typedef void* memmove_func(void* __dst, const void* __src, size_t __n); DEFINE_IFUNC_FOR(memmove) { __builtin_cpu_init(); @@ -107,6 +100,11 @@ DEFINE_IFUNC_FOR(memmove) { RETURN_FUNC(memmove_func, memmove_generic); } +typedef void* memcpy_func(void*, const void*, size_t); +DEFINE_IFUNC_FOR(memcpy) { + return memmove_resolver(); +} + typedef char* strcpy_func(char* __dst, const char* __src); DEFINE_IFUNC_FOR(strcpy) { __builtin_cpu_init(); diff --git a/libc/arch-x86/silvermont/string/sse2-memmove-slm.S b/libc/arch-x86/silvermont/string/sse2-memmove-slm.S index 48087d89a..da6456ccc 100644 --- a/libc/arch-x86/silvermont/string/sse2-memmove-slm.S +++ b/libc/arch-x86/silvermont/string/sse2-memmove-slm.S @@ -67,12 +67,6 @@ name: \ cfi_startproc #endif -#ifndef ALIAS_SYMBOL -# define ALIAS_SYMBOL(alias, original) \ - .globl alias; \ - .equ alias, original -#endif - #ifndef END # define END(name) \ cfi_endproc; \ @@ -543,5 +537,3 @@ L(mm_large_page_loop_backward): jmp L(mm_recalc_len) END (MEMMOVE) - -ALIAS_SYMBOL(memcpy_generic, MEMMOVE) diff --git a/libc/arch-x86/static_function_dispatch.S b/libc/arch-x86/static_function_dispatch.S index 5f879edb4..7e8e63d47 100644 --- a/libc/arch-x86/static_function_dispatch.S +++ b/libc/arch-x86/static_function_dispatch.S @@ -36,7 +36,7 @@ END(name) FUNCTION_DELEGATE(memcmp, memcmp_generic) FUNCTION_DELEGATE(memset, memset_generic) FUNCTION_DELEGATE(__memset_chk, __memset_chk_generic) -FUNCTION_DELEGATE(memcpy, memcpy_generic) +FUNCTION_DELEGATE(memcpy, memmove_generic) FUNCTION_DELEGATE(memmove, memmove_generic) FUNCTION_DELEGATE(strcpy, strcpy_generic) FUNCTION_DELEGATE(strncpy, strncpy_generic)