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