* better
[mascara-docs.git] / i386 / linux-2.3.21 / arch / ppc / chrpboot / string.S
blobba83591b76f0844ef621a01a6e364b864a792ab5
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
19         .globl  strcpy
20 strcpy:
21         addi    r5,r3,-1
22         addi    r4,r4,-1
23 1:      lbzu    r0,1(r4)
24         cmpwi   0,r0,0
25         stbu    r0,1(r5)
26         bne     1b
27         blr
29         .globl  strncpy
30 strncpy:
31         cmpwi   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         blr
42         .globl  strcat
43 strcat:
44         addi    r5,r3,-1
45         addi    r4,r4,-1
46 1:      lbzu    r0,1(r5)
47         cmpwi   0,r0,0
48         bne     1b
49         addi    r5,r5,-1
50 1:      lbzu    r0,1(r4)
51         cmpwi   0,r0,0
52         stbu    r0,1(r5)
53         bne     1b
54         blr
56         .globl  strcmp
57 strcmp:
58         addi    r5,r3,-1
59         addi    r4,r4,-1
60 1:      lbzu    r3,1(r5)
61         cmpwi   1,r3,0
62         lbzu    r0,1(r4)
63         subf.   r3,r0,r3
64         beqlr   1
65         beq     1b
66         blr
68         .globl  strlen
69 strlen:
70         addi    r4,r3,-1
71 1:      lbzu    r0,1(r4)
72         cmpwi   0,r0,0
73         bne     1b
74         subf    r3,r3,r4
75         blr
77         .globl  memset
78 memset:
79         rlwimi  r4,r4,8,16,23
80         rlwimi  r4,r4,16,0,15
81         addi    r6,r3,-4
82         cmplwi  0,r5,4
83         blt     7f
84         stwu    r4,4(r6)
85         beqlr
86         andi.   r0,r6,3
87         add     r5,r0,r5
88         subf    r6,r0,r6
89         rlwinm  r0,r5,32-2,2,31
90         mtctr   r0
91         bdz     6f
92 1:      stwu    r4,4(r6)
93         bdnz    1b
94 6:      andi.   r5,r5,3
95 7:      cmpwi   0,r5,0
96         beqlr
97         mtctr   r5
98         addi    r6,r6,3
99 8:      stbu    r4,1(r6)
100         bdnz    8b
101         blr
103         .globl  bcopy
104 bcopy:
105         mr      r6,r3
106         mr      r3,r4
107         mr      r4,r6
108         b       memcpy
110         .globl  memmove
111 memmove:
112         cmplw   0,r3,r4
113         bgt     backwards_memcpy
114         /* fall through */
116         .globl  memcpy
117 memcpy:
118         rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
119         addi    r6,r3,-4
120         addi    r4,r4,-4
121         beq     2f                      /* if less than 8 bytes to do */
122         andi.   r0,r6,3                 /* get dest word aligned */
123         mtctr   r7
124         bne     5f
125 1:      lwz     r7,4(r4)
126         lwzu    r8,8(r4)
127         stw     r7,4(r6)
128         stwu    r8,8(r6)
129         bdnz    1b
130         andi.   r5,r5,7
131 2:      cmplwi  0,r5,4
132         blt     3f
133         lwzu    r0,4(r4)
134         addi    r5,r5,-4
135         stwu    r0,4(r6)
136 3:      cmpwi   0,r5,0
137         beqlr
138         mtctr   r5
139         addi    r4,r4,3
140         addi    r6,r6,3
141 4:      lbzu    r0,1(r4)
142         stbu    r0,1(r6)
143         bdnz    4b
144         blr
145 5:      subfic  r0,r0,4
146         mtctr   r0
147 6:      lbz     r7,4(r4)
148         addi    r4,r4,1
149         stb     r7,4(r6)
150         addi    r6,r6,1
151         bdnz    6b
152         subf    r5,r0,r5
153         rlwinm. r7,r5,32-3,3,31
154         beq     2b
155         mtctr   r7
156         b       1b
158         .globl  backwards_memcpy
159 backwards_memcpy:
160         rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
161         add     r6,r3,r5
162         add     r4,r4,r5
163         beq     2f
164         andi.   r0,r6,3
165         mtctr   r7
166         bne     5f
167 1:      lwz     r7,-4(r4)
168         lwzu    r8,-8(r4)
169         stw     r7,-4(r6)
170         stwu    r8,-8(r6)
171         bdnz    1b
172         andi.   r5,r5,7
173 2:      cmplwi  0,r5,4
174         blt     3f
175         lwzu    r0,-4(r4)
176         subi    r5,r5,4
177         stwu    r0,-4(r6)
178 3:      cmpwi   0,r5,0
179         beqlr
180         mtctr   r5
181 4:      lbzu    r0,-1(r4)
182         stbu    r0,-1(r6)
183         bdnz    4b
184         blr
185 5:      mtctr   r0
186 6:      lbzu    r7,-1(r4)
187         stbu    r7,-1(r6)
188         bdnz    6b
189         subf    r5,r0,r5
190         rlwinm. r7,r5,32-3,3,31
191         beq     2b
192         mtctr   r7
193         b       1b
195         .globl  memcmp
196 memcmp:
197         cmpwi   0,r5,0
198         blelr
199         mtctr   r5
200         addi    r6,r3,-1
201         addi    r4,r4,-1
202 1:      lbzu    r3,1(r6)
203         lbzu    r0,1(r4)
204         subf.   r3,r0,r3
205         bdnzt   2,1b
206         blr