1*a47a12beSStefan Roese/* 2*a47a12beSStefan Roese * String handling functions for PowerPC. 3*a47a12beSStefan Roese * 4*a47a12beSStefan Roese * Copyright (C) 1996 Paul Mackerras. 5*a47a12beSStefan Roese * 6*a47a12beSStefan Roese * This program is free software; you can redistribute it and/or 7*a47a12beSStefan Roese * modify it under the terms of the GNU General Public License 8*a47a12beSStefan Roese * as published by the Free Software Foundation; either version 9*a47a12beSStefan Roese * 2 of the License, or (at your option) any later version. 10*a47a12beSStefan Roese */ 11*a47a12beSStefan Roese#include <ppc_asm.tmpl> 12*a47a12beSStefan Roese#include <asm/errno.h> 13*a47a12beSStefan Roese 14*a47a12beSStefan Roese .globl strcpy 15*a47a12beSStefan Roesestrcpy: 16*a47a12beSStefan Roese addi r5,r3,-1 17*a47a12beSStefan Roese addi r4,r4,-1 18*a47a12beSStefan Roese1: lbzu r0,1(r4) 19*a47a12beSStefan Roese cmpwi 0,r0,0 20*a47a12beSStefan Roese stbu r0,1(r5) 21*a47a12beSStefan Roese bne 1b 22*a47a12beSStefan Roese blr 23*a47a12beSStefan Roese 24*a47a12beSStefan Roese .globl strncpy 25*a47a12beSStefan Roesestrncpy: 26*a47a12beSStefan Roese cmpwi 0,r5,0 27*a47a12beSStefan Roese beqlr 28*a47a12beSStefan Roese mtctr r5 29*a47a12beSStefan Roese addi r6,r3,-1 30*a47a12beSStefan Roese addi r4,r4,-1 31*a47a12beSStefan Roese1: lbzu r0,1(r4) 32*a47a12beSStefan Roese cmpwi 0,r0,0 33*a47a12beSStefan Roese stbu r0,1(r6) 34*a47a12beSStefan Roese bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */ 35*a47a12beSStefan Roese blr 36*a47a12beSStefan Roese 37*a47a12beSStefan Roese .globl strcat 38*a47a12beSStefan Roesestrcat: 39*a47a12beSStefan Roese addi r5,r3,-1 40*a47a12beSStefan Roese addi r4,r4,-1 41*a47a12beSStefan Roese1: lbzu r0,1(r5) 42*a47a12beSStefan Roese cmpwi 0,r0,0 43*a47a12beSStefan Roese bne 1b 44*a47a12beSStefan Roese addi r5,r5,-1 45*a47a12beSStefan Roese1: lbzu r0,1(r4) 46*a47a12beSStefan Roese cmpwi 0,r0,0 47*a47a12beSStefan Roese stbu r0,1(r5) 48*a47a12beSStefan Roese bne 1b 49*a47a12beSStefan Roese blr 50*a47a12beSStefan Roese 51*a47a12beSStefan Roese .globl strcmp 52*a47a12beSStefan Roesestrcmp: 53*a47a12beSStefan Roese addi r5,r3,-1 54*a47a12beSStefan Roese addi r4,r4,-1 55*a47a12beSStefan Roese1: lbzu r3,1(r5) 56*a47a12beSStefan Roese cmpwi 1,r3,0 57*a47a12beSStefan Roese lbzu r0,1(r4) 58*a47a12beSStefan Roese subf. r3,r0,r3 59*a47a12beSStefan Roese beqlr 1 60*a47a12beSStefan Roese beq 1b 61*a47a12beSStefan Roese blr 62*a47a12beSStefan Roese 63*a47a12beSStefan Roese .globl strlen 64*a47a12beSStefan Roesestrlen: 65*a47a12beSStefan Roese addi r4,r3,-1 66*a47a12beSStefan Roese1: lbzu r0,1(r4) 67*a47a12beSStefan Roese cmpwi 0,r0,0 68*a47a12beSStefan Roese bne 1b 69*a47a12beSStefan Roese subf r3,r3,r4 70*a47a12beSStefan Roese blr 71*a47a12beSStefan Roese 72*a47a12beSStefan Roese .globl memset 73*a47a12beSStefan Roesememset: 74*a47a12beSStefan Roese rlwimi r4,r4,8,16,23 75*a47a12beSStefan Roese rlwimi r4,r4,16,0,15 76*a47a12beSStefan Roese addi r6,r3,-4 77*a47a12beSStefan Roese cmplwi 0,r5,4 78*a47a12beSStefan Roese blt 7f 79*a47a12beSStefan Roese stwu r4,4(r6) 80*a47a12beSStefan Roese beqlr 81*a47a12beSStefan Roese andi. r0,r6,3 82*a47a12beSStefan Roese add r5,r0,r5 83*a47a12beSStefan Roese subf r6,r0,r6 84*a47a12beSStefan Roese rlwinm r0,r5,32-2,2,31 85*a47a12beSStefan Roese mtctr r0 86*a47a12beSStefan Roese bdz 6f 87*a47a12beSStefan Roese1: stwu r4,4(r6) 88*a47a12beSStefan Roese bdnz 1b 89*a47a12beSStefan Roese6: andi. r5,r5,3 90*a47a12beSStefan Roese7: cmpwi 0,r5,0 91*a47a12beSStefan Roese beqlr 92*a47a12beSStefan Roese mtctr r5 93*a47a12beSStefan Roese addi r6,r6,3 94*a47a12beSStefan Roese8: stbu r4,1(r6) 95*a47a12beSStefan Roese bdnz 8b 96*a47a12beSStefan Roese blr 97*a47a12beSStefan Roese 98*a47a12beSStefan Roese .globl bcopy 99*a47a12beSStefan Roesebcopy: 100*a47a12beSStefan Roese mr r6,r3 101*a47a12beSStefan Roese mr r3,r4 102*a47a12beSStefan Roese mr r4,r6 103*a47a12beSStefan Roese b memcpy 104*a47a12beSStefan Roese 105*a47a12beSStefan Roese .globl memmove 106*a47a12beSStefan Roesememmove: 107*a47a12beSStefan Roese cmplw 0,r3,r4 108*a47a12beSStefan Roese bgt backwards_memcpy 109*a47a12beSStefan Roese /* fall through */ 110*a47a12beSStefan Roese 111*a47a12beSStefan Roese .globl memcpy 112*a47a12beSStefan Roesememcpy: 113*a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 114*a47a12beSStefan Roese addi r6,r3,-4 115*a47a12beSStefan Roese addi r4,r4,-4 116*a47a12beSStefan Roese beq 2f /* if less than 8 bytes to do */ 117*a47a12beSStefan Roese andi. r0,r6,3 /* get dest word aligned */ 118*a47a12beSStefan Roese mtctr r7 119*a47a12beSStefan Roese bne 5f 120*a47a12beSStefan Roese1: lwz r7,4(r4) 121*a47a12beSStefan Roese lwzu r8,8(r4) 122*a47a12beSStefan Roese stw r7,4(r6) 123*a47a12beSStefan Roese stwu r8,8(r6) 124*a47a12beSStefan Roese bdnz 1b 125*a47a12beSStefan Roese andi. r5,r5,7 126*a47a12beSStefan Roese2: cmplwi 0,r5,4 127*a47a12beSStefan Roese blt 3f 128*a47a12beSStefan Roese lwzu r0,4(r4) 129*a47a12beSStefan Roese addi r5,r5,-4 130*a47a12beSStefan Roese stwu r0,4(r6) 131*a47a12beSStefan Roese3: cmpwi 0,r5,0 132*a47a12beSStefan Roese beqlr 133*a47a12beSStefan Roese mtctr r5 134*a47a12beSStefan Roese addi r4,r4,3 135*a47a12beSStefan Roese addi r6,r6,3 136*a47a12beSStefan Roese4: lbzu r0,1(r4) 137*a47a12beSStefan Roese stbu r0,1(r6) 138*a47a12beSStefan Roese bdnz 4b 139*a47a12beSStefan Roese blr 140*a47a12beSStefan Roese5: subfic r0,r0,4 141*a47a12beSStefan Roese mtctr r0 142*a47a12beSStefan Roese6: lbz r7,4(r4) 143*a47a12beSStefan Roese addi r4,r4,1 144*a47a12beSStefan Roese stb r7,4(r6) 145*a47a12beSStefan Roese addi r6,r6,1 146*a47a12beSStefan Roese bdnz 6b 147*a47a12beSStefan Roese subf r5,r0,r5 148*a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 149*a47a12beSStefan Roese beq 2b 150*a47a12beSStefan Roese mtctr r7 151*a47a12beSStefan Roese b 1b 152*a47a12beSStefan Roese 153*a47a12beSStefan Roese .globl backwards_memcpy 154*a47a12beSStefan Roesebackwards_memcpy: 155*a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 156*a47a12beSStefan Roese add r6,r3,r5 157*a47a12beSStefan Roese add r4,r4,r5 158*a47a12beSStefan Roese beq 2f 159*a47a12beSStefan Roese andi. r0,r6,3 160*a47a12beSStefan Roese mtctr r7 161*a47a12beSStefan Roese bne 5f 162*a47a12beSStefan Roese1: lwz r7,-4(r4) 163*a47a12beSStefan Roese lwzu r8,-8(r4) 164*a47a12beSStefan Roese stw r7,-4(r6) 165*a47a12beSStefan Roese stwu r8,-8(r6) 166*a47a12beSStefan Roese bdnz 1b 167*a47a12beSStefan Roese andi. r5,r5,7 168*a47a12beSStefan Roese2: cmplwi 0,r5,4 169*a47a12beSStefan Roese blt 3f 170*a47a12beSStefan Roese lwzu r0,-4(r4) 171*a47a12beSStefan Roese subi r5,r5,4 172*a47a12beSStefan Roese stwu r0,-4(r6) 173*a47a12beSStefan Roese3: cmpwi 0,r5,0 174*a47a12beSStefan Roese beqlr 175*a47a12beSStefan Roese mtctr r5 176*a47a12beSStefan Roese4: lbzu r0,-1(r4) 177*a47a12beSStefan Roese stbu r0,-1(r6) 178*a47a12beSStefan Roese bdnz 4b 179*a47a12beSStefan Roese blr 180*a47a12beSStefan Roese5: mtctr r0 181*a47a12beSStefan Roese6: lbzu r7,-1(r4) 182*a47a12beSStefan Roese stbu r7,-1(r6) 183*a47a12beSStefan Roese bdnz 6b 184*a47a12beSStefan Roese subf r5,r0,r5 185*a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 186*a47a12beSStefan Roese beq 2b 187*a47a12beSStefan Roese mtctr r7 188*a47a12beSStefan Roese b 1b 189*a47a12beSStefan Roese 190*a47a12beSStefan Roese .globl memcmp 191*a47a12beSStefan Roesememcmp: 192*a47a12beSStefan Roese cmpwi 0,r5,0 193*a47a12beSStefan Roese ble- 2f 194*a47a12beSStefan Roese mtctr r5 195*a47a12beSStefan Roese addi r6,r3,-1 196*a47a12beSStefan Roese addi r4,r4,-1 197*a47a12beSStefan Roese1: lbzu r3,1(r6) 198*a47a12beSStefan Roese lbzu r0,1(r4) 199*a47a12beSStefan Roese subf. r3,r0,r3 200*a47a12beSStefan Roese bdnzt 2,1b 201*a47a12beSStefan Roese blr 202*a47a12beSStefan Roese2: li r3,0 203*a47a12beSStefan Roese blr 204*a47a12beSStefan Roese 205*a47a12beSStefan Roese .global memchr 206*a47a12beSStefan Roesememchr: 207*a47a12beSStefan Roese cmpwi 0,r5,0 208*a47a12beSStefan Roese ble- 2f 209*a47a12beSStefan Roese mtctr r5 210*a47a12beSStefan Roese addi r3,r3,-1 211*a47a12beSStefan Roese1: lbzu r0,1(r3) 212*a47a12beSStefan Roese cmpw 0,r0,r4 213*a47a12beSStefan Roese bdnzf 2,1b 214*a47a12beSStefan Roese beqlr 215*a47a12beSStefan Roese2: li r3,0 216*a47a12beSStefan Roese blr 217