Commit | Line | Data |
---|---|---|
14cf11af PM |
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 | */ | |
14cf11af PM |
11 | #include <asm/processor.h> |
12 | #include <asm/errno.h> | |
13 | #include <asm/ppc_asm.h> | |
9445aa1a | 14 | #include <asm/export.h> |
14cf11af | 15 | |
14cf11af PM |
16 | .text |
17 | ||
14cf11af PM |
18 | /* This clears out any unused part of the destination buffer, |
19 | just as the libc version does. -- paulus */ | |
20 | _GLOBAL(strncpy) | |
ca5d0674 | 21 | PPC_LCMPI 0,r5,0 |
14cf11af PM |
22 | beqlr |
23 | mtctr r5 | |
24 | addi r6,r3,-1 | |
25 | addi r4,r4,-1 | |
87a156fb | 26 | .balign 16 |
14cf11af PM |
27 | 1: 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 | |
ca5d0674 | 33 | PPC_LCMPI 0,r5,0 /* any space left in destination buffer? */ |
14cf11af PM |
34 | beqlr /* we know r0 == 0 here */ |
35 | 2: stbu r0,1(r6) /* clear it out if so */ | |
36 | bdnz 2b | |
37 | blr | |
9445aa1a | 38 | EXPORT_SYMBOL(strncpy) |
14cf11af | 39 | |
0119536c | 40 | _GLOBAL(strncmp) |
ca5d0674 AS |
41 | PPC_LCMPI 0,r5,0 |
42 | beq- 2f | |
0119536c SR |
43 | mtctr r5 |
44 | addi r5,r3,-1 | |
45 | addi r4,r4,-1 | |
87a156fb | 46 | .balign 16 |
0119536c SR |
47 | 1: 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 | |
637a9902 JM |
54 | 2: li r3,0 |
55 | blr | |
9445aa1a | 56 | EXPORT_SYMBOL(strncmp) |
0119536c | 57 | |
15c2d45d | 58 | #ifdef CONFIG_PPC32 |
14cf11af | 59 | _GLOBAL(memcmp) |
ca5d0674 AS |
60 | PPC_LCMPI 0,r5,0 |
61 | beq- 2f | |
14cf11af PM |
62 | mtctr r5 |
63 | addi r6,r3,-1 | |
64 | addi r4,r4,-1 | |
65 | 1: lbzu r3,1(r6) | |
66 | lbzu r0,1(r4) | |
67 | subf. r3,r0,r3 | |
68 | bdnzt 2,1b | |
69 | blr | |
70 | 2: li r3,0 | |
71 | blr | |
9445aa1a | 72 | EXPORT_SYMBOL(memcmp) |
15c2d45d | 73 | #endif |
14cf11af PM |
74 | |
75 | _GLOBAL(memchr) | |
ca5d0674 AS |
76 | PPC_LCMPI 0,r5,0 |
77 | beq- 2f | |
14cf11af PM |
78 | mtctr r5 |
79 | addi r3,r3,-1 | |
87a156fb | 80 | .balign 16 |
14cf11af PM |
81 | 1: lbzu r0,1(r3) |
82 | cmpw 0,r0,r4 | |
83 | bdnzf 2,1b | |
84 | beqlr | |
85 | 2: li r3,0 | |
86 | blr | |
9445aa1a | 87 | EXPORT_SYMBOL(memchr) |
14cf11af | 88 | |
17968fbb | 89 | #ifdef CONFIG_PPC32 |
14cf11af PM |
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 */ | |
97 | 11: 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 | |
107 | 1: stwu r5,4(r6) | |
108 | bdnz 1b | |
109 | /* clear byte sized chunks */ | |
110 | 7: cmpwi 0,r4,0 | |
111 | beqlr | |
112 | mtctr r4 | |
113 | addi r6,r6,3 | |
114 | 8: stbu r5,1(r6) | |
115 | bdnz 8b | |
116 | blr | |
117 | 90: mr r3,r4 | |
118 | blr | |
119 | 91: mfctr r3 | |
120 | slwi r3,r3,2 | |
121 | add r3,r3,r4 | |
122 | blr | |
123 | 92: mfctr r3 | |
124 | blr | |
125 | ||
24bfa6a9 NP |
126 | EX_TABLE(11b, 90b) |
127 | EX_TABLE(1b, 91b) | |
128 | EX_TABLE(8b, 92b) | |
129 | ||
9445aa1a | 130 | EXPORT_SYMBOL(__clear_user) |
17968fbb | 131 | #endif |