1/* Search a character in a block of memory. 31/64 bit S/390 version.
2 Copyright (C) 2001-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19/* INPUT PARAMETERS
20 %r2 = address to memory area
21 %r3 = character to find
22 %r4 = number of bytes to search. */
23
24#include <ifunc-memchr.h>
25#include "sysdep.h"
26#include "asm-syntax.h"
27
28#if HAVE_MEMCHR_Z900_G5
29# if defined __s390x__
30# define SLGR slgr
31# define LGHI lghi
32# define NGR ngr
33# define LGR lgr
34# else
35# define SLGR slr
36# define LGHI lhi
37# define NGR nr
38# define LGR lr
39# endif /* ! defined __s390x__ */
40
41 .text
42ENTRY(MEMCHR_Z900_G5)
43 LGHI %r0,0xff
44 NGR %r0,%r3
45 LGR %r1,%r2
46# if ! defined __s390x__
47 tmlh %r4,32768
48 jo 3f /* Jump away if n >= 0x80000000 */
49# endif
50 la %r2,0(%r4,%r1)
510: srst %r2,%r1
52 jo 0b
53 brc 13,1f
54 SLGR %r2,%r2
551: br %r14
56# if ! defined __s390x__
57 /* On s390 (31bit), the pointer to the first byte after s (stored in
58 r2) always wraps around with n >= 0x80000000 and can lead to stop
59 searching before end of s. Thus just use r2=0 in this case.
60 If r2 < r1, the srst instruction stops searching with cc=2 "not
61 found" when wrapping around from top address to zero. */
623: SLGR %r2,%r2
63 j 0b
64# endif
65END(MEMCHR_Z900_G5)
66
67# if ! HAVE_MEMCHR_IFUNC
68strong_alias (MEMCHR_Z900_G5, __memchr)
69weak_alias (__memchr, memchr)
70# endif
71
72# if defined SHARED && IS_IN (libc)
73strong_alias (MEMCHR_Z900_G5, __GI_memchr)
74# endif
75#endif
76

source code of glibc/sysdeps/s390/memchr-z900.S