~vorlon/ubuntu/natty/eglibc/multiarch

« back to all changes in this revision

Viewing changes to sysdeps/x86_64/multiarch/strcmp.S

  • Committer: Steve Langasek
  • Date: 2011-02-18 21:18:44 UTC
  • mfrom: (103.1.7 eglibc)
  • Revision ID: steve.langasek@linaro.org-20110218211844-lodmi8b1qhyq3f3x
Tags: 2.13~pre1-0ubuntu1+multiarch.1
merge from natty

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* strcmp with SSE4.2
2
 
   Copyright (C) 2009 Free Software Foundation, Inc.
 
2
   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
3
3
   Contributed by Intel Corporation.
4
4
   This file is part of the GNU C Library.
5
5
 
24
24
#ifdef USE_AS_STRNCMP
25
25
/* Since the counter, %r11, is unsigned, we branch to strcmp_exitz
26
26
   if the new counter > the old one or is 0.  */
27
 
#define UPDATE_STRNCMP_COUNTER                          \
28
 
        /* calculate left number to compare */          \
29
 
        lea     -16(%rcx, %r11), %r9;                   \
30
 
        cmp     %r9, %r11;                              \
31
 
        jb      LABEL(strcmp_exitz_sse4_2);             \
32
 
        test    %r9, %r9;                               \
33
 
        je      LABEL(strcmp_exitz_sse4_2);             \
34
 
        mov     %r9, %r11
35
 
 
36
 
#define STRCMP_SSE42    __strncmp_sse42
37
 
#define STRCMP_SSSE3    __strncmp_ssse3
38
 
#define STRCMP_SSE2     __strncmp_sse2
39
 
#define __GI_STRCMP     __GI_strncmp
 
27
# define UPDATE_STRNCMP_COUNTER                         \
 
28
        /* calculate left number to compare */          \
 
29
        lea     -16(%rcx, %r11), %r9;                   \
 
30
        cmp     %r9, %r11;                              \
 
31
        jb      LABEL(strcmp_exitz_sse4_2);             \
 
32
        test    %r9, %r9;                               \
 
33
        je      LABEL(strcmp_exitz_sse4_2);             \
 
34
        mov     %r9, %r11
 
35
 
 
36
# define STRCMP_SSE42   __strncmp_sse42
 
37
# define STRCMP_SSSE3   __strncmp_ssse3
 
38
# define STRCMP_SSE2    __strncmp_sse2
 
39
# define __GI_STRCMP    __GI_strncmp
 
40
#elif defined USE_AS_STRCASECMP_L
 
41
# include "locale-defines.h"
 
42
 
 
43
# define UPDATE_STRNCMP_COUNTER
 
44
 
 
45
# define STRCMP_SSE42   __strcasecmp_l_sse42
 
46
# define STRCMP_SSSE3   __strcasecmp_l_ssse3
 
47
# define STRCMP_SSE2    __strcasecmp_l_sse2
 
48
# define __GI_STRCMP    __GI___strcasecmp_l
 
49
#elif defined USE_AS_STRNCASECMP_L
 
50
# include "locale-defines.h"
 
51
 
 
52
/* Since the counter, %r11, is unsigned, we branch to strcmp_exitz
 
53
   if the new counter > the old one or is 0.  */
 
54
# define UPDATE_STRNCMP_COUNTER                         \
 
55
        /* calculate left number to compare */          \
 
56
        lea     -16(%rcx, %r11), %r9;                   \
 
57
        cmp     %r9, %r11;                              \
 
58
        jb      LABEL(strcmp_exitz_sse4_2);             \
 
59
        test    %r9, %r9;                               \
 
60
        je      LABEL(strcmp_exitz_sse4_2);             \
 
61
        mov     %r9, %r11
 
62
 
 
63
# define STRCMP_SSE42   __strncasecmp_l_sse42
 
64
# define STRCMP_SSSE3   __strncasecmp_l_ssse3
 
65
# define STRCMP_SSE2    __strncasecmp_l_sse2
 
66
# define __GI_STRCMP    __GI___strncasecmp_l
40
67
#else
41
 
#define UPDATE_STRNCMP_COUNTER
42
 
#ifndef STRCMP
43
 
#define STRCMP          strcmp
44
 
#define STRCMP_SSE42    __strcmp_sse42
45
 
#define STRCMP_SSSE3    __strcmp_ssse3
46
 
#define STRCMP_SSE2     __strcmp_sse2
47
 
#define __GI_STRCMP     __GI_strcmp
48
 
#endif
 
68
# define UPDATE_STRNCMP_COUNTER
 
69
# ifndef STRCMP
 
70
#  define STRCMP        strcmp
 
71
#  define STRCMP_SSE42  __strcmp_sse42
 
72
#  define STRCMP_SSSE3  __strcmp_ssse3
 
73
#  define STRCMP_SSE2   __strcmp_sse2
 
74
#  define __GI_STRCMP   __GI_strcmp
 
75
# endif
49
76
#endif
50
77
 
51
78
#ifndef LABEL
52
 
#define LABEL(l) L(l)
 
79
# define LABEL(l) L(l)
53
80
#endif
54
81
 
55
82
/* Define multiple versions only for the definition in libc.  Don't
73
100
2:      ret
74
101
END(STRCMP)
75
102
 
 
103
# ifdef USE_AS_STRCASECMP_L
 
104
ENTRY(__strcasecmp)
 
105
        .type   __strcasecmp, @gnu_indirect_function
 
106
        cmpl    $0, __cpu_features+KIND_OFFSET(%rip)
 
107
        jne     1f
 
108
        call    __init_cpu_features
 
109
1:
 
110
        leaq    __strcasecmp_sse42(%rip), %rax
 
111
        testl   $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip)
 
112
        jnz     2f
 
113
        leaq    __strcasecmp_ssse3(%rip), %rax
 
114
        testl   $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip)
 
115
        jnz     2f
 
116
        leaq    __strcasecmp_sse2(%rip), %rax
 
117
2:      ret
 
118
END(__strcasecmp)
 
119
weak_alias (__strcasecmp, strcasecmp)
 
120
# endif
 
121
# ifdef USE_AS_STRNCASECMP_L
 
122
ENTRY(__strncasecmp)
 
123
        .type   __strncasecmp, @gnu_indirect_function
 
124
        cmpl    $0, __cpu_features+KIND_OFFSET(%rip)
 
125
        jne     1f
 
126
        call    __init_cpu_features
 
127
1:
 
128
        leaq    __strncasecmp_sse42(%rip), %rax
 
129
        testl   $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip)
 
130
        jnz     2f
 
131
        leaq    __strncasecmp_ssse3(%rip), %rax
 
132
        testl   $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip)
 
133
        jnz     2f
 
134
        leaq    __strncasecmp_sse2(%rip), %rax
 
135
2:      ret
 
136
END(__strncasecmp)
 
137
weak_alias (__strncasecmp, strncasecmp)
 
138
# endif
 
139
 
76
140
/* We use 0x1a:
77
141
        _SIDD_SBYTE_OPS
78
142
        | _SIDD_CMP_EQUAL_EACH
101
165
 
102
166
        /* Put all SSE 4.2 functions together.  */
103
167
        .section .text.sse4.2,"ax",@progbits
104
 
        .align  16
 
168
        .align  16
105
169
        .type   STRCMP_SSE42, @function
 
170
# ifdef USE_AS_STRCASECMP_L
 
171
ENTRY (__strcasecmp_sse42)
 
172
        movq    __libc_tsd_LOCALE@gottpoff(%rip),%rax
 
173
        movq    %fs:(%rax),%rdx
 
174
 
 
175
        // XXX 5 byte should be before the function
 
176
        /* 5-byte NOP.  */
 
177
        .byte   0x0f,0x1f,0x44,0x00,0x00
 
178
END (__strcasecmp_sse42)
 
179
        /* FALLTHROUGH to strcasecmp_l.  */
 
180
# endif
 
181
# ifdef USE_AS_STRNCASECMP_L
 
182
ENTRY (__strncasecmp_sse42)
 
183
        movq    __libc_tsd_LOCALE@gottpoff(%rip),%rax
 
184
        movq    %fs:(%rax),%rcx
 
185
 
 
186
        // XXX 5 byte should be before the function
 
187
        /* 5-byte NOP.  */
 
188
        .byte   0x0f,0x1f,0x44,0x00,0x00
 
189
END (__strncasecmp_sse42)
 
190
        /* FALLTHROUGH to strncasecmp_l.  */
 
191
# endif
 
192
 
106
193
STRCMP_SSE42:
107
194
        cfi_startproc
108
195
        CALL_MCOUNT
110
197
/*
111
198
 * This implementation uses SSE to compare up to 16 bytes at a time.
112
199
 */
113
 
#ifdef USE_AS_STRNCMP
 
200
# ifdef USE_AS_STRCASECMP_L
 
201
        /* We have to fall back on the C implementation for locales
 
202
           with encodings not matching ASCII for single bytes.  */
 
203
#  if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
 
204
        movq    LOCALE_T___LOCALES+LC_CTYPE*8(%rdx), %rax
 
205
#  else
 
206
        movq    (%rdx), %rax
 
207
#  endif
 
208
        testl   $0, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%rax)
 
209
        jne     __strcasecmp_l_nonascii
 
210
# endif
 
211
# ifdef USE_AS_STRNCASECMP_L
 
212
        /* We have to fall back on the C implementation for locales
 
213
           with encodings not matching ASCII for single bytes.  */
 
214
#  if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
 
215
        movq    LOCALE_T___LOCALES+LC_CTYPE*8(%rcx), %rax
 
216
#  else
 
217
        movq    (%rcx), %rax
 
218
#  endif
 
219
        testl   $0, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%rax)
 
220
        jne     __strncasecmp_l_nonascii
 
221
# endif
 
222
 
 
223
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
114
224
        test    %rdx, %rdx
115
225
        je      LABEL(strcmp_exitz_sse4_2)
116
226
        cmp     $1, %rdx
117
227
        je      LABEL(Byte0_sse4_2)
118
228
        mov     %rdx, %r11
119
 
#endif
 
229
# endif
120
230
        mov     %esi, %ecx
121
231
        mov     %edi, %eax
122
232
/* Use 64bit AND here to avoid long NOP padding.  */
123
233
        and     $0x3f, %rcx             /* rsi alignment in cache line */
124
234
        and     $0x3f, %rax             /* rdi alignment in cache line */
 
235
# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
 
236
        .section .rodata.cst16,"aM",@progbits,16
 
237
        .align 16
 
238
.Lbelowupper_sse4:
 
239
        .quad   0x4040404040404040
 
240
        .quad   0x4040404040404040
 
241
.Ltopupper_sse4:
 
242
        .quad   0x5b5b5b5b5b5b5b5b
 
243
        .quad   0x5b5b5b5b5b5b5b5b
 
244
.Ltouppermask_sse4:
 
245
        .quad   0x2020202020202020
 
246
        .quad   0x2020202020202020
 
247
        .previous
 
248
        movdqa  .Lbelowupper_sse4(%rip), %xmm4
 
249
#  define UCLOW_reg %xmm4
 
250
        movdqa  .Ltopupper_sse4(%rip), %xmm5
 
251
#  define UCHIGH_reg %xmm5
 
252
        movdqa  .Ltouppermask_sse4(%rip), %xmm6
 
253
#  define LCQWORD_reg %xmm6
 
254
# endif
125
255
        cmp     $0x30, %ecx
126
256
        ja      LABEL(crosscache_sse4_2)/* rsi: 16-byte load will cross cache line */
127
257
        cmp     $0x30, %eax
128
258
        ja      LABEL(crosscache_sse4_2)/* rdi: 16-byte load will cross cache line */
129
259
        movdqu  (%rdi), %xmm1
130
260
        movdqu  (%rsi), %xmm2
 
261
# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
 
262
#  define TOLOWER(reg1, reg2) \
 
263
        movdqa  reg1, %xmm7;                                    \
 
264
        movdqa  UCHIGH_reg, %xmm8;                              \
 
265
        movdqa  reg2, %xmm9;                                    \
 
266
        movdqa  UCHIGH_reg, %xmm10;                             \
 
267
        pcmpgtb UCLOW_reg, %xmm7;                               \
 
268
        pcmpgtb reg1, %xmm8;                                    \
 
269
        pcmpgtb UCLOW_reg, %xmm9;                               \
 
270
        pcmpgtb reg2, %xmm10;                                   \
 
271
        pand    %xmm8, %xmm7;                                   \
 
272
        pand    %xmm10, %xmm9;                                  \
 
273
        pand    LCQWORD_reg, %xmm7;                             \
 
274
        pand    LCQWORD_reg, %xmm9;                             \
 
275
        por     %xmm7, reg1;                                    \
 
276
        por     %xmm9, reg2
 
277
        TOLOWER (%xmm1, %xmm2)
 
278
# else
 
279
#  define TOLOWER(reg1, reg2)
 
280
# endif
131
281
        pxor    %xmm0, %xmm0            /* clear %xmm0 for null char checks */
132
282
        pcmpeqb %xmm1, %xmm0            /* Any null chars? */
133
283
        pcmpeqb %xmm2, %xmm1            /* compare first 16 bytes for equality */
135
285
        pmovmskb %xmm1, %edx
136
286
        sub     $0xffff, %edx           /* if first 16 bytes are same, edx == 0xffff */
137
287
        jnz     LABEL(less16bytes_sse4_2)/* If not, find different value or null char */
138
 
#ifdef USE_AS_STRNCMP
 
288
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
139
289
        sub     $16, %r11
140
290
        jbe     LABEL(strcmp_exitz_sse4_2)/* finish comparision */
141
 
#endif
 
291
# endif
142
292
        add     $16, %rsi               /* prepare to search next 16 bytes */
143
293
        add     $16, %rdi               /* prepare to search next 16 bytes */
144
294
 
180
330
        movdqa  (%rsi), %xmm1
181
331
        pxor    %xmm0, %xmm0                    /* clear %xmm0 for null char check */
182
332
        pcmpeqb %xmm1, %xmm0                    /* Any null chars? */
 
333
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
183
334
        pcmpeqb (%rdi), %xmm1                   /* compare 16 bytes for equality */
 
335
# else
 
336
        movdqa  (%rdi), %xmm2
 
337
        TOLOWER (%xmm1, %xmm2)
 
338
        pcmpeqb %xmm2, %xmm1                    /* compare 16 bytes for equality */
 
339
# endif
184
340
        psubb   %xmm0, %xmm1                    /* packed sub of comparison results*/
185
341
        pmovmskb %xmm1, %r9d
186
342
        shr     %cl, %edx                       /* adjust 0xffff for offset */
204
360
        .p2align 4
205
361
LABEL(ashr_0_use_sse4_2):
206
362
        movdqa  (%rdi,%rdx), %xmm0
 
363
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
207
364
        pcmpistri      $0x1a,(%rsi,%rdx), %xmm0
 
365
# else
 
366
        movdqa  (%rsi,%rdx), %xmm1
 
367
        TOLOWER (%xmm0, %xmm1)
 
368
        pcmpistri $0x1a, %xmm1, %xmm0
 
369
# endif
208
370
        lea     16(%rdx), %rdx
209
371
        jbe     LABEL(ashr_0_use_sse4_2_exit)
210
 
#ifdef USE_AS_STRNCMP
 
372
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
211
373
        sub     $16, %r11
212
374
        jbe     LABEL(strcmp_exitz_sse4_2)
213
 
#endif
 
375
# endif
214
376
 
215
377
        movdqa  (%rdi,%rdx), %xmm0
 
378
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
216
379
        pcmpistri      $0x1a,(%rsi,%rdx), %xmm0
 
380
# else
 
381
        movdqa  (%rsi,%rdx), %xmm1
 
382
        TOLOWER (%xmm0, %xmm1)
 
383
        pcmpistri $0x1a, %xmm1, %xmm0
 
384
# endif
217
385
        lea     16(%rdx), %rdx
218
386
        jbe     LABEL(ashr_0_use_sse4_2_exit)
219
 
#ifdef USE_AS_STRNCMP
 
387
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
220
388
        sub     $16, %r11
221
389
        jbe     LABEL(strcmp_exitz_sse4_2)
222
 
#endif
 
390
# endif
223
391
        jmp     LABEL(ashr_0_use_sse4_2)
224
392
 
225
393
 
226
394
        .p2align 4
227
395
LABEL(ashr_0_use_sse4_2_exit):
228
396
        jnc     LABEL(strcmp_exitz_sse4_2)
229
 
#ifdef USE_AS_STRNCMP
 
397
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
230
398
        sub     %rcx, %r11
231
399
        jbe     LABEL(strcmp_exitz_sse4_2)
232
 
#endif
 
400
# endif
233
401
        lea     -16(%rdx, %rcx), %rcx
234
402
        movzbl  (%rdi, %rcx), %eax
235
403
        movzbl  (%rsi, %rcx), %edx
 
404
# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
 
405
        leaq    _nl_C_LC_CTYPE_tolower+128*4(%rip), %rcx
 
406
        movl    (%rcx,%rax,4), %eax
 
407
        movl    (%rcx,%rdx,4), %edx
 
408
# endif
236
409
        sub     %edx, %eax
237
410
        ret
238
411
 
239
412
 
240
413
 
241
 
 
242
414
/*
243
415
 * The following cases will be handled by ashr_1
244
 
 * rcx(offset of rsi)  rax(offset of rdi)   relative offset     corresponding case
 
416
 * rcx(offset of rsi)  rax(offset of rdi)   relative offset     corresponding case
245
417
 *        n(15)            n -15            0(15 +(n-15) - n)         ashr_1
246
418
 */
247
419
        .p2align 4
251
423
        movdqa  (%rsi), %xmm1
252
424
        pcmpeqb %xmm1, %xmm0            /* Any null chars? */
253
425
        pslldq  $15, %xmm2              /* shift first string to align with second */
 
426
        TOLOWER (%xmm1, %xmm2)
254
427
        pcmpeqb %xmm1, %xmm2            /* compare 16 bytes for equality */
255
428
        psubb   %xmm0, %xmm2            /* packed sub of comparison results*/
256
429
        pmovmskb %xmm2, %r9d
281
454
 
282
455
        movdqa  (%rdi, %rdx), %xmm0
283
456
        palignr $1, -16(%rdi, %rdx), %xmm0
 
457
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
284
458
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
459
# else
 
460
        movdqa  (%rsi,%rdx), %xmm1
 
461
        TOLOWER (%xmm0, %xmm1)
 
462
        pcmpistri $0x1a, %xmm1, %xmm0
 
463
# endif
285
464
        jbe     LABEL(use_sse4_2_exit)
286
 
#ifdef USE_AS_STRNCMP
 
465
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
287
466
        sub     $16, %r11
288
467
        jbe     LABEL(strcmp_exitz_sse4_2)
289
 
#endif
 
468
# endif
290
469
 
291
470
        add     $16, %rdx
292
471
        add     $16, %r10
294
473
 
295
474
        movdqa  (%rdi, %rdx), %xmm0
296
475
        palignr $1, -16(%rdi, %rdx), %xmm0
 
476
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
297
477
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
478
# else
 
479
        movdqa  (%rsi,%rdx), %xmm1
 
480
        TOLOWER (%xmm0, %xmm1)
 
481
        pcmpistri $0x1a, %xmm1, %xmm0
 
482
# endif
298
483
        jbe     LABEL(use_sse4_2_exit)
299
 
#ifdef USE_AS_STRNCMP
 
484
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
300
485
        sub     $16, %r11
301
486
        jbe     LABEL(strcmp_exitz_sse4_2)
302
 
#endif
 
487
# endif
303
488
        add     $16, %rdx
304
489
        jmp     LABEL(loop_ashr_1_use_sse4_2)
305
490
 
309
494
        movdqa  -16(%rdi, %rdx), %xmm0
310
495
        psrldq  $1, %xmm0
311
496
        pcmpistri      $0x3a,%xmm0, %xmm0
312
 
#ifdef USE_AS_STRNCMP
 
497
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
313
498
        cmp     %r11, %rcx
314
499
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
315
 
#endif
 
500
# endif
316
501
        cmp     $14, %ecx
317
502
        ja      LABEL(loop_ashr_1_use_sse4_2)
318
503
 
320
505
 
321
506
/*
322
507
 * The following cases will be handled by ashr_2
323
 
 * rcx(offset of rsi)  rax(offset of rdi)   relative offset     corresponding case
 
508
 * rcx(offset of rsi)  rax(offset of rdi)   relative offset     corresponding case
324
509
 *        n(14~15)            n -14         1(15 +(n-14) - n)         ashr_2
325
510
 */
326
511
        .p2align 4
330
515
        movdqa  (%rsi), %xmm1
331
516
        pcmpeqb %xmm1, %xmm0
332
517
        pslldq  $14, %xmm2
 
518
        TOLOWER (%xmm1, %xmm2)
333
519
        pcmpeqb %xmm1, %xmm2
334
520
        psubb   %xmm0, %xmm2
335
521
        pmovmskb %xmm2, %r9d
360
546
 
361
547
        movdqa  (%rdi, %rdx), %xmm0
362
548
        palignr $2, -16(%rdi, %rdx), %xmm0
 
549
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
363
550
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
551
# else
 
552
        movdqa  (%rsi,%rdx), %xmm1
 
553
        TOLOWER (%xmm0, %xmm1)
 
554
        pcmpistri $0x1a, %xmm1, %xmm0
 
555
# endif
364
556
        jbe     LABEL(use_sse4_2_exit)
365
 
#ifdef USE_AS_STRNCMP
 
557
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
366
558
        sub     $16, %r11
367
559
        jbe     LABEL(strcmp_exitz_sse4_2)
368
 
#endif
 
560
# endif
369
561
 
370
562
        add     $16, %rdx
371
563
        add     $16, %r10
373
565
 
374
566
        movdqa  (%rdi, %rdx), %xmm0
375
567
        palignr $2, -16(%rdi, %rdx), %xmm0
 
568
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
376
569
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
570
# else
 
571
        movdqa  (%rsi,%rdx), %xmm1
 
572
        TOLOWER (%xmm0, %xmm1)
 
573
        pcmpistri $0x1a, %xmm1, %xmm0
 
574
# endif
377
575
        jbe     LABEL(use_sse4_2_exit)
378
 
#ifdef USE_AS_STRNCMP
 
576
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
379
577
        sub     $16, %r11
380
578
        jbe     LABEL(strcmp_exitz_sse4_2)
381
 
#endif
 
579
# endif
382
580
        add     $16, %rdx
383
581
        jmp     LABEL(loop_ashr_2_use_sse4_2)
384
582
 
388
586
        movdqa  -16(%rdi, %rdx), %xmm0
389
587
        psrldq  $2, %xmm0
390
588
        pcmpistri      $0x3a,%xmm0, %xmm0
391
 
#ifdef USE_AS_STRNCMP
 
589
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
392
590
        cmp     %r11, %rcx
393
591
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
394
 
#endif
 
592
# endif
395
593
        cmp     $13, %ecx
396
594
        ja      LABEL(loop_ashr_2_use_sse4_2)
397
595
 
409
607
        movdqa  (%rsi), %xmm1
410
608
        pcmpeqb %xmm1, %xmm0
411
609
        pslldq  $13, %xmm2
 
610
        TOLOWER (%xmm1, %xmm2)
412
611
        pcmpeqb %xmm1, %xmm2
413
612
        psubb   %xmm0, %xmm2
414
613
        pmovmskb %xmm2, %r9d
439
638
 
440
639
        movdqa  (%rdi, %rdx), %xmm0
441
640
        palignr $3, -16(%rdi, %rdx), %xmm0
 
641
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
442
642
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
643
# else
 
644
        movdqa  (%rsi,%rdx), %xmm1
 
645
        TOLOWER (%xmm0, %xmm1)
 
646
        pcmpistri $0x1a, %xmm1, %xmm0
 
647
# endif
443
648
        jbe     LABEL(use_sse4_2_exit)
444
 
#ifdef USE_AS_STRNCMP
 
649
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
445
650
        sub     $16, %r11
446
651
        jbe     LABEL(strcmp_exitz_sse4_2)
447
 
#endif
 
652
# endif
448
653
 
449
654
        add     $16, %rdx
450
655
        add     $16, %r10
452
657
 
453
658
        movdqa  (%rdi, %rdx), %xmm0
454
659
        palignr $3, -16(%rdi, %rdx), %xmm0
 
660
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
455
661
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
662
# else
 
663
        movdqa  (%rsi,%rdx), %xmm1
 
664
        TOLOWER (%xmm0, %xmm1)
 
665
        pcmpistri $0x1a, %xmm1, %xmm0
 
666
# endif
456
667
        jbe     LABEL(use_sse4_2_exit)
457
 
#ifdef USE_AS_STRNCMP
 
668
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
458
669
        sub     $16, %r11
459
670
        jbe     LABEL(strcmp_exitz_sse4_2)
460
 
#endif
 
671
# endif
461
672
        add     $16, %rdx
462
673
        jmp     LABEL(loop_ashr_3_use_sse4_2)
463
674
 
467
678
        movdqa  -16(%rdi, %rdx), %xmm0
468
679
        psrldq  $3, %xmm0
469
680
        pcmpistri      $0x3a,%xmm0, %xmm0
470
 
#ifdef USE_AS_STRNCMP
 
681
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
471
682
        cmp     %r11, %rcx
472
683
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
473
 
#endif
 
684
# endif
474
685
        cmp     $12, %ecx
475
686
        ja      LABEL(loop_ashr_3_use_sse4_2)
476
687
 
488
699
        movdqa  (%rsi), %xmm1
489
700
        pcmpeqb %xmm1, %xmm0
490
701
        pslldq  $12, %xmm2
 
702
        TOLOWER (%xmm1, %xmm2)
491
703
        pcmpeqb %xmm1, %xmm2
492
704
        psubb   %xmm0, %xmm2
493
705
        pmovmskb %xmm2, %r9d
519
731
 
520
732
        movdqa  (%rdi, %rdx), %xmm0
521
733
        palignr $4, -16(%rdi, %rdx), %xmm0
 
734
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
522
735
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
736
# else
 
737
        movdqa  (%rsi,%rdx), %xmm1
 
738
        TOLOWER (%xmm0, %xmm1)
 
739
        pcmpistri $0x1a, %xmm1, %xmm0
 
740
# endif
523
741
        jbe     LABEL(use_sse4_2_exit)
524
 
#ifdef USE_AS_STRNCMP
 
742
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
525
743
        sub     $16, %r11
526
744
        jbe     LABEL(strcmp_exitz_sse4_2)
527
 
#endif
 
745
# endif
528
746
 
529
747
        add     $16, %rdx
530
748
        add     $16, %r10
532
750
 
533
751
        movdqa  (%rdi, %rdx), %xmm0
534
752
        palignr $4, -16(%rdi, %rdx), %xmm0
 
753
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
535
754
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
755
# else
 
756
        movdqa  (%rsi,%rdx), %xmm1
 
757
        TOLOWER (%xmm0, %xmm1)
 
758
        pcmpistri $0x1a, %xmm1, %xmm0
 
759
# endif
536
760
        jbe     LABEL(use_sse4_2_exit)
537
 
#ifdef USE_AS_STRNCMP
 
761
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
538
762
        sub     $16, %r11
539
763
        jbe     LABEL(strcmp_exitz_sse4_2)
540
 
#endif
 
764
# endif
541
765
        add     $16, %rdx
542
766
        jmp     LABEL(loop_ashr_4_use_sse4_2)
543
767
 
547
771
        movdqa  -16(%rdi, %rdx), %xmm0
548
772
        psrldq  $4, %xmm0
549
773
        pcmpistri      $0x3a,%xmm0, %xmm0
550
 
#ifdef USE_AS_STRNCMP
 
774
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
551
775
        cmp     %r11, %rcx
552
776
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
553
 
#endif
 
777
# endif
554
778
        cmp     $11, %ecx
555
779
        ja      LABEL(loop_ashr_4_use_sse4_2)
556
780
 
559
783
/*
560
784
 * The following cases will be handled by ashr_5
561
785
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset      corresponding case
562
 
 *        n(11~15)          n - 11                4(15 +(n-11) - n)         ashr_5
 
786
 *        n(11~15)          n - 11                4(15 +(n-11) - n)         ashr_5
563
787
 */
564
788
        .p2align 4
565
789
LABEL(ashr_5_sse4_2):
568
792
        movdqa  (%rsi), %xmm1
569
793
        pcmpeqb %xmm1, %xmm0
570
794
        pslldq  $11, %xmm2
 
795
        TOLOWER (%xmm1, %xmm2)
571
796
        pcmpeqb %xmm1, %xmm2
572
797
        psubb   %xmm0, %xmm2
573
798
        pmovmskb %xmm2, %r9d
599
824
 
600
825
        movdqa  (%rdi, %rdx), %xmm0
601
826
        palignr $5, -16(%rdi, %rdx), %xmm0
 
827
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
602
828
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
829
# else
 
830
        movdqa  (%rsi,%rdx), %xmm1
 
831
        TOLOWER (%xmm0, %xmm1)
 
832
        pcmpistri $0x1a, %xmm1, %xmm0
 
833
# endif
603
834
        jbe     LABEL(use_sse4_2_exit)
604
 
#ifdef USE_AS_STRNCMP
 
835
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
605
836
        sub     $16, %r11
606
837
        jbe     LABEL(strcmp_exitz_sse4_2)
607
 
#endif
 
838
# endif
608
839
 
609
840
        add     $16, %rdx
610
841
        add     $16, %r10
613
844
        movdqa  (%rdi, %rdx), %xmm0
614
845
 
615
846
        palignr $5, -16(%rdi, %rdx), %xmm0
 
847
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
616
848
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
849
# else
 
850
        movdqa  (%rsi,%rdx), %xmm1
 
851
        TOLOWER (%xmm0, %xmm1)
 
852
        pcmpistri $0x1a, %xmm1, %xmm0
 
853
# endif
617
854
        jbe     LABEL(use_sse4_2_exit)
618
 
#ifdef USE_AS_STRNCMP
 
855
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
619
856
        sub     $16, %r11
620
857
        jbe     LABEL(strcmp_exitz_sse4_2)
621
 
#endif
 
858
# endif
622
859
        add     $16, %rdx
623
860
        jmp     LABEL(loop_ashr_5_use_sse4_2)
624
861
 
628
865
        movdqa  -16(%rdi, %rdx), %xmm0
629
866
        psrldq  $5, %xmm0
630
867
        pcmpistri      $0x3a,%xmm0, %xmm0
631
 
#ifdef USE_AS_STRNCMP
 
868
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
632
869
        cmp     %r11, %rcx
633
870
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
634
 
#endif
 
871
# endif
635
872
        cmp     $10, %ecx
636
873
        ja      LABEL(loop_ashr_5_use_sse4_2)
637
874
 
640
877
/*
641
878
 * The following cases will be handled by ashr_6
642
879
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset      corresponding case
643
 
 *        n(10~15)          n - 10                5(15 +(n-10) - n)         ashr_6
 
880
 *        n(10~15)          n - 10                5(15 +(n-10) - n)         ashr_6
644
881
 */
645
882
        .p2align 4
646
883
LABEL(ashr_6_sse4_2):
649
886
        movdqa  (%rsi), %xmm1
650
887
        pcmpeqb %xmm1, %xmm0
651
888
        pslldq  $10, %xmm2
 
889
        TOLOWER (%xmm1, %xmm2)
652
890
        pcmpeqb %xmm1, %xmm2
653
891
        psubb   %xmm0, %xmm2
654
892
        pmovmskb %xmm2, %r9d
680
918
 
681
919
        movdqa  (%rdi, %rdx), %xmm0
682
920
        palignr $6, -16(%rdi, %rdx), %xmm0
683
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
921
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
922
        pcmpistri $0x1a,(%rsi,%rdx), %xmm0
 
923
# else
 
924
        movdqa  (%rsi,%rdx), %xmm1
 
925
        TOLOWER (%xmm0, %xmm1)
 
926
        pcmpistri $0x1a, %xmm1, %xmm0
 
927
# endif
684
928
        jbe     LABEL(use_sse4_2_exit)
685
 
#ifdef USE_AS_STRNCMP
 
929
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
686
930
        sub     $16, %r11
687
931
        jbe     LABEL(strcmp_exitz_sse4_2)
688
 
#endif
 
932
# endif
689
933
 
690
934
        add     $16, %rdx
691
935
        add     $16, %r10
693
937
 
694
938
        movdqa  (%rdi, %rdx), %xmm0
695
939
        palignr $6, -16(%rdi, %rdx), %xmm0
696
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
940
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
941
        pcmpistri $0x1a,(%rsi,%rdx), %xmm0
 
942
# else
 
943
        movdqa  (%rsi,%rdx), %xmm1
 
944
        TOLOWER (%xmm0, %xmm1)
 
945
        pcmpistri $0x1a, %xmm1, %xmm0
 
946
# endif
697
947
        jbe     LABEL(use_sse4_2_exit)
698
 
#ifdef USE_AS_STRNCMP
 
948
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
699
949
        sub     $16, %r11
700
950
        jbe     LABEL(strcmp_exitz_sse4_2)
701
 
#endif
 
951
# endif
702
952
        add     $16, %rdx
703
953
        jmp     LABEL(loop_ashr_6_use_sse4_2)
704
954
 
708
958
        movdqa  -16(%rdi, %rdx), %xmm0
709
959
        psrldq  $6, %xmm0
710
960
        pcmpistri      $0x3a,%xmm0, %xmm0
711
 
#ifdef USE_AS_STRNCMP
 
961
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
712
962
        cmp     %r11, %rcx
713
963
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
714
 
#endif
 
964
# endif
715
965
        cmp     $9, %ecx
716
966
        ja      LABEL(loop_ashr_6_use_sse4_2)
717
967
 
720
970
/*
721
971
 * The following cases will be handled by ashr_7
722
972
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset      corresponding case
723
 
 *        n(9~15)          n - 9                6(15 +(n - 9) - n)         ashr_7
 
973
 *        n(9~15)          n - 9                  6(15 +(n - 9) - n)         ashr_7
724
974
 */
725
975
        .p2align 4
726
976
LABEL(ashr_7_sse4_2):
729
979
        movdqa  (%rsi), %xmm1
730
980
        pcmpeqb %xmm1, %xmm0
731
981
        pslldq  $9, %xmm2
 
982
        TOLOWER (%xmm1, %xmm2)
732
983
        pcmpeqb %xmm1, %xmm2
733
984
        psubb   %xmm0, %xmm2
734
985
        pmovmskb %xmm2, %r9d
760
1011
 
761
1012
        movdqa  (%rdi, %rdx), %xmm0
762
1013
        palignr $7, -16(%rdi, %rdx), %xmm0
 
1014
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
763
1015
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1016
# else
 
1017
        movdqa  (%rsi,%rdx), %xmm1
 
1018
        TOLOWER (%xmm0, %xmm1)
 
1019
        pcmpistri $0x1a, %xmm1, %xmm0
 
1020
# endif
764
1021
        jbe     LABEL(use_sse4_2_exit)
765
 
#ifdef USE_AS_STRNCMP
 
1022
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
766
1023
        sub     $16, %r11
767
1024
        jbe     LABEL(strcmp_exitz_sse4_2)
768
 
#endif
 
1025
# endif
769
1026
 
770
1027
        add     $16, %rdx
771
1028
        add     $16, %r10
773
1030
 
774
1031
        movdqa  (%rdi, %rdx), %xmm0
775
1032
        palignr $7, -16(%rdi, %rdx), %xmm0
 
1033
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
776
1034
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1035
# else
 
1036
        movdqa  (%rsi,%rdx), %xmm1
 
1037
        TOLOWER (%xmm0, %xmm1)
 
1038
        pcmpistri $0x1a, %xmm1, %xmm0
 
1039
# endif
777
1040
        jbe     LABEL(use_sse4_2_exit)
778
 
#ifdef USE_AS_STRNCMP
 
1041
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
779
1042
        sub     $16, %r11
780
1043
        jbe     LABEL(strcmp_exitz_sse4_2)
781
 
#endif
 
1044
# endif
782
1045
        add     $16, %rdx
783
1046
        jmp     LABEL(loop_ashr_7_use_sse4_2)
784
1047
 
788
1051
        movdqa  -16(%rdi, %rdx), %xmm0
789
1052
        psrldq  $7, %xmm0
790
1053
        pcmpistri      $0x3a,%xmm0, %xmm0
791
 
#ifdef USE_AS_STRNCMP
 
1054
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
792
1055
        cmp     %r11, %rcx
793
1056
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
794
 
#endif
 
1057
# endif
795
1058
        cmp     $8, %ecx
796
1059
        ja      LABEL(loop_ashr_7_use_sse4_2)
797
1060
 
800
1063
/*
801
1064
 *  The following cases will be handled by ashr_8
802
1065
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset        corresponding case
803
 
 *        n(8~15)          n - 8                7(15 +(n - 8) - n)         ashr_8
 
1066
 *        n(8~15)          n - 8                  7(15 +(n - 8) - n)         ashr_8
804
1067
 */
805
1068
        .p2align 4
806
1069
LABEL(ashr_8_sse4_2):
809
1072
        movdqa  (%rsi), %xmm1
810
1073
        pcmpeqb %xmm1, %xmm0
811
1074
        pslldq  $8, %xmm2
 
1075
        TOLOWER (%xmm1, %xmm2)
812
1076
        pcmpeqb %xmm1, %xmm2
813
1077
        psubb   %xmm0, %xmm2
814
1078
        pmovmskb %xmm2, %r9d
840
1104
 
841
1105
        movdqa  (%rdi, %rdx), %xmm0
842
1106
        palignr $8, -16(%rdi, %rdx), %xmm0
843
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1107
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1108
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1109
# else
 
1110
        movdqa  (%rsi,%rdx), %xmm1
 
1111
        TOLOWER (%xmm0, %xmm1)
 
1112
        pcmpistri $0x1a, %xmm1, %xmm0
 
1113
# endif
844
1114
        jbe     LABEL(use_sse4_2_exit)
845
 
#ifdef USE_AS_STRNCMP
 
1115
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
846
1116
        sub     $16, %r11
847
1117
        jbe     LABEL(strcmp_exitz_sse4_2)
848
 
#endif
 
1118
# endif
849
1119
 
850
1120
        add     $16, %rdx
851
1121
        add     $16, %r10
853
1123
 
854
1124
        movdqa  (%rdi, %rdx), %xmm0
855
1125
        palignr $8, -16(%rdi, %rdx), %xmm0
856
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1126
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1127
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1128
# else
 
1129
        movdqa  (%rsi,%rdx), %xmm1
 
1130
        TOLOWER (%xmm0, %xmm1)
 
1131
        pcmpistri $0x1a, %xmm1, %xmm0
 
1132
# endif
857
1133
        jbe     LABEL(use_sse4_2_exit)
858
 
#ifdef USE_AS_STRNCMP
 
1134
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
859
1135
        sub     $16, %r11
860
1136
        jbe     LABEL(strcmp_exitz_sse4_2)
861
 
#endif
 
1137
# endif
862
1138
        add     $16, %rdx
863
1139
        jmp     LABEL(loop_ashr_8_use_sse4_2)
864
1140
 
868
1144
        movdqa  -16(%rdi, %rdx), %xmm0
869
1145
        psrldq  $8, %xmm0
870
1146
        pcmpistri      $0x3a,%xmm0, %xmm0
871
 
#ifdef USE_AS_STRNCMP
 
1147
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
872
1148
        cmp     %r11, %rcx
873
1149
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
874
 
#endif
 
1150
# endif
875
1151
        cmp     $7, %ecx
876
1152
        ja      LABEL(loop_ashr_8_use_sse4_2)
877
1153
 
880
1156
/*
881
1157
 *  The following cases will be handled by ashr_9
882
1158
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset        corresponding case
883
 
 *        n(7~15)          n - 7                8(15 +(n - 7) - n)         ashr_9
 
1159
 *        n(7~15)          n - 7                  8(15 +(n - 7) - n)         ashr_9
884
1160
 */
885
1161
        .p2align 4
886
1162
LABEL(ashr_9_sse4_2):
889
1165
        movdqa  (%rsi), %xmm1
890
1166
        pcmpeqb %xmm1, %xmm0
891
1167
        pslldq  $7, %xmm2
 
1168
        TOLOWER (%xmm1, %xmm2)
892
1169
        pcmpeqb %xmm1, %xmm2
893
1170
        psubb   %xmm0, %xmm2
894
1171
        pmovmskb %xmm2, %r9d
921
1198
        movdqa  (%rdi, %rdx), %xmm0
922
1199
 
923
1200
        palignr $9, -16(%rdi, %rdx), %xmm0
924
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1201
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1202
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1203
# else
 
1204
        movdqa  (%rsi,%rdx), %xmm1
 
1205
        TOLOWER (%xmm0, %xmm1)
 
1206
        pcmpistri $0x1a, %xmm1, %xmm0
 
1207
# endif
925
1208
        jbe     LABEL(use_sse4_2_exit)
926
 
#ifdef USE_AS_STRNCMP
 
1209
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
927
1210
        sub     $16, %r11
928
1211
        jbe     LABEL(strcmp_exitz_sse4_2)
929
 
#endif
 
1212
# endif
930
1213
 
931
1214
        add     $16, %rdx
932
1215
        add     $16, %r10
934
1217
 
935
1218
        movdqa  (%rdi, %rdx), %xmm0
936
1219
        palignr $9, -16(%rdi, %rdx), %xmm0
937
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1220
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1221
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1222
# else
 
1223
        movdqa  (%rsi,%rdx), %xmm1
 
1224
        TOLOWER (%xmm0, %xmm1)
 
1225
        pcmpistri $0x1a, %xmm1, %xmm0
 
1226
# endif
938
1227
        jbe     LABEL(use_sse4_2_exit)
939
 
#ifdef USE_AS_STRNCMP
 
1228
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
940
1229
        sub     $16, %r11
941
1230
        jbe     LABEL(strcmp_exitz_sse4_2)
942
 
#endif
 
1231
# endif
943
1232
        add     $16, %rdx
944
1233
        jmp     LABEL(loop_ashr_9_use_sse4_2)
945
1234
 
949
1238
        movdqa  -16(%rdi, %rdx), %xmm0
950
1239
        psrldq  $9, %xmm0
951
1240
        pcmpistri      $0x3a,%xmm0, %xmm0
952
 
#ifdef USE_AS_STRNCMP
 
1241
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
953
1242
        cmp     %r11, %rcx
954
1243
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
955
 
#endif
 
1244
# endif
956
1245
        cmp     $6, %ecx
957
1246
        ja      LABEL(loop_ashr_9_use_sse4_2)
958
1247
 
961
1250
/*
962
1251
 *  The following cases will be handled by ashr_10
963
1252
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset        corresponding case
964
 
 *        n(6~15)          n - 6                9(15 +(n - 6) - n)         ashr_10
 
1253
 *        n(6~15)          n - 6                  9(15 +(n - 6) - n)         ashr_10
965
1254
 */
966
1255
        .p2align 4
967
1256
LABEL(ashr_10_sse4_2):
970
1259
        movdqa  (%rsi), %xmm1
971
1260
        pcmpeqb %xmm1, %xmm0
972
1261
        pslldq  $6, %xmm2
 
1262
        TOLOWER (%xmm1, %xmm2)
973
1263
        pcmpeqb %xmm1, %xmm2
974
1264
        psubb   %xmm0, %xmm2
975
1265
        pmovmskb %xmm2, %r9d
1001
1291
 
1002
1292
        movdqa  (%rdi, %rdx), %xmm0
1003
1293
        palignr $10, -16(%rdi, %rdx), %xmm0
1004
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1294
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1295
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1296
# else
 
1297
        movdqa  (%rsi,%rdx), %xmm1
 
1298
        TOLOWER (%xmm0, %xmm1)
 
1299
        pcmpistri $0x1a, %xmm1, %xmm0
 
1300
# endif
1005
1301
        jbe     LABEL(use_sse4_2_exit)
1006
 
#ifdef USE_AS_STRNCMP
 
1302
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1007
1303
        sub     $16, %r11
1008
1304
        jbe     LABEL(strcmp_exitz_sse4_2)
1009
 
#endif
 
1305
# endif
1010
1306
 
1011
1307
        add     $16, %rdx
1012
1308
        add     $16, %r10
1014
1310
 
1015
1311
        movdqa  (%rdi, %rdx), %xmm0
1016
1312
        palignr $10, -16(%rdi, %rdx), %xmm0
1017
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1313
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1314
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1315
# else
 
1316
        movdqa  (%rsi,%rdx), %xmm1
 
1317
        TOLOWER (%xmm0, %xmm1)
 
1318
        pcmpistri $0x1a, %xmm1, %xmm0
 
1319
# endif
1018
1320
        jbe     LABEL(use_sse4_2_exit)
1019
 
#ifdef USE_AS_STRNCMP
 
1321
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1020
1322
        sub     $16, %r11
1021
1323
        jbe     LABEL(strcmp_exitz_sse4_2)
1022
 
#endif
 
1324
# endif
1023
1325
        add     $16, %rdx
1024
1326
        jmp     LABEL(loop_ashr_10_use_sse4_2)
1025
1327
 
1029
1331
        movdqa  -16(%rdi, %rdx), %xmm0
1030
1332
        psrldq  $10, %xmm0
1031
1333
        pcmpistri      $0x3a,%xmm0, %xmm0
1032
 
#ifdef USE_AS_STRNCMP
 
1334
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1033
1335
        cmp     %r11, %rcx
1034
1336
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
1035
 
#endif
 
1337
# endif
1036
1338
        cmp     $5, %ecx
1037
1339
        ja      LABEL(loop_ashr_10_use_sse4_2)
1038
1340
 
1041
1343
/*
1042
1344
 *  The following cases will be handled by ashr_11
1043
1345
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset        corresponding case
1044
 
 *        n(5~15)          n - 5                10(15 +(n - 5) - n)         ashr_11
 
1346
 *        n(5~15)          n - 5                  10(15 +(n - 5) - n)         ashr_11
1045
1347
 */
1046
1348
        .p2align 4
1047
1349
LABEL(ashr_11_sse4_2):
1050
1352
        movdqa  (%rsi), %xmm1
1051
1353
        pcmpeqb %xmm1, %xmm0
1052
1354
        pslldq  $5, %xmm2
 
1355
        TOLOWER (%xmm1, %xmm2)
1053
1356
        pcmpeqb %xmm1, %xmm2
1054
1357
        psubb   %xmm0, %xmm2
1055
1358
        pmovmskb %xmm2, %r9d
1081
1384
 
1082
1385
        movdqa  (%rdi, %rdx), %xmm0
1083
1386
        palignr $11, -16(%rdi, %rdx), %xmm0
1084
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1387
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1388
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1389
# else
 
1390
        movdqa  (%rsi,%rdx), %xmm1
 
1391
        TOLOWER (%xmm0, %xmm1)
 
1392
        pcmpistri $0x1a, %xmm1, %xmm0
 
1393
# endif
1085
1394
        jbe     LABEL(use_sse4_2_exit)
1086
 
#ifdef USE_AS_STRNCMP
 
1395
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1087
1396
        sub     $16, %r11
1088
1397
        jbe     LABEL(strcmp_exitz_sse4_2)
1089
 
#endif
 
1398
# endif
1090
1399
 
1091
1400
        add     $16, %rdx
1092
1401
        add     $16, %r10
1094
1403
 
1095
1404
        movdqa  (%rdi, %rdx), %xmm0
1096
1405
        palignr $11, -16(%rdi, %rdx), %xmm0
1097
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1406
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1407
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1408
# else
 
1409
        movdqa  (%rsi,%rdx), %xmm1
 
1410
        TOLOWER (%xmm0, %xmm1)
 
1411
        pcmpistri $0x1a, %xmm1, %xmm0
 
1412
# endif
1098
1413
        jbe     LABEL(use_sse4_2_exit)
1099
 
#ifdef USE_AS_STRNCMP
 
1414
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1100
1415
        sub     $16, %r11
1101
1416
        jbe     LABEL(strcmp_exitz_sse4_2)
1102
 
#endif
 
1417
# endif
1103
1418
        add     $16, %rdx
1104
1419
        jmp     LABEL(loop_ashr_11_use_sse4_2)
1105
1420
 
1109
1424
        movdqa  -16(%rdi, %rdx), %xmm0
1110
1425
        psrldq  $11, %xmm0
1111
1426
        pcmpistri      $0x3a,%xmm0, %xmm0
1112
 
#ifdef USE_AS_STRNCMP
 
1427
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1113
1428
        cmp     %r11, %rcx
1114
1429
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
1115
 
#endif
 
1430
# endif
1116
1431
        cmp     $4, %ecx
1117
1432
        ja      LABEL(loop_ashr_11_use_sse4_2)
1118
1433
 
1121
1436
/*
1122
1437
 *  The following cases will be handled by ashr_12
1123
1438
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset        corresponding case
1124
 
 *        n(4~15)          n - 4                11(15 +(n - 4) - n)         ashr_12
 
1439
 *        n(4~15)          n - 4                  11(15 +(n - 4) - n)         ashr_12
1125
1440
 */
1126
1441
        .p2align 4
1127
1442
LABEL(ashr_12_sse4_2):
1130
1445
        movdqa  (%rsi), %xmm1
1131
1446
        pcmpeqb %xmm1, %xmm0
1132
1447
        pslldq  $4, %xmm2
 
1448
        TOLOWER (%xmm1, %xmm2)
1133
1449
        pcmpeqb %xmm1, %xmm2
1134
1450
        psubb   %xmm0, %xmm2
1135
1451
        pmovmskb %xmm2, %r9d
1161
1477
 
1162
1478
        movdqa  (%rdi, %rdx), %xmm0
1163
1479
        palignr $12, -16(%rdi, %rdx), %xmm0
1164
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1480
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1481
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1482
# else
 
1483
        movdqa  (%rsi,%rdx), %xmm1
 
1484
        TOLOWER (%xmm0, %xmm1)
 
1485
        pcmpistri $0x1a, %xmm1, %xmm0
 
1486
# endif
1165
1487
        jbe     LABEL(use_sse4_2_exit)
1166
 
#ifdef USE_AS_STRNCMP
 
1488
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1167
1489
        sub     $16, %r11
1168
1490
        jbe     LABEL(strcmp_exitz_sse4_2)
1169
 
#endif
 
1491
# endif
1170
1492
 
1171
1493
        add     $16, %rdx
1172
1494
        add     $16, %r10
1174
1496
 
1175
1497
        movdqa  (%rdi, %rdx), %xmm0
1176
1498
        palignr $12, -16(%rdi, %rdx), %xmm0
1177
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1499
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1500
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1501
# else
 
1502
        movdqa  (%rsi,%rdx), %xmm1
 
1503
        TOLOWER (%xmm0, %xmm1)
 
1504
        pcmpistri $0x1a, %xmm1, %xmm0
 
1505
# endif
1178
1506
        jbe     LABEL(use_sse4_2_exit)
1179
 
#ifdef USE_AS_STRNCMP
 
1507
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1180
1508
        sub     $16, %r11
1181
1509
        jbe     LABEL(strcmp_exitz_sse4_2)
1182
 
#endif
 
1510
# endif
1183
1511
        add     $16, %rdx
1184
1512
        jmp     LABEL(loop_ashr_12_use_sse4_2)
1185
1513
 
1189
1517
        movdqa  -16(%rdi, %rdx), %xmm0
1190
1518
        psrldq  $12, %xmm0
1191
1519
        pcmpistri      $0x3a,%xmm0, %xmm0
1192
 
#ifdef USE_AS_STRNCMP
 
1520
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1193
1521
        cmp     %r11, %rcx
1194
1522
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
1195
 
#endif
 
1523
# endif
1196
1524
        cmp     $3, %ecx
1197
1525
        ja      LABEL(loop_ashr_12_use_sse4_2)
1198
1526
 
1201
1529
/*
1202
1530
 *  The following cases will be handled by ashr_13
1203
1531
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset        corresponding case
1204
 
 *        n(3~15)          n - 3                12(15 +(n - 3) - n)         ashr_13
 
1532
 *        n(3~15)          n - 3                  12(15 +(n - 3) - n)         ashr_13
1205
1533
 */
1206
1534
        .p2align 4
1207
1535
LABEL(ashr_13_sse4_2):
1210
1538
        movdqa  (%rsi), %xmm1
1211
1539
        pcmpeqb %xmm1, %xmm0
1212
1540
        pslldq  $3, %xmm2
 
1541
        TOLOWER (%xmm1, %xmm2)
1213
1542
        pcmpeqb %xmm1, %xmm2
1214
1543
        psubb   %xmm0, %xmm2
1215
1544
        pmovmskb %xmm2, %r9d
1242
1571
 
1243
1572
        movdqa  (%rdi, %rdx), %xmm0
1244
1573
        palignr $13, -16(%rdi, %rdx), %xmm0
1245
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1574
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1575
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1576
# else
 
1577
        movdqa  (%rsi,%rdx), %xmm1
 
1578
        TOLOWER (%xmm0, %xmm1)
 
1579
        pcmpistri $0x1a, %xmm1, %xmm0
 
1580
# endif
1246
1581
        jbe     LABEL(use_sse4_2_exit)
1247
 
#ifdef USE_AS_STRNCMP
 
1582
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1248
1583
        sub     $16, %r11
1249
1584
        jbe     LABEL(strcmp_exitz_sse4_2)
1250
 
#endif
 
1585
# endif
1251
1586
 
1252
1587
        add     $16, %rdx
1253
1588
        add     $16, %r10
1255
1590
 
1256
1591
        movdqa  (%rdi, %rdx), %xmm0
1257
1592
        palignr $13, -16(%rdi, %rdx), %xmm0
1258
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1593
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1594
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1595
# else
 
1596
        movdqa  (%rsi,%rdx), %xmm1
 
1597
        TOLOWER (%xmm0, %xmm1)
 
1598
        pcmpistri $0x1a, %xmm1, %xmm0
 
1599
# endif
1259
1600
        jbe     LABEL(use_sse4_2_exit)
1260
 
#ifdef USE_AS_STRNCMP
 
1601
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1261
1602
        sub     $16, %r11
1262
1603
        jbe     LABEL(strcmp_exitz_sse4_2)
1263
 
#endif
 
1604
# endif
1264
1605
        add     $16, %rdx
1265
1606
        jmp     LABEL(loop_ashr_13_use_sse4_2)
1266
1607
 
1270
1611
        movdqa  -16(%rdi, %rdx), %xmm0
1271
1612
        psrldq  $13, %xmm0
1272
1613
        pcmpistri      $0x3a,%xmm0, %xmm0
1273
 
#ifdef USE_AS_STRNCMP
 
1614
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1274
1615
        cmp     %r11, %rcx
1275
1616
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
1276
 
#endif
 
1617
# endif
1277
1618
        cmp     $2, %ecx
1278
1619
        ja      LABEL(loop_ashr_13_use_sse4_2)
1279
1620
 
1282
1623
/*
1283
1624
 *  The following cases will be handled by ashr_14
1284
1625
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset        corresponding case
1285
 
 *        n(2~15)          n - 2                13(15 +(n - 2) - n)         ashr_14
 
1626
 *        n(2~15)          n - 2                  13(15 +(n - 2) - n)         ashr_14
1286
1627
 */
1287
1628
        .p2align 4
1288
1629
LABEL(ashr_14_sse4_2):
1291
1632
        movdqa  (%rsi), %xmm1
1292
1633
        pcmpeqb %xmm1, %xmm0
1293
1634
        pslldq  $2, %xmm2
 
1635
        TOLOWER (%xmm1, %xmm2)
1294
1636
        pcmpeqb %xmm1, %xmm2
1295
1637
        psubb   %xmm0, %xmm2
1296
1638
        pmovmskb %xmm2, %r9d
1323
1665
 
1324
1666
        movdqa  (%rdi, %rdx), %xmm0
1325
1667
        palignr $14, -16(%rdi, %rdx), %xmm0
1326
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1668
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1669
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1670
# else
 
1671
        movdqa  (%rsi,%rdx), %xmm1
 
1672
        TOLOWER (%xmm0, %xmm1)
 
1673
        pcmpistri $0x1a, %xmm1, %xmm0
 
1674
# endif
1327
1675
        jbe     LABEL(use_sse4_2_exit)
1328
 
#ifdef USE_AS_STRNCMP
 
1676
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1329
1677
        sub     $16, %r11
1330
1678
        jbe     LABEL(strcmp_exitz_sse4_2)
1331
 
#endif
 
1679
# endif
1332
1680
 
1333
1681
        add     $16, %rdx
1334
1682
        add     $16, %r10
1336
1684
 
1337
1685
        movdqa  (%rdi, %rdx), %xmm0
1338
1686
        palignr $14, -16(%rdi, %rdx), %xmm0
1339
 
        pcmpistri       $0x1a,(%rsi,%rdx), %xmm0
 
1687
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1688
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1689
# else
 
1690
        movdqa  (%rsi,%rdx), %xmm1
 
1691
        TOLOWER (%xmm0, %xmm1)
 
1692
        pcmpistri $0x1a, %xmm1, %xmm0
 
1693
# endif
1340
1694
        jbe     LABEL(use_sse4_2_exit)
1341
 
#ifdef USE_AS_STRNCMP
 
1695
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1342
1696
        sub     $16, %r11
1343
1697
        jbe     LABEL(strcmp_exitz_sse4_2)
1344
 
#endif
 
1698
# endif
1345
1699
        add     $16, %rdx
1346
1700
        jmp     LABEL(loop_ashr_14_use_sse4_2)
1347
1701
 
1351
1705
        movdqa  -16(%rdi, %rdx), %xmm0
1352
1706
        psrldq  $14, %xmm0
1353
1707
        pcmpistri      $0x3a,%xmm0, %xmm0
1354
 
#ifdef USE_AS_STRNCMP
 
1708
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1355
1709
        cmp     %r11, %rcx
1356
1710
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
1357
 
#endif
 
1711
# endif
1358
1712
        cmp     $1, %ecx
1359
1713
        ja      LABEL(loop_ashr_14_use_sse4_2)
1360
1714
 
1363
1717
/*
1364
1718
 *  The following cases will be handled by ashr_15
1365
1719
 *  rcx(offset of rsi)  rax(offset of rdi)        relative offset        corresponding case
1366
 
 *        n(1~15)          n - 1                14(15 +(n - 1) - n)         ashr_15
 
1720
 *        n(1~15)          n - 1                  14(15 +(n - 1) - n)         ashr_15
1367
1721
 */
1368
1722
        .p2align 4
1369
1723
LABEL(ashr_15_sse4_2):
1372
1726
        movdqa  (%rsi), %xmm1
1373
1727
        pcmpeqb %xmm1, %xmm0
1374
1728
        pslldq  $1, %xmm2
 
1729
        TOLOWER (%xmm1, %xmm2)
1375
1730
        pcmpeqb %xmm1, %xmm2
1376
1731
        psubb   %xmm0, %xmm2
1377
1732
        pmovmskb %xmm2, %r9d
1406
1761
 
1407
1762
        movdqa  (%rdi, %rdx), %xmm0
1408
1763
        palignr $15, -16(%rdi, %rdx), %xmm0
1409
 
        pcmpistri      $0x1a,(%rsi,%rdx), %xmm0
 
1764
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1765
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1766
# else
 
1767
        movdqa  (%rsi,%rdx), %xmm1
 
1768
        TOLOWER (%xmm0, %xmm1)
 
1769
        pcmpistri $0x1a, %xmm1, %xmm0
 
1770
# endif
1410
1771
        jbe     LABEL(use_sse4_2_exit)
1411
 
#ifdef USE_AS_STRNCMP
 
1772
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1412
1773
        sub     $16, %r11
1413
1774
        jbe     LABEL(strcmp_exitz_sse4_2)
1414
 
#endif
 
1775
# endif
1415
1776
 
1416
1777
        add     $16, %rdx
1417
1778
        add     $16, %r10
1419
1780
 
1420
1781
        movdqa  (%rdi, %rdx), %xmm0
1421
1782
        palignr $15, -16(%rdi, %rdx), %xmm0
1422
 
        pcmpistri      $0x1a,(%rsi,%rdx), %xmm0
 
1783
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
 
1784
        pcmpistri $0x1a, (%rsi,%rdx), %xmm0
 
1785
# else
 
1786
        movdqa  (%rsi,%rdx), %xmm1
 
1787
        TOLOWER (%xmm0, %xmm1)
 
1788
        pcmpistri $0x1a, %xmm1, %xmm0
 
1789
# endif
1423
1790
        jbe     LABEL(use_sse4_2_exit)
1424
 
#ifdef USE_AS_STRNCMP
 
1791
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1425
1792
        sub     $16, %r11
1426
1793
        jbe     LABEL(strcmp_exitz_sse4_2)
1427
 
#endif
 
1794
# endif
1428
1795
        add     $16, %rdx
1429
1796
        jmp     LABEL(loop_ashr_15_use_sse4_2)
1430
1797
 
1434
1801
        movdqa  -16(%rdi, %rdx), %xmm0
1435
1802
        psrldq  $15, %xmm0
1436
1803
        pcmpistri      $0x3a,%xmm0, %xmm0
1437
 
#ifdef USE_AS_STRNCMP
 
1804
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1438
1805
        cmp     %r11, %rcx
1439
1806
        jae     LABEL(nibble_ashr_use_sse4_2_exit)
1440
 
#endif
 
1807
# endif
1441
1808
        cmp     $0, %ecx
1442
1809
        ja      LABEL(loop_ashr_15_use_sse4_2)
1443
1810
 
1444
1811
LABEL(nibble_ashr_use_sse4_2_exit):
 
1812
# if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
1445
1813
        pcmpistri      $0x1a,(%rsi,%rdx), %xmm0
 
1814
# else
 
1815
        movdqa  (%rsi,%rdx), %xmm1
 
1816
        TOLOWER (%xmm0, %xmm1)
 
1817
        pcmpistri $0x1a, %xmm1, %xmm0
 
1818
# endif
1446
1819
        .p2align 4
1447
1820
LABEL(use_sse4_2_exit):
1448
1821
        jnc     LABEL(strcmp_exitz_sse4_2)
1449
 
#ifdef USE_AS_STRNCMP
 
1822
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1450
1823
        sub     %rcx, %r11
1451
1824
        jbe     LABEL(strcmp_exitz_sse4_2)
1452
 
#endif
 
1825
# endif
1453
1826
        add     %rcx, %rdx
1454
1827
        lea     -16(%rdi, %r9), %rdi
1455
1828
        movzbl  (%rdi, %rdx), %eax
1458
1831
        jz      LABEL(use_sse4_2_ret_sse4_2)
1459
1832
        xchg    %eax, %edx
1460
1833
LABEL(use_sse4_2_ret_sse4_2):
 
1834
# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
 
1835
        leaq    _nl_C_LC_CTYPE_tolower+128*4(%rip), %rcx
 
1836
        movl    (%rcx,%rdx,4), %edx
 
1837
        movl    (%rcx,%rax,4), %eax
 
1838
# endif
 
1839
 
1461
1840
        sub     %edx, %eax
1462
1841
        ret
1463
1842
 
1473
1852
LABEL(less16bytes_sse4_2):
1474
1853
        bsf     %rdx, %rdx              /* find and store bit index in %rdx */
1475
1854
 
1476
 
#ifdef USE_AS_STRNCMP
 
1855
# if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1477
1856
        sub     %rdx, %r11
1478
1857
        jbe     LABEL(strcmp_exitz_sse4_2)
1479
 
#endif
 
1858
# endif
1480
1859
        movzbl  (%rsi, %rdx), %ecx
1481
1860
        movzbl  (%rdi, %rdx), %eax
1482
1861
 
 
1862
# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
 
1863
        leaq    _nl_C_LC_CTYPE_tolower+128*4(%rip), %rdx
 
1864
        movl    (%rdx,%rcx,4), %ecx
 
1865
        movl    (%rdx,%rax,4), %eax
 
1866
# endif
 
1867
 
1483
1868
        sub     %ecx, %eax
1484
1869
        ret
1485
1870
 
1488
1873
        ret
1489
1874
 
1490
1875
        .p2align 4
 
1876
        // XXX Same as code above
1491
1877
LABEL(Byte0_sse4_2):
1492
1878
        movzx   (%rsi), %ecx
1493
1879
        movzx   (%rdi), %eax
1494
1880
 
 
1881
# if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
 
1882
        leaq    _nl_C_LC_CTYPE_tolower+128*4(%rip), %rdx
 
1883
        movl    (%rdx,%rcx,4), %ecx
 
1884
        movl    (%rdx,%rax,4), %eax
 
1885
# endif
 
1886
 
1495
1887
        sub     %ecx, %eax
1496
1888
        ret
1497
1889
        cfi_endproc
1498
1890
        .size   STRCMP_SSE42, .-STRCMP_SSE42
1499
1891
 
 
1892
# undef UCLOW_reg
 
1893
# undef UCHIGH_reg
 
1894
# undef LCQWORD_reg
 
1895
# undef TOLOWER
 
1896
 
1500
1897
        /* Put all SSE 4.2 functions together.  */
1501
1898
        .section .rodata.sse4.2,"a",@progbits
1502
1899
        .p2align 3
1528
1925
# undef END
1529
1926
# define END(name) \
1530
1927
        cfi_endproc; .size STRCMP_SSE2, .-STRCMP_SSE2
 
1928
 
 
1929
# ifdef USE_AS_STRCASECMP_L
 
1930
#  define ENTRY2(name) \
 
1931
        .type __strcasecmp_sse2, @function; \
 
1932
        .align 16; \
 
1933
        __strcasecmp_sse2: cfi_startproc; \
 
1934
        CALL_MCOUNT
 
1935
#  define END2(name) \
 
1936
        cfi_endproc; .size __strcasecmp_sse2, .-__strcasecmp_sse2
 
1937
# endif
 
1938
 
 
1939
# ifdef USE_AS_STRNCASECMP_L
 
1940
#  define ENTRY2(name) \
 
1941
        .type __strncasecmp_sse2, @function; \
 
1942
        .align 16; \
 
1943
        __strncasecmp_sse2: cfi_startproc; \
 
1944
        CALL_MCOUNT
 
1945
#  define END2(name) \
 
1946
        cfi_endproc; .size __strncasecmp_sse2, .-__strncasecmp_sse2
 
1947
# endif
 
1948
 
1531
1949
# undef libc_hidden_builtin_def
1532
1950
/* It doesn't make sense to send libc-internal strcmp calls through a PLT.
1533
1951
   The speedup we get from using SSE4.2 instruction is likely eaten away