1/* 2 * Copyright (C) Paul Mackerras 1997. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 * 9 * NOTE: this code runs in 32 bit mode and is packaged as ELF32. 10 */ 11 12#include <asm/ppc_asm.h> 13 14 .text 15 .globl strcpy 16strcpy: 17 addi r5,r3,-1 18 addi r4,r4,-1 191: lbzu r0,1(r4) 20 cmpwi 0,r0,0 21 stbu r0,1(r5) 22 bne 1b 23 blr 24 25 .globl strncpy 26strncpy: 27 cmpwi 0,r5,0 28 beqlr 29 mtctr r5 30 addi r6,r3,-1 31 addi r4,r4,-1 321: lbzu r0,1(r4) 33 cmpwi 0,r0,0 34 stbu r0,1(r6) 35 bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */ 36 blr 37 38 .globl strcat 39strcat: 40 addi r5,r3,-1 41 addi r4,r4,-1 421: lbzu r0,1(r5) 43 cmpwi 0,r0,0 44 bne 1b 45 addi r5,r5,-1 461: lbzu r0,1(r4) 47 cmpwi 0,r0,0 48 stbu r0,1(r5) 49 bne 1b 50 blr 51 52 .globl strcmp 53strcmp: 54 addi r5,r3,-1 55 addi r4,r4,-1 561: lbzu r3,1(r5) 57 cmpwi 1,r3,0 58 lbzu r0,1(r4) 59 subf. r3,r0,r3 60 beqlr 1 61 beq 1b 62 blr 63 64 .globl strlen 65strlen: 66 addi r4,r3,-1 671: lbzu r0,1(r4) 68 cmpwi 0,r0,0 69 bne 1b 70 subf r3,r3,r4 71 blr 72 73 .globl memset 74memset: 75 rlwimi r4,r4,8,16,23 76 rlwimi r4,r4,16,0,15 77 addi r6,r3,-4 78 cmplwi 0,r5,4 79 blt 7f 80 stwu r4,4(r6) 81 beqlr 82 andi. r0,r6,3 83 add r5,r0,r5 84 subf r6,r0,r6 85 rlwinm r0,r5,32-2,2,31 86 mtctr r0 87 bdz 6f 881: stwu r4,4(r6) 89 bdnz 1b 906: andi. r5,r5,3 917: cmpwi 0,r5,0 92 beqlr 93 mtctr r5 94 addi r6,r6,3 958: stbu r4,1(r6) 96 bdnz 8b 97 blr 98 99 .globl bcopy 100bcopy: 101 mr r6,r3 102 mr r3,r4 103 mr r4,r6 104 b memcpy 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 /* r0 = r5 >> 3 */ 115 addi r6,r3,-4 116 addi r4,r4,-4 117 beq 2f /* if less than 8 bytes to do */ 118 andi. r0,r6,3 /* get dest word aligned */ 119 mtctr r7 120 bne 5f 1211: lwz r7,4(r4) 122 lwzu r8,8(r4) 123 stw r7,4(r6) 124 stwu r8,8(r6) 125 bdnz 1b 126 andi. r5,r5,7 1272: cmplwi 0,r5,4 128 blt 3f 129 lwzu r0,4(r4) 130 addi r5,r5,-4 131 stwu r0,4(r6) 1323: cmpwi 0,r5,0 133 beqlr 134 mtctr r5 135 addi r4,r4,3 136 addi r6,r6,3 1374: lbzu r0,1(r4) 138 stbu r0,1(r6) 139 bdnz 4b 140 blr 1415: subfic r0,r0,4 142 mtctr r0 1436: lbz r7,4(r4) 144 addi r4,r4,1 145 stb r7,4(r6) 146 addi r6,r6,1 147 bdnz 6b 148 subf r5,r0,r5 149 rlwinm. r7,r5,32-3,3,31 150 beq 2b 151 mtctr r7 152 b 1b 153 154 .globl backwards_memcpy 155backwards_memcpy: 156 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 157 add r6,r3,r5 158 add r4,r4,r5 159 beq 2f 160 andi. r0,r6,3 161 mtctr r7 162 bne 5f 1631: lwz r7,-4(r4) 164 lwzu r8,-8(r4) 165 stw r7,-4(r6) 166 stwu r8,-8(r6) 167 bdnz 1b 168 andi. r5,r5,7 1692: cmplwi 0,r5,4 170 blt 3f 171 lwzu r0,-4(r4) 172 subi r5,r5,4 173 stwu r0,-4(r6) 1743: cmpwi 0,r5,0 175 beqlr 176 mtctr r5 1774: lbzu r0,-1(r4) 178 stbu r0,-1(r6) 179 bdnz 4b 180 blr 1815: mtctr r0 1826: lbzu r7,-1(r4) 183 stbu r7,-1(r6) 184 bdnz 6b 185 subf r5,r0,r5 186 rlwinm. r7,r5,32-3,3,31 187 beq 2b 188 mtctr r7 189 b 1b 190 191 .globl memcmp 192memcmp: 193 cmpwi 0,r5,0 194 blelr 195 mtctr r5 196 addi r6,r3,-1 197 addi r4,r4,-1 1981: lbzu r3,1(r6) 199 lbzu r0,1(r4) 200 subf. r3,r0,r3 201 bdnzt 2,1b 202 blr 203 204 205/* 206 * Flush the dcache and invalidate the icache for a range of addresses. 207 * 208 * flush_cache(addr, len) 209 */ 210 .global flush_cache 211flush_cache: 212 addi 4,4,0x1f /* len = (len + 0x1f) / 0x20 */ 213 rlwinm. 4,4,27,5,31 214 mtctr 4 215 beqlr 2161: dcbf 0,3 217 icbi 0,3 218 addi 3,3,0x20 219 bdnz 1b 220 sync 221 isync 222 blr 223 224

