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#include <asm/export.h> 15 16 .text 17 18/* This clears out any unused part of the destination buffer, 19 just as the libc version does. -- paulus */ 20_GLOBAL(strncpy) 21 PPC_LCMPI 0,r5,0 22 beqlr 23 mtctr r5 24 addi r6,r3,-1 25 addi r4,r4,-1 26 .balign 16 271: lbzu r0,1(r4) 28 cmpwi 0,r0,0 29 stbu r0,1(r6) 30 bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */ 31 bnelr /* if we didn't hit a null char, we're done */ 32 mfctr r5 33 PPC_LCMPI 0,r5,0 /* any space left in destination buffer? */ 34 beqlr /* we know r0 == 0 here */ 352: stbu r0,1(r6) /* clear it out if so */ 36 bdnz 2b 37 blr 38EXPORT_SYMBOL(strncpy) 39 40_GLOBAL(strncmp) 41 PPC_LCMPI 0,r5,0 42 beq- 2f 43 mtctr r5 44 addi r5,r3,-1 45 addi r4,r4,-1 46 .balign 16 471: lbzu r3,1(r5) 48 cmpwi 1,r3,0 49 lbzu r0,1(r4) 50 subf. r3,r0,r3 51 beqlr 1 52 bdnzt eq,1b 53 blr 542: li r3,0 55 blr 56EXPORT_SYMBOL(strncmp) 57 58#ifdef CONFIG_PPC32 59_GLOBAL(memcmp) 60 PPC_LCMPI 0,r5,0 61 beq- 2f 62 mtctr r5 63 addi r6,r3,-1 64 addi r4,r4,-1 651: lbzu r3,1(r6) 66 lbzu r0,1(r4) 67 subf. r3,r0,r3 68 bdnzt 2,1b 69 blr 702: li r3,0 71 blr 72EXPORT_SYMBOL(memcmp) 73#endif 74 75_GLOBAL(memchr) 76 PPC_LCMPI 0,r5,0 77 beq- 2f 78 mtctr r5 79 addi r3,r3,-1 80 .balign 16 811: lbzu r0,1(r3) 82 cmpw 0,r0,r4 83 bdnzf 2,1b 84 beqlr 852: li r3,0 86 blr 87EXPORT_SYMBOL(memchr) 88 89#ifdef CONFIG_PPC32 90_GLOBAL(__clear_user) 91 addi r6,r3,-4 92 li r3,0 93 li r5,0 94 cmplwi 0,r4,4 95 blt 7f 96 /* clear a single word */ 9711: stwu r5,4(r6) 98 beqlr 99 /* clear word sized chunks */ 100 andi. r0,r6,3 101 add r4,r0,r4 102 subf r6,r0,r6 103 srwi r0,r4,2 104 andi. r4,r4,3 105 mtctr r0 106 bdz 7f 1071: stwu r5,4(r6) 108 bdnz 1b 109 /* clear byte sized chunks */ 1107: cmpwi 0,r4,0 111 beqlr 112 mtctr r4 113 addi r6,r6,3 1148: stbu r5,1(r6) 115 bdnz 8b 116 blr 11790: mr r3,r4 118 blr 11991: mfctr r3 120 slwi r3,r3,2 121 add r3,r3,r4 122 blr 12392: mfctr r3 124 blr 125 126 EX_TABLE(11b, 90b) 127 EX_TABLE(1b, 91b) 128 EX_TABLE(8b, 92b) 129 130EXPORT_SYMBOL(__clear_user) 131#endif 132