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

source code of linux/arch/powerpc/lib/string.S