~ubuntu-branches/ubuntu/precise/eglibc/precise

« back to all changes in this revision

Viewing changes to sysdeps/i386/i686/multiarch/strcmp-sse4.S

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2011-10-04 17:48:26 UTC
  • mfrom: (216.1.23 oneiric)
  • Revision ID: package-import@ubuntu.com-20111004174826-2cyb9ewn3ucymlsx
Tags: 2.13-20ubuntu5
libc6-dev: Don't break the current {gnat,gcj}-4.4-base versons. LP: #853688.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* strcmp with SSE4.2
2
 
   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
 
2
   Copyright (C) 2010 Free Software Foundation, Inc.
3
3
   Contributed by Intel Corporation.
4
4
   This file is part of the GNU C Library.
5
5
 
34
34
#define PUSH(REG)       pushl REG; CFI_PUSH (REG)
35
35
#define POP(REG)        popl REG; CFI_POP (REG)
36
36
 
37
 
#ifdef USE_AS_STRNCMP
38
 
# ifndef STRCMP
39
 
#  define STRCMP        __strncmp_sse4_2
40
 
# endif
41
 
# define STR1           8
42
 
# define STR2           STR1+4
43
 
# define CNT            STR2+4
44
 
# define RETURN         POP (REM); ret; .p2align 4; CFI_PUSH (REM)
45
 
# define REM            %ebp
46
 
#elif defined USE_AS_STRCASECMP_L
47
 
# include "locale-defines.h"
48
 
# ifndef STRCMP
49
 
#  define STRCMP        __strcasecmp_l_sse4_2
50
 
# endif
51
 
# ifdef PIC
52
 
#  define STR1          12
53
 
# else
54
 
#  define STR1          8
55
 
# endif
56
 
# define STR2           STR1+4
57
 
# define LOCALE         12      /* Loaded before the adjustement.  */
58
 
# ifdef PIC
59
 
#  define RETURN        POP (%edi); POP (%ebx); ret; \
60
 
                        .p2align 4; CFI_PUSH (%ebx); CFI_PUSH (%edi)
61
 
# else
62
 
#  define RETURN        POP (%edi); ret; .p2align 4; CFI_PUSH (%edi)
63
 
# endif
64
 
# define NONASCII       __strcasecmp_nonascii
65
 
#elif defined USE_AS_STRNCASECMP_L
66
 
# include "locale-defines.h"
67
 
# ifndef STRCMP
68
 
#  define STRCMP        __strncasecmp_l_sse4_2
69
 
# endif
70
 
# ifdef PIC
71
 
#  define STR1          16
72
 
# else
73
 
#  define STR1          12
74
 
# endif
75
 
# define STR2           STR1+4
76
 
# define CNT            STR2+4
77
 
# define LOCALE         16      /* Loaded before the adjustement.  */
78
 
# ifdef PIC
79
 
#  define RETURN        POP (%edi); POP (REM); POP (%ebx); ret; \
80
 
                        .p2align 4; \
81
 
                        CFI_PUSH (%ebx); CFI_PUSH (REM); CFI_PUSH (%edi)
82
 
# else
83
 
#  define RETURN        POP (%edi); POP (REM); ret; \
84
 
                        .p2align 4; CFI_PUSH (REM); CFI_PUSH (%edi)
85
 
# endif
86
 
# define REM            %ebp
87
 
# define NONASCII       __strncasecmp_nonascii
88
 
#else
 
37
#ifndef USE_AS_STRNCMP
89
38
# ifndef STRCMP
90
39
#  define STRCMP        __strcmp_sse4_2
91
40
# endif
92
41
# define STR1           4
93
42
# define STR2           STR1+4
94
43
# define RETURN         ret; .p2align 4
 
44
#else
 
45
# ifndef STRCMP
 
46
#  define STRCMP        __strncmp_sse4_2
 
47
# endif
 
48
# define STR1           8
 
49
# define STR2           STR1+4
 
50
# define CNT            STR2+4
 
51
# define RETURN         POP (%ebp); ret; .p2align 4; CFI_PUSH (%ebp)
95
52
#endif
96
53
 
97
54
        .section .text.sse4.2,"ax",@progbits
98
 
 
99
 
#ifdef USE_AS_STRCASECMP_L
100
 
ENTRY (__strcasecmp_sse4_2)
101
 
# ifdef PIC
102
 
        PUSH    (%ebx)
103
 
        call    __i686.get_pc_thunk.bx
104
 
        addl    $_GLOBAL_OFFSET_TABLE_, %ebx
105
 
        movl    __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
106
 
#  ifdef NO_TLS_DIRECT_SEG_REFS
107
 
        addl    %gs:0, %eax
108
 
        movl    (%eax), %eax
109
 
#  else
110
 
        movl    %gs:(%eax), %eax
111
 
#  endif
112
 
# else
113
 
#  ifdef NO_TLS_DIRECT_SEG_REFS
114
 
        movl    %gs:0, %eax
115
 
        movl    __libc_tsd_LOCALE@NTPOFF(%eax), %eax
116
 
#  else
117
 
        movl    %gs:__libc_tsd_LOCALE@NTPOFF, %eax
118
 
#  endif
119
 
# endif
120
 
# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
121
 
        movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
122
 
# else
123
 
        movl    (%eax), %eax
124
 
# endif
125
 
        testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
126
 
        jne     __strcasecmp_nonascii
127
 
        jmp     L(ascii)
128
 
END (__strcasecmp_sse4_2)
129
 
#endif
130
 
 
131
 
#ifdef USE_AS_STRNCASECMP_L
132
 
ENTRY (__strncasecmp_sse4_2)
133
 
# ifdef PIC
134
 
        PUSH    (%ebx)
135
 
        call    __i686.get_pc_thunk.bx
136
 
        addl    $_GLOBAL_OFFSET_TABLE_, %ebx
137
 
        movl    __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
138
 
#  ifdef NO_TLS_DIRECT_SEG_REFS
139
 
        addl    %gs:0, %eax
140
 
        movl    (%eax), %eax
141
 
#  else
142
 
        movl    %gs:(%eax), %eax
143
 
#  endif
144
 
# else
145
 
#  ifdef NO_TLS_DIRECT_SEG_REFS
146
 
        movl    %gs:0, %eax
147
 
        movl    __libc_tsd_LOCALE@NTPOFF(%eax), %eax
148
 
#  else
149
 
        movl    %gs:__libc_tsd_LOCALE@NTPOFF, %eax
150
 
#  endif
151
 
# endif
152
 
# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
153
 
        movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
154
 
# else
155
 
        movl    (%eax), %eax
156
 
# endif
157
 
        testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
158
 
        jne     __strncasecmp_nonascii
159
 
        jmp     L(ascii)
160
 
END (__strncasecmp_sse4_2)
161
 
#endif
162
 
 
163
 
        ENTRY (STRCMP)
164
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
165
 
        movl    LOCALE(%esp), %eax
166
 
# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
167
 
        movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
168
 
# else
169
 
        movl    (%eax), %eax
170
 
# endif
171
 
        testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
172
 
        jne     NONASCII
173
 
 
174
 
# ifdef PIC
175
 
        PUSH    (%ebx)
176
 
        call    __i686.get_pc_thunk.bx
177
 
        addl    $_GLOBAL_OFFSET_TABLE_, %ebx
178
 
# endif
179
 
L(ascii):
180
 
        .section .rodata.cst16,"aM",@progbits,16
181
 
        .align 16
182
 
.Lbelowupper:
183
 
        .quad   0x4040404040404040
184
 
        .quad   0x4040404040404040
185
 
.Ltopupper:
186
 
        .quad   0x5b5b5b5b5b5b5b5b
187
 
        .quad   0x5b5b5b5b5b5b5b5b
188
 
.Ltouppermask:
189
 
        .quad   0x2020202020202020
190
 
        .quad   0x2020202020202020
191
 
        .previous
192
 
 
193
 
# ifdef PIC
194
 
#  define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
195
 
#  define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
196
 
#  define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
197
 
# else
198
 
#  define UCLOW_reg .Lbelowupper
199
 
#  define UCHIGH_reg .Ltopupper
200
 
#  define LCQWORD_reg .Ltouppermask
201
 
# endif
202
 
#endif
203
 
 
204
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
205
 
        PUSH    (REM)
206
 
#endif
207
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
208
 
        PUSH    (%edi)
 
55
ENTRY (STRCMP)
 
56
#ifdef USE_AS_STRNCMP
 
57
        PUSH    (%ebp)
209
58
#endif
210
59
        mov     STR1(%esp), %edx
211
60
        mov     STR2(%esp), %eax
212
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
213
 
        movl    CNT(%esp), REM
214
 
        test    REM, REM
 
61
#ifdef USE_AS_STRNCMP
 
62
        movl    CNT(%esp), %ebp
 
63
        test    %ebp, %ebp
215
64
        je      L(eq)
216
65
#endif
217
66
        mov     %dx, %cx
223
72
        and     $0xfff, %ecx
224
73
        cmp     $0xff0, %ecx
225
74
        ja      L(first4bytes)
226
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
227
 
# define TOLOWER(reg1, reg2) \
228
 
        movdqa  reg1, %xmm3;                                                  \
229
 
        movdqa  UCHIGH_reg, %xmm4;                                            \
230
 
        movdqa  reg2, %xmm5;                                                  \
231
 
        movdqa  UCHIGH_reg, %xmm6;                                            \
232
 
        pcmpgtb UCLOW_reg, %xmm3;                                             \
233
 
        pcmpgtb reg1, %xmm4;                                                  \
234
 
        pcmpgtb UCLOW_reg, %xmm5;                                             \
235
 
        pcmpgtb reg2, %xmm6;                                                  \
236
 
        pand    %xmm4, %xmm3;                                                 \
237
 
        pand    %xmm6, %xmm5;                                                 \
238
 
        pand    LCQWORD_reg, %xmm3;                                           \
239
 
        pand    LCQWORD_reg, %xmm5;                                           \
240
 
        por     %xmm3, reg1;                                                  \
241
 
        por     %xmm5, reg2
242
 
 
243
 
        movdqu  (%eax), %xmm1
244
 
        TOLOWER (%xmm2, %xmm1)
245
 
        movd    %xmm2, %ecx
246
 
        movd    %xmm1, %edi
247
 
        movdqa  %xmm2, %xmm3
248
 
        movdqa  %xmm1, %xmm4
249
 
        cmpl    %edi, %ecx
250
 
#else
251
 
# define TOLOWER(reg1, reg)
252
 
 
253
75
        movd    %xmm2, %ecx
254
76
        cmp     (%eax), %ecx
255
 
#endif
256
77
        jne     L(less4bytes)
257
 
#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
258
78
        movdqu  (%eax), %xmm1
259
 
#endif
260
79
        pxor    %xmm2, %xmm1
261
80
        pxor    %xmm0, %xmm0
262
81
        ptest   %xmm1, %xmm0
265
84
        ptest   %xmm2, %xmm0
266
85
        jnc     L(less16bytes)
267
86
 
268
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
269
 
        sub     $16, REM
 
87
#ifdef USE_AS_STRNCMP
 
88
        sub     $16, %ebp
270
89
        jbe     L(eq)
271
90
#endif
272
91
        add     $16, %edx
273
92
        add     $16, %eax
274
93
L(first4bytes):
275
94
        movzbl  (%eax), %ecx
276
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
277
 
        movzbl  (%edx), %edi
278
 
# ifdef PIC
279
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
280
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
281
 
# else
282
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
283
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
284
 
# endif
285
 
        cmpl    %ecx, %edi
286
 
#else
287
95
        cmpb    %cl, (%edx)
288
 
#endif
289
96
        jne     L(neq)
290
97
        cmpl    $0, %ecx
291
98
        je      L(eq)
292
99
 
293
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
294
 
        cmp     $1, REM
 
100
#ifdef USE_AS_STRNCMP
 
101
        cmp     $1, %ebp
295
102
        je      L(eq)
296
103
#endif
297
104
 
298
105
        movzbl  1(%eax), %ecx
299
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
300
 
        movzbl  1(%edx), %edi
301
 
# ifdef PIC
302
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
303
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
304
 
# else
305
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
306
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
307
 
# endif
308
 
        cmpl    %ecx, %edi
309
 
#else
310
106
        cmpb    %cl, 1(%edx)
311
 
#endif
312
107
        jne     L(neq)
313
108
        cmpl    $0, %ecx
314
109
        je      L(eq)
315
110
 
316
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
317
 
        cmp     $2, REM
 
111
#ifdef USE_AS_STRNCMP
 
112
        cmp     $2, %ebp
318
113
        je      L(eq)
319
114
#endif
320
115
        movzbl  2(%eax), %ecx
321
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
322
 
        movzbl  2(%edx), %edi
323
 
# ifdef PIC
324
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
325
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
326
 
# else
327
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
328
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
329
 
# endif
330
 
        cmpl    %ecx, %edi
331
 
#else
332
116
        cmpb    %cl, 2(%edx)
333
 
#endif
334
117
        jne     L(neq)
335
118
        cmpl    $0, %ecx
336
119
        je      L(eq)
337
120
 
338
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
339
 
        cmp     $3, REM
 
121
#ifdef USE_AS_STRNCMP
 
122
        cmp     $3, %ebp
340
123
        je      L(eq)
341
124
#endif
342
125
        movzbl  3(%eax), %ecx
343
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
344
 
        movzbl  3(%edx), %edi
345
 
# ifdef PIC
346
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
347
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
348
 
# else
349
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
350
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
351
 
# endif
352
 
        cmpl    %ecx, %edi
353
 
#else
354
126
        cmpb    %cl, 3(%edx)
355
 
#endif
356
127
        jne     L(neq)
357
128
        cmpl    $0, %ecx
358
129
        je      L(eq)
359
130
 
360
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
361
 
        cmp     $4, REM
 
131
#ifdef USE_AS_STRNCMP
 
132
        cmp     $4, %ebp
362
133
        je      L(eq)
363
134
#endif
364
135
        movzbl  4(%eax), %ecx
365
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
366
 
        movzbl  4(%edx), %edi
367
 
# ifdef PIC
368
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
369
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
370
 
# else
371
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
372
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
373
 
# endif
374
 
        cmpl    %ecx, %edi
375
 
#else
376
136
        cmpb    %cl, 4(%edx)
377
 
#endif
378
137
        jne     L(neq)
379
138
        cmpl    $0, %ecx
380
139
        je      L(eq)
381
140
 
382
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
383
 
        cmp     $5, REM
 
141
#ifdef USE_AS_STRNCMP
 
142
        cmp     $5, %ebp
384
143
        je      L(eq)
385
144
#endif
386
145
        movzbl  5(%eax), %ecx
387
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
388
 
        movzbl  5(%edx), %edi
389
 
# ifdef PIC
390
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
391
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
392
 
# else
393
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
394
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
395
 
# endif
396
 
        cmpl    %ecx, %edi
397
 
#else
398
146
        cmpb    %cl, 5(%edx)
399
 
#endif
400
147
        jne     L(neq)
401
148
        cmpl    $0, %ecx
402
149
        je      L(eq)
403
150
 
404
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
405
 
        cmp     $6, REM
 
151
#ifdef USE_AS_STRNCMP
 
152
        cmp     $6, %ebp
406
153
        je      L(eq)
407
154
#endif
408
155
        movzbl  6(%eax), %ecx
409
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
410
 
        movzbl  6(%edx), %edi
411
 
# ifdef PIC
412
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
413
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
414
 
# else
415
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
416
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
417
 
# endif
418
 
        cmpl    %ecx, %edi
419
 
#else
420
156
        cmpb    %cl, 6(%edx)
421
 
#endif
422
157
        jne     L(neq)
423
158
        cmpl    $0, %ecx
424
159
        je      L(eq)
425
160
 
426
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
427
 
        cmp     $7, REM
 
161
#ifdef USE_AS_STRNCMP
 
162
        cmp     $7, %ebp
428
163
        je      L(eq)
429
164
#endif
430
165
        movzbl  7(%eax), %ecx
431
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
432
 
        movzbl  7(%edx), %edi
433
 
# ifdef PIC
434
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
435
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
436
 
# else
437
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
438
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
439
 
# endif
440
 
        cmpl    %ecx, %edi
441
 
#else
442
166
        cmpb    %cl, 7(%edx)
443
 
#endif
444
167
        jne     L(neq)
445
168
        cmpl    $0, %ecx
446
169
        je      L(eq)
447
170
 
448
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
449
 
        sub     $8, REM
 
171
#ifdef USE_AS_STRNCMP
 
172
        sub     $8, %ebp
450
173
        je      L(eq)
451
174
#endif
452
175
        add     $8, %eax
453
176
        add     $8, %edx
454
177
 
455
 
#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
178
        PUSH    (%ebx)
456
179
        PUSH    (%edi)
457
 
#endif
458
180
        PUSH    (%esi)
459
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
 
181
#ifdef USE_AS_STRNCMP
460
182
        cfi_remember_state
461
183
#endif
462
184
        mov     %edx, %edi
463
185
        mov     %eax, %esi
464
186
        xorl    %eax, %eax
465
187
L(check_offset):
466
 
        movl    %edi, %edx
 
188
        movl    %edi, %ebx
467
189
        movl    %esi, %ecx
468
 
        andl    $0xfff, %edx
 
190
        andl    $0xfff, %ebx
469
191
        andl    $0xfff, %ecx
470
 
        cmpl    %edx, %ecx
471
 
        cmovl   %edx, %ecx
 
192
        cmpl    %ebx, %ecx
 
193
        cmovl   %ebx, %ecx
472
194
        lea     -0xff0(%ecx), %edx
473
195
        sub     %edx, %edi
474
196
        sub     %edx, %esi
477
199
L(loop):
478
200
        movdqu  (%esi,%edx), %xmm2
479
201
        movdqu  (%edi,%edx), %xmm1
480
 
        TOLOWER (%xmm2, %xmm1)
481
202
        pcmpistri       $0x1a, %xmm2, %xmm1
482
203
        jbe     L(end)
483
204
 
484
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
485
 
        sub     $16, REM
 
205
#ifdef USE_AS_STRNCMP
 
206
        sub     $16, %ebp
486
207
        jbe     L(more16byteseq)
487
208
#endif
488
209
 
490
211
        jle     L(loop)
491
212
L(crosspage):
492
213
        movzbl  (%edi,%edx), %eax
493
 
        movzbl  (%esi,%edx), %ecx
494
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
495
 
# ifdef PIC
496
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
497
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
498
 
# else
499
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
500
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
501
 
# endif
502
 
#endif
503
 
        subl    %ecx, %eax
 
214
        movzbl  (%esi,%edx), %ebx
 
215
        subl    %ebx, %eax
504
216
        jne     L(ret)
505
 
        testl   %ecx, %ecx
 
217
        testl   %ebx, %ebx
506
218
        je      L(ret)
507
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
508
 
        sub     $1, REM
 
219
#ifdef USE_AS_STRNCMP
 
220
        sub     $1, %ebp
509
221
        jbe     L(more16byteseq)
510
222
#endif
511
223
        inc     %edx
518
230
        .p2align 4
519
231
L(end):
520
232
        jnc     L(ret)
521
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
522
 
        sub     %ecx, REM
 
233
#ifdef USE_AS_STRNCMP
 
234
        sub     %ecx, %ebp
523
235
        jbe     L(more16byteseq)
524
236
#endif
525
 
        lea     (%ecx,%edx), %ecx
526
 
        movzbl  (%edi,%ecx), %eax
527
 
        movzbl  (%esi,%ecx), %ecx
528
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
529
 
# ifdef PIC
530
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
531
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
532
 
# else
533
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
534
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
535
 
# endif
536
 
#endif
 
237
        lea     (%ecx,%edx), %ebx
 
238
        movzbl  (%edi,%ebx), %eax
 
239
        movzbl  (%esi,%ebx), %ecx
537
240
        subl    %ecx, %eax
538
241
L(ret):
539
242
        POP     (%esi)
540
243
        POP     (%edi)
541
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
542
 
        POP     (REM)
543
 
#endif
544
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
545
 
# ifdef PIC
546
244
        POP     (%ebx)
547
 
# endif
 
245
#ifdef USE_AS_STRNCMP
 
246
        POP     (%ebp)
548
247
#endif
549
248
        ret
550
249
 
551
250
        .p2align 4
552
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
 
251
#ifdef USE_AS_STRNCMP
553
252
        cfi_restore_state
554
253
L(more16byteseq):
555
254
        POP     (%esi)
556
 
# ifdef USE_AS_STRNCMP
557
255
        POP     (%edi)
558
 
# endif
 
256
        POP     (%ebx)
559
257
#endif
560
258
L(eq):
561
259
        xorl    %eax, %eax
571
269
L(less16bytes):
572
270
        add     $0xfefefeff, %ecx
573
271
        jnc     L(less4bytes)
574
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
575
 
        movd    %xmm3, %edi
576
 
        xor     %edi, %ecx
577
 
#else
578
272
        xor     (%edx), %ecx
579
 
#endif
580
273
        or      $0xfefefeff, %ecx
581
274
        add     $1, %ecx
582
275
        jnz     L(less4bytes)
583
276
 
584
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
585
 
        cmp     $4, REM
 
277
#ifdef USE_AS_STRNCMP
 
278
        cmp     $4, %ebp
586
279
        jbe     L(eq)
587
280
#endif
588
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
589
 
        psrldq  $4, %xmm3
590
 
        psrldq  $4, %xmm4
591
 
        movd    %xmm3, %ecx
592
 
        movd    %xmm4, %edi
593
 
        cmp     %edi, %ecx
594
 
        mov     %ecx, %edi
595
 
#else
596
281
        mov     4(%edx), %ecx
597
282
        cmp     4(%eax), %ecx
598
 
#endif
599
283
        jne     L(more4bytes)
600
284
        add     $0xfefefeff, %ecx
601
285
        jnc     L(more4bytes)
602
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
603
 
        xor     %edi, %ecx
604
 
#else
605
286
        xor     4(%edx), %ecx
606
 
#endif
607
287
        or      $0xfefefeff, %ecx
608
288
        add     $1, %ecx
609
289
        jnz     L(more4bytes)
610
290
 
611
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
612
 
        sub     $8, REM
 
291
#ifdef USE_AS_STRNCMP
 
292
        sub     $8, %ebp
613
293
        jbe     L(eq)
614
294
#endif
615
295
 
618
298
L(less4bytes):
619
299
 
620
300
        movzbl  (%eax), %ecx
621
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
622
 
        movzbl  (%edx), %edi
623
 
# ifdef PIC
624
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
625
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
626
 
# else
627
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
628
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
629
 
# endif
630
 
        cmpl    %ecx, %edi
631
 
#else
632
301
        cmpb    %cl, (%edx)
633
 
#endif
634
302
        jne     L(neq)
635
303
        cmpl    $0, %ecx
636
304
        je      L(eq)
637
305
 
638
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
639
 
        cmp     $1, REM
 
306
#ifdef USE_AS_STRNCMP
 
307
        cmp     $1, %ebp
640
308
        je      L(eq)
641
309
#endif
642
310
        movzbl  1(%eax), %ecx
643
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
644
 
        movzbl  1(%edx), %edi
645
 
# ifdef PIC
646
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
647
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
648
 
# else
649
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
650
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
651
 
# endif
652
 
        cmpl    %ecx, %edi
653
 
#else
654
311
        cmpb    %cl, 1(%edx)
655
 
#endif
656
312
        jne     L(neq)
657
313
        cmpl    $0, %ecx
658
314
        je      L(eq)
659
315
 
660
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
661
 
        cmp     $2, REM
 
316
#ifdef USE_AS_STRNCMP
 
317
        cmp     $2, %ebp
662
318
        je      L(eq)
663
319
#endif
664
320
 
665
321
        movzbl  2(%eax), %ecx
666
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
667
 
        movzbl  2(%edx), %edi
668
 
# ifdef PIC
669
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
670
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
671
 
# else
672
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
673
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
674
 
# endif
675
 
        cmpl    %ecx, %edi
676
 
#else
677
322
        cmpb    %cl, 2(%edx)
678
 
#endif
679
323
        jne     L(neq)
680
324
        cmpl    $0, %ecx
681
325
        je      L(eq)
682
326
 
683
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
684
 
        cmp     $3, REM
 
327
#ifdef USE_AS_STRNCMP
 
328
        cmp     $3, %ebp
685
329
        je      L(eq)
686
330
#endif
687
331
        movzbl  3(%eax), %ecx
688
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
689
 
        movzbl  3(%edx), %edi
690
 
# ifdef PIC
691
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
692
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
693
 
# else
694
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
695
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
696
 
# endif
697
 
        cmpl    %ecx, %edi
698
 
#else
699
332
        cmpb    %cl, 3(%edx)
700
 
#endif
701
333
        jne     L(neq)
702
334
        cmpl    $0, %ecx
703
335
        je      L(eq)
704
336
 
705
337
L(more4bytes):
706
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
707
 
        cmp     $4, REM
 
338
#ifdef USE_AS_STRNCMP
 
339
        cmp     $4, %ebp
708
340
        je      L(eq)
709
341
#endif
710
342
        movzbl  4(%eax), %ecx
711
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
712
 
        movzbl  4(%edx), %edi
713
 
# ifdef PIC
714
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
715
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
716
 
# else
717
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
718
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
719
 
# endif
720
 
        cmpl    %ecx, %edi
721
 
#else
722
343
        cmpb    %cl, 4(%edx)
723
 
#endif
724
344
        jne     L(neq)
725
345
        cmpl    $0, %ecx
726
346
        je      L(eq)
727
347
 
728
348
 
729
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
730
 
        cmp     $5, REM
 
349
#ifdef USE_AS_STRNCMP
 
350
        cmp     $5, %ebp
731
351
        je      L(eq)
732
352
#endif
733
353
        movzbl  5(%eax), %ecx
734
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
735
 
        movzbl  5(%edx), %edi
736
 
# ifdef PIC
737
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
738
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
739
 
# else
740
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
741
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
742
 
# endif
743
 
        cmpl    %ecx, %edi
744
 
#else
745
354
        cmpb    %cl, 5(%edx)
746
 
#endif
747
355
        jne     L(neq)
748
356
        cmpl    $0, %ecx
749
357
        je      L(eq)
750
358
 
751
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
752
 
        cmp     $6, REM
 
359
#ifdef USE_AS_STRNCMP
 
360
        cmp     $6, %ebp
753
361
        je      L(eq)
754
362
#endif
755
363
        movzbl  6(%eax), %ecx
756
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
757
 
        movzbl  6(%edx), %edi
758
 
# ifdef PIC
759
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
760
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
761
 
# else
762
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
763
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
764
 
# endif
765
 
        cmpl    %ecx, %edi
766
 
#else
767
364
        cmpb    %cl, 6(%edx)
768
 
#endif
769
365
        jne     L(neq)
770
366
        cmpl    $0, %ecx
771
367
        je      L(eq)
772
368
 
773
 
#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
774
 
        cmp     $7, REM
 
369
#ifdef USE_AS_STRNCMP
 
370
        cmp     $7, %ebp
775
371
        je      L(eq)
776
372
#endif
777
373
        movzbl  7(%eax), %ecx
778
 
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
779
 
        movzbl  7(%edx), %edi
780
 
# ifdef PIC
781
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
782
 
        movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
783
 
# else
784
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
785
 
        movl    _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
786
 
# endif
787
 
        cmpl    %ecx, %edi
788
 
#else
789
374
        cmpb    %cl, 7(%edx)
790
 
#endif
791
375
        jne     L(neq)
792
376
        jmp     L(eq)
793
377