xref: /linux-6.15/arch/powerpc/lib/string.S (revision 39326182)
12874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */
214cf11afSPaul Mackerras/*
314cf11afSPaul Mackerras * String handling functions for PowerPC.
414cf11afSPaul Mackerras *
514cf11afSPaul Mackerras * Copyright (C) 1996 Paul Mackerras.
614cf11afSPaul Mackerras */
7*39326182SMasahiro Yamada#include <linux/export.h>
814cf11afSPaul Mackerras#include <asm/ppc_asm.h>
91128bb78SChristophe Leroy#include <asm/cache.h>
1014cf11afSPaul Mackerras
1114cf11afSPaul Mackerras	.text
1214cf11afSPaul Mackerras
1314cf11afSPaul Mackerras/* This clears out any unused part of the destination buffer,
1414cf11afSPaul Mackerras   just as the libc version does.  -- paulus */
1514cf11afSPaul Mackerras_GLOBAL(strncpy)
16ca5d0674SAndreas Schwab	PPC_LCMPI 0,r5,0
1714cf11afSPaul Mackerras	beqlr
1814cf11afSPaul Mackerras	mtctr	r5
1914cf11afSPaul Mackerras	addi	r6,r3,-1
2014cf11afSPaul Mackerras	addi	r4,r4,-1
211128bb78SChristophe Leroy	.balign IFETCH_ALIGN_BYTES
2214cf11afSPaul Mackerras1:	lbzu	r0,1(r4)
2314cf11afSPaul Mackerras	cmpwi	0,r0,0
2414cf11afSPaul Mackerras	stbu	r0,1(r6)
2514cf11afSPaul Mackerras	bdnzf	2,1b		/* dec ctr, branch if ctr != 0 && !cr0.eq */
2614cf11afSPaul Mackerras	bnelr			/* if we didn't hit a null char, we're done */
2714cf11afSPaul Mackerras	mfctr	r5
28ca5d0674SAndreas Schwab	PPC_LCMPI 0,r5,0	/* any space left in destination buffer? */
2914cf11afSPaul Mackerras	beqlr			/* we know r0 == 0 here */
3014cf11afSPaul Mackerras2:	stbu	r0,1(r6)	/* clear it out if so */
3114cf11afSPaul Mackerras	bdnz	2b
3214cf11afSPaul Mackerras	blr
339445aa1aSAl ViroEXPORT_SYMBOL(strncpy)
3414cf11afSPaul Mackerras
350119536cSSteven Rostedt_GLOBAL(strncmp)
36ca5d0674SAndreas Schwab	PPC_LCMPI 0,r5,0
37ca5d0674SAndreas Schwab	beq-	2f
380119536cSSteven Rostedt	mtctr	r5
390119536cSSteven Rostedt	addi	r5,r3,-1
400119536cSSteven Rostedt	addi	r4,r4,-1
411128bb78SChristophe Leroy	.balign IFETCH_ALIGN_BYTES
420119536cSSteven Rostedt1:	lbzu	r3,1(r5)
430119536cSSteven Rostedt	cmpwi	1,r3,0
440119536cSSteven Rostedt	lbzu	r0,1(r4)
450119536cSSteven Rostedt	subf.	r3,r0,r3
460119536cSSteven Rostedt	beqlr	1
470119536cSSteven Rostedt	bdnzt	eq,1b
480119536cSSteven Rostedt	blr
49637a9902SJeff Mahoney2:	li	r3,0
50637a9902SJeff Mahoney	blr
519445aa1aSAl ViroEXPORT_SYMBOL(strncmp)
520119536cSSteven Rostedt
5314cf11afSPaul Mackerras_GLOBAL(memchr)
54ca5d0674SAndreas Schwab	PPC_LCMPI 0,r5,0
55ca5d0674SAndreas Schwab	beq-	2f
5614cf11afSPaul Mackerras	mtctr	r5
5714cf11afSPaul Mackerras	addi	r3,r3,-1
581128bb78SChristophe Leroy	.balign IFETCH_ALIGN_BYTES
5914cf11afSPaul Mackerras1:	lbzu	r0,1(r3)
6014cf11afSPaul Mackerras	cmpw	0,r0,r4
6114cf11afSPaul Mackerras	bdnzf	2,1b
6214cf11afSPaul Mackerras	beqlr
6314cf11afSPaul Mackerras2:	li	r3,0
6414cf11afSPaul Mackerras	blr
659445aa1aSAl ViroEXPORT_SYMBOL(memchr)
66