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