]>
Commit | Line | Data |
---|---|---|
12788f63 MT |
1 | 2011-03-20 H.J. Lu <hongjiu.lu@intel.com> |
2 | ||
3 | [BZ #12597] | |
4 | * string/test-strncmp.c (do_page_test): New function. | |
5 | (check2): Likewise. | |
6 | (test_main): Call check2. | |
7 | * sysdeps/x86_64/multiarch/strcmp.S: Properly cross page boundary. | |
8 | ||
9 | Index: glibc-2.12-2-gc4ccff1/string/test-strncmp.c | |
10 | =================================================================== | |
11 | --- glibc-2.12-2-gc4ccff1.orig/string/test-strncmp.c | |
12 | +++ glibc-2.12-2-gc4ccff1/string/test-strncmp.c | |
13 | @@ -200,6 +200,27 @@ do_test (size_t align1, size_t align2, s | |
14 | } | |
15 | ||
16 | static void | |
17 | +do_page_test (size_t offset1, size_t offset2, char *s2) | |
18 | +{ | |
19 | + char *s1; | |
20 | + int exp_result; | |
21 | + | |
22 | + if (offset1 >= page_size || offset2 >= page_size) | |
23 | + return; | |
24 | + | |
25 | + s1 = (char *) (buf1 + offset1); | |
26 | + s2 += offset2; | |
27 | + | |
28 | + exp_result= *s1; | |
29 | + | |
30 | + FOR_EACH_IMPL (impl, 0) | |
31 | + { | |
32 | + check_result (impl, s1, s2, page_size, -exp_result); | |
33 | + check_result (impl, s2, s1, page_size, exp_result); | |
34 | + } | |
35 | +} | |
36 | + | |
37 | +static void | |
38 | do_random_tests (void) | |
39 | { | |
40 | size_t i, j, n, align1, align2, pos, len1, len2, size; | |
41 | @@ -312,6 +333,25 @@ check1 (void) | |
42 | } | |
43 | } | |
44 | ||
45 | +static void | |
46 | +check2 (void) | |
47 | +{ | |
48 | + size_t i; | |
49 | + char *s1, *s2; | |
50 | + | |
51 | + s1 = (char *) buf1; | |
52 | + for (i = 0; i < page_size - 1; i++) | |
53 | + s1[i] = 23; | |
54 | + s1[i] = 0; | |
55 | + | |
56 | + s2 = strdup (s1); | |
57 | + | |
58 | + for (i = 0; i < 64; ++i) | |
59 | + do_page_test (3990 + i, 2635, s2); | |
60 | + | |
61 | + free (s2); | |
62 | +} | |
63 | + | |
64 | int | |
65 | test_main (void) | |
66 | { | |
67 | @@ -320,6 +360,7 @@ test_main (void) | |
68 | test_init (); | |
69 | ||
70 | check1 (); | |
71 | + check2 (); | |
72 | ||
73 | printf ("%23s", ""); | |
74 | FOR_EACH_IMPL (impl, 0) | |
75 | Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcmp.S | |
76 | =================================================================== | |
77 | --- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/strcmp.S | |
78 | +++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcmp.S | |
79 | @@ -452,6 +452,7 @@ LABEL(loop_ashr_1_use_sse4_2): | |
80 | add $16, %r10 | |
81 | jg LABEL(nibble_ashr_1_use_sse4_2) | |
82 | ||
83 | +LABEL(nibble_ashr_1_use_sse4_2_restart): | |
84 | movdqa (%rdi, %rdx), %xmm0 | |
85 | palignr $1, -16(%rdi, %rdx), %xmm0 | |
86 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
87 | @@ -499,7 +500,7 @@ LABEL(nibble_ashr_1_use_sse4_2): | |
88 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
89 | # endif | |
90 | cmp $14, %ecx | |
91 | - ja LABEL(loop_ashr_1_use_sse4_2) | |
92 | + ja LABEL(nibble_ashr_1_use_sse4_2_restart) | |
93 | ||
94 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
95 | ||
96 | @@ -544,6 +545,7 @@ LABEL(loop_ashr_2_use_sse4_2): | |
97 | add $16, %r10 | |
98 | jg LABEL(nibble_ashr_2_use_sse4_2) | |
99 | ||
100 | +LABEL(nibble_ashr_2_use_sse4_2_restart): | |
101 | movdqa (%rdi, %rdx), %xmm0 | |
102 | palignr $2, -16(%rdi, %rdx), %xmm0 | |
103 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
104 | @@ -591,7 +593,7 @@ LABEL(nibble_ashr_2_use_sse4_2): | |
105 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
106 | # endif | |
107 | cmp $13, %ecx | |
108 | - ja LABEL(loop_ashr_2_use_sse4_2) | |
109 | + ja LABEL(nibble_ashr_2_use_sse4_2_restart) | |
110 | ||
111 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
112 | ||
113 | @@ -636,6 +638,7 @@ LABEL(loop_ashr_3_use_sse4_2): | |
114 | add $16, %r10 | |
115 | jg LABEL(nibble_ashr_3_use_sse4_2) | |
116 | ||
117 | +LABEL(nibble_ashr_3_use_sse4_2_restart): | |
118 | movdqa (%rdi, %rdx), %xmm0 | |
119 | palignr $3, -16(%rdi, %rdx), %xmm0 | |
120 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
121 | @@ -683,7 +686,7 @@ LABEL(nibble_ashr_3_use_sse4_2): | |
122 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
123 | # endif | |
124 | cmp $12, %ecx | |
125 | - ja LABEL(loop_ashr_3_use_sse4_2) | |
126 | + ja LABEL(nibble_ashr_3_use_sse4_2_restart) | |
127 | ||
128 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
129 | ||
130 | @@ -729,6 +732,7 @@ LABEL(loop_ashr_4_use_sse4_2): | |
131 | add $16, %r10 | |
132 | jg LABEL(nibble_ashr_4_use_sse4_2) | |
133 | ||
134 | +LABEL(nibble_ashr_4_use_sse4_2_restart): | |
135 | movdqa (%rdi, %rdx), %xmm0 | |
136 | palignr $4, -16(%rdi, %rdx), %xmm0 | |
137 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
138 | @@ -776,7 +780,7 @@ LABEL(nibble_ashr_4_use_sse4_2): | |
139 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
140 | # endif | |
141 | cmp $11, %ecx | |
142 | - ja LABEL(loop_ashr_4_use_sse4_2) | |
143 | + ja LABEL(nibble_ashr_4_use_sse4_2_restart) | |
144 | ||
145 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
146 | ||
147 | @@ -822,6 +826,7 @@ LABEL(loop_ashr_5_use_sse4_2): | |
148 | add $16, %r10 | |
149 | jg LABEL(nibble_ashr_5_use_sse4_2) | |
150 | ||
151 | +LABEL(nibble_ashr_5_use_sse4_2_restart): | |
152 | movdqa (%rdi, %rdx), %xmm0 | |
153 | palignr $5, -16(%rdi, %rdx), %xmm0 | |
154 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
155 | @@ -870,7 +875,7 @@ LABEL(nibble_ashr_5_use_sse4_2): | |
156 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
157 | # endif | |
158 | cmp $10, %ecx | |
159 | - ja LABEL(loop_ashr_5_use_sse4_2) | |
160 | + ja LABEL(nibble_ashr_5_use_sse4_2_restart) | |
161 | ||
162 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
163 | ||
164 | @@ -916,6 +921,7 @@ LABEL(loop_ashr_6_use_sse4_2): | |
165 | add $16, %r10 | |
166 | jg LABEL(nibble_ashr_6_use_sse4_2) | |
167 | ||
168 | +LABEL(nibble_ashr_6_use_sse4_2_restart): | |
169 | movdqa (%rdi, %rdx), %xmm0 | |
170 | palignr $6, -16(%rdi, %rdx), %xmm0 | |
171 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
172 | @@ -963,7 +969,7 @@ LABEL(nibble_ashr_6_use_sse4_2): | |
173 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
174 | # endif | |
175 | cmp $9, %ecx | |
176 | - ja LABEL(loop_ashr_6_use_sse4_2) | |
177 | + ja LABEL(nibble_ashr_6_use_sse4_2_restart) | |
178 | ||
179 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
180 | ||
181 | @@ -1009,6 +1015,7 @@ LABEL(loop_ashr_7_use_sse4_2): | |
182 | add $16, %r10 | |
183 | jg LABEL(nibble_ashr_7_use_sse4_2) | |
184 | ||
185 | +LABEL(nibble_ashr_7_use_sse4_2_restart): | |
186 | movdqa (%rdi, %rdx), %xmm0 | |
187 | palignr $7, -16(%rdi, %rdx), %xmm0 | |
188 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
189 | @@ -1056,7 +1063,7 @@ LABEL(nibble_ashr_7_use_sse4_2): | |
190 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
191 | # endif | |
192 | cmp $8, %ecx | |
193 | - ja LABEL(loop_ashr_7_use_sse4_2) | |
194 | + ja LABEL(nibble_ashr_7_use_sse4_2_restart) | |
195 | ||
196 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
197 | ||
198 | @@ -1102,6 +1109,7 @@ LABEL(loop_ashr_8_use_sse4_2): | |
199 | add $16, %r10 | |
200 | jg LABEL(nibble_ashr_8_use_sse4_2) | |
201 | ||
202 | +LABEL(nibble_ashr_8_use_sse4_2_restart): | |
203 | movdqa (%rdi, %rdx), %xmm0 | |
204 | palignr $8, -16(%rdi, %rdx), %xmm0 | |
205 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
206 | @@ -1149,7 +1157,7 @@ LABEL(nibble_ashr_8_use_sse4_2): | |
207 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
208 | # endif | |
209 | cmp $7, %ecx | |
210 | - ja LABEL(loop_ashr_8_use_sse4_2) | |
211 | + ja LABEL(nibble_ashr_8_use_sse4_2_restart) | |
212 | ||
213 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
214 | ||
215 | @@ -1195,6 +1203,7 @@ LABEL(loop_ashr_9_use_sse4_2): | |
216 | add $16, %r10 | |
217 | jg LABEL(nibble_ashr_9_use_sse4_2) | |
218 | ||
219 | +LABEL(nibble_ashr_9_use_sse4_2_restart): | |
220 | movdqa (%rdi, %rdx), %xmm0 | |
221 | ||
222 | palignr $9, -16(%rdi, %rdx), %xmm0 | |
223 | @@ -1243,7 +1252,7 @@ LABEL(nibble_ashr_9_use_sse4_2): | |
224 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
225 | # endif | |
226 | cmp $6, %ecx | |
227 | - ja LABEL(loop_ashr_9_use_sse4_2) | |
228 | + ja LABEL(nibble_ashr_9_use_sse4_2_restart) | |
229 | ||
230 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
231 | ||
232 | @@ -1289,6 +1298,7 @@ LABEL(loop_ashr_10_use_sse4_2): | |
233 | add $16, %r10 | |
234 | jg LABEL(nibble_ashr_10_use_sse4_2) | |
235 | ||
236 | +LABEL(nibble_ashr_10_use_sse4_2_restart): | |
237 | movdqa (%rdi, %rdx), %xmm0 | |
238 | palignr $10, -16(%rdi, %rdx), %xmm0 | |
239 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
240 | @@ -1336,7 +1346,7 @@ LABEL(nibble_ashr_10_use_sse4_2): | |
241 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
242 | # endif | |
243 | cmp $5, %ecx | |
244 | - ja LABEL(loop_ashr_10_use_sse4_2) | |
245 | + ja LABEL(nibble_ashr_10_use_sse4_2_restart) | |
246 | ||
247 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
248 | ||
249 | @@ -1382,6 +1392,7 @@ LABEL(loop_ashr_11_use_sse4_2): | |
250 | add $16, %r10 | |
251 | jg LABEL(nibble_ashr_11_use_sse4_2) | |
252 | ||
253 | +LABEL(nibble_ashr_11_use_sse4_2_restart): | |
254 | movdqa (%rdi, %rdx), %xmm0 | |
255 | palignr $11, -16(%rdi, %rdx), %xmm0 | |
256 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
257 | @@ -1429,7 +1440,7 @@ LABEL(nibble_ashr_11_use_sse4_2): | |
258 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
259 | # endif | |
260 | cmp $4, %ecx | |
261 | - ja LABEL(loop_ashr_11_use_sse4_2) | |
262 | + ja LABEL(nibble_ashr_11_use_sse4_2_restart) | |
263 | ||
264 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
265 | ||
266 | @@ -1475,6 +1486,7 @@ LABEL(loop_ashr_12_use_sse4_2): | |
267 | add $16, %r10 | |
268 | jg LABEL(nibble_ashr_12_use_sse4_2) | |
269 | ||
270 | +LABEL(nibble_ashr_12_use_sse4_2_restart): | |
271 | movdqa (%rdi, %rdx), %xmm0 | |
272 | palignr $12, -16(%rdi, %rdx), %xmm0 | |
273 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
274 | @@ -1522,7 +1534,7 @@ LABEL(nibble_ashr_12_use_sse4_2): | |
275 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
276 | # endif | |
277 | cmp $3, %ecx | |
278 | - ja LABEL(loop_ashr_12_use_sse4_2) | |
279 | + ja LABEL(nibble_ashr_12_use_sse4_2_restart) | |
280 | ||
281 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
282 | ||
283 | @@ -1569,6 +1581,7 @@ LABEL(loop_ashr_13_use_sse4_2): | |
284 | add $16, %r10 | |
285 | jg LABEL(nibble_ashr_13_use_sse4_2) | |
286 | ||
287 | +LABEL(nibble_ashr_13_use_sse4_2_restart): | |
288 | movdqa (%rdi, %rdx), %xmm0 | |
289 | palignr $13, -16(%rdi, %rdx), %xmm0 | |
290 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
291 | @@ -1616,7 +1629,7 @@ LABEL(nibble_ashr_13_use_sse4_2): | |
292 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
293 | # endif | |
294 | cmp $2, %ecx | |
295 | - ja LABEL(loop_ashr_13_use_sse4_2) | |
296 | + ja LABEL(nibble_ashr_13_use_sse4_2_restart) | |
297 | ||
298 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
299 | ||
300 | @@ -1663,6 +1676,7 @@ LABEL(loop_ashr_14_use_sse4_2): | |
301 | add $16, %r10 | |
302 | jg LABEL(nibble_ashr_14_use_sse4_2) | |
303 | ||
304 | +LABEL(nibble_ashr_14_use_sse4_2_restart): | |
305 | movdqa (%rdi, %rdx), %xmm0 | |
306 | palignr $14, -16(%rdi, %rdx), %xmm0 | |
307 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
308 | @@ -1710,7 +1724,7 @@ LABEL(nibble_ashr_14_use_sse4_2): | |
309 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
310 | # endif | |
311 | cmp $1, %ecx | |
312 | - ja LABEL(loop_ashr_14_use_sse4_2) | |
313 | + ja LABEL(nibble_ashr_14_use_sse4_2_restart) | |
314 | ||
315 | jmp LABEL(nibble_ashr_use_sse4_2_exit) | |
316 | ||
317 | @@ -1759,6 +1773,7 @@ LABEL(loop_ashr_15_use_sse4_2): | |
318 | add $16, %r10 | |
319 | jg LABEL(nibble_ashr_15_use_sse4_2) | |
320 | ||
321 | +LABEL(nibble_ashr_15_use_sse4_2_restart): | |
322 | movdqa (%rdi, %rdx), %xmm0 | |
323 | palignr $15, -16(%rdi, %rdx), %xmm0 | |
324 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L | |
325 | @@ -1806,7 +1821,7 @@ LABEL(nibble_ashr_15_use_sse4_2): | |
326 | jae LABEL(nibble_ashr_use_sse4_2_exit) | |
327 | # endif | |
328 | cmp $0, %ecx | |
329 | - ja LABEL(loop_ashr_15_use_sse4_2) | |
330 | + ja LABEL(nibble_ashr_15_use_sse4_2_restart) | |
331 | ||
332 | LABEL(nibble_ashr_use_sse4_2_exit): | |
333 | # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L |