xref: /OK3568_Linux_fs/kernel/arch/powerpc/lib/string.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun * String handling functions for PowerPC.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 1996 Paul Mackerras.
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun#include <asm/ppc_asm.h>
8*4882a593Smuzhiyun#include <asm/export.h>
9*4882a593Smuzhiyun#include <asm/cache.h>
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun	.text
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun/* This clears out any unused part of the destination buffer,
14*4882a593Smuzhiyun   just as the libc version does.  -- paulus */
15*4882a593Smuzhiyun_GLOBAL(strncpy)
16*4882a593Smuzhiyun	PPC_LCMPI 0,r5,0
17*4882a593Smuzhiyun	beqlr
18*4882a593Smuzhiyun	mtctr	r5
19*4882a593Smuzhiyun	addi	r6,r3,-1
20*4882a593Smuzhiyun	addi	r4,r4,-1
21*4882a593Smuzhiyun	.balign IFETCH_ALIGN_BYTES
22*4882a593Smuzhiyun1:	lbzu	r0,1(r4)
23*4882a593Smuzhiyun	cmpwi	0,r0,0
24*4882a593Smuzhiyun	stbu	r0,1(r6)
25*4882a593Smuzhiyun	bdnzf	2,1b		/* dec ctr, branch if ctr != 0 && !cr0.eq */
26*4882a593Smuzhiyun	bnelr			/* if we didn't hit a null char, we're done */
27*4882a593Smuzhiyun	mfctr	r5
28*4882a593Smuzhiyun	PPC_LCMPI 0,r5,0	/* any space left in destination buffer? */
29*4882a593Smuzhiyun	beqlr			/* we know r0 == 0 here */
30*4882a593Smuzhiyun2:	stbu	r0,1(r6)	/* clear it out if so */
31*4882a593Smuzhiyun	bdnz	2b
32*4882a593Smuzhiyun	blr
33*4882a593SmuzhiyunEXPORT_SYMBOL(strncpy)
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun_GLOBAL(strncmp)
36*4882a593Smuzhiyun	PPC_LCMPI 0,r5,0
37*4882a593Smuzhiyun	beq-	2f
38*4882a593Smuzhiyun	mtctr	r5
39*4882a593Smuzhiyun	addi	r5,r3,-1
40*4882a593Smuzhiyun	addi	r4,r4,-1
41*4882a593Smuzhiyun	.balign IFETCH_ALIGN_BYTES
42*4882a593Smuzhiyun1:	lbzu	r3,1(r5)
43*4882a593Smuzhiyun	cmpwi	1,r3,0
44*4882a593Smuzhiyun	lbzu	r0,1(r4)
45*4882a593Smuzhiyun	subf.	r3,r0,r3
46*4882a593Smuzhiyun	beqlr	1
47*4882a593Smuzhiyun	bdnzt	eq,1b
48*4882a593Smuzhiyun	blr
49*4882a593Smuzhiyun2:	li	r3,0
50*4882a593Smuzhiyun	blr
51*4882a593SmuzhiyunEXPORT_SYMBOL(strncmp)
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun_GLOBAL(memchr)
54*4882a593Smuzhiyun	PPC_LCMPI 0,r5,0
55*4882a593Smuzhiyun	beq-	2f
56*4882a593Smuzhiyun	mtctr	r5
57*4882a593Smuzhiyun	addi	r3,r3,-1
58*4882a593Smuzhiyun	.balign IFETCH_ALIGN_BYTES
59*4882a593Smuzhiyun1:	lbzu	r0,1(r3)
60*4882a593Smuzhiyun	cmpw	0,r0,r4
61*4882a593Smuzhiyun	bdnzf	2,1b
62*4882a593Smuzhiyun	beqlr
63*4882a593Smuzhiyun2:	li	r3,0
64*4882a593Smuzhiyun	blr
65*4882a593SmuzhiyunEXPORT_SYMBOL(memchr)
66