1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Copyright (C) Paul Mackerras 1997. 4 * 5 * NOTE: this code runs in 32 bit mode and is packaged as ELF32. 6 */ 7 8#include "ppc_asm.h" 9 10 .text 11 .globl strcpy 12strcpy: 13 addi r5,r3,-1 14 addi r4,r4,-1 151: lbzu r0,1(r4) 16 cmpwi 0,r0,0 17 stbu r0,1(r5) 18 bne 1b 19 blr 20 21 .globl strcat 22strcat: 23 addi r5,r3,-1 24 addi r4,r4,-1 251: lbzu r0,1(r5) 26 cmpwi 0,r0,0 27 bne 1b 28 addi r5,r5,-1 291: lbzu r0,1(r4) 30 cmpwi 0,r0,0 31 stbu r0,1(r5) 32 bne 1b 33 blr 34 35 .globl strchr 36strchr: 37 addi r3,r3,-1 381: lbzu r0,1(r3) 39 cmpw 0,r0,r4 40 beqlr 41 cmpwi 0,r0,0 42 bne 1b 43 li r3,0 44 blr 45 46 .globl strcmp 47strcmp: 48 addi r5,r3,-1 49 addi r4,r4,-1 501: lbzu r3,1(r5) 51 cmpwi 1,r3,0 52 lbzu r0,1(r4) 53 subf. r3,r0,r3 54 beqlr 1 55 beq 1b 56 blr 57 58 .globl strncmp 59strncmp: 60 mtctr r5 61 addi r5,r3,-1 62 addi r4,r4,-1 631: lbzu r3,1(r5) 64 cmpwi 1,r3,0 65 lbzu r0,1(r4) 66 subf. r3,r0,r3 67 beqlr 1 68 bdnzt eq,1b 69 blr 70 71 .globl strlen 72strlen: 73 addi r4,r3,-1 741: lbzu r0,1(r4) 75 cmpwi 0,r0,0 76 bne 1b 77 subf r3,r3,r4 78 blr 79 80 .globl memset 81memset: 82 rlwimi r4,r4,8,16,23 83 rlwimi r4,r4,16,0,15 84 addi r6,r3,-4 85 cmplwi 0,r5,4 86 blt 7f 87 stwu r4,4(r6) 88 beqlr 89 andi. r0,r6,3 90 add r5,r0,r5 91 subf r6,r0,r6 92 rlwinm r0,r5,32-2,2,31 93 mtctr r0 94 bdz 6f 951: stwu r4,4(r6) 96 bdnz 1b 976: andi. r5,r5,3 987: cmpwi 0,r5,0 99 beqlr 100 mtctr r5 101 addi r6,r6,3 1028: stbu r4,1(r6) 103 bdnz 8b 104 blr 105 106 .globl memmove 107memmove: 108 cmplw 0,r3,r4 109 bgt backwards_memcpy 110 /* fall through */ 111 112 .globl memcpy 113memcpy: 114 rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */ 115 addi r6,r3,-4 116 addi r4,r4,-4 117 beq 3f /* if less than 8 bytes to do */ 118 andi. r0,r6,3 /* get dest word aligned */ 119 mtctr r7 120 bne 5f 121 andi. r0,r4,3 /* check src word aligned too */ 122 bne 3f 1231: lwz r7,4(r4) 124 lwzu r8,8(r4) 125 stw r7,4(r6) 126 stwu r8,8(r6) 127 bdnz 1b 128 andi. r5,r5,7 1292: cmplwi 0,r5,4 130 blt 3f 131 lwzu r0,4(r4) 132 addi r5,r5,-4 133 stwu r0,4(r6) 1343: cmpwi 0,r5,0 135 beqlr 136 mtctr r5 137 addi r4,r4,3 138 addi r6,r6,3 1394: lbzu r0,1(r4) 140 stbu r0,1(r6) 141 bdnz 4b 142 blr 1435: subfic r0,r0,4 144 cmpw cr1,r0,r5 145 add r7,r0,r4 146 andi. r7,r7,3 /* will source be word-aligned too? */ 147 ble cr1,3b 148 bne 3b /* do byte-by-byte if not */ 149 mtctr r0 1506: lbz r7,4(r4) 151 addi r4,r4,1 152 stb r7,4(r6) 153 addi r6,r6,1 154 bdnz 6b 155 subf r5,r0,r5 156 rlwinm. r7,r5,32-3,3,31 157 beq 2b 158 mtctr r7 159 b 1b 160 161 .globl backwards_memcpy 162backwards_memcpy: 163 rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */ 164 add r6,r3,r5 165 add r4,r4,r5 166 beq 3f 167 andi. r0,r6,3 168 mtctr r7 169 bne 5f 170 andi. r0,r4,3 171 bne 3f 1721: lwz r7,-4(r4) 173 lwzu r8,-8(r4) 174 stw r7,-4(r6) 175 stwu r8,-8(r6) 176 bdnz 1b 177 andi. r5,r5,7 1782: cmplwi 0,r5,4 179 blt 3f 180 lwzu r0,-4(r4) 181 subi r5,r5,4 182 stwu r0,-4(r6) 1833: cmpwi 0,r5,0 184 beqlr 185 mtctr r5 1864: lbzu r0,-1(r4) 187 stbu r0,-1(r6) 188 bdnz 4b 189 blr 1905: cmpw cr1,r0,r5 191 subf r7,r0,r4 192 andi. r7,r7,3 193 ble cr1,3b 194 bne 3b 195 mtctr r0 1966: lbzu r7,-1(r4) 197 stbu r7,-1(r6) 198 bdnz 6b 199 subf r5,r0,r5 200 rlwinm. r7,r5,32-3,3,31 201 beq 2b 202 mtctr r7 203 b 1b 204 205 .globl memchr 206memchr: 207 cmpwi 0,r5,0 208 blelr 209 mtctr r5 210 addi r3,r3,-1 2111: lbzu r0,1(r3) 212 cmpw r0,r4 213 beqlr 214 bdnz 1b 215 li r3,0 216 blr 217 218 .globl memcmp 219memcmp: 220 cmpwi 0,r5,0 221 ble 2f 222 mtctr r5 223 addi r6,r3,-1 224 addi r4,r4,-1 2251: lbzu r3,1(r6) 226 lbzu r0,1(r4) 227 subf. r3,r0,r3 228 bdnzt 2,1b 229 blr 2302: li r3,0 231 blr 232 233 234/* 235 * Flush the dcache and invalidate the icache for a range of addresses. 236 * 237 * flush_cache(addr, len) 238 */ 239 .global flush_cache 240flush_cache: 241 addi 4,4,0x1f /* len = (len + 0x1f) / 0x20 */ 242 rlwinm. 4,4,27,5,31 243 mtctr 4 244 beqlr 2451: dcbf 0,3 246 icbi 0,3 247 addi 3,3,0x20 248 bdnz 1b 249 sync 250 isync 251 blr 252 253