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