diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/aarch64/rawmemchr.S | 42 | ||||
-rw-r--r-- | sysdeps/aarch64/strlen.S | 5 |
3 files changed, 50 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index a9cedf0cb9..4ed597bd76 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2016-06-20 Wilco Dijkstra <wdijkstr@arm.com> + * sysdeps/aarch64/rawmemchr.S (__rawmemchr): New file. + * sysdeps/aarch64/strlen.S (__strlen): Change to __strlen to avoid PLT. + +2016-06-20 Wilco Dijkstra <wdijkstr@arm.com> + * sysdeps/aarch64/memcpy.S (memcpy): Rewrite of optimized memcpy and memmove. * sysdeps/aarch64/memmove.S (memmove): Remove diff --git a/sysdeps/aarch64/rawmemchr.S b/sysdeps/aarch64/rawmemchr.S new file mode 100644 index 0000000000..ec958e8f54 --- /dev/null +++ b/sysdeps/aarch64/rawmemchr.S @@ -0,0 +1,42 @@ +/* rawmemchr - find a character in a memory zone + + Copyright (C) 2015 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +/* Special case rawmemchr (s, 0) as strlen, otherwise tailcall memchr. + Call strlen without setting up a full frame - it preserves x14/x15. +*/ + +ENTRY (__rawmemchr) + cbz w1, L(do_strlen) + mov x2, -1 + b __memchr + +L(do_strlen): + mov x15, x30 + cfi_return_column (x15) + mov x14, x0 + bl __strlen + add x0, x14, x0 + ret x15 + +END (__rawmemchr) +weak_alias (__rawmemchr, rawmemchr) +libc_hidden_builtin_def (__rawmemchr) diff --git a/sysdeps/aarch64/strlen.S b/sysdeps/aarch64/strlen.S index 9b4d1da60c..a07834bf96 100644 --- a/sysdeps/aarch64/strlen.S +++ b/sysdeps/aarch64/strlen.S @@ -84,7 +84,7 @@ whether the first fetch, which may be misaligned, crosses a page boundary. */ -ENTRY_ALIGN (strlen, 6) +ENTRY_ALIGN (__strlen, 6) and tmp1, srcin, MIN_PAGE_SIZE - 1 mov zeroones, REP8_01 cmp tmp1, MIN_PAGE_SIZE - 16 @@ -213,5 +213,6 @@ L(page_cross): csel data1, data1, tmp4, eq csel data2, data2, tmp2, eq b L(page_cross_entry) -END (strlen) +END (__strlen) +weak_alias (__strlen, strlen) libc_hidden_builtin_def (strlen) |