root/arch/powerpc/lib/string.S
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * String handling functions for PowerPC.
 *
 * Copyright (C) 1996 Paul Mackerras.
 */
#include <linux/export.h>
#include <asm/ppc_asm.h>
#include <asm/cache.h>

        .text
        
/* This clears out any unused part of the destination buffer,
   just as the libc version does.  -- paulus */
_GLOBAL(strncpy)
        PPC_LCMPI 0,r5,0
        beqlr
        mtctr   r5
        addi    r6,r3,-1
        addi    r4,r4,-1
        .balign IFETCH_ALIGN_BYTES
1:      lbzu    r0,1(r4)
        cmpwi   0,r0,0
        stbu    r0,1(r6)
        bdnzf   2,1b            /* dec ctr, branch if ctr != 0 && !cr0.eq */
        bnelr                   /* if we didn't hit a null char, we're done */
        mfctr   r5
        PPC_LCMPI 0,r5,0        /* any space left in destination buffer? */
        beqlr                   /* we know r0 == 0 here */
2:      stbu    r0,1(r6)        /* clear it out if so */
        bdnz    2b
        blr
EXPORT_SYMBOL(strncpy)

_GLOBAL(strncmp)
        PPC_LCMPI 0,r5,0
        beq-    2f
        mtctr   r5
        addi    r5,r3,-1
        addi    r4,r4,-1
        .balign IFETCH_ALIGN_BYTES
1:      lbzu    r3,1(r5)
        cmpwi   1,r3,0
        lbzu    r0,1(r4)
        subf.   r3,r0,r3
        beqlr   1
        bdnzt   eq,1b
        blr
2:      li      r3,0
        blr
EXPORT_SYMBOL(strncmp)

_GLOBAL(memchr)
        PPC_LCMPI 0,r5,0
        beq-    2f
        mtctr   r5
        addi    r3,r3,-1
        .balign IFETCH_ALIGN_BYTES
1:      lbzu    r0,1(r3)
        cmpw    0,r0,r4
        bdnzf   2,1b
        beqlr
2:      li      r3,0
        blr
EXPORT_SYMBOL(memchr)