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