/* Optimized strcmp implementation for POWER7/PowerPC32.
   Copyright (C) 2010 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, write to the Free
   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
   02110-1301 USA.  */

#include <sysdep.h>
#include <bp-sym.h>
#include <bp-asm.h>

/* See strlen.s for comments on how the end-of-string testing works.  */

/* int [r3] strncmp (const char *s1 [r3],
		     const char *s2 [r4],
		     size_t size [r5])  */

EALIGN (BP_SYM(strncmp),4,0)

#define rTMP	r0
#define rRTN	r3
#define rSTR1	r3	/* first string arg */
#define rSTR2	r4	/* second string arg */
#define rN	r5	/* max string length */
/* Note:  The Bounded pointer support in this code is broken.  This code
   was inherited from PPC32 and and that support was never completed.
   Current PPC gcc does not support -fbounds-check or -fbounded-pointers.  */
#define rWORD1	r6	/* current word in s1 */
#define rWORD2	r7	/* current word in s2 */
#define rWORD3	r10
#define rWORD4	r11
#define rFEFE	r8	/* constant 0xfefefeff (-0x01010101) */
#define r7F7F	r9	/* constant 0x7f7f7f7f */
#define rNEG	r10	/* ~(word in s1 | 0x7f7f7f7f) */
#define rBITDIF	r11	/* bits that differ in s1 & s2 words */

	dcbt	0,rSTR1
	or	rTMP,rSTR2,rSTR1
	lis	r7F7F,0x7f7f
	dcbt	0,rSTR2
	clrlwi.	rTMP,rTMP,30
	cmplwi	cr1,rN,0
	lis	rFEFE,-0x101
	bne	L(unaligned)
/* We are word alligned so set up for two loops.  first a word
   loop, then fall into the byte loop if any residual.  */
	srwi.	rTMP,rN,2
	clrlwi	rN,rN,30
	addi	rFEFE,rFEFE,-0x101
	addi	r7F7F,r7F7F,0x7f7f
	cmplwi	cr1,rN,0
	beq	L(unaligned)

	mtctr	rTMP
	lwz	rWORD1,0(rSTR1)
	lwz	rWORD2,0(rSTR2)
	b	L(g1)

L(g0):
	lwzu	rWORD1,4(rSTR1)
	bne	cr1,L(different)
	lwzu	rWORD2,4(rSTR2)
L(g1):	add	rTMP,rFEFE,rWORD1
	nor	rNEG,r7F7F,rWORD1
	bdz	L(tail)
	and.	rTMP,rTMP,rNEG
	cmpw	cr1,rWORD1,rWORD2
	beq	L(g0)

/* OK. We've hit the end of the string. We need to be careful that
   we don't compare two strings as different because of gunk beyond
   the end of the strings...  */

L(endstring):
	and	rTMP,r7F7F,rWORD1
	beq	cr1,L(equal)
	add	rTMP,rTMP,r7F7F
	xor.	rBITDIF,rWORD1,rWORD2

	andc	rNEG,rNEG,rTMP
	blt	L(highbit)
	cntlzw	rBITDIF,rBITDIF
	cntlzw	rNEG,rNEG
	addi	rNEG,rNEG,7
	cmpw	cr1,rNEG,rBITDIF
	sub	rRTN,rWORD1,rWORD2
	blt	cr1,L(equal)
	srawi	rRTN,rRTN,31
	ori	rRTN,rRTN,1
	blr
L(equal):
	li	rRTN,0
	blr

L(different):
	lwzu	rWORD1,-4(rSTR1)
	xor.	rBITDIF,rWORD1,rWORD2
	sub	rRTN,rWORD1,rWORD2
	blt	L(highbit)
	srawi	rRTN,rRTN,31
	ori	rRTN,rRTN,1
	blr
L(highbit):
	srwi	rWORD2,rWORD2,24
	srwi	rWORD1,rWORD1,24
	sub	rRTN,rWORD1,rWORD2
	blr


/* Oh well. In this case, we just do a byte-by-byte comparison.  */
	.align	4
L(tail):
	and.	rTMP,rTMP,rNEG
	cmpw	cr1,rWORD1,rWORD2
	bne	L(endstring)
	addi	rSTR1,rSTR1,4
	bne	cr1,L(different)
	addi	rSTR2,rSTR2,4
	cmplwi	cr1,rN,0
L(unaligned):
	mtctr	rN
	ble	cr1,L(ux)
L(uz):
	lbz	rWORD1,0(rSTR1)
	lbz	rWORD2,0(rSTR2)
	.align	4
L(u1):
	cmpwi	cr1,rWORD1,0
	bdz	L(u4)
	cmpw	rWORD1,rWORD2
	beq	cr1,L(u4)
	lbzu	rWORD3,1(rSTR1)
	lbzu	rWORD4,1(rSTR2)
	bne	L(u4)
	cmpwi	cr1,rWORD3,0
	bdz	L(u3)
	cmpw	rWORD3,rWORD4
	beq	cr1,L(u3)
	lbzu	rWORD1,1(rSTR1)
	lbzu	rWORD2,1(rSTR2)
	bne	L(u3)
	cmpwi	cr1,rWORD1,0
	bdz	L(u4)
	cmpw	rWORD1,rWORD2
	beq	cr1,L(u4)
	lbzu	rWORD3,1(rSTR1)
	lbzu	rWORD4,1(rSTR2)
	bne	L(u4)
	cmpwi	cr1,rWORD3,0
	bdz	L(u3)
	cmpw	rWORD3,rWORD4
	beq	cr1,L(u3)
	lbzu	rWORD1,1(rSTR1)
	lbzu	rWORD2,1(rSTR2)
	beq	L(u1)

L(u3):  sub	rRTN,rWORD3,rWORD4
	blr
L(u4):	sub	rRTN,rWORD1,rWORD2
	blr
L(ux):
	li	rRTN,0
	blr
END (BP_SYM (strncmp))
libc_hidden_builtin_def (strncmp)
