1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * Copyright (C) Paul Mackerras 1997. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * NOTE: this code runs in 32 bit mode and is packaged as ELF32. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun#include "ppc_asm.h" 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun .text 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 strchr 49*4882a593Smuzhiyunstrchr: 50*4882a593Smuzhiyun addi r3,r3,-1 51*4882a593Smuzhiyun1: lbzu r0,1(r3) 52*4882a593Smuzhiyun cmpw 0,r0,r4 53*4882a593Smuzhiyun beqlr 54*4882a593Smuzhiyun cmpwi 0,r0,0 55*4882a593Smuzhiyun bne 1b 56*4882a593Smuzhiyun li r3,0 57*4882a593Smuzhiyun blr 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun .globl strcmp 60*4882a593Smuzhiyunstrcmp: 61*4882a593Smuzhiyun addi r5,r3,-1 62*4882a593Smuzhiyun addi r4,r4,-1 63*4882a593Smuzhiyun1: lbzu r3,1(r5) 64*4882a593Smuzhiyun cmpwi 1,r3,0 65*4882a593Smuzhiyun lbzu r0,1(r4) 66*4882a593Smuzhiyun subf. r3,r0,r3 67*4882a593Smuzhiyun beqlr 1 68*4882a593Smuzhiyun beq 1b 69*4882a593Smuzhiyun blr 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun .globl strncmp 72*4882a593Smuzhiyunstrncmp: 73*4882a593Smuzhiyun mtctr r5 74*4882a593Smuzhiyun addi r5,r3,-1 75*4882a593Smuzhiyun addi r4,r4,-1 76*4882a593Smuzhiyun1: lbzu r3,1(r5) 77*4882a593Smuzhiyun cmpwi 1,r3,0 78*4882a593Smuzhiyun lbzu r0,1(r4) 79*4882a593Smuzhiyun subf. r3,r0,r3 80*4882a593Smuzhiyun beqlr 1 81*4882a593Smuzhiyun bdnzt eq,1b 82*4882a593Smuzhiyun blr 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun .globl strlen 85*4882a593Smuzhiyunstrlen: 86*4882a593Smuzhiyun addi r4,r3,-1 87*4882a593Smuzhiyun1: lbzu r0,1(r4) 88*4882a593Smuzhiyun cmpwi 0,r0,0 89*4882a593Smuzhiyun bne 1b 90*4882a593Smuzhiyun subf r3,r3,r4 91*4882a593Smuzhiyun blr 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun .globl memset 94*4882a593Smuzhiyunmemset: 95*4882a593Smuzhiyun rlwimi r4,r4,8,16,23 96*4882a593Smuzhiyun rlwimi r4,r4,16,0,15 97*4882a593Smuzhiyun addi r6,r3,-4 98*4882a593Smuzhiyun cmplwi 0,r5,4 99*4882a593Smuzhiyun blt 7f 100*4882a593Smuzhiyun stwu r4,4(r6) 101*4882a593Smuzhiyun beqlr 102*4882a593Smuzhiyun andi. r0,r6,3 103*4882a593Smuzhiyun add r5,r0,r5 104*4882a593Smuzhiyun subf r6,r0,r6 105*4882a593Smuzhiyun rlwinm r0,r5,32-2,2,31 106*4882a593Smuzhiyun mtctr r0 107*4882a593Smuzhiyun bdz 6f 108*4882a593Smuzhiyun1: stwu r4,4(r6) 109*4882a593Smuzhiyun bdnz 1b 110*4882a593Smuzhiyun6: andi. r5,r5,3 111*4882a593Smuzhiyun7: cmpwi 0,r5,0 112*4882a593Smuzhiyun beqlr 113*4882a593Smuzhiyun mtctr r5 114*4882a593Smuzhiyun addi r6,r6,3 115*4882a593Smuzhiyun8: stbu r4,1(r6) 116*4882a593Smuzhiyun bdnz 8b 117*4882a593Smuzhiyun blr 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun .globl memmove 120*4882a593Smuzhiyunmemmove: 121*4882a593Smuzhiyun cmplw 0,r3,r4 122*4882a593Smuzhiyun bgt backwards_memcpy 123*4882a593Smuzhiyun /* fall through */ 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun .globl memcpy 126*4882a593Smuzhiyunmemcpy: 127*4882a593Smuzhiyun rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */ 128*4882a593Smuzhiyun addi r6,r3,-4 129*4882a593Smuzhiyun addi r4,r4,-4 130*4882a593Smuzhiyun beq 3f /* if less than 8 bytes to do */ 131*4882a593Smuzhiyun andi. r0,r6,3 /* get dest word aligned */ 132*4882a593Smuzhiyun mtctr r7 133*4882a593Smuzhiyun bne 5f 134*4882a593Smuzhiyun andi. r0,r4,3 /* check src word aligned too */ 135*4882a593Smuzhiyun bne 3f 136*4882a593Smuzhiyun1: lwz r7,4(r4) 137*4882a593Smuzhiyun lwzu r8,8(r4) 138*4882a593Smuzhiyun stw r7,4(r6) 139*4882a593Smuzhiyun stwu r8,8(r6) 140*4882a593Smuzhiyun bdnz 1b 141*4882a593Smuzhiyun andi. r5,r5,7 142*4882a593Smuzhiyun2: cmplwi 0,r5,4 143*4882a593Smuzhiyun blt 3f 144*4882a593Smuzhiyun lwzu r0,4(r4) 145*4882a593Smuzhiyun addi r5,r5,-4 146*4882a593Smuzhiyun stwu r0,4(r6) 147*4882a593Smuzhiyun3: cmpwi 0,r5,0 148*4882a593Smuzhiyun beqlr 149*4882a593Smuzhiyun mtctr r5 150*4882a593Smuzhiyun addi r4,r4,3 151*4882a593Smuzhiyun addi r6,r6,3 152*4882a593Smuzhiyun4: lbzu r0,1(r4) 153*4882a593Smuzhiyun stbu r0,1(r6) 154*4882a593Smuzhiyun bdnz 4b 155*4882a593Smuzhiyun blr 156*4882a593Smuzhiyun5: subfic r0,r0,4 157*4882a593Smuzhiyun cmpw cr1,r0,r5 158*4882a593Smuzhiyun add r7,r0,r4 159*4882a593Smuzhiyun andi. r7,r7,3 /* will source be word-aligned too? */ 160*4882a593Smuzhiyun ble cr1,3b 161*4882a593Smuzhiyun bne 3b /* do byte-by-byte if not */ 162*4882a593Smuzhiyun mtctr r0 163*4882a593Smuzhiyun6: lbz r7,4(r4) 164*4882a593Smuzhiyun addi r4,r4,1 165*4882a593Smuzhiyun stb r7,4(r6) 166*4882a593Smuzhiyun addi r6,r6,1 167*4882a593Smuzhiyun bdnz 6b 168*4882a593Smuzhiyun subf r5,r0,r5 169*4882a593Smuzhiyun rlwinm. r7,r5,32-3,3,31 170*4882a593Smuzhiyun beq 2b 171*4882a593Smuzhiyun mtctr r7 172*4882a593Smuzhiyun b 1b 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun .globl backwards_memcpy 175*4882a593Smuzhiyunbackwards_memcpy: 176*4882a593Smuzhiyun rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */ 177*4882a593Smuzhiyun add r6,r3,r5 178*4882a593Smuzhiyun add r4,r4,r5 179*4882a593Smuzhiyun beq 3f 180*4882a593Smuzhiyun andi. r0,r6,3 181*4882a593Smuzhiyun mtctr r7 182*4882a593Smuzhiyun bne 5f 183*4882a593Smuzhiyun andi. r0,r4,3 184*4882a593Smuzhiyun bne 3f 185*4882a593Smuzhiyun1: lwz r7,-4(r4) 186*4882a593Smuzhiyun lwzu r8,-8(r4) 187*4882a593Smuzhiyun stw r7,-4(r6) 188*4882a593Smuzhiyun stwu r8,-8(r6) 189*4882a593Smuzhiyun bdnz 1b 190*4882a593Smuzhiyun andi. r5,r5,7 191*4882a593Smuzhiyun2: cmplwi 0,r5,4 192*4882a593Smuzhiyun blt 3f 193*4882a593Smuzhiyun lwzu r0,-4(r4) 194*4882a593Smuzhiyun subi r5,r5,4 195*4882a593Smuzhiyun stwu r0,-4(r6) 196*4882a593Smuzhiyun3: cmpwi 0,r5,0 197*4882a593Smuzhiyun beqlr 198*4882a593Smuzhiyun mtctr r5 199*4882a593Smuzhiyun4: lbzu r0,-1(r4) 200*4882a593Smuzhiyun stbu r0,-1(r6) 201*4882a593Smuzhiyun bdnz 4b 202*4882a593Smuzhiyun blr 203*4882a593Smuzhiyun5: cmpw cr1,r0,r5 204*4882a593Smuzhiyun subf r7,r0,r4 205*4882a593Smuzhiyun andi. r7,r7,3 206*4882a593Smuzhiyun ble cr1,3b 207*4882a593Smuzhiyun bne 3b 208*4882a593Smuzhiyun mtctr r0 209*4882a593Smuzhiyun6: lbzu r7,-1(r4) 210*4882a593Smuzhiyun stbu r7,-1(r6) 211*4882a593Smuzhiyun bdnz 6b 212*4882a593Smuzhiyun subf r5,r0,r5 213*4882a593Smuzhiyun rlwinm. r7,r5,32-3,3,31 214*4882a593Smuzhiyun beq 2b 215*4882a593Smuzhiyun mtctr r7 216*4882a593Smuzhiyun b 1b 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun .globl memchr 219*4882a593Smuzhiyunmemchr: 220*4882a593Smuzhiyun cmpwi 0,r5,0 221*4882a593Smuzhiyun blelr 222*4882a593Smuzhiyun mtctr r5 223*4882a593Smuzhiyun addi r3,r3,-1 224*4882a593Smuzhiyun1: lbzu r0,1(r3) 225*4882a593Smuzhiyun cmpw r0,r4 226*4882a593Smuzhiyun beqlr 227*4882a593Smuzhiyun bdnz 1b 228*4882a593Smuzhiyun li r3,0 229*4882a593Smuzhiyun blr 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun .globl memcmp 232*4882a593Smuzhiyunmemcmp: 233*4882a593Smuzhiyun cmpwi 0,r5,0 234*4882a593Smuzhiyun ble 2f 235*4882a593Smuzhiyun mtctr r5 236*4882a593Smuzhiyun addi r6,r3,-1 237*4882a593Smuzhiyun addi r4,r4,-1 238*4882a593Smuzhiyun1: lbzu r3,1(r6) 239*4882a593Smuzhiyun lbzu r0,1(r4) 240*4882a593Smuzhiyun subf. r3,r0,r3 241*4882a593Smuzhiyun bdnzt 2,1b 242*4882a593Smuzhiyun blr 243*4882a593Smuzhiyun2: li r3,0 244*4882a593Smuzhiyun blr 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun/* 248*4882a593Smuzhiyun * Flush the dcache and invalidate the icache for a range of addresses. 249*4882a593Smuzhiyun * 250*4882a593Smuzhiyun * flush_cache(addr, len) 251*4882a593Smuzhiyun */ 252*4882a593Smuzhiyun .global flush_cache 253*4882a593Smuzhiyunflush_cache: 254*4882a593Smuzhiyun addi 4,4,0x1f /* len = (len + 0x1f) / 0x20 */ 255*4882a593Smuzhiyun rlwinm. 4,4,27,5,31 256*4882a593Smuzhiyun mtctr 4 257*4882a593Smuzhiyun beqlr 258*4882a593Smuzhiyun1: dcbf 0,3 259*4882a593Smuzhiyun icbi 0,3 260*4882a593Smuzhiyun addi 3,3,0x20 261*4882a593Smuzhiyun bdnz 1b 262*4882a593Smuzhiyun sync 263*4882a593Smuzhiyun isync 264*4882a593Smuzhiyun blr 265*4882a593Smuzhiyun 266