1 /* memchr - find a character in a memory zone
3 Copyright (C) 2015-2022 Free Software Foundation, Inc.
5 This file is part of the GNU C Library.
7 The GNU C Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
12 The GNU C Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with the GNU C Library. If not, see
19 <https://www.gnu.org/licenses/>. */
25 * ARMv8-a, AArch64, Advanced SIMD.
30 # define MEMCHR __memchr
33 /* Arguments and results. */
56 For each 16-byte chunk we calculate a 64-bit syndrome value with four bits
57 per byte. For even bytes, bits 0-3 are set if the relevant byte matched the
58 requested character or the byte is NUL. Bits 4-7 must be zero. Bits 4-7 are
59 set likewise for odd bytes so that adjacent bytes can be merged. Since the
60 bits in the syndrome reflect the order in which things occur in the original
61 string, counting trailing zeros identifies exactly which byte matched. */
68 ld1 {vdata.16b}, [src]
69 dup vrepchr.16b, chrin
72 cmeq vhas_chr.16b, vdata.16b, vrepchr.16b
74 and vhas_chr.16b, vhas_chr.16b, vrepmask.16b
75 addp vend.16b, vhas_chr.16b, vhas_chr.16b /* 128->64 */
78 cbz synd, L(start_loop)
82 add result, srcin, synd, lsr 2
83 cmp cntin, synd, lsr 2
84 csel result, result, xzr, hi
90 subs cntrem, cntin, tmp
93 /* Make sure that it won't overread by a 16-byte chunk */
95 tbnz tmp, 4, L(loop32_2)
100 cmeq vhas_chr.16b, vdata.16b, vrepchr.16b
101 umaxp vend.16b, vhas_chr.16b, vhas_chr.16b /* 128->64 */
106 ldr qdata, [src, 16]!
107 subs cntrem, cntrem, 32
108 cmeq vhas_chr.16b, vdata.16b, vrepchr.16b
110 umaxp vend.16b, vhas_chr.16b, vhas_chr.16b /* 128->64 */
114 and vhas_chr.16b, vhas_chr.16b, vrepmask.16b
115 addp vend.16b, vhas_chr.16b, vhas_chr.16b /* 128->64 */
117 add tmp, srcin, cntin
119 #ifndef __AARCH64EB__
123 cmp cntrem, synd, lsr 2
124 add result, src, synd, lsr 2
125 csel result, result, xzr, hi
133 weak_alias (MEMCHR, memchr)
134 libc_hidden_builtin_def (memchr)