1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * String handling functions for PowerPC. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 1996 Paul Mackerras. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun#include <ppc_asm.tmpl> 9*4882a593Smuzhiyun#include <linux/errno.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun .globl strcpy 12*4882a593Smuzhiyunstrcpy: 13*4882a593Smuzhiyun addi r5,r3,-1 14*4882a593Smuzhiyun addi r4,r4,-1 15*4882a593Smuzhiyun1: lbzu r0,1(r4) 16*4882a593Smuzhiyun cmpwi 0,r0,0 17*4882a593Smuzhiyun stbu r0,1(r5) 18*4882a593Smuzhiyun bne 1b 19*4882a593Smuzhiyun blr 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun .globl strncpy 22*4882a593Smuzhiyunstrncpy: 23*4882a593Smuzhiyun cmpwi 0,r5,0 24*4882a593Smuzhiyun beqlr 25*4882a593Smuzhiyun mtctr r5 26*4882a593Smuzhiyun addi r6,r3,-1 27*4882a593Smuzhiyun addi r4,r4,-1 28*4882a593Smuzhiyun1: lbzu r0,1(r4) 29*4882a593Smuzhiyun cmpwi 0,r0,0 30*4882a593Smuzhiyun stbu r0,1(r6) 31*4882a593Smuzhiyun bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */ 32*4882a593Smuzhiyun blr 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun .globl strcat 35*4882a593Smuzhiyunstrcat: 36*4882a593Smuzhiyun addi r5,r3,-1 37*4882a593Smuzhiyun addi r4,r4,-1 38*4882a593Smuzhiyun1: lbzu r0,1(r5) 39*4882a593Smuzhiyun cmpwi 0,r0,0 40*4882a593Smuzhiyun bne 1b 41*4882a593Smuzhiyun addi r5,r5,-1 42*4882a593Smuzhiyun1: lbzu r0,1(r4) 43*4882a593Smuzhiyun cmpwi 0,r0,0 44*4882a593Smuzhiyun stbu r0,1(r5) 45*4882a593Smuzhiyun bne 1b 46*4882a593Smuzhiyun blr 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun .globl strcmp 49*4882a593Smuzhiyunstrcmp: 50*4882a593Smuzhiyun addi r5,r3,-1 51*4882a593Smuzhiyun addi r4,r4,-1 52*4882a593Smuzhiyun1: lbzu r3,1(r5) 53*4882a593Smuzhiyun cmpwi 1,r3,0 54*4882a593Smuzhiyun lbzu r0,1(r4) 55*4882a593Smuzhiyun subf. r3,r0,r3 56*4882a593Smuzhiyun beqlr 1 57*4882a593Smuzhiyun beq 1b 58*4882a593Smuzhiyun blr 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun .globl strlen 61*4882a593Smuzhiyunstrlen: 62*4882a593Smuzhiyun addi r4,r3,-1 63*4882a593Smuzhiyun1: lbzu r0,1(r4) 64*4882a593Smuzhiyun cmpwi 0,r0,0 65*4882a593Smuzhiyun bne 1b 66*4882a593Smuzhiyun subf r3,r3,r4 67*4882a593Smuzhiyun blr 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun .globl memset 70*4882a593Smuzhiyunmemset: 71*4882a593Smuzhiyun rlwimi r4,r4,8,16,23 72*4882a593Smuzhiyun rlwimi r4,r4,16,0,15 73*4882a593Smuzhiyun addi r6,r3,-4 74*4882a593Smuzhiyun cmplwi 0,r5,4 75*4882a593Smuzhiyun blt 7f 76*4882a593Smuzhiyun stwu r4,4(r6) 77*4882a593Smuzhiyun beqlr 78*4882a593Smuzhiyun andi. r0,r6,3 79*4882a593Smuzhiyun add r5,r0,r5 80*4882a593Smuzhiyun subf r6,r0,r6 81*4882a593Smuzhiyun rlwinm r0,r5,32-2,2,31 82*4882a593Smuzhiyun mtctr r0 83*4882a593Smuzhiyun bdz 6f 84*4882a593Smuzhiyun1: stwu r4,4(r6) 85*4882a593Smuzhiyun bdnz 1b 86*4882a593Smuzhiyun6: andi. r5,r5,3 87*4882a593Smuzhiyun7: cmpwi 0,r5,0 88*4882a593Smuzhiyun beqlr 89*4882a593Smuzhiyun mtctr r5 90*4882a593Smuzhiyun addi r6,r6,3 91*4882a593Smuzhiyun8: stbu r4,1(r6) 92*4882a593Smuzhiyun bdnz 8b 93*4882a593Smuzhiyun blr 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun .globl memmove 96*4882a593Smuzhiyunmemmove: 97*4882a593Smuzhiyun cmplw 0,r3,r4 98*4882a593Smuzhiyun bgt backwards_memcpy 99*4882a593Smuzhiyun /* fall through */ 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun .globl memcpy 102*4882a593Smuzhiyunmemcpy: 103*4882a593Smuzhiyun rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 104*4882a593Smuzhiyun addi r6,r3,-4 105*4882a593Smuzhiyun addi r4,r4,-4 106*4882a593Smuzhiyun beq 2f /* if less than 8 bytes to do */ 107*4882a593Smuzhiyun andi. r0,r6,3 /* get dest word aligned */ 108*4882a593Smuzhiyun mtctr r7 109*4882a593Smuzhiyun bne 5f 110*4882a593Smuzhiyun1: lwz r7,4(r4) 111*4882a593Smuzhiyun lwzu r8,8(r4) 112*4882a593Smuzhiyun stw r7,4(r6) 113*4882a593Smuzhiyun stwu r8,8(r6) 114*4882a593Smuzhiyun bdnz 1b 115*4882a593Smuzhiyun andi. r5,r5,7 116*4882a593Smuzhiyun2: cmplwi 0,r5,4 117*4882a593Smuzhiyun blt 3f 118*4882a593Smuzhiyun lwzu r0,4(r4) 119*4882a593Smuzhiyun addi r5,r5,-4 120*4882a593Smuzhiyun stwu r0,4(r6) 121*4882a593Smuzhiyun3: cmpwi 0,r5,0 122*4882a593Smuzhiyun beqlr 123*4882a593Smuzhiyun mtctr r5 124*4882a593Smuzhiyun addi r4,r4,3 125*4882a593Smuzhiyun addi r6,r6,3 126*4882a593Smuzhiyun4: lbzu r0,1(r4) 127*4882a593Smuzhiyun stbu r0,1(r6) 128*4882a593Smuzhiyun bdnz 4b 129*4882a593Smuzhiyun blr 130*4882a593Smuzhiyun5: subfic r0,r0,4 131*4882a593Smuzhiyun mtctr r0 132*4882a593Smuzhiyun6: lbz r7,4(r4) 133*4882a593Smuzhiyun addi r4,r4,1 134*4882a593Smuzhiyun stb r7,4(r6) 135*4882a593Smuzhiyun addi r6,r6,1 136*4882a593Smuzhiyun bdnz 6b 137*4882a593Smuzhiyun subf r5,r0,r5 138*4882a593Smuzhiyun rlwinm. r7,r5,32-3,3,31 139*4882a593Smuzhiyun beq 2b 140*4882a593Smuzhiyun mtctr r7 141*4882a593Smuzhiyun b 1b 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun .globl backwards_memcpy 144*4882a593Smuzhiyunbackwards_memcpy: 145*4882a593Smuzhiyun rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 146*4882a593Smuzhiyun add r6,r3,r5 147*4882a593Smuzhiyun add r4,r4,r5 148*4882a593Smuzhiyun beq 2f 149*4882a593Smuzhiyun andi. r0,r6,3 150*4882a593Smuzhiyun mtctr r7 151*4882a593Smuzhiyun bne 5f 152*4882a593Smuzhiyun1: lwz r7,-4(r4) 153*4882a593Smuzhiyun lwzu r8,-8(r4) 154*4882a593Smuzhiyun stw r7,-4(r6) 155*4882a593Smuzhiyun stwu r8,-8(r6) 156*4882a593Smuzhiyun bdnz 1b 157*4882a593Smuzhiyun andi. r5,r5,7 158*4882a593Smuzhiyun2: cmplwi 0,r5,4 159*4882a593Smuzhiyun blt 3f 160*4882a593Smuzhiyun lwzu r0,-4(r4) 161*4882a593Smuzhiyun subi r5,r5,4 162*4882a593Smuzhiyun stwu r0,-4(r6) 163*4882a593Smuzhiyun3: cmpwi 0,r5,0 164*4882a593Smuzhiyun beqlr 165*4882a593Smuzhiyun mtctr r5 166*4882a593Smuzhiyun4: lbzu r0,-1(r4) 167*4882a593Smuzhiyun stbu r0,-1(r6) 168*4882a593Smuzhiyun bdnz 4b 169*4882a593Smuzhiyun blr 170*4882a593Smuzhiyun5: mtctr r0 171*4882a593Smuzhiyun6: lbzu r7,-1(r4) 172*4882a593Smuzhiyun stbu r7,-1(r6) 173*4882a593Smuzhiyun bdnz 6b 174*4882a593Smuzhiyun subf r5,r0,r5 175*4882a593Smuzhiyun rlwinm. r7,r5,32-3,3,31 176*4882a593Smuzhiyun beq 2b 177*4882a593Smuzhiyun mtctr r7 178*4882a593Smuzhiyun b 1b 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun .globl memcmp 181*4882a593Smuzhiyunmemcmp: 182*4882a593Smuzhiyun cmpwi 0,r5,0 183*4882a593Smuzhiyun ble- 2f 184*4882a593Smuzhiyun mtctr r5 185*4882a593Smuzhiyun addi r6,r3,-1 186*4882a593Smuzhiyun addi r4,r4,-1 187*4882a593Smuzhiyun1: lbzu r3,1(r6) 188*4882a593Smuzhiyun lbzu r0,1(r4) 189*4882a593Smuzhiyun subf. r3,r0,r3 190*4882a593Smuzhiyun bdnzt 2,1b 191*4882a593Smuzhiyun blr 192*4882a593Smuzhiyun2: li r3,0 193*4882a593Smuzhiyun blr 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun .global memchr 196*4882a593Smuzhiyunmemchr: 197*4882a593Smuzhiyun cmpwi 0,r5,0 198*4882a593Smuzhiyun ble- 2f 199*4882a593Smuzhiyun mtctr r5 200*4882a593Smuzhiyun addi r3,r3,-1 201*4882a593Smuzhiyun1: lbzu r0,1(r3) 202*4882a593Smuzhiyun cmpw 0,r0,r4 203*4882a593Smuzhiyun bdnzf 2,1b 204*4882a593Smuzhiyun beqlr 205*4882a593Smuzhiyun2: li r3,0 206*4882a593Smuzhiyun blr 207