Merge branch 'salted-string-hash'
[deliverable/linux.git] / arch / powerpc / lib / string.S
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
22 1: 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
36 1: 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 */
44 2: 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
51 1: lbzu r0,1(r5)
52 cmpwi 0,r0,0
53 bne 1b
54 addi r5,r5,-1
55 1: 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
64 1: 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
78 1: 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
85 2: li r3,0
86 blr
87
88 _GLOBAL(strlen)
89 addi r4,r3,-1
90 1: lbzu r0,1(r4)
91 cmpwi 0,r0,0
92 bne 1b
93 subf r3,r3,r4
94 blr
95
96 #ifdef CONFIG_PPC32
97 _GLOBAL(memcmp)
98 PPC_LCMPI 0,r5,0
99 beq- 2f
100 mtctr r5
101 addi r6,r3,-1
102 addi r4,r4,-1
103 1: lbzu r3,1(r6)
104 lbzu r0,1(r4)
105 subf. r3,r0,r3
106 bdnzt 2,1b
107 blr
108 2: li r3,0
109 blr
110 #endif
111
112 _GLOBAL(memchr)
113 PPC_LCMPI 0,r5,0
114 beq- 2f
115 mtctr r5
116 addi r3,r3,-1
117 1: lbzu r0,1(r3)
118 cmpw 0,r0,r4
119 bdnzf 2,1b
120 beqlr
121 2: li r3,0
122 blr
123
124 #ifdef CONFIG_PPC32
125 _GLOBAL(__clear_user)
126 addi r6,r3,-4
127 li r3,0
128 li r5,0
129 cmplwi 0,r4,4
130 blt 7f
131 /* clear a single word */
132 11: stwu r5,4(r6)
133 beqlr
134 /* clear word sized chunks */
135 andi. r0,r6,3
136 add r4,r0,r4
137 subf r6,r0,r6
138 srwi r0,r4,2
139 andi. r4,r4,3
140 mtctr r0
141 bdz 7f
142 1: stwu r5,4(r6)
143 bdnz 1b
144 /* clear byte sized chunks */
145 7: cmpwi 0,r4,0
146 beqlr
147 mtctr r4
148 addi r6,r6,3
149 8: stbu r5,1(r6)
150 bdnz 8b
151 blr
152 90: mr r3,r4
153 blr
154 91: mfctr r3
155 slwi r3,r3,2
156 add r3,r3,r4
157 blr
158 92: mfctr r3
159 blr
160
161 .section __ex_table,"a"
162 PPC_LONG 11b,90b
163 PPC_LONG 1b,91b
164 PPC_LONG 8b,92b
165 .text
166 #endif
This page took 0.03529 seconds and 5 git commands to generate.