1/* 2 * String handling functions for PowerPC. 3 * 4 * Copyright (C) 1996 Paul Mackerras. 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 9 * 2 of the License, or (at your option) any later version. 10 */ 11#include <ppc_asm.tmpl> 12#include <asm/errno.h> 13 14 .globl strcpy 15strcpy: 16 addi r5,r3,-1 17 addi r4,r4,-1 181: lbzu r0,1(r4) 19 cmpwi 0,r0,0 20 stbu r0,1(r5) 21 bne 1b 22 blr 23 24 .globl strncpy 25strncpy: 26 cmpwi 0,r5,0 27 beqlr 28 mtctr r5 29 addi r6,r3,-1 30 addi r4,r4,-1 311: lbzu r0,1(r4) 32 cmpwi 0,r0,0 33 stbu r0,1(r6) 34 bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */ 35 blr 36 37 .globl strcat 38strcat: 39 addi r5,r3,-1 40 addi r4,r4,-1 411: lbzu r0,1(r5) 42 cmpwi 0,r0,0 43 bne 1b 44 addi r5,r5,-1 451: lbzu r0,1(r4) 46 cmpwi 0,r0,0 47 stbu r0,1(r5) 48 bne 1b 49 blr 50 51 .globl strlen 52strlen: 53 addi r4,r3,-1 541: lbzu r0,1(r4) 55 cmpwi 0,r0,0 56 bne 1b 57 subf r3,r3,r4 58 blr 59 60 .globl memset 61memset: 62 rlwimi r4,r4,8,16,23 63 rlwimi r4,r4,16,0,15 64 addi r6,r3,-4 65 cmplwi 0,r5,4 66 blt 7f 67 stwu r4,4(r6) 68 beqlr 69 andi. r0,r6,3 70 add r5,r0,r5 71 subf r6,r0,r6 72 rlwinm r0,r5,32-2,2,31 73 mtctr r0 74 bdz 6f 751: stwu r4,4(r6) 76 bdnz 1b 776: andi. r5,r5,3 787: cmpwi 0,r5,0 79 beqlr 80 mtctr r5 81 addi r6,r6,3 828: stbu r4,1(r6) 83 bdnz 8b 84 blr 85 86 .globl bcopy 87bcopy: 88 mr r6,r3 89 mr r3,r4 90 mr r4,r6 91 b memcpy 92 93 .globl memmove 94memmove: 95 cmplw 0,r3,r4 96 bgt backwards_memcpy 97 /* fall through */ 98 99 .globl memcpy 100memcpy: 101 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 102 addi r6,r3,-4 103 addi r4,r4,-4 104 beq 2f /* if less than 8 bytes to do */ 105 andi. r0,r6,3 /* get dest word aligned */ 106 mtctr r7 107 bne 5f 1081: lwz r7,4(r4) 109 lwzu r8,8(r4) 110 stw r7,4(r6) 111 stwu r8,8(r6) 112 bdnz 1b 113 andi. r5,r5,7 1142: cmplwi 0,r5,4 115 blt 3f 116 lwzu r0,4(r4) 117 addi r5,r5,-4 118 stwu r0,4(r6) 1193: cmpwi 0,r5,0 120 beqlr 121 mtctr r5 122 addi r4,r4,3 123 addi r6,r6,3 1244: lbzu r0,1(r4) 125 stbu r0,1(r6) 126 bdnz 4b 127 blr 1285: subfic r0,r0,4 129 mtctr r0 1306: lbz r7,4(r4) 131 addi r4,r4,1 132 stb r7,4(r6) 133 addi r6,r6,1 134 bdnz 6b 135 subf r5,r0,r5 136 rlwinm. r7,r5,32-3,3,31 137 beq 2b 138 mtctr r7 139 b 1b 140 141 .globl backwards_memcpy 142backwards_memcpy: 143 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 144 add r6,r3,r5 145 add r4,r4,r5 146 beq 2f 147 andi. r0,r6,3 148 mtctr r7 149 bne 5f 1501: lwz r7,-4(r4) 151 lwzu r8,-8(r4) 152 stw r7,-4(r6) 153 stwu r8,-8(r6) 154 bdnz 1b 155 andi. r5,r5,7 1562: cmplwi 0,r5,4 157 blt 3f 158 lwzu r0,-4(r4) 159 subi r5,r5,4 160 stwu r0,-4(r6) 1613: cmpwi 0,r5,0 162 beqlr 163 mtctr r5 1644: lbzu r0,-1(r4) 165 stbu r0,-1(r6) 166 bdnz 4b 167 blr 1685: mtctr r0 1696: lbzu r7,-1(r4) 170 stbu r7,-1(r6) 171 bdnz 6b 172 subf r5,r0,r5 173 rlwinm. r7,r5,32-3,3,31 174 beq 2b 175 mtctr r7 176 b 1b 177 178 .globl memcmp 179memcmp: 180 cmpwi 0,r5,0 181 ble- 2f 182 mtctr r5 183 addi r6,r3,-1 184 addi r4,r4,-1 1851: lbzu r3,1(r6) 186 lbzu r0,1(r4) 187 subf. r3,r0,r3 188 bdnzt 2,1b 189 blr 1902: li r3,0 191 blr 192 193 .global memchr 194memchr: 195 cmpwi 0,r5,0 196 ble- 2f 197 mtctr r5 198 addi r3,r3,-1 1991: lbzu r0,1(r3) 200 cmpw 0,r0,r4 201 bdnzf 2,1b 202 beqlr 2032: li r3,0 204 blr 205