1/* 2 * String handling functions for PowerPC. 3 * 4 * Copyright (C) 1996 Paul Mackerras. 5 * 6 * SPDX-License-Identifier: GPL-2.0+ 7 */ 8#include <ppc_asm.tmpl> 9#include <linux/errno.h> 10 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 strncpy 22strncpy: 23 cmpwi 0,r5,0 24 beqlr 25 mtctr r5 26 addi r6,r3,-1 27 addi r4,r4,-1 281: lbzu r0,1(r4) 29 cmpwi 0,r0,0 30 stbu r0,1(r6) 31 bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */ 32 blr 33 34 .globl strcat 35strcat: 36 addi r5,r3,-1 37 addi r4,r4,-1 381: lbzu r0,1(r5) 39 cmpwi 0,r0,0 40 bne 1b 41 addi r5,r5,-1 421: lbzu r0,1(r4) 43 cmpwi 0,r0,0 44 stbu r0,1(r5) 45 bne 1b 46 blr 47 48 .globl strcmp 49strcmp: 50 addi r5,r3,-1 51 addi r4,r4,-1 521: lbzu r3,1(r5) 53 cmpwi 1,r3,0 54 lbzu r0,1(r4) 55 subf. r3,r0,r3 56 beqlr 1 57 beq 1b 58 blr 59 60 .globl strlen 61strlen: 62 addi r4,r3,-1 631: lbzu r0,1(r4) 64 cmpwi 0,r0,0 65 bne 1b 66 subf r3,r3,r4 67 blr 68 69 .globl memset 70memset: 71 rlwimi r4,r4,8,16,23 72 rlwimi r4,r4,16,0,15 73 addi r6,r3,-4 74 cmplwi 0,r5,4 75 blt 7f 76 stwu r4,4(r6) 77 beqlr 78 andi. r0,r6,3 79 add r5,r0,r5 80 subf r6,r0,r6 81 rlwinm r0,r5,32-2,2,31 82 mtctr r0 83 bdz 6f 841: stwu r4,4(r6) 85 bdnz 1b 866: andi. r5,r5,3 877: cmpwi 0,r5,0 88 beqlr 89 mtctr r5 90 addi r6,r6,3 918: stbu r4,1(r6) 92 bdnz 8b 93 blr 94 95 .globl memmove 96memmove: 97 cmplw 0,r3,r4 98 bgt backwards_memcpy 99 /* fall through */ 100 101 .globl memcpy 102memcpy: 103 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 104 addi r6,r3,-4 105 addi r4,r4,-4 106 beq 2f /* if less than 8 bytes to do */ 107 andi. r0,r6,3 /* get dest word aligned */ 108 mtctr r7 109 bne 5f 1101: lwz r7,4(r4) 111 lwzu r8,8(r4) 112 stw r7,4(r6) 113 stwu r8,8(r6) 114 bdnz 1b 115 andi. r5,r5,7 1162: cmplwi 0,r5,4 117 blt 3f 118 lwzu r0,4(r4) 119 addi r5,r5,-4 120 stwu r0,4(r6) 1213: cmpwi 0,r5,0 122 beqlr 123 mtctr r5 124 addi r4,r4,3 125 addi r6,r6,3 1264: lbzu r0,1(r4) 127 stbu r0,1(r6) 128 bdnz 4b 129 blr 1305: subfic r0,r0,4 131 mtctr r0 1326: lbz r7,4(r4) 133 addi r4,r4,1 134 stb r7,4(r6) 135 addi r6,r6,1 136 bdnz 6b 137 subf r5,r0,r5 138 rlwinm. r7,r5,32-3,3,31 139 beq 2b 140 mtctr r7 141 b 1b 142 143 .globl backwards_memcpy 144backwards_memcpy: 145 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 146 add r6,r3,r5 147 add r4,r4,r5 148 beq 2f 149 andi. r0,r6,3 150 mtctr r7 151 bne 5f 1521: lwz r7,-4(r4) 153 lwzu r8,-8(r4) 154 stw r7,-4(r6) 155 stwu r8,-8(r6) 156 bdnz 1b 157 andi. r5,r5,7 1582: cmplwi 0,r5,4 159 blt 3f 160 lwzu r0,-4(r4) 161 subi r5,r5,4 162 stwu r0,-4(r6) 1633: cmpwi 0,r5,0 164 beqlr 165 mtctr r5 1664: lbzu r0,-1(r4) 167 stbu r0,-1(r6) 168 bdnz 4b 169 blr 1705: mtctr r0 1716: lbzu r7,-1(r4) 172 stbu r7,-1(r6) 173 bdnz 6b 174 subf r5,r0,r5 175 rlwinm. r7,r5,32-3,3,31 176 beq 2b 177 mtctr r7 178 b 1b 179 180 .globl memcmp 181memcmp: 182 cmpwi 0,r5,0 183 ble- 2f 184 mtctr r5 185 addi r6,r3,-1 186 addi r4,r4,-1 1871: lbzu r3,1(r6) 188 lbzu r0,1(r4) 189 subf. r3,r0,r3 190 bdnzt 2,1b 191 blr 1922: li r3,0 193 blr 194 195 .global memchr 196memchr: 197 cmpwi 0,r5,0 198 ble- 2f 199 mtctr r5 200 addi r3,r3,-1 2011: lbzu r0,1(r3) 202 cmpw 0,r0,r4 203 bdnzf 2,1b 204 beqlr 2052: li r3,0 206 blr 207