1 2011-03-20 H.J. Lu <hongjiu.lu@intel.com>
4 * string/test-strncmp.c (do_page_test): New function.
6 (test_main): Call check2.
7 * sysdeps/x86_64/multiarch/strcmp.S: Properly cross page boundary.
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
17 +do_page_test (size_t offset1, size_t offset2, char *s2)
22 + if (offset1 >= page_size || offset2 >= page_size)
25 + s1 = (char *) (buf1 + offset1);
30 + FOR_EACH_IMPL (impl, 0)
32 + check_result (impl, s1, s2, page_size, -exp_result);
33 + check_result (impl, s2, s1, page_size, exp_result);
38 do_random_tests (void)
40 size_t i, j, n, align1, align2, pos, len1, len2, size;
41 @@ -312,6 +333,25 @@ check1 (void)
52 + for (i = 0; i < page_size - 1; i++)
58 + for (i = 0; i < 64; ++i)
59 + do_page_test (3990 + i, 2635, s2);
67 @@ -320,6 +360,7 @@ test_main (void)
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):
81 jg LABEL(nibble_ashr_1_use_sse4_2)
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)
91 - ja LABEL(loop_ashr_1_use_sse4_2)
92 + ja LABEL(nibble_ashr_1_use_sse4_2_restart)
94 jmp LABEL(nibble_ashr_use_sse4_2_exit)
96 @@ -544,6 +545,7 @@ LABEL(loop_ashr_2_use_sse4_2):
98 jg LABEL(nibble_ashr_2_use_sse4_2)
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)
108 - ja LABEL(loop_ashr_2_use_sse4_2)
109 + ja LABEL(nibble_ashr_2_use_sse4_2_restart)
111 jmp LABEL(nibble_ashr_use_sse4_2_exit)
113 @@ -636,6 +638,7 @@ LABEL(loop_ashr_3_use_sse4_2):
115 jg LABEL(nibble_ashr_3_use_sse4_2)
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)
125 - ja LABEL(loop_ashr_3_use_sse4_2)
126 + ja LABEL(nibble_ashr_3_use_sse4_2_restart)
128 jmp LABEL(nibble_ashr_use_sse4_2_exit)
130 @@ -729,6 +732,7 @@ LABEL(loop_ashr_4_use_sse4_2):
132 jg LABEL(nibble_ashr_4_use_sse4_2)
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)
142 - ja LABEL(loop_ashr_4_use_sse4_2)
143 + ja LABEL(nibble_ashr_4_use_sse4_2_restart)
145 jmp LABEL(nibble_ashr_use_sse4_2_exit)
147 @@ -822,6 +826,7 @@ LABEL(loop_ashr_5_use_sse4_2):
149 jg LABEL(nibble_ashr_5_use_sse4_2)
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)
159 - ja LABEL(loop_ashr_5_use_sse4_2)
160 + ja LABEL(nibble_ashr_5_use_sse4_2_restart)
162 jmp LABEL(nibble_ashr_use_sse4_2_exit)
164 @@ -916,6 +921,7 @@ LABEL(loop_ashr_6_use_sse4_2):
166 jg LABEL(nibble_ashr_6_use_sse4_2)
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)
176 - ja LABEL(loop_ashr_6_use_sse4_2)
177 + ja LABEL(nibble_ashr_6_use_sse4_2_restart)
179 jmp LABEL(nibble_ashr_use_sse4_2_exit)
181 @@ -1009,6 +1015,7 @@ LABEL(loop_ashr_7_use_sse4_2):
183 jg LABEL(nibble_ashr_7_use_sse4_2)
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)
193 - ja LABEL(loop_ashr_7_use_sse4_2)
194 + ja LABEL(nibble_ashr_7_use_sse4_2_restart)
196 jmp LABEL(nibble_ashr_use_sse4_2_exit)
198 @@ -1102,6 +1109,7 @@ LABEL(loop_ashr_8_use_sse4_2):
200 jg LABEL(nibble_ashr_8_use_sse4_2)
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)
210 - ja LABEL(loop_ashr_8_use_sse4_2)
211 + ja LABEL(nibble_ashr_8_use_sse4_2_restart)
213 jmp LABEL(nibble_ashr_use_sse4_2_exit)
215 @@ -1195,6 +1203,7 @@ LABEL(loop_ashr_9_use_sse4_2):
217 jg LABEL(nibble_ashr_9_use_sse4_2)
219 +LABEL(nibble_ashr_9_use_sse4_2_restart):
220 movdqa (%rdi, %rdx), %xmm0
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)
227 - ja LABEL(loop_ashr_9_use_sse4_2)
228 + ja LABEL(nibble_ashr_9_use_sse4_2_restart)
230 jmp LABEL(nibble_ashr_use_sse4_2_exit)
232 @@ -1289,6 +1298,7 @@ LABEL(loop_ashr_10_use_sse4_2):
234 jg LABEL(nibble_ashr_10_use_sse4_2)
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)
244 - ja LABEL(loop_ashr_10_use_sse4_2)
245 + ja LABEL(nibble_ashr_10_use_sse4_2_restart)
247 jmp LABEL(nibble_ashr_use_sse4_2_exit)
249 @@ -1382,6 +1392,7 @@ LABEL(loop_ashr_11_use_sse4_2):
251 jg LABEL(nibble_ashr_11_use_sse4_2)
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)
261 - ja LABEL(loop_ashr_11_use_sse4_2)
262 + ja LABEL(nibble_ashr_11_use_sse4_2_restart)
264 jmp LABEL(nibble_ashr_use_sse4_2_exit)
266 @@ -1475,6 +1486,7 @@ LABEL(loop_ashr_12_use_sse4_2):
268 jg LABEL(nibble_ashr_12_use_sse4_2)
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)
278 - ja LABEL(loop_ashr_12_use_sse4_2)
279 + ja LABEL(nibble_ashr_12_use_sse4_2_restart)
281 jmp LABEL(nibble_ashr_use_sse4_2_exit)
283 @@ -1569,6 +1581,7 @@ LABEL(loop_ashr_13_use_sse4_2):
285 jg LABEL(nibble_ashr_13_use_sse4_2)
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)
295 - ja LABEL(loop_ashr_13_use_sse4_2)
296 + ja LABEL(nibble_ashr_13_use_sse4_2_restart)
298 jmp LABEL(nibble_ashr_use_sse4_2_exit)
300 @@ -1663,6 +1676,7 @@ LABEL(loop_ashr_14_use_sse4_2):
302 jg LABEL(nibble_ashr_14_use_sse4_2)
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)
312 - ja LABEL(loop_ashr_14_use_sse4_2)
313 + ja LABEL(nibble_ashr_14_use_sse4_2_restart)
315 jmp LABEL(nibble_ashr_use_sse4_2_exit)
317 @@ -1759,6 +1773,7 @@ LABEL(loop_ashr_15_use_sse4_2):
319 jg LABEL(nibble_ashr_15_use_sse4_2)
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)
329 - ja LABEL(loop_ashr_15_use_sse4_2)
330 + ja LABEL(nibble_ashr_15_use_sse4_2_restart)
332 LABEL(nibble_ashr_use_sse4_2_exit):
333 # if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L