1*83d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0+ */ 2a47a12beSStefan Roese/* 3a47a12beSStefan Roese * String handling functions for PowerPC. 4a47a12beSStefan Roese * 5a47a12beSStefan Roese * Copyright (C) 1996 Paul Mackerras. 6a47a12beSStefan Roese */ 7a47a12beSStefan Roese#include <ppc_asm.tmpl> 81221ce45SMasahiro Yamada#include <linux/errno.h> 9a47a12beSStefan Roese 10a47a12beSStefan Roese .globl strcpy 11a47a12beSStefan Roesestrcpy: 12a47a12beSStefan Roese addi r5,r3,-1 13a47a12beSStefan Roese addi r4,r4,-1 14a47a12beSStefan Roese1: lbzu r0,1(r4) 15a47a12beSStefan Roese cmpwi 0,r0,0 16a47a12beSStefan Roese stbu r0,1(r5) 17a47a12beSStefan Roese bne 1b 18a47a12beSStefan Roese blr 19a47a12beSStefan Roese 20a47a12beSStefan Roese .globl strncpy 21a47a12beSStefan Roesestrncpy: 22a47a12beSStefan Roese cmpwi 0,r5,0 23a47a12beSStefan Roese beqlr 24a47a12beSStefan Roese mtctr r5 25a47a12beSStefan Roese addi r6,r3,-1 26a47a12beSStefan Roese addi r4,r4,-1 27a47a12beSStefan Roese1: lbzu r0,1(r4) 28a47a12beSStefan Roese cmpwi 0,r0,0 29a47a12beSStefan Roese stbu r0,1(r6) 30a47a12beSStefan Roese bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */ 31a47a12beSStefan Roese blr 32a47a12beSStefan Roese 33a47a12beSStefan Roese .globl strcat 34a47a12beSStefan Roesestrcat: 35a47a12beSStefan Roese addi r5,r3,-1 36a47a12beSStefan Roese addi r4,r4,-1 37a47a12beSStefan Roese1: lbzu r0,1(r5) 38a47a12beSStefan Roese cmpwi 0,r0,0 39a47a12beSStefan Roese bne 1b 40a47a12beSStefan Roese addi r5,r5,-1 41a47a12beSStefan Roese1: lbzu r0,1(r4) 42a47a12beSStefan Roese cmpwi 0,r0,0 43a47a12beSStefan Roese stbu r0,1(r5) 44a47a12beSStefan Roese bne 1b 45a47a12beSStefan Roese blr 46a47a12beSStefan Roese 47a47a12beSStefan Roese .globl strcmp 48a47a12beSStefan Roesestrcmp: 49a47a12beSStefan Roese addi r5,r3,-1 50a47a12beSStefan Roese addi r4,r4,-1 51a47a12beSStefan Roese1: lbzu r3,1(r5) 52a47a12beSStefan Roese cmpwi 1,r3,0 53a47a12beSStefan Roese lbzu r0,1(r4) 54a47a12beSStefan Roese subf. r3,r0,r3 55a47a12beSStefan Roese beqlr 1 56a47a12beSStefan Roese beq 1b 57a47a12beSStefan Roese blr 58a47a12beSStefan Roese 59a47a12beSStefan Roese .globl strlen 60a47a12beSStefan Roesestrlen: 61a47a12beSStefan Roese addi r4,r3,-1 62a47a12beSStefan Roese1: lbzu r0,1(r4) 63a47a12beSStefan Roese cmpwi 0,r0,0 64a47a12beSStefan Roese bne 1b 65a47a12beSStefan Roese subf r3,r3,r4 66a47a12beSStefan Roese blr 67a47a12beSStefan Roese 68a47a12beSStefan Roese .globl memset 69a47a12beSStefan Roesememset: 70a47a12beSStefan Roese rlwimi r4,r4,8,16,23 71a47a12beSStefan Roese rlwimi r4,r4,16,0,15 72a47a12beSStefan Roese addi r6,r3,-4 73a47a12beSStefan Roese cmplwi 0,r5,4 74a47a12beSStefan Roese blt 7f 75a47a12beSStefan Roese stwu r4,4(r6) 76a47a12beSStefan Roese beqlr 77a47a12beSStefan Roese andi. r0,r6,3 78a47a12beSStefan Roese add r5,r0,r5 79a47a12beSStefan Roese subf r6,r0,r6 80a47a12beSStefan Roese rlwinm r0,r5,32-2,2,31 81a47a12beSStefan Roese mtctr r0 82a47a12beSStefan Roese bdz 6f 83a47a12beSStefan Roese1: stwu r4,4(r6) 84a47a12beSStefan Roese bdnz 1b 85a47a12beSStefan Roese6: andi. r5,r5,3 86a47a12beSStefan Roese7: cmpwi 0,r5,0 87a47a12beSStefan Roese beqlr 88a47a12beSStefan Roese mtctr r5 89a47a12beSStefan Roese addi r6,r6,3 90a47a12beSStefan Roese8: stbu r4,1(r6) 91a47a12beSStefan Roese bdnz 8b 92a47a12beSStefan Roese blr 93a47a12beSStefan Roese 94a47a12beSStefan Roese .globl memmove 95a47a12beSStefan Roesememmove: 96a47a12beSStefan Roese cmplw 0,r3,r4 97a47a12beSStefan Roese bgt backwards_memcpy 98a47a12beSStefan Roese /* fall through */ 99a47a12beSStefan Roese 100a47a12beSStefan Roese .globl memcpy 101a47a12beSStefan Roesememcpy: 102a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 103a47a12beSStefan Roese addi r6,r3,-4 104a47a12beSStefan Roese addi r4,r4,-4 105a47a12beSStefan Roese beq 2f /* if less than 8 bytes to do */ 106a47a12beSStefan Roese andi. r0,r6,3 /* get dest word aligned */ 107a47a12beSStefan Roese mtctr r7 108a47a12beSStefan Roese bne 5f 109a47a12beSStefan Roese1: lwz r7,4(r4) 110a47a12beSStefan Roese lwzu r8,8(r4) 111a47a12beSStefan Roese stw r7,4(r6) 112a47a12beSStefan Roese stwu r8,8(r6) 113a47a12beSStefan Roese bdnz 1b 114a47a12beSStefan Roese andi. r5,r5,7 115a47a12beSStefan Roese2: cmplwi 0,r5,4 116a47a12beSStefan Roese blt 3f 117a47a12beSStefan Roese lwzu r0,4(r4) 118a47a12beSStefan Roese addi r5,r5,-4 119a47a12beSStefan Roese stwu r0,4(r6) 120a47a12beSStefan Roese3: cmpwi 0,r5,0 121a47a12beSStefan Roese beqlr 122a47a12beSStefan Roese mtctr r5 123a47a12beSStefan Roese addi r4,r4,3 124a47a12beSStefan Roese addi r6,r6,3 125a47a12beSStefan Roese4: lbzu r0,1(r4) 126a47a12beSStefan Roese stbu r0,1(r6) 127a47a12beSStefan Roese bdnz 4b 128a47a12beSStefan Roese blr 129a47a12beSStefan Roese5: subfic r0,r0,4 130a47a12beSStefan Roese mtctr r0 131a47a12beSStefan Roese6: lbz r7,4(r4) 132a47a12beSStefan Roese addi r4,r4,1 133a47a12beSStefan Roese stb r7,4(r6) 134a47a12beSStefan Roese addi r6,r6,1 135a47a12beSStefan Roese bdnz 6b 136a47a12beSStefan Roese subf r5,r0,r5 137a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 138a47a12beSStefan Roese beq 2b 139a47a12beSStefan Roese mtctr r7 140a47a12beSStefan Roese b 1b 141a47a12beSStefan Roese 142a47a12beSStefan Roese .globl backwards_memcpy 143a47a12beSStefan Roesebackwards_memcpy: 144a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 145a47a12beSStefan Roese add r6,r3,r5 146a47a12beSStefan Roese add r4,r4,r5 147a47a12beSStefan Roese beq 2f 148a47a12beSStefan Roese andi. r0,r6,3 149a47a12beSStefan Roese mtctr r7 150a47a12beSStefan Roese bne 5f 151a47a12beSStefan Roese1: lwz r7,-4(r4) 152a47a12beSStefan Roese lwzu r8,-8(r4) 153a47a12beSStefan Roese stw r7,-4(r6) 154a47a12beSStefan Roese stwu r8,-8(r6) 155a47a12beSStefan Roese bdnz 1b 156a47a12beSStefan Roese andi. r5,r5,7 157a47a12beSStefan Roese2: cmplwi 0,r5,4 158a47a12beSStefan Roese blt 3f 159a47a12beSStefan Roese lwzu r0,-4(r4) 160a47a12beSStefan Roese subi r5,r5,4 161a47a12beSStefan Roese stwu r0,-4(r6) 162a47a12beSStefan Roese3: cmpwi 0,r5,0 163a47a12beSStefan Roese beqlr 164a47a12beSStefan Roese mtctr r5 165a47a12beSStefan Roese4: lbzu r0,-1(r4) 166a47a12beSStefan Roese stbu r0,-1(r6) 167a47a12beSStefan Roese bdnz 4b 168a47a12beSStefan Roese blr 169a47a12beSStefan Roese5: mtctr r0 170a47a12beSStefan Roese6: lbzu r7,-1(r4) 171a47a12beSStefan Roese stbu r7,-1(r6) 172a47a12beSStefan Roese bdnz 6b 173a47a12beSStefan Roese subf r5,r0,r5 174a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 175a47a12beSStefan Roese beq 2b 176a47a12beSStefan Roese mtctr r7 177a47a12beSStefan Roese b 1b 178a47a12beSStefan Roese 179a47a12beSStefan Roese .globl memcmp 180a47a12beSStefan Roesememcmp: 181a47a12beSStefan Roese cmpwi 0,r5,0 182a47a12beSStefan Roese ble- 2f 183a47a12beSStefan Roese mtctr r5 184a47a12beSStefan Roese addi r6,r3,-1 185a47a12beSStefan Roese addi r4,r4,-1 186a47a12beSStefan Roese1: lbzu r3,1(r6) 187a47a12beSStefan Roese lbzu r0,1(r4) 188a47a12beSStefan Roese subf. r3,r0,r3 189a47a12beSStefan Roese bdnzt 2,1b 190a47a12beSStefan Roese blr 191a47a12beSStefan Roese2: li r3,0 192a47a12beSStefan Roese blr 193a47a12beSStefan Roese 194a47a12beSStefan Roese .global memchr 195a47a12beSStefan Roesememchr: 196a47a12beSStefan Roese cmpwi 0,r5,0 197a47a12beSStefan Roese ble- 2f 198a47a12beSStefan Roese mtctr r5 199a47a12beSStefan Roese addi r3,r3,-1 200a47a12beSStefan Roese1: lbzu r0,1(r3) 201a47a12beSStefan Roese cmpw 0,r0,r4 202a47a12beSStefan Roese bdnzf 2,1b 203a47a12beSStefan Roese beqlr 204a47a12beSStefan Roese2: li r3,0 205a47a12beSStefan Roese blr 206