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#include <asm/processor.h> 12#include <asm/errno.h> 13#include <asm/ppc_asm.h> 14 15 .section __ex_table,"a" 16 PPC_LONG_ALIGN 17 .text 18 19_GLOBAL(strcpy) 20 addi r5,r3,-1 21 addi r4,r4,-1 221: lbzu r0,1(r4) 23 cmpwi 0,r0,0 24 stbu r0,1(r5) 25 bne 1b 26 blr 27 28/* This clears out any unused part of the destination buffer, 29 just as the libc version does. -- paulus */ 30_GLOBAL(strncpy) 31 PPC_LCMPI 0,r5,0 32 beqlr 33 mtctr r5 34 addi r6,r3,-1 35 addi r4,r4,-1 361: lbzu r0,1(r4) 37 cmpwi 0,r0,0 38 stbu r0,1(r6) 39 bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */ 40 bnelr /* if we didn't hit a null char, we're done */ 41 mfctr r5 42 PPC_LCMPI 0,r5,0 /* any space left in destination buffer? */ 43 beqlr /* we know r0 == 0 here */ 442: stbu r0,1(r6) /* clear it out if so */ 45 bdnz 2b 46 blr 47 48_GLOBAL(strcat) 49 addi r5,r3,-1 50 addi r4,r4,-1 511: lbzu r0,1(r5) 52 cmpwi 0,r0,0 53 bne 1b 54 addi r5,r5,-1 551: lbzu r0,1(r4) 56 cmpwi 0,r0,0 57 stbu r0,1(r5) 58 bne 1b 59 blr 60 61_GLOBAL(strcmp) 62 addi r5,r3,-1 63 addi r4,r4,-1 641: lbzu r3,1(r5) 65 cmpwi 1,r3,0 66 lbzu r0,1(r4) 67 subf. r3,r0,r3 68 beqlr 1 69 beq 1b 70 blr 71 72_GLOBAL(strncmp) 73 PPC_LCMPI 0,r5,0 74 beq- 2f 75 mtctr r5 76 addi r5,r3,-1 77 addi r4,r4,-1 781: lbzu r3,1(r5) 79 cmpwi 1,r3,0 80 lbzu r0,1(r4) 81 subf. r3,r0,r3 82 beqlr 1 83 bdnzt eq,1b 84 blr 852: li r3,0 86 blr 87 88_GLOBAL(strlen) 89 addi r4,r3,-1 901: lbzu r0,1(r4) 91 cmpwi 0,r0,0 92 bne 1b 93 subf r3,r3,r4 94 blr 95 96_GLOBAL(memcmp) 97 PPC_LCMPI 0,r5,0 98 beq- 2f 99 mtctr r5 100 addi r6,r3,-1 101 addi r4,r4,-1 1021: lbzu r3,1(r6) 103 lbzu r0,1(r4) 104 subf. r3,r0,r3 105 bdnzt 2,1b 106 blr 1072: li r3,0 108 blr 109 110_GLOBAL(memchr) 111 PPC_LCMPI 0,r5,0 112 beq- 2f 113 mtctr r5 114 addi r3,r3,-1 1151: lbzu r0,1(r3) 116 cmpw 0,r0,r4 117 bdnzf 2,1b 118 beqlr 1192: li r3,0 120 blr 121 122#ifdef CONFIG_PPC32 123_GLOBAL(__clear_user) 124 addi r6,r3,-4 125 li r3,0 126 li r5,0 127 cmplwi 0,r4,4 128 blt 7f 129 /* clear a single word */ 13011: stwu r5,4(r6) 131 beqlr 132 /* clear word sized chunks */ 133 andi. r0,r6,3 134 add r4,r0,r4 135 subf r6,r0,r6 136 srwi r0,r4,2 137 andi. r4,r4,3 138 mtctr r0 139 bdz 7f 1401: stwu r5,4(r6) 141 bdnz 1b 142 /* clear byte sized chunks */ 1437: cmpwi 0,r4,0 144 beqlr 145 mtctr r4 146 addi r6,r6,3 1478: stbu r5,1(r6) 148 bdnz 8b 149 blr 15090: mr r3,r4 151 blr 15291: mfctr r3 153 slwi r3,r3,2 154 add r3,r3,r4 155 blr 15692: mfctr r3 157 blr 158 159 .section __ex_table,"a" 160 PPC_LONG 11b,90b 161 PPC_LONG 1b,91b 162 PPC_LONG 8b,92b 163 .text 164#endif 165