Blame sysdeps/powerpc/powerpc64/le/power9/rawmemchr.S

Packit Service 9f8ac8
/* Optimized rawmemchr implementation for PowerPC64/POWER9.
Packit Service 9f8ac8
   Copyright (C) 2020 Free Software Foundation, Inc.
Packit Service 9f8ac8
   This file is part of the GNU C Library.
Packit Service 9f8ac8
Packit Service 9f8ac8
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 9f8ac8
   modify it under the terms of the GNU Lesser General Public
Packit Service 9f8ac8
   License as published by the Free Software Foundation; either
Packit Service 9f8ac8
   version 2.1 of the License, or (at your option) any later version.
Packit Service 9f8ac8
Packit Service 9f8ac8
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 9f8ac8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 9f8ac8
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 9f8ac8
   Lesser General Public License for more details.
Packit Service 9f8ac8
Packit Service 9f8ac8
   You should have received a copy of the GNU Lesser General Public
Packit Service 9f8ac8
   License along with the GNU C Library; if not, see
Packit Service 9f8ac8
   <https://www.gnu.org/licenses/>.  */
Packit Service 9f8ac8
Packit Service 9f8ac8
#include <sysdep.h>
Packit Service 9f8ac8
Packit Service 9f8ac8
#ifndef RAWMEMCHR
Packit Service 9f8ac8
# define RAWMEMCHR __rawmemchr
Packit Service 9f8ac8
#endif
Packit Service 9f8ac8
Packit Service 9f8ac8
/* Implements the function
Packit Service 9f8ac8
Packit Service 9f8ac8
   int [r3] rawmemchr (void *s [r3], int c [r4])
Packit Service 9f8ac8
Packit Service 9f8ac8
   The implementation can load bytes past a matching byte, but only
Packit Service 9f8ac8
   up to the next 16B boundary, so it never crosses a page.  */
Packit Service 9f8ac8
Packit Service 9f8ac8
.machine power9
Packit Service 9f8ac8
ENTRY_TOCLESS (RAWMEMCHR, 4)
Packit Service 9f8ac8
	CALL_MCOUNT 2
Packit Service 9f8ac8
Packit Service 9f8ac8
	xori	r5,r4,0xff
Packit Service 9f8ac8
Packit Service 9f8ac8
	mtvsrd	v18+32,r4	/* matching char in v18  */
Packit Service 9f8ac8
	mtvsrd	v19+32,r5	/* non matching char in v19  */
Packit Service 9f8ac8
Packit Service 9f8ac8
	vspltb	v18,v18,7	/* replicate  */
Packit Service 9f8ac8
	vspltb	v19,v19,7	/* replicate  */
Packit Service 9f8ac8
Packit Service 9f8ac8
	neg	r5,r3
Packit Service 9f8ac8
	rldicl	r9,r5,0,60	/* How many bytes to get source 16B aligned?  */
Packit Service 9f8ac8
Packit Service 9f8ac8
	/* Align data and fill bytes not loaded with non matching char  */
Packit Service 9f8ac8
	lvx	v0,0,r3
Packit Service 9f8ac8
	lvsr	v1,0,r3
Packit Service 9f8ac8
	vperm	v0,v19,v0,v1
Packit Service 9f8ac8
Packit Service 9f8ac8
	vcmpequb. v6,v0,v18	/* 0xff if byte matches, 0x00 otherwise  */
Packit Service 9f8ac8
	beq	cr6,L(aligned)
Packit Service 9f8ac8
Packit Service 9f8ac8
	vctzlsbb r0,v6
Packit Service 9f8ac8
	add	r3,r3,r0
Packit Service 9f8ac8
	blr
Packit Service 9f8ac8
Packit Service 9f8ac8
L(aligned):
Packit Service 9f8ac8
	add	r3,r3,r9
Packit Service 9f8ac8
Packit Service 9f8ac8
L(loop):
Packit Service 9f8ac8
	lxv	v0+32,0(r3)
Packit Service 9f8ac8
	vcmpequb. v6,v0,v18	/* 0xff if byte matches, 0x00 otherwise  */
Packit Service 9f8ac8
	bne	cr6,L(tail1)
Packit Service 9f8ac8
Packit Service 9f8ac8
	lxv	v0+32,16(r3)
Packit Service 9f8ac8
	vcmpequb. v6,v0,v18	/* 0xff if byte matches, 0x00 otherwise  */
Packit Service 9f8ac8
	bne	cr6,L(tail2)
Packit Service 9f8ac8
Packit Service 9f8ac8
	lxv	v0+32,32(r3)
Packit Service 9f8ac8
	vcmpequb. v6,v0,v18	/* 0xff if byte matches, 0x00 otherwise  */
Packit Service 9f8ac8
	bne	cr6,L(tail3)
Packit Service 9f8ac8
Packit Service 9f8ac8
	lxv	v0+32,48(r3)
Packit Service 9f8ac8
	vcmpequb. v6,v0,v18	/* 0xff if byte matches, 0x00 otherwise  */
Packit Service 9f8ac8
	bne	cr6,L(tail4)
Packit Service 9f8ac8
Packit Service 9f8ac8
	addi	r3,r3,64
Packit Service 9f8ac8
	b	L(loop)
Packit Service 9f8ac8
Packit Service 9f8ac8
L(tail1):
Packit Service 9f8ac8
	vctzlsbb r0,v6
Packit Service 9f8ac8
	add	r3,r3,r0
Packit Service 9f8ac8
	blr
Packit Service 9f8ac8
Packit Service 9f8ac8
L(tail2):
Packit Service 9f8ac8
	vctzlsbb r0,v6
Packit Service 9f8ac8
	add	r3,r3,r0
Packit Service 9f8ac8
	addi	r3,r3,16
Packit Service 9f8ac8
	blr
Packit Service 9f8ac8
Packit Service 9f8ac8
L(tail3):
Packit Service 9f8ac8
	vctzlsbb r0,v6
Packit Service 9f8ac8
	add	r3,r3,r0
Packit Service 9f8ac8
	addi	r3,r3,32
Packit Service 9f8ac8
	blr
Packit Service 9f8ac8
Packit Service 9f8ac8
L(tail4):
Packit Service 9f8ac8
	vctzlsbb r0,v6
Packit Service 9f8ac8
	add	r3,r3,r0
Packit Service 9f8ac8
	addi	r3,r3,48
Packit Service 9f8ac8
	blr
Packit Service 9f8ac8
Packit Service 9f8ac8
END (RAWMEMCHR)
Packit Service 9f8ac8
weak_alias (__rawmemchr,rawmemchr)
Packit Service 9f8ac8
libc_hidden_builtin_def (__rawmemchr)