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#define r0 0 12#define r3 3 13#define r4 4 14#define r5 5 15#define r6 6 16#define r7 7 17#define r8 8 18 19 .globl strlen 20strlen: 21 addi r4,r3,-1 221: lbzu r0,1(r4) 23 cmpwi 0,r0,0 24 bne 1b 25 subf r3,r3,r4 26 blr 27 28 .globl memset 29memset: 30 rlwimi r4,r4,8,16,23 31 rlwimi r4,r4,16,0,15 32 addi r6,r3,-4 33 cmplwi 0,r5,4 34 blt 7f 35 stwu r4,4(r6) 36 beqlr 37 andi. r0,r6,3 38 add r5,r0,r5 39 subf r6,r0,r6 40 rlwinm r0,r5,32-2,2,31 41 mtctr r0 42 bdz 6f 431: stwu r4,4(r6) 44 bdnz 1b 456: andi. r5,r5,3 467: cmpwi 0,r5,0 47 beqlr 48 mtctr r5 49 addi r6,r6,3 508: stbu r4,1(r6) 51 bdnz 8b 52 blr 53 54 .globl memmove 55memmove: 56 cmplw 0,r3,r4 57 bgt backwards_memcpy 58 /* fall through */ 59 60 .globl memcpy 61memcpy: 62 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 63 addi r6,r3,-4 64 addi r4,r4,-4 65 beq 2f /* if less than 8 bytes to do */ 66 andi. r0,r6,3 /* get dest word aligned */ 67 mtctr r7 68 bne 5f 691: lwz r7,4(r4) 70 lwzu r8,8(r4) 71 stw r7,4(r6) 72 stwu r8,8(r6) 73 bdnz 1b 74 andi. r5,r5,7 752: cmplwi 0,r5,4 76 blt 3f 77 lwzu r0,4(r4) 78 addi r5,r5,-4 79 stwu r0,4(r6) 803: cmpwi 0,r5,0 81 beqlr 82 mtctr r5 83 addi r4,r4,3 84 addi r6,r6,3 854: lbzu r0,1(r4) 86 stbu r0,1(r6) 87 bdnz 4b 88 blr 895: subfic r0,r0,4 90 mtctr r0 916: lbz r7,4(r4) 92 addi r4,r4,1 93 stb r7,4(r6) 94 addi r6,r6,1 95 bdnz 6b 96 subf r5,r0,r5 97 rlwinm. r7,r5,32-3,3,31 98 beq 2b 99 mtctr r7 100 b 1b 101 102 .globl backwards_memcpy 103backwards_memcpy: 104 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ 105 add r6,r3,r5 106 add r4,r4,r5 107 beq 2f 108 andi. r0,r6,3 109 mtctr r7 110 bne 5f 1111: lwz r7,-4(r4) 112 lwzu r8,-8(r4) 113 stw r7,-4(r6) 114 stwu r8,-8(r6) 115 bdnz 1b 116 andi. r5,r5,7 1172: cmplwi 0,r5,4 118 blt 3f 119 lwzu r0,-4(r4) 120 subi r5,r5,4 121 stwu r0,-4(r6) 1223: cmpwi 0,r5,0 123 beqlr 124 mtctr r5 1254: lbzu r0,-1(r4) 126 stbu r0,-1(r6) 127 bdnz 4b 128 blr 1295: mtctr r0 1306: lbzu r7,-1(r4) 131 stbu r7,-1(r6) 132 bdnz 6b 133 subf r5,r0,r5 134 rlwinm. r7,r5,32-3,3,31 135 beq 2b 136 mtctr r7 137 b 1b 138 139 .globl memcmp 140memcmp: 141 cmpwi 0,r5,0 142 blelr 143 mtctr r5 144 addi r6,r3,-1 145 addi r4,r4,-1 1461: lbzu r3,1(r6) 147 lbzu r0,1(r4) 148 subf. r3,r0,r3 149 bdnzt 2,1b 150 blr 151