1a47a12beSStefan Roese/* 2a47a12beSStefan Roese * String handling functions for PowerPC. 3a47a12beSStefan Roese * 4a47a12beSStefan Roese * Copyright (C) 1996 Paul Mackerras. 5a47a12beSStefan Roese * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 7a47a12beSStefan Roese */ 8a47a12beSStefan Roese#include <ppc_asm.tmpl> 9*1221ce45SMasahiro Yamada#include <linux/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 memmove 96a47a12beSStefan Roesememmove: 97a47a12beSStefan Roese cmplw 0,r3,r4 98a47a12beSStefan Roese bgt backwards_memcpy 99a47a12beSStefan Roese /* fall through */ 100a47a12beSStefan Roese 101a47a12beSStefan Roese .globl memcpy 102a47a12beSStefan Roesememcpy: 103a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 104a47a12beSStefan Roese addi r6,r3,-4 105a47a12beSStefan Roese addi r4,r4,-4 106a47a12beSStefan Roese beq 2f /* if less than 8 bytes to do */ 107a47a12beSStefan Roese andi. r0,r6,3 /* get dest word aligned */ 108a47a12beSStefan Roese mtctr r7 109a47a12beSStefan Roese bne 5f 110a47a12beSStefan Roese1: lwz r7,4(r4) 111a47a12beSStefan Roese lwzu r8,8(r4) 112a47a12beSStefan Roese stw r7,4(r6) 113a47a12beSStefan Roese stwu r8,8(r6) 114a47a12beSStefan Roese bdnz 1b 115a47a12beSStefan Roese andi. r5,r5,7 116a47a12beSStefan Roese2: cmplwi 0,r5,4 117a47a12beSStefan Roese blt 3f 118a47a12beSStefan Roese lwzu r0,4(r4) 119a47a12beSStefan Roese addi r5,r5,-4 120a47a12beSStefan Roese stwu r0,4(r6) 121a47a12beSStefan Roese3: cmpwi 0,r5,0 122a47a12beSStefan Roese beqlr 123a47a12beSStefan Roese mtctr r5 124a47a12beSStefan Roese addi r4,r4,3 125a47a12beSStefan Roese addi r6,r6,3 126a47a12beSStefan Roese4: lbzu r0,1(r4) 127a47a12beSStefan Roese stbu r0,1(r6) 128a47a12beSStefan Roese bdnz 4b 129a47a12beSStefan Roese blr 130a47a12beSStefan Roese5: subfic r0,r0,4 131a47a12beSStefan Roese mtctr r0 132a47a12beSStefan Roese6: lbz r7,4(r4) 133a47a12beSStefan Roese addi r4,r4,1 134a47a12beSStefan Roese stb r7,4(r6) 135a47a12beSStefan Roese addi r6,r6,1 136a47a12beSStefan Roese bdnz 6b 137a47a12beSStefan Roese subf r5,r0,r5 138a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 139a47a12beSStefan Roese beq 2b 140a47a12beSStefan Roese mtctr r7 141a47a12beSStefan Roese b 1b 142a47a12beSStefan Roese 143a47a12beSStefan Roese .globl backwards_memcpy 144a47a12beSStefan Roesebackwards_memcpy: 145a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 146a47a12beSStefan Roese add r6,r3,r5 147a47a12beSStefan Roese add r4,r4,r5 148a47a12beSStefan Roese beq 2f 149a47a12beSStefan Roese andi. r0,r6,3 150a47a12beSStefan Roese mtctr r7 151a47a12beSStefan Roese bne 5f 152a47a12beSStefan Roese1: lwz r7,-4(r4) 153a47a12beSStefan Roese lwzu r8,-8(r4) 154a47a12beSStefan Roese stw r7,-4(r6) 155a47a12beSStefan Roese stwu r8,-8(r6) 156a47a12beSStefan Roese bdnz 1b 157a47a12beSStefan Roese andi. r5,r5,7 158a47a12beSStefan Roese2: cmplwi 0,r5,4 159a47a12beSStefan Roese blt 3f 160a47a12beSStefan Roese lwzu r0,-4(r4) 161a47a12beSStefan Roese subi r5,r5,4 162a47a12beSStefan Roese stwu r0,-4(r6) 163a47a12beSStefan Roese3: cmpwi 0,r5,0 164a47a12beSStefan Roese beqlr 165a47a12beSStefan Roese mtctr r5 166a47a12beSStefan Roese4: lbzu r0,-1(r4) 167a47a12beSStefan Roese stbu r0,-1(r6) 168a47a12beSStefan Roese bdnz 4b 169a47a12beSStefan Roese blr 170a47a12beSStefan Roese5: mtctr r0 171a47a12beSStefan Roese6: lbzu r7,-1(r4) 172a47a12beSStefan Roese stbu r7,-1(r6) 173a47a12beSStefan Roese bdnz 6b 174a47a12beSStefan Roese subf r5,r0,r5 175a47a12beSStefan Roese rlwinm. r7,r5,32-3,3,31 176a47a12beSStefan Roese beq 2b 177a47a12beSStefan Roese mtctr r7 178a47a12beSStefan Roese b 1b 179a47a12beSStefan Roese 180a47a12beSStefan Roese .globl memcmp 181a47a12beSStefan Roesememcmp: 182a47a12beSStefan Roese cmpwi 0,r5,0 183a47a12beSStefan Roese ble- 2f 184a47a12beSStefan Roese mtctr r5 185a47a12beSStefan Roese addi r6,r3,-1 186a47a12beSStefan Roese addi r4,r4,-1 187a47a12beSStefan Roese1: lbzu r3,1(r6) 188a47a12beSStefan Roese lbzu r0,1(r4) 189a47a12beSStefan Roese subf. r3,r0,r3 190a47a12beSStefan Roese bdnzt 2,1b 191a47a12beSStefan Roese blr 192a47a12beSStefan Roese2: li r3,0 193a47a12beSStefan Roese blr 194a47a12beSStefan Roese 195a47a12beSStefan Roese .global memchr 196a47a12beSStefan Roesememchr: 197a47a12beSStefan Roese cmpwi 0,r5,0 198a47a12beSStefan Roese ble- 2f 199a47a12beSStefan Roese mtctr r5 200a47a12beSStefan Roese addi r3,r3,-1 201a47a12beSStefan Roese1: lbzu r0,1(r3) 202a47a12beSStefan Roese cmpw 0,r0,r4 203a47a12beSStefan Roese bdnzf 2,1b 204a47a12beSStefan Roese beqlr 205a47a12beSStefan Roese2: li r3,0 206a47a12beSStefan Roese blr 207