]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/powerpc/powerpc32/power4/strncmp.S
Fix whitespaces.
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc32 / power4 / strncmp.S
1 /* Optimized strcmp implementation for PowerPC32.
2 Copyright (C) 2003, 2006, 2011 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA
18 02110-1301 USA. */
19
20 #include <sysdep.h>
21 #include <bp-sym.h>
22 #include <bp-asm.h>
23
24 /* See strlen.s for comments on how the end-of-string testing works. */
25
26 /* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */
27
28 EALIGN (BP_SYM(strncmp), 4, 0)
29
30 #define rTMP r0
31 #define rRTN r3
32 #define rSTR1 r3 /* first string arg */
33 #define rSTR2 r4 /* second string arg */
34 #define rN r5 /* max string length */
35 /* Note: The Bounded pointer support in this code is broken. This code
36 was inherited from PPC32 and that support was never completed.
37 Current PPC gcc does not support -fbounds-check or -fbounded-pointers. */
38 #define rWORD1 r6 /* current word in s1 */
39 #define rWORD2 r7 /* current word in s2 */
40 #define rWORD3 r10
41 #define rWORD4 r11
42 #define rFEFE r8 /* constant 0xfefefeff (-0x01010101) */
43 #define r7F7F r9 /* constant 0x7f7f7f7f */
44 #define rNEG r10 /* ~(word in s1 | 0x7f7f7f7f) */
45 #define rBITDIF r11 /* bits that differ in s1 & s2 words */
46
47 dcbt 0,rSTR1
48 or rTMP, rSTR2, rSTR1
49 lis r7F7F, 0x7f7f
50 dcbt 0,rSTR2
51 clrlwi. rTMP, rTMP, 30
52 cmplwi cr1, rN, 0
53 lis rFEFE, -0x101
54 bne L(unaligned)
55 /* We are word alligned so set up for two loops. first a word
56 loop, then fall into the byte loop if any residual. */
57 srwi. rTMP, rN, 2
58 clrlwi rN, rN, 30
59 addi rFEFE, rFEFE, -0x101
60 addi r7F7F, r7F7F, 0x7f7f
61 cmplwi cr1, rN, 0
62 beq L(unaligned)
63
64 mtctr rTMP /* Power4 wants mtctr 1st in dispatch group. */
65 lwz rWORD1, 0(rSTR1)
66 lwz rWORD2, 0(rSTR2)
67 b L(g1)
68
69 L(g0):
70 lwzu rWORD1, 4(rSTR1)
71 bne- cr1, L(different)
72 lwzu rWORD2, 4(rSTR2)
73 L(g1): add rTMP, rFEFE, rWORD1
74 nor rNEG, r7F7F, rWORD1
75 bdz L(tail)
76 and. rTMP, rTMP, rNEG
77 cmpw cr1, rWORD1, rWORD2
78 beq+ L(g0)
79
80 /* OK. We've hit the end of the string. We need to be careful that
81 we don't compare two strings as different because of gunk beyond
82 the end of the strings... */
83
84 L(endstring):
85 and rTMP, r7F7F, rWORD1
86 beq cr1, L(equal)
87 add rTMP, rTMP, r7F7F
88 xor. rBITDIF, rWORD1, rWORD2
89
90 andc rNEG, rNEG, rTMP
91 blt- L(highbit)
92 cntlzw rBITDIF, rBITDIF
93 cntlzw rNEG, rNEG
94 addi rNEG, rNEG, 7
95 cmpw cr1, rNEG, rBITDIF
96 sub rRTN, rWORD1, rWORD2
97 blt- cr1, L(equal)
98 srawi rRTN, rRTN, 31
99 ori rRTN, rRTN, 1
100 blr
101 L(equal):
102 li rRTN, 0
103 blr
104
105 L(different):
106 lwzu rWORD1, -4(rSTR1)
107 xor. rBITDIF, rWORD1, rWORD2
108 sub rRTN, rWORD1, rWORD2
109 blt- L(highbit)
110 srawi rRTN, rRTN, 31
111 ori rRTN, rRTN, 1
112 blr
113 L(highbit):
114 srwi rWORD2, rWORD2, 24
115 srwi rWORD1, rWORD1, 24
116 sub rRTN, rWORD1, rWORD2
117 blr
118
119
120 /* Oh well. In this case, we just do a byte-by-byte comparison. */
121 .align 4
122 L(tail):
123 and. rTMP, rTMP, rNEG
124 cmpw cr1, rWORD1, rWORD2
125 bne- L(endstring)
126 addi rSTR1, rSTR1, 4
127 bne- cr1, L(different)
128 addi rSTR2, rSTR2, 4
129 cmplwi cr1, rN, 0
130 L(unaligned):
131 mtctr rN /* Power4 wants mtctr 1st in dispatch group */
132 ble cr1, L(ux)
133 L(uz):
134 lbz rWORD1, 0(rSTR1)
135 lbz rWORD2, 0(rSTR2)
136 .align 4
137 L(u1):
138 cmpwi cr1, rWORD1, 0
139 bdz L(u4)
140 cmpw rWORD1, rWORD2
141 beq- cr1, L(u4)
142 bne- L(u4)
143 lbzu rWORD3, 1(rSTR1)
144 lbzu rWORD4, 1(rSTR2)
145 cmpwi cr1, rWORD3, 0
146 bdz L(u3)
147 cmpw rWORD3, rWORD4
148 beq- cr1, L(u3)
149 bne- L(u3)
150 lbzu rWORD1, 1(rSTR1)
151 lbzu rWORD2, 1(rSTR2)
152 cmpwi cr1, rWORD1, 0
153 bdz L(u4)
154 cmpw rWORD1, rWORD2
155 beq- cr1, L(u4)
156 bne- L(u4)
157 lbzu rWORD3, 1(rSTR1)
158 lbzu rWORD4, 1(rSTR2)
159 cmpwi cr1, rWORD3, 0
160 bdz L(u3)
161 cmpw rWORD3, rWORD4
162 beq- cr1, L(u3)
163 bne- L(u3)
164 lbzu rWORD1, 1(rSTR1)
165 lbzu rWORD2, 1(rSTR2)
166 b L(u1)
167
168 L(u3): sub rRTN, rWORD3, rWORD4
169 blr
170 L(u4): sub rRTN, rWORD1, rWORD2
171 blr
172 L(ux):
173 li rRTN, 0
174 blr
175 END (BP_SYM (strncmp))
176 libc_hidden_builtin_def (strncmp)