]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android-sdk/platform-bionic.git/blob - libc/arch-x86/silvermont/string/sse2-strcpy-slm.S
am 40bc7cd4: (-s ours) DO NOT MERGE Re-add .save directive for arm assembler code.
[android-sdk/platform-bionic.git] / libc / arch-x86 / silvermont / string / sse2-strcpy-slm.S
1 /*
2 Copyright (c) 2014, Intel Corporation
3 All rights reserved.
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
8     * Redistributions of source code must retain the above copyright notice,
9     * this list of conditions and the following disclaimer.
11     * Redistributions in binary form must reproduce the above copyright notice,
12     * this list of conditions and the following disclaimer in the documentation
13     * and/or other materials provided with the distribution.
15     * Neither the name of Intel Corporation nor the names of its contributors
16     * may be used to endorse or promote products derived from this software
17     * without specific prior written permission.
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
31 #ifndef L
32 # define L(label)       .L##label
33 #endif
35 #ifndef cfi_startproc
36 # define cfi_startproc  .cfi_startproc
37 #endif
39 #ifndef cfi_endproc
40 # define cfi_endproc    .cfi_endproc
41 #endif
43 #ifndef cfi_rel_offset
44 # define cfi_rel_offset(reg, off)       .cfi_rel_offset reg, off
45 #endif
47 #ifndef cfi_restore
48 # define cfi_restore(reg)       .cfi_restore reg
49 #endif
51 #ifndef cfi_adjust_cfa_offset
52 # define cfi_adjust_cfa_offset(off)     .cfi_adjust_cfa_offset off
53 #endif
55 #ifndef ENTRY
56 # define ENTRY(name)             \
57         .type name, @function;   \
58         .globl name;             \
59         .p2align 4;              \
60 name:                            \
61         cfi_startproc
62 #endif
64 #ifndef END
65 # define END(name)               \
66         cfi_endproc;             \
67         .size name, .-name
68 #endif
70 #define CFI_PUSH(REG)                  \
71         cfi_adjust_cfa_offset (4);     \
72         cfi_rel_offset (REG, 0)
74 #define CFI_POP(REG)                   \
75         cfi_adjust_cfa_offset (-4);    \
76         cfi_restore (REG)
78 #define PUSH(REG) pushl REG; CFI_PUSH (REG)
79 #define POP(REG) popl REG; CFI_POP (REG)
81 #ifndef STRCPY
82 # define STRCPY  strcpy
83 #endif
85 #ifdef USE_AS_STPNCPY
86 # define USE_AS_STRNCPY
87 # define USE_AS_STPCPY
88 #endif
90 #ifdef USE_AS_STRNCPY
91 # define PARMS  16
92 # define ENTRANCE PUSH(%ebx); PUSH(%esi); PUSH(%edi)
93 # define RETURN  POP(%edi); POP(%esi); POP(%ebx); ret; CFI_PUSH(%ebx); CFI_PUSH(%edi); CFI_PUSH(%edi);
94 #else
95 # define PARMS  12
96 # define ENTRANCE PUSH(%esi); PUSH(%edi)
97 # define RETURN  POP(%edi); POP(%esi); ret; CFI_PUSH(%esi); CFI_PUSH(%edi);
98 #endif
100 #define STR1  PARMS
101 #define STR2  STR1+4
102 #define LEN  STR2+4
105 #if (defined SHARED || defined __PIC__)
106 # define JMPTBL(I, B)   I - B
108 /* Load an entry in a jump table into ECX and branch to it.  TABLE is a
109         jump    table with relative offsets.  INDEX is a register contains the
110         index   into the jump table.   SCALE is the scale of INDEX. */
112 # define BRANCH_TO_JMPTBL_ENTRY(TABLE, INDEX, SCALE)            \
113         /* We first load PC into ECX.  */                       \
114         call    __x86.get_pc_thunk.cx;                         \
115         /* Get the address of the jump table.  */               \
116         addl    $(TABLE - .), %ecx;                             \
117         /* Get the entry and convert the relative offset to the \
118         absolute        address.  */                            \
119         addl    (%ecx,INDEX,SCALE), %ecx;                       \
120         /* We loaded the jump table and adjuested ECX. Go.  */  \
121         jmp     *%ecx
122 #else
123 # define JMPTBL(I, B)   I
125 /* Branch to an entry in a jump table.  TABLE is a jump table with
126         absolute        offsets.  INDEX is a register contains the index into the
127         jump    table.  SCALE is the scale of INDEX. */
129 # define BRANCH_TO_JMPTBL_ENTRY(TABLE, INDEX, SCALE)            \
130         jmp     *TABLE(,INDEX,SCALE)
131 #endif
133 .text
134 ENTRY (STRCPY)
135         ENTRANCE
136         mov     STR1(%esp), %edi
137         mov     STR2(%esp), %esi
138 #ifdef USE_AS_STRNCPY
139         movl    LEN(%esp), %ebx
140         test    %ebx, %ebx
141         jz      L(ExitZero)
142 #endif
144         mov     %esi, %ecx
145 #ifndef USE_AS_STPCPY
146         mov     %edi, %eax      /* save result */
147 #endif
148         and     $15, %ecx
149         jz      L(SourceStringAlignmentZero)
151         and     $-16, %esi
152         pxor    %xmm0, %xmm0
153         pxor    %xmm1, %xmm1
155         pcmpeqb (%esi), %xmm1
156 #ifdef USE_AS_STRNCPY
157         add     %ecx, %ebx
158 #endif
159         pmovmskb %xmm1, %edx
160         shr     %cl, %edx
161 #ifdef USE_AS_STRNCPY
162 #ifdef USE_AS_STPCPY
163         cmp     $16, %ebx
164         jbe     L(CopyFrom1To16BytesTailCase2OrCase3)
165 #else
166         cmp     $17, %ebx
167         jbe     L(CopyFrom1To16BytesTailCase2OrCase3)
168 #endif
169 #endif
170         test    %edx, %edx
171         jnz     L(CopyFrom1To16BytesTail)
173         pcmpeqb 16(%esi), %xmm0
174         pmovmskb %xmm0, %edx
175 #ifdef USE_AS_STRNCPY
176 #ifdef USE_AS_STPCPY
177         cmp     $32, %ebx
178         jbe     L(CopyFrom1To32BytesCase2OrCase3)
179 #else
180         cmp     $33, %ebx
181         jbe     L(CopyFrom1To32BytesCase2OrCase3)
182 #endif
183 #endif
184         test    %edx, %edx
185         jnz     L(CopyFrom1To32Bytes)
187         movdqu  (%esi, %ecx), %xmm1   /* copy 16 bytes */
188         movdqu  %xmm1, (%edi)
190         sub     %ecx, %edi
191         mov     %edi, %edx
192         mov     $16, %ecx
193         and     $15, %edx
194         jz      L(Align16Both)
196 /* If source adress alignment != destination adress alignment */
197         .p2align 4
198 L(Unalign16Both):
199         movdqa  (%esi, %ecx), %xmm1
200         movaps  16(%esi, %ecx), %xmm2
201         movdqu  %xmm1, (%edi, %ecx)
202         pcmpeqb %xmm2, %xmm0
203         pmovmskb %xmm0, %edx
204         add     $16, %ecx
205 #ifdef USE_AS_STRNCPY
206         sub     $48, %ebx
207         jbe     L(CopyFrom1To16BytesCase2OrCase3)
208         test    %edx, %edx
209         jnz     L(CopyFrom1To16BytesUnalignedXmm2)
210 #else
211         test    %edx, %edx
212         jnz     L(CopyFrom1To16Bytes)
213 #endif
215         movaps  16(%esi, %ecx), %xmm3
216         movdqu  %xmm2, (%edi, %ecx)
217         pcmpeqb %xmm3, %xmm0
218         pmovmskb %xmm0, %edx
219         add     $16, %ecx
220 #ifdef USE_AS_STRNCPY
221         sub     $16, %ebx
222         jbe     L(CopyFrom1To16BytesCase2OrCase3)
223         test    %edx, %edx
224         jnz     L(CopyFrom1To16BytesUnalignedXmm3)
225 #else
226         test    %edx, %edx
227         jnz     L(CopyFrom1To16Bytes)
228 #endif
230         movaps  16(%esi, %ecx), %xmm4
231         movdqu  %xmm3, (%edi, %ecx)
232         pcmpeqb %xmm4, %xmm0
233         pmovmskb %xmm0, %edx
234         add     $16, %ecx
235 #ifdef USE_AS_STRNCPY
236         sub     $16, %ebx
237         jbe     L(CopyFrom1To16BytesCase2OrCase3)
238         test    %edx, %edx
239         jnz     L(CopyFrom1To16BytesUnalignedXmm4)
240 #else
241         test    %edx, %edx
242         jnz     L(CopyFrom1To16Bytes)
243 #endif
245         movaps  16(%esi, %ecx), %xmm1
246         movdqu  %xmm4, (%edi, %ecx)
247         pcmpeqb %xmm1, %xmm0
248         pmovmskb %xmm0, %edx
249         add     $16, %ecx
250 #ifdef USE_AS_STRNCPY
251         sub     $16, %ebx
252         jbe     L(CopyFrom1To16BytesCase2OrCase3)
253         test    %edx, %edx
254         jnz     L(CopyFrom1To16BytesUnalignedXmm1)
255 #else
256         test    %edx, %edx
257         jnz     L(CopyFrom1To16Bytes)
258 #endif
260         movaps  16(%esi, %ecx), %xmm2
261         movdqu  %xmm1, (%edi, %ecx)
262         pcmpeqb %xmm2, %xmm0
263         pmovmskb %xmm0, %edx
264         add     $16, %ecx
265 #ifdef USE_AS_STRNCPY
266         sub     $16, %ebx
267         jbe     L(CopyFrom1To16BytesCase2OrCase3)
268         test    %edx, %edx
269         jnz     L(CopyFrom1To16BytesUnalignedXmm2)
270 #else
271         test    %edx, %edx
272         jnz     L(CopyFrom1To16Bytes)
273 #endif
275         movaps  16(%esi, %ecx), %xmm3
276         movdqu  %xmm2, (%edi, %ecx)
277         pcmpeqb %xmm3, %xmm0
278         pmovmskb %xmm0, %edx
279         add     $16, %ecx
280 #ifdef USE_AS_STRNCPY
281         sub     $16, %ebx
282         jbe     L(CopyFrom1To16BytesCase2OrCase3)
283         test    %edx, %edx
284         jnz     L(CopyFrom1To16BytesUnalignedXmm3)
285 #else
286         test    %edx, %edx
287         jnz     L(CopyFrom1To16Bytes)
288 #endif
290         movdqu  %xmm3, (%edi, %ecx)
291         mov     %esi, %edx
292         lea     16(%esi, %ecx), %esi
293         and     $-0x40, %esi
294         sub     %esi, %edx
295         sub     %edx, %edi
296 #ifdef USE_AS_STRNCPY
297         lea     64+64(%ebx, %edx), %ebx
298 #endif
299 L(Unaligned64Loop):
300         movaps  (%esi), %xmm2
301         movaps  %xmm2, %xmm4
302         movaps  16(%esi), %xmm5
303         movaps  32(%esi), %xmm3
304         movaps  %xmm3, %xmm6
305         movaps  48(%esi), %xmm7
306         pminub  %xmm5, %xmm2
307         pminub  %xmm7, %xmm3
308         pminub  %xmm2, %xmm3
309         pcmpeqb %xmm0, %xmm3
310         pmovmskb %xmm3, %edx
311 #ifdef USE_AS_STRNCPY
312         sub     $64, %ebx
313         jbe     L(UnalignedLeaveCase2OrCase3)
314 #endif
315         test    %edx, %edx
316         jnz     L(Unaligned64Leave)
318 L(Unaligned64Loop_start):
319         add     $64, %edi
320         add     $64, %esi
321         movdqu  %xmm4, -64(%edi)
322         movaps  (%esi), %xmm2
323         movdqa  %xmm2, %xmm4
324         movdqu  %xmm5, -48(%edi)
325         movaps  16(%esi), %xmm5
326         pminub  %xmm5, %xmm2
327         movaps  32(%esi), %xmm3
328         movdqu  %xmm6, -32(%edi)
329         movaps  %xmm3, %xmm6
330         movdqu  %xmm7, -16(%edi)
331         movaps  48(%esi), %xmm7
332         pminub  %xmm7, %xmm3
333         pminub  %xmm2, %xmm3
334         pcmpeqb %xmm3, %xmm0
335         pmovmskb %xmm0, %edx
336 #ifdef USE_AS_STRNCPY
337         sub     $64, %ebx
338         jbe     L(UnalignedLeaveCase2OrCase3)
339 #endif
340         test    %edx, %edx
341         jz      L(Unaligned64Loop_start)
343 L(Unaligned64Leave):
344         pxor    %xmm0, %xmm0
345         pxor    %xmm1, %xmm1
347         pcmpeqb %xmm4, %xmm0
348         pcmpeqb %xmm5, %xmm1
349         pmovmskb %xmm0, %edx
350         pmovmskb %xmm1, %ecx
351         test    %edx, %edx
352         jnz     L(CopyFrom1To16BytesUnaligned_0)
353         test    %ecx, %ecx
354         jnz     L(CopyFrom1To16BytesUnaligned_16)
356         pcmpeqb %xmm6, %xmm0
357         pcmpeqb %xmm7, %xmm1
358         pmovmskb %xmm0, %edx
359         pmovmskb %xmm1, %ecx
360         test    %edx, %edx
361         jnz     L(CopyFrom1To16BytesUnaligned_32)
363         bsf     %ecx, %edx
364         movdqu  %xmm4, (%edi)
365         movdqu  %xmm5, 16(%edi)
366         movdqu  %xmm6, 32(%edi)
367 #ifdef USE_AS_STRNCPY
368 #ifdef USE_AS_STPCPY
369         lea     48(%edi, %edx), %eax
370 #endif
371         movdqu  %xmm7, 48(%edi)
372         add     $15, %ebx
373         sub     %edx, %ebx
374         lea     49(%edi, %edx), %edi
375         jmp     L(StrncpyFillTailWithZero)
376 #else
377         add     $48, %esi
378         add     $48, %edi
379         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
380 #endif
382 /* If source adress alignment == destination adress alignment */
384 L(SourceStringAlignmentZero):
385         pxor    %xmm0, %xmm0
386         movdqa  (%esi), %xmm1
387         pcmpeqb %xmm1, %xmm0
388         pmovmskb %xmm0, %edx
390 #ifdef USE_AS_STRNCPY
391 #ifdef USE_AS_STPCPY
392         cmp     $16, %ebx
393         jbe     L(CopyFrom1To16BytesTail1Case2OrCase3)
394 #else
395         cmp     $17, %ebx
396         jbe     L(CopyFrom1To16BytesTail1Case2OrCase3)
397 #endif
398 #endif
399         test    %edx, %edx
400         jnz     L(CopyFrom1To16BytesTail1)
402         pcmpeqb 16(%esi), %xmm0
403         movdqu  %xmm1, (%edi)
404         pmovmskb %xmm0, %edx
406 #ifdef USE_AS_STRNCPY
407 #ifdef USE_AS_STPCPY
408         cmp     $32, %ebx
409         jbe     L(CopyFrom1To32Bytes1Case2OrCase3)
410 #else
411         cmp     $33, %ebx
412         jbe     L(CopyFrom1To32Bytes1Case2OrCase3)
413 #endif
414 #endif
415         test    %edx, %edx
416         jnz     L(CopyFrom1To32Bytes1)
418         mov     %edi, %edx
419         mov     $16, %ecx
420         and     $15, %edx
421         jnz     L(Unalign16Both)
423 L(Align16Both):
424         movdqa  (%esi, %ecx), %xmm1
425         movdqa  16(%esi, %ecx), %xmm2
426         movdqa  %xmm1, (%edi, %ecx)
427         pcmpeqb %xmm2, %xmm0
428         pmovmskb %xmm0, %edx
429         add     $16, %ecx
430 #ifdef USE_AS_STRNCPY
431         sub     $48, %ebx
432         jbe     L(CopyFrom1To16BytesCase2OrCase3)
433         test    %edx, %edx
434         jnz     L(CopyFrom1To16BytesXmm2)
435 #else
436         test    %edx, %edx
437         jnz     L(CopyFrom1To16Bytes)
438 #endif
440         movdqa  16(%esi, %ecx), %xmm3
441         movdqa  %xmm2, (%edi, %ecx)
442         pcmpeqb %xmm3, %xmm0
443         pmovmskb %xmm0, %edx
444         lea     16(%ecx), %ecx
445 #ifdef USE_AS_STRNCPY
446         sub     $16, %ebx
447         jbe     L(CopyFrom1To16BytesCase2OrCase3)
448         test    %edx, %edx
449         jnz     L(CopyFrom1To16BytesXmm3)
450 #else
451         test    %edx, %edx
452         jnz     L(CopyFrom1To16Bytes)
453 #endif
455         movdqa  16(%esi, %ecx), %xmm4
456         movdqa  %xmm3, (%edi, %ecx)
457         pcmpeqb %xmm4, %xmm0
458         pmovmskb %xmm0, %edx
459         lea     16(%ecx), %ecx
460 #ifdef USE_AS_STRNCPY
461         sub     $16, %ebx
462         jbe     L(CopyFrom1To16BytesCase2OrCase3)
463         test    %edx, %edx
464         jnz     L(CopyFrom1To16BytesXmm4)
465 #else
466         test    %edx, %edx
467         jnz     L(CopyFrom1To16Bytes)
468 #endif
470         movdqa  16(%esi, %ecx), %xmm1
471         movdqa  %xmm4, (%edi, %ecx)
472         pcmpeqb %xmm1, %xmm0
473         pmovmskb %xmm0, %edx
474         lea     16(%ecx), %ecx
475 #ifdef USE_AS_STRNCPY
476         sub     $16, %ebx
477         jbe     L(CopyFrom1To16BytesCase2OrCase3)
478         test    %edx, %edx
479         jnz     L(CopyFrom1To16BytesXmm1)
480 #else
481         test    %edx, %edx
482         jnz     L(CopyFrom1To16Bytes)
483 #endif
485         movdqa  16(%esi, %ecx), %xmm2
486         movdqa  %xmm1, (%edi, %ecx)
487         pcmpeqb %xmm2, %xmm0
488         pmovmskb %xmm0, %edx
489         lea     16(%ecx), %ecx
490 #ifdef USE_AS_STRNCPY
491         sub     $16, %ebx
492         jbe     L(CopyFrom1To16BytesCase2OrCase3)
493         test    %edx, %edx
494         jnz     L(CopyFrom1To16BytesXmm2)
495 #else
496         test    %edx, %edx
497         jnz     L(CopyFrom1To16Bytes)
498 #endif
500         movdqa  16(%esi, %ecx), %xmm3
501         movdqa  %xmm2, (%edi, %ecx)
502         pcmpeqb %xmm3, %xmm0
503         pmovmskb %xmm0, %edx
504         lea     16(%ecx), %ecx
505 #ifdef USE_AS_STRNCPY
506         sub     $16, %ebx
507         jbe     L(CopyFrom1To16BytesCase2OrCase3)
508         test    %edx, %edx
509         jnz     L(CopyFrom1To16BytesXmm3)
510 #else
511         test    %edx, %edx
512         jnz     L(CopyFrom1To16Bytes)
513 #endif
515         movdqa  %xmm3, (%edi, %ecx)
516         mov     %esi, %edx
517         lea     16(%esi, %ecx), %esi
518         and     $-0x40, %esi
519         sub     %esi, %edx
520         sub     %edx, %edi
521 #ifdef USE_AS_STRNCPY
522         lea     64+64(%ebx, %edx), %ebx
523 #endif
524 L(Aligned64Loop):
525         movdqa  (%esi), %xmm2
526         movdqa  %xmm2, %xmm4
527         movaps  16(%esi), %xmm5
528         movdqa  32(%esi), %xmm3
529         movdqa  %xmm3, %xmm6
530         movaps  48(%esi), %xmm7
531         pminub  %xmm5, %xmm2
532         pminub  %xmm7, %xmm3
533         pminub  %xmm2, %xmm3
534         pcmpeqb %xmm0, %xmm3
535         pmovmskb %xmm3, %edx
536 #ifdef USE_AS_STRNCPY
537         sub     $64, %ebx
538         jbe     L(AlignedLeaveCase2OrCase3)
539 #endif
540         test    %edx, %edx
541         jnz     L(Aligned64Leave)
543 L(Aligned64Loop_start):
544         add     $64, %esi
545         add     $64, %edi
546         movaps  %xmm4, -64(%edi)
547         movdqa  (%esi), %xmm2
548         movdqa  %xmm2, %xmm4
549         movaps  %xmm5, -48(%edi)
550         movaps  16(%esi), %xmm5
551         pminub  %xmm5, %xmm2
552         movaps  32(%esi), %xmm3
553         movaps  %xmm6, -32(%edi)
554         movdqa  %xmm3, %xmm6
555         movaps  %xmm7, -16(%edi)
556         movaps  48(%esi), %xmm7
557         pminub  %xmm7, %xmm3
558         pminub  %xmm2, %xmm3
559         pcmpeqb %xmm3, %xmm0
560         pmovmskb %xmm0, %edx
561 #ifdef USE_AS_STRNCPY
562         sub     $64, %ebx
563         jbe     L(AlignedLeaveCase2OrCase3)
564 #endif
565         test    %edx, %edx
566         jz      L(Aligned64Loop_start)
568 L(Aligned64Leave):
569         pxor    %xmm0, %xmm0
570         pxor    %xmm1, %xmm1
572         pcmpeqb %xmm4, %xmm0
573         pcmpeqb %xmm5, %xmm1
574         pmovmskb %xmm0, %edx
575         pmovmskb %xmm1, %ecx
576         test    %edx, %edx
577         jnz     L(CopyFrom1To16Bytes_0)
578         test    %ecx, %ecx
579         jnz     L(CopyFrom1To16Bytes_16)
581         pcmpeqb %xmm6, %xmm0
582         pcmpeqb %xmm7, %xmm1
583         pmovmskb %xmm0, %edx
584         pmovmskb %xmm1, %ecx
585         test    %edx, %edx
586         jnz     L(CopyFrom1To16Bytes_32)
588         bsf     %ecx, %edx
589         movdqa  %xmm4, (%edi)
590         movdqa  %xmm5, 16(%edi)
591         movdqa  %xmm6, 32(%edi)
592 #ifdef USE_AS_STRNCPY
593 #ifdef USE_AS_STPCPY
594         lea     48(%edi, %edx), %eax
595 #endif
596         movdqa  %xmm7, 48(%edi)
597         add     $15, %ebx
598         sub     %edx, %ebx
599         lea     49(%edi, %edx), %edi
600         jmp     L(StrncpyFillTailWithZero)
601 #else
602         add     $48, %esi
603         add     $48, %edi
604         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
605 #endif
607 /*----------------------------------------------------*/
609 /* Case1 */
610 #ifndef USE_AS_STRNCPY
611         .p2align 4
612 L(CopyFrom1To16Bytes):
613         add     %ecx, %edi
614         add     %ecx, %esi
615         bsf     %edx, %edx
616         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
617 #endif
618         .p2align 4
619 L(CopyFrom1To16BytesTail):
620 #ifdef USE_AS_STRNCPY
621         sub     %ecx, %ebx
622 #endif
623         add     %ecx, %esi
624         bsf     %edx, %edx
625         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
627         .p2align 4
628 L(CopyFrom1To32Bytes1):
629         add     $16, %esi
630         add     $16, %edi
631 #ifdef USE_AS_STRNCPY
632         sub     $16, %ebx
633 #endif
634 L(CopyFrom1To16BytesTail1):
635         bsf     %edx, %edx
636         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
638         .p2align 4
639 L(CopyFrom1To32Bytes):
640 #ifdef USE_AS_STRNCPY
641         sub     %ecx, %ebx
642 #endif
643         bsf     %edx, %edx
644         add     %ecx, %esi
645         add     $16, %edx
646         sub     %ecx, %edx
647         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
649         .p2align 4
650 L(CopyFrom1To16Bytes_0):
651         bsf     %edx, %edx
652 #ifdef USE_AS_STRNCPY
653 #ifdef USE_AS_STPCPY
654         lea     (%edi, %edx), %eax
655 #endif
656         movdqa  %xmm4, (%edi)
657         add     $63, %ebx
658         sub     %edx, %ebx
659         lea     1(%edi, %edx), %edi
660         jmp     L(StrncpyFillTailWithZero)
661 #else
662         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
663 #endif
665         .p2align 4
666 L(CopyFrom1To16Bytes_16):
667         bsf     %ecx, %edx
668         movdqa  %xmm4, (%edi)
669 #ifdef USE_AS_STRNCPY
670 #ifdef USE_AS_STPCPY
671         lea     16(%edi, %edx), %eax
672 #endif
673         movdqa  %xmm5, 16(%edi)
674         add     $47, %ebx
675         sub     %edx, %ebx
676         lea     17(%edi, %edx), %edi
677         jmp     L(StrncpyFillTailWithZero)
678 #else
679         add     $16, %esi
680         add     $16, %edi
681         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
682 #endif
684         .p2align 4
685 L(CopyFrom1To16Bytes_32):
686         bsf     %edx, %edx
687         movdqa  %xmm4, (%edi)
688         movdqa  %xmm5, 16(%edi)
689 #ifdef USE_AS_STRNCPY
690 #ifdef USE_AS_STPCPY
691         lea     32(%edi, %edx), %eax
692 #endif
693         movdqa  %xmm6, 32(%edi)
694         add     $31, %ebx
695         sub     %edx, %ebx
696         lea     33(%edi, %edx), %edi
697         jmp     L(StrncpyFillTailWithZero)
698 #else
699         add     $32, %esi
700         add     $32, %edi
701         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
702 #endif
704         .p2align 4
705 L(CopyFrom1To16BytesUnaligned_0):
706         bsf     %edx, %edx
707 #ifdef USE_AS_STRNCPY
708 #ifdef USE_AS_STPCPY
709         lea     (%edi, %edx), %eax
710 #endif
711         movdqu  %xmm4, (%edi)
712         add     $63, %ebx
713         sub     %edx, %ebx
714         lea     1(%edi, %edx), %edi
715         jmp     L(StrncpyFillTailWithZero)
716 #else
717         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
718 #endif
720         .p2align 4
721 L(CopyFrom1To16BytesUnaligned_16):
722         bsf     %ecx, %edx
723         movdqu  %xmm4, (%edi)
724 #ifdef USE_AS_STRNCPY
725 #ifdef USE_AS_STPCPY
726         lea     16(%edi, %edx), %eax
727 #endif
728         movdqu  %xmm5, 16(%edi)
729         add     $47, %ebx
730         sub     %edx, %ebx
731         lea     17(%edi, %edx), %edi
732         jmp     L(StrncpyFillTailWithZero)
733 #else
734         add     $16, %esi
735         add     $16, %edi
736         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
737 #endif
739         .p2align 4
740 L(CopyFrom1To16BytesUnaligned_32):
741         bsf     %edx, %edx
742         movdqu  %xmm4, (%edi)
743         movdqu  %xmm5, 16(%edi)
744 #ifdef USE_AS_STRNCPY
745 #ifdef USE_AS_STPCPY
746         lea     32(%edi, %edx), %eax
747 #endif
748         movdqu  %xmm6, 32(%edi)
749         add     $31, %ebx
750         sub     %edx, %ebx
751         lea     33(%edi, %edx), %edi
752         jmp     L(StrncpyFillTailWithZero)
753 #else
754         add     $32, %esi
755         add     $32, %edi
756         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
757 #endif
759 #ifdef USE_AS_STRNCPY
760         .p2align 4
761 L(CopyFrom1To16BytesXmm6):
762         movdqa  %xmm6, (%edi, %ecx)
763         jmp     L(CopyFrom1To16BytesXmmExit)
765         .p2align 4
766 L(CopyFrom1To16BytesXmm5):
767         movdqa  %xmm5, (%edi, %ecx)
768         jmp     L(CopyFrom1To16BytesXmmExit)
770         .p2align 4
771 L(CopyFrom1To16BytesXmm4):
772         movdqa  %xmm4, (%edi, %ecx)
773         jmp     L(CopyFrom1To16BytesXmmExit)
775         .p2align 4
776 L(CopyFrom1To16BytesXmm3):
777         movdqa  %xmm3, (%edi, %ecx)
778         jmp     L(CopyFrom1To16BytesXmmExit)
780         .p2align 4
781 L(CopyFrom1To16BytesXmm2):
782         movdqa  %xmm2, (%edi, %ecx)
783         jmp     L(CopyFrom1To16BytesXmmExit)
785         .p2align 4
786 L(CopyFrom1To16BytesXmm1):
787         movdqa  %xmm1, (%edi, %ecx)
788         jmp     L(CopyFrom1To16BytesXmmExit)
790         .p2align 4
791 L(CopyFrom1To16BytesUnalignedXmm6):
792         movdqu  %xmm6, (%edi, %ecx)
793         jmp     L(CopyFrom1To16BytesXmmExit)
795         .p2align 4
796 L(CopyFrom1To16BytesUnalignedXmm5):
797         movdqu  %xmm5, (%edi, %ecx)
798         jmp     L(CopyFrom1To16BytesXmmExit)
800         .p2align 4
801 L(CopyFrom1To16BytesUnalignedXmm4):
802         movdqu  %xmm4, (%edi, %ecx)
803         jmp     L(CopyFrom1To16BytesXmmExit)
805         .p2align 4
806 L(CopyFrom1To16BytesUnalignedXmm3):
807         movdqu  %xmm3, (%edi, %ecx)
808         jmp     L(CopyFrom1To16BytesXmmExit)
810         .p2align 4
811 L(CopyFrom1To16BytesUnalignedXmm1):
812         movdqu  %xmm1, (%edi, %ecx)
813         jmp     L(CopyFrom1To16BytesXmmExit)
815         .p2align 4
816 L(CopyFrom1To16BytesExit):
817         BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %edx, 4)
819 /* Case2 */
821         .p2align 4
822 L(CopyFrom1To16BytesCase2):
823         add     $16, %ebx
824         add     %ecx, %edi
825         add     %ecx, %esi
826         bsf     %edx, %edx
827         cmp     %ebx, %edx
828         jb      L(CopyFrom1To16BytesExit)
829         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
831         .p2align 4
832 L(CopyFrom1To32BytesCase2):
833         sub     %ecx, %ebx
834         add     %ecx, %esi
835         bsf     %edx, %edx
836         add     $16, %edx
837         sub     %ecx, %edx
838         cmp     %ebx, %edx
839         jb      L(CopyFrom1To16BytesExit)
840         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
842 L(CopyFrom1To16BytesTailCase2):
843         sub     %ecx, %ebx
844         add     %ecx, %esi
845         bsf     %edx, %edx
846         cmp     %ebx, %edx
847         jb      L(CopyFrom1To16BytesExit)
848         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
850 L(CopyFrom1To16BytesTail1Case2):
851         bsf     %edx, %edx
852         cmp     %ebx, %edx
853         jb      L(CopyFrom1To16BytesExit)
854         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
856 /* Case2 or Case3,  Case3 */
858         .p2align 4
859 L(CopyFrom1To16BytesCase2OrCase3):
860         test    %edx, %edx
861         jnz     L(CopyFrom1To16BytesCase2)
862 L(CopyFrom1To16BytesCase3):
863         add     $16, %ebx
864         add     %ecx, %edi
865         add     %ecx, %esi
866         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
868         .p2align 4
869 L(CopyFrom1To32BytesCase2OrCase3):
870         test    %edx, %edx
871         jnz     L(CopyFrom1To32BytesCase2)
872         sub     %ecx, %ebx
873         add     %ecx, %esi
874         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
876         .p2align 4
877 L(CopyFrom1To16BytesTailCase2OrCase3):
878         test    %edx, %edx
879         jnz     L(CopyFrom1To16BytesTailCase2)
880         sub     %ecx, %ebx
881         add     %ecx, %esi
882         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
884         .p2align 4
885 L(CopyFrom1To32Bytes1Case2OrCase3):
886         add     $16, %edi
887         add     $16, %esi
888         sub     $16, %ebx
889 L(CopyFrom1To16BytesTail1Case2OrCase3):
890         test    %edx, %edx
891         jnz     L(CopyFrom1To16BytesTail1Case2)
892         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
894 #endif
896 /*-----------------------------------------------------------------*/
897         .p2align 4
898 L(Exit0):
899 #ifdef USE_AS_STPCPY
900         mov     %edi, %eax
901 #endif
902         RETURN
904         .p2align 4
905 L(Exit1):
906         movb    %dh, (%edi)
907 #ifdef USE_AS_STPCPY
908         lea     (%edi), %eax
909 #endif
910 #ifdef USE_AS_STRNCPY
911         sub     $1, %ebx
912         lea     1(%edi), %edi
913         jnz     L(StrncpyFillTailWithZero)
914 #endif
915         RETURN
917         .p2align 4
918 L(Exit2):
919         movw    (%esi), %dx
920         movw    %dx, (%edi)
921 #ifdef USE_AS_STPCPY
922         lea     1(%edi), %eax
923 #endif
924 #ifdef USE_AS_STRNCPY
925         sub     $2, %ebx
926         lea     2(%edi), %edi
927         jnz     L(StrncpyFillTailWithZero)
928 #endif
929         RETURN
931         .p2align 4
932 L(Exit3):
933         movw    (%esi), %cx
934         movw    %cx, (%edi)
935         movb    %dh, 2(%edi)
936 #ifdef USE_AS_STPCPY
937         lea     2(%edi), %eax
938 #endif
939 #ifdef USE_AS_STRNCPY
940         sub     $3, %ebx
941         lea     3(%edi), %edi
942         jnz     L(StrncpyFillTailWithZero)
943 #endif
944         RETURN
946         .p2align 4
947 L(Exit4):
948         movl    (%esi), %edx
949         movl    %edx, (%edi)
950 #ifdef USE_AS_STPCPY
951         lea     3(%edi), %eax
952 #endif
953 #ifdef USE_AS_STRNCPY
954         sub     $4, %ebx
955         lea     4(%edi), %edi
956         jnz     L(StrncpyFillTailWithZero)
957 #endif
958         RETURN
960         .p2align 4
961 L(Exit5):
962         movl    (%esi), %ecx
963         movb    %dh, 4(%edi)
964         movl    %ecx, (%edi)
965 #ifdef USE_AS_STPCPY
966         lea     4(%edi), %eax
967 #endif
968 #ifdef USE_AS_STRNCPY
969         sub     $5, %ebx
970         lea     5(%edi), %edi
971         jnz     L(StrncpyFillTailWithZero)
972 #endif
973         RETURN
975         .p2align 4
976 L(Exit6):
977         movl    (%esi), %ecx
978         movw    4(%esi), %dx
979         movl    %ecx, (%edi)
980         movw    %dx, 4(%edi)
981 #ifdef USE_AS_STPCPY
982         lea     5(%edi), %eax
983 #endif
984 #ifdef USE_AS_STRNCPY
985         sub     $6, %ebx
986         lea     6(%edi), %edi
987         jnz     L(StrncpyFillTailWithZero)
988 #endif
989         RETURN
991         .p2align 4
992 L(Exit7):
993         movl    (%esi), %ecx
994         movl    3(%esi), %edx
995         movl    %ecx, (%edi)
996         movl    %edx, 3(%edi)
997 #ifdef USE_AS_STPCPY
998         lea     6(%edi), %eax
999 #endif
1000 #ifdef USE_AS_STRNCPY
1001         sub     $7, %ebx
1002         lea     7(%edi), %edi
1003         jnz     L(StrncpyFillTailWithZero)
1004 #endif
1005         RETURN
1007         .p2align 4
1008 L(Exit8):
1009         movlpd  (%esi), %xmm0
1010         movlpd  %xmm0, (%edi)
1011 #ifdef USE_AS_STPCPY
1012         lea     7(%edi), %eax
1013 #endif
1014 #ifdef USE_AS_STRNCPY
1015         sub     $8, %ebx
1016         lea     8(%edi), %edi
1017         jnz     L(StrncpyFillTailWithZero)
1018 #endif
1019         RETURN
1021         .p2align 4
1022 L(Exit9):
1023         movlpd  (%esi), %xmm0
1024         movb    %dh, 8(%edi)
1025         movlpd  %xmm0, (%edi)
1026 #ifdef USE_AS_STPCPY
1027         lea     8(%edi), %eax
1028 #endif
1029 #ifdef USE_AS_STRNCPY
1030         sub     $9, %ebx
1031         lea     9(%edi), %edi
1032         jnz     L(StrncpyFillTailWithZero)
1033 #endif
1034         RETURN
1036         .p2align 4
1037 L(Exit10):
1038         movlpd  (%esi), %xmm0
1039         movw    8(%esi), %dx
1040         movlpd  %xmm0, (%edi)
1041         movw    %dx, 8(%edi)
1042 #ifdef USE_AS_STPCPY
1043         lea     9(%edi), %eax
1044 #endif
1045 #ifdef USE_AS_STRNCPY
1046         sub     $10, %ebx
1047         lea     10(%edi), %edi
1048         jnz     L(StrncpyFillTailWithZero)
1049 #endif
1050         RETURN
1052         .p2align 4
1053 L(Exit11):
1054         movlpd  (%esi), %xmm0
1055         movl    7(%esi), %edx
1056         movlpd  %xmm0, (%edi)
1057         movl    %edx, 7(%edi)
1058 #ifdef USE_AS_STPCPY
1059         lea     10(%edi), %eax
1060 #endif
1061 #ifdef USE_AS_STRNCPY
1062         sub     $11, %ebx
1063         lea     11(%edi), %edi
1064         jnz     L(StrncpyFillTailWithZero)
1065 #endif
1066         RETURN
1068         .p2align 4
1069 L(Exit12):
1070         movlpd  (%esi), %xmm0
1071         movl    8(%esi), %edx
1072         movlpd  %xmm0, (%edi)
1073         movl    %edx, 8(%edi)
1074 #ifdef USE_AS_STPCPY
1075         lea     11(%edi), %eax
1076 #endif
1077 #ifdef USE_AS_STRNCPY
1078         sub     $12, %ebx
1079         lea     12(%edi), %edi
1080         jnz     L(StrncpyFillTailWithZero)
1081 #endif
1082         RETURN
1084         .p2align 4
1085 L(Exit13):
1086         movlpd  (%esi), %xmm0
1087         movlpd  5(%esi), %xmm1
1088         movlpd  %xmm0, (%edi)
1089         movlpd  %xmm1, 5(%edi)
1090 #ifdef USE_AS_STPCPY
1091         lea     12(%edi), %eax
1092 #endif
1093 #ifdef USE_AS_STRNCPY
1094         sub     $13, %ebx
1095         lea     13(%edi), %edi
1096         jnz     L(StrncpyFillTailWithZero)
1097 #endif
1098         RETURN
1100         .p2align 4
1101 L(Exit14):
1102         movlpd  (%esi), %xmm0
1103         movlpd  6(%esi), %xmm1
1104         movlpd  %xmm0, (%edi)
1105         movlpd  %xmm1, 6(%edi)
1106 #ifdef USE_AS_STPCPY
1107         lea     13(%edi), %eax
1108 #endif
1109 #ifdef USE_AS_STRNCPY
1110         sub     $14, %ebx
1111         lea     14(%edi), %edi
1112         jnz     L(StrncpyFillTailWithZero)
1113 #endif
1114         RETURN
1116         .p2align 4
1117 L(Exit15):
1118         movlpd  (%esi), %xmm0
1119         movlpd  7(%esi), %xmm1
1120         movlpd  %xmm0, (%edi)
1121         movlpd  %xmm1, 7(%edi)
1122 #ifdef USE_AS_STPCPY
1123         lea     14(%edi), %eax
1124 #endif
1125 #ifdef USE_AS_STRNCPY
1126         sub     $15, %ebx
1127         lea     15(%edi), %edi
1128         jnz     L(StrncpyFillTailWithZero)
1129 #endif
1130         RETURN
1132         .p2align 4
1133 L(Exit16):
1134         movdqu  (%esi), %xmm0
1135         movdqu  %xmm0, (%edi)
1136 #ifdef USE_AS_STPCPY
1137         lea     15(%edi), %eax
1138 #endif
1139 #ifdef USE_AS_STRNCPY
1140         sub     $16, %ebx
1141         lea     16(%edi), %edi
1142         jnz     L(StrncpyFillTailWithZero)
1143 #endif
1144         RETURN
1146         .p2align 4
1147 L(Exit17):
1148         movdqu  (%esi), %xmm0
1149         xor     %cl, %cl
1150         movdqu  %xmm0, (%edi)
1151         movb    %cl, 16(%edi)
1152 #ifdef USE_AS_STPCPY
1153         lea     16(%edi), %eax
1154 #endif
1155 #ifdef USE_AS_STRNCPY
1156         sub     $17, %ebx
1157         lea     17(%edi), %edi
1158         jnz     L(StrncpyFillTailWithZero)
1159 #endif
1160         RETURN
1162         .p2align 4
1163 L(Exit18):
1164         movdqu  (%esi), %xmm0
1165         movw    16(%esi), %cx
1166         movdqu  %xmm0, (%edi)
1167         movw    %cx, 16(%edi)
1168 #ifdef USE_AS_STPCPY
1169         lea     17(%edi), %eax
1170 #endif
1171 #ifdef USE_AS_STRNCPY
1172         sub     $18, %ebx
1173         lea     18(%edi), %edi
1174         jnz     L(StrncpyFillTailWithZero)
1175 #endif
1176         RETURN
1178         .p2align 4
1179 L(Exit19):
1180         movdqu  (%esi), %xmm0
1181         movl    15(%esi), %ecx
1182         movdqu  %xmm0, (%edi)
1183         movl    %ecx, 15(%edi)
1184 #ifdef USE_AS_STPCPY
1185         lea     18(%edi), %eax
1186 #endif
1187 #ifdef USE_AS_STRNCPY
1188         sub     $19, %ebx
1189         lea     19(%edi), %edi
1190         jnz     L(StrncpyFillTailWithZero)
1191 #endif
1192         RETURN
1194         .p2align 4
1195 L(Exit20):
1196         movdqu  (%esi), %xmm0
1197         movl    16(%esi), %ecx
1198         movdqu  %xmm0, (%edi)
1199         movl    %ecx, 16(%edi)
1200 #ifdef USE_AS_STPCPY
1201         lea     19(%edi), %eax
1202 #endif
1203 #ifdef USE_AS_STRNCPY
1204         sub     $20, %ebx
1205         lea     20(%edi), %edi
1206         jnz     L(StrncpyFillTailWithZero)
1207 #endif
1208         RETURN
1210         .p2align 4
1211 L(Exit21):
1212         movdqu  (%esi), %xmm0
1213         movl    16(%esi), %ecx
1214         xor     %dl, %dl
1215         movdqu  %xmm0, (%edi)
1216         movl    %ecx, 16(%edi)
1217         movb    %dl, 20(%edi)
1218 #ifdef USE_AS_STPCPY
1219         lea     20(%edi), %eax
1220 #endif
1221 #ifdef USE_AS_STRNCPY
1222         sub     $21, %ebx
1223         lea     21(%edi), %edi
1224         jnz     L(StrncpyFillTailWithZero)
1225 #endif
1226         RETURN
1228         .p2align 4
1229 L(Exit22):
1230         movdqu  (%esi), %xmm0
1231         movlpd  14(%esi), %xmm3
1232         movdqu  %xmm0, (%edi)
1233         movlpd  %xmm3, 14(%edi)
1234 #ifdef USE_AS_STPCPY
1235         lea     21(%edi), %eax
1236 #endif
1237 #ifdef USE_AS_STRNCPY
1238         sub     $22, %ebx
1239         lea     22(%edi), %edi
1240         jnz     L(StrncpyFillTailWithZero)
1241 #endif
1242         RETURN
1244         .p2align 4
1245 L(Exit23):
1246         movdqu  (%esi), %xmm0
1247         movlpd  15(%esi), %xmm3
1248         movdqu  %xmm0, (%edi)
1249         movlpd  %xmm3, 15(%edi)
1250 #ifdef USE_AS_STPCPY
1251         lea     22(%edi), %eax
1252 #endif
1253 #ifdef USE_AS_STRNCPY
1254         sub     $23, %ebx
1255         lea     23(%edi), %edi
1256         jnz     L(StrncpyFillTailWithZero)
1257 #endif
1258         RETURN
1260         .p2align 4
1261 L(Exit24):
1262         movdqu  (%esi), %xmm0
1263         movlpd  16(%esi), %xmm2
1264         movdqu  %xmm0, (%edi)
1265         movlpd  %xmm2, 16(%edi)
1266 #ifdef USE_AS_STPCPY
1267         lea     23(%edi), %eax
1268 #endif
1269 #ifdef USE_AS_STRNCPY
1270         sub     $24, %ebx
1271         lea     24(%edi), %edi
1272         jnz     L(StrncpyFillTailWithZero)
1273 #endif
1274         RETURN
1276         .p2align 4
1277 L(Exit25):
1278         movdqu  (%esi), %xmm0
1279         movlpd  16(%esi), %xmm2
1280         xor     %cl, %cl
1281         movdqu  %xmm0, (%edi)
1282         movlpd  %xmm2, 16(%edi)
1283         movb    %cl, 24(%edi)
1284 #ifdef USE_AS_STPCPY
1285         lea     24(%edi), %eax
1286 #endif
1287 #ifdef USE_AS_STRNCPY
1288         sub     $25, %ebx
1289         lea     25(%edi), %edi
1290         jnz     L(StrncpyFillTailWithZero)
1291 #endif
1292         RETURN
1294         .p2align 4
1295 L(Exit26):
1296         movdqu  (%esi), %xmm0
1297         movlpd  16(%esi), %xmm2
1298         movw    24(%esi), %cx
1299         movdqu  %xmm0, (%edi)
1300         movlpd  %xmm2, 16(%edi)
1301         movw    %cx, 24(%edi)
1302 #ifdef USE_AS_STPCPY
1303         lea     25(%edi), %eax
1304 #endif
1305 #ifdef USE_AS_STRNCPY
1306         sub     $26, %ebx
1307         lea     26(%edi), %edi
1308         jnz     L(StrncpyFillTailWithZero)
1309 #endif
1310         RETURN
1312         .p2align 4
1313 L(Exit27):
1314         movdqu  (%esi), %xmm0
1315         movlpd  16(%esi), %xmm2
1316         movl    23(%esi), %ecx
1317         movdqu  %xmm0, (%edi)
1318         movlpd  %xmm2, 16(%edi)
1319         movl    %ecx, 23(%edi)
1320 #ifdef USE_AS_STPCPY
1321         lea     26(%edi), %eax
1322 #endif
1323 #ifdef USE_AS_STRNCPY
1324         sub     $27, %ebx
1325         lea     27(%edi), %edi
1326         jnz     L(StrncpyFillTailWithZero)
1327 #endif
1328         RETURN
1330         .p2align 4
1331 L(Exit28):
1332         movdqu  (%esi), %xmm0
1333         movlpd  16(%esi), %xmm2
1334         movl    24(%esi), %ecx
1335         movdqu  %xmm0, (%edi)
1336         movlpd  %xmm2, 16(%edi)
1337         movl    %ecx, 24(%edi)
1338 #ifdef USE_AS_STPCPY
1339         lea     27(%edi), %eax
1340 #endif
1341 #ifdef USE_AS_STRNCPY
1342         sub     $28, %ebx
1343         lea     28(%edi), %edi
1344         jnz     L(StrncpyFillTailWithZero)
1345 #endif
1346         RETURN
1348         .p2align 4
1349 L(Exit29):
1350         movdqu  (%esi), %xmm0
1351         movdqu  13(%esi), %xmm2
1352         movdqu  %xmm0, (%edi)
1353         movdqu  %xmm2, 13(%edi)
1354 #ifdef USE_AS_STPCPY
1355         lea     28(%edi), %eax
1356 #endif
1357 #ifdef USE_AS_STRNCPY
1358         sub     $29, %ebx
1359         lea     29(%edi), %edi
1360         jnz     L(StrncpyFillTailWithZero)
1361 #endif
1362         RETURN
1364         .p2align 4
1365 L(Exit30):
1366         movdqu  (%esi), %xmm0
1367         movdqu  14(%esi), %xmm2
1368         movdqu  %xmm0, (%edi)
1369         movdqu  %xmm2, 14(%edi)
1370 #ifdef USE_AS_STPCPY
1371         lea     29(%edi), %eax
1372 #endif
1373 #ifdef USE_AS_STRNCPY
1374         sub     $30, %ebx
1375         lea     30(%edi), %edi
1376         jnz     L(StrncpyFillTailWithZero)
1377 #endif
1378         RETURN
1381         .p2align 4
1382 L(Exit31):
1383         movdqu  (%esi), %xmm0
1384         movdqu  15(%esi), %xmm2
1385         movdqu  %xmm0, (%edi)
1386         movdqu  %xmm2, 15(%edi)
1387 #ifdef USE_AS_STPCPY
1388         lea     30(%edi), %eax
1389 #endif
1390 #ifdef USE_AS_STRNCPY
1391         sub     $31, %ebx
1392         lea     31(%edi), %edi
1393         jnz     L(StrncpyFillTailWithZero)
1394 #endif
1395         RETURN
1397         .p2align 4
1398 L(Exit32):
1399         movdqu  (%esi), %xmm0
1400         movdqu  16(%esi), %xmm2
1401         movdqu  %xmm0, (%edi)
1402         movdqu  %xmm2, 16(%edi)
1403 #ifdef USE_AS_STPCPY
1404         lea     31(%edi), %eax
1405 #endif
1406 #ifdef USE_AS_STRNCPY
1407         sub     $32, %ebx
1408         lea     32(%edi), %edi
1409         jnz     L(StrncpyFillTailWithZero)
1410 #endif
1411         RETURN
1413 #ifdef USE_AS_STRNCPY
1415         .p2align 4
1416 L(StrncpyExit1):
1417         movb    (%esi), %dl
1418         movb    %dl, (%edi)
1419 #ifdef USE_AS_STPCPY
1420         lea     1(%edi), %eax
1421 #endif
1422         RETURN
1424         .p2align 4
1425 L(StrncpyExit2):
1426         movw    (%esi), %dx
1427         movw    %dx, (%edi)
1428 #ifdef USE_AS_STPCPY
1429         lea     2(%edi), %eax
1430 #endif
1431         RETURN
1432         .p2align 4
1433 L(StrncpyExit3):
1434         movw    (%esi), %cx
1435         movb    2(%esi), %dl
1436         movw    %cx, (%edi)
1437         movb    %dl, 2(%edi)
1438 #ifdef USE_AS_STPCPY
1439         lea     3(%edi), %eax
1440 #endif
1441         RETURN
1443         .p2align 4
1444 L(StrncpyExit4):
1445         movl    (%esi), %edx
1446         movl    %edx, (%edi)
1447 #ifdef USE_AS_STPCPY
1448         lea     4(%edi), %eax
1449 #endif
1450         RETURN
1452         .p2align 4
1453 L(StrncpyExit5):
1454         movl    (%esi), %ecx
1455         movb    4(%esi), %dl
1456         movl    %ecx, (%edi)
1457         movb    %dl, 4(%edi)
1458 #ifdef USE_AS_STPCPY
1459         lea     5(%edi), %eax
1460 #endif
1461         RETURN
1463         .p2align 4
1464 L(StrncpyExit6):
1465         movl    (%esi), %ecx
1466         movw    4(%esi), %dx
1467         movl    %ecx, (%edi)
1468         movw    %dx, 4(%edi)
1469 #ifdef USE_AS_STPCPY
1470         lea     6(%edi), %eax
1471 #endif
1472         RETURN
1474         .p2align 4
1475 L(StrncpyExit7):
1476         movl    (%esi), %ecx
1477         movl    3(%esi), %edx
1478         movl    %ecx, (%edi)
1479         movl    %edx, 3(%edi)
1480 #ifdef USE_AS_STPCPY
1481         lea     7(%edi), %eax
1482 #endif
1483         RETURN
1485         .p2align 4
1486 L(StrncpyExit8):
1487         movlpd  (%esi), %xmm0
1488         movlpd  %xmm0, (%edi)
1489 #ifdef USE_AS_STPCPY
1490         lea     8(%edi), %eax
1491 #endif
1492         RETURN
1494         .p2align 4
1495 L(StrncpyExit9):
1496         movlpd  (%esi), %xmm0
1497         movb    8(%esi), %dl
1498         movlpd  %xmm0, (%edi)
1499         movb    %dl, 8(%edi)
1500 #ifdef USE_AS_STPCPY
1501         lea     9(%edi), %eax
1502 #endif
1503         RETURN
1505         .p2align 4
1506 L(StrncpyExit10):
1507         movlpd  (%esi), %xmm0
1508         movw    8(%esi), %dx
1509         movlpd  %xmm0, (%edi)
1510         movw    %dx, 8(%edi)
1511 #ifdef USE_AS_STPCPY
1512         lea     10(%edi), %eax
1513 #endif
1514         RETURN
1516         .p2align 4
1517 L(StrncpyExit11):
1518         movlpd  (%esi), %xmm0
1519         movl    7(%esi), %edx
1520         movlpd  %xmm0, (%edi)
1521         movl    %edx, 7(%edi)
1522 #ifdef USE_AS_STPCPY
1523         lea     11(%edi), %eax
1524 #endif
1525         RETURN
1527         .p2align 4
1528 L(StrncpyExit12):
1529         movlpd  (%esi), %xmm0
1530         movl    8(%esi), %edx
1531         movlpd  %xmm0, (%edi)
1532         movl    %edx, 8(%edi)
1533 #ifdef USE_AS_STPCPY
1534         lea     12(%edi), %eax
1535 #endif
1536         RETURN
1538         .p2align 4
1539 L(StrncpyExit13):
1540         movlpd  (%esi), %xmm0
1541         movlpd  5(%esi), %xmm1
1542         movlpd  %xmm0, (%edi)
1543         movlpd  %xmm1, 5(%edi)
1544 #ifdef USE_AS_STPCPY
1545         lea     13(%edi), %eax
1546 #endif
1547         RETURN
1549         .p2align 4
1550 L(StrncpyExit14):
1551         movlpd  (%esi), %xmm0
1552         movlpd  6(%esi), %xmm1
1553         movlpd  %xmm0, (%edi)
1554         movlpd  %xmm1, 6(%edi)
1555 #ifdef USE_AS_STPCPY
1556         lea     14(%edi), %eax
1557 #endif
1558         RETURN
1560         .p2align 4
1561 L(StrncpyExit15):
1562         movlpd  (%esi), %xmm0
1563         movlpd  7(%esi), %xmm1
1564         movlpd  %xmm0, (%edi)
1565         movlpd  %xmm1, 7(%edi)
1566 #ifdef USE_AS_STPCPY
1567         lea     15(%edi), %eax
1568 #endif
1569         RETURN
1571         .p2align 4
1572 L(StrncpyExit16):
1573         movdqu  (%esi), %xmm0
1574         movdqu  %xmm0, (%edi)
1575 #ifdef USE_AS_STPCPY
1576         lea     16(%edi), %eax
1577 #endif
1578         RETURN
1580         .p2align 4
1581 L(StrncpyExit17):
1582         movdqu  (%esi), %xmm0
1583         movb    16(%esi), %cl
1584         movdqu  %xmm0, (%edi)
1585         movb    %cl, 16(%edi)
1586 #ifdef USE_AS_STPCPY
1587         lea     17(%edi), %eax
1588 #endif
1589         RETURN
1591         .p2align 4
1592 L(StrncpyExit18):
1593         movdqu  (%esi), %xmm0
1594         movw    16(%esi), %cx
1595         movdqu  %xmm0, (%edi)
1596         movw    %cx, 16(%edi)
1597 #ifdef USE_AS_STPCPY
1598         lea     18(%edi), %eax
1599 #endif
1600         RETURN
1602         .p2align 4
1603 L(StrncpyExit19):
1604         movdqu  (%esi), %xmm0
1605         movl    15(%esi), %ecx
1606         movdqu  %xmm0, (%edi)
1607         movl    %ecx, 15(%edi)
1608 #ifdef USE_AS_STPCPY
1609         lea     19(%edi), %eax
1610 #endif
1611         RETURN
1613         .p2align 4
1614 L(StrncpyExit20):
1615         movdqu  (%esi), %xmm0
1616         movl    16(%esi), %ecx
1617         movdqu  %xmm0, (%edi)
1618         movl    %ecx, 16(%edi)
1619 #ifdef USE_AS_STPCPY
1620         lea     20(%edi), %eax
1621 #endif
1622         RETURN
1624         .p2align 4
1625 L(StrncpyExit21):
1626         movdqu  (%esi), %xmm0
1627         movl    16(%esi), %ecx
1628         movb    20(%esi), %dl
1629         movdqu  %xmm0, (%edi)
1630         movl    %ecx, 16(%edi)
1631         movb    %dl, 20(%edi)
1632 #ifdef USE_AS_STPCPY
1633         lea     21(%edi), %eax
1634 #endif
1635         RETURN
1637         .p2align 4
1638 L(StrncpyExit22):
1639         movdqu  (%esi), %xmm0
1640         movlpd  14(%esi), %xmm3
1641         movdqu  %xmm0, (%edi)
1642         movlpd  %xmm3, 14(%edi)
1643 #ifdef USE_AS_STPCPY
1644         lea     22(%edi), %eax
1645 #endif
1646         RETURN
1648         .p2align 4
1649 L(StrncpyExit23):
1650         movdqu  (%esi), %xmm0
1651         movlpd  15(%esi), %xmm3
1652         movdqu  %xmm0, (%edi)
1653         movlpd  %xmm3, 15(%edi)
1654 #ifdef USE_AS_STPCPY
1655         lea     23(%edi), %eax
1656 #endif
1657         RETURN
1659         .p2align 4
1660 L(StrncpyExit24):
1661         movdqu  (%esi), %xmm0
1662         movlpd  16(%esi), %xmm2
1663         movdqu  %xmm0, (%edi)
1664         movlpd  %xmm2, 16(%edi)
1665 #ifdef USE_AS_STPCPY
1666         lea     24(%edi), %eax
1667 #endif
1668         RETURN
1670         .p2align 4
1671 L(StrncpyExit25):
1672         movdqu  (%esi), %xmm0
1673         movlpd  16(%esi), %xmm2
1674         movb    24(%esi), %cl
1675         movdqu  %xmm0, (%edi)
1676         movlpd  %xmm2, 16(%edi)
1677         movb    %cl, 24(%edi)
1678 #ifdef USE_AS_STPCPY
1679         lea     25(%edi), %eax
1680 #endif
1681         RETURN
1683         .p2align 4
1684 L(StrncpyExit26):
1685         movdqu  (%esi), %xmm0
1686         movlpd  16(%esi), %xmm2
1687         movw    24(%esi), %cx
1688         movdqu  %xmm0, (%edi)
1689         movlpd  %xmm2, 16(%edi)
1690         movw    %cx, 24(%edi)
1691 #ifdef USE_AS_STPCPY
1692         lea     26(%edi), %eax
1693 #endif
1694         RETURN
1696         .p2align 4
1697 L(StrncpyExit27):
1698         movdqu  (%esi), %xmm0
1699         movlpd  16(%esi), %xmm2
1700         movl    23(%esi), %ecx
1701         movdqu  %xmm0, (%edi)
1702         movlpd  %xmm2, 16(%edi)
1703         movl    %ecx, 23(%edi)
1704 #ifdef USE_AS_STPCPY
1705         lea     27(%edi), %eax
1706 #endif
1707         RETURN
1709         .p2align 4
1710 L(StrncpyExit28):
1711         movdqu  (%esi), %xmm0
1712         movlpd  16(%esi), %xmm2
1713         movl    24(%esi), %ecx
1714         movdqu  %xmm0, (%edi)
1715         movlpd  %xmm2, 16(%edi)
1716         movl    %ecx, 24(%edi)
1717 #ifdef USE_AS_STPCPY
1718         lea     28(%edi), %eax
1719 #endif
1720         RETURN
1722         .p2align 4
1723 L(StrncpyExit29):
1724         movdqu  (%esi), %xmm0
1725         movdqu  13(%esi), %xmm2
1726         movdqu  %xmm0, (%edi)
1727         movdqu  %xmm2, 13(%edi)
1728 #ifdef USE_AS_STPCPY
1729         lea     29(%edi), %eax
1730 #endif
1731         RETURN
1733         .p2align 4
1734 L(StrncpyExit30):
1735         movdqu  (%esi), %xmm0
1736         movdqu  14(%esi), %xmm2
1737         movdqu  %xmm0, (%edi)
1738         movdqu  %xmm2, 14(%edi)
1739 #ifdef USE_AS_STPCPY
1740         lea     30(%edi), %eax
1741 #endif
1742         RETURN
1744         .p2align 4
1745 L(StrncpyExit31):
1746         movdqu  (%esi), %xmm0
1747         movdqu  15(%esi), %xmm2
1748         movdqu  %xmm0, (%edi)
1749         movdqu  %xmm2, 15(%edi)
1750 #ifdef USE_AS_STPCPY
1751         lea     31(%edi), %eax
1752 #endif
1753         RETURN
1755         .p2align 4
1756 L(StrncpyExit32):
1757         movdqu  (%esi), %xmm0
1758         movdqu  16(%esi), %xmm2
1759         movdqu  %xmm0, (%edi)
1760         movdqu  %xmm2, 16(%edi)
1761 #ifdef USE_AS_STPCPY
1762         lea     32(%edi), %eax
1763 #endif
1764         RETURN
1766         .p2align 4
1767 L(StrncpyExit33):
1768         movdqu  (%esi), %xmm0
1769         movdqu  16(%esi), %xmm2
1770         movb    32(%esi), %cl
1771         movdqu  %xmm0, (%edi)
1772         movdqu  %xmm2, 16(%edi)
1773         movb    %cl, 32(%edi)
1774         RETURN
1776         .p2align 4
1777 L(Fill0):
1778         RETURN
1780         .p2align 4
1781 L(Fill1):
1782         movb    %dl, (%edi)
1783         RETURN
1785         .p2align 4
1786 L(Fill2):
1787         movw    %dx, (%edi)
1788         RETURN
1790         .p2align 4
1791 L(Fill3):
1792         movl    %edx, -1(%edi)
1793         RETURN
1795         .p2align 4
1796 L(Fill4):
1797         movl    %edx, (%edi)
1798         RETURN
1800         .p2align 4
1801 L(Fill5):
1802         movl    %edx, (%edi)
1803         movb    %dl, 4(%edi)
1804         RETURN
1806         .p2align 4
1807 L(Fill6):
1808         movl    %edx, (%edi)
1809         movw    %dx, 4(%edi)
1810         RETURN
1812         .p2align 4
1813 L(Fill7):
1814         movlpd  %xmm0, -1(%edi)
1815         RETURN
1817         .p2align 4
1818 L(Fill8):
1819         movlpd  %xmm0, (%edi)
1820         RETURN
1822         .p2align 4
1823 L(Fill9):
1824         movlpd  %xmm0, (%edi)
1825         movb    %dl, 8(%edi)
1826         RETURN
1828         .p2align 4
1829 L(Fill10):
1830         movlpd  %xmm0, (%edi)
1831         movw    %dx, 8(%edi)
1832         RETURN
1834         .p2align 4
1835 L(Fill11):
1836         movlpd  %xmm0, (%edi)
1837         movl    %edx, 7(%edi)
1838         RETURN
1840         .p2align 4
1841 L(Fill12):
1842         movlpd  %xmm0, (%edi)
1843         movl    %edx, 8(%edi)
1844         RETURN
1846         .p2align 4
1847 L(Fill13):
1848         movlpd  %xmm0, (%edi)
1849         movlpd  %xmm0, 5(%edi)
1850         RETURN
1852         .p2align 4
1853 L(Fill14):
1854         movlpd  %xmm0, (%edi)
1855         movlpd  %xmm0, 6(%edi)
1856         RETURN
1858         .p2align 4
1859 L(Fill15):
1860         movdqu  %xmm0, -1(%edi)
1861         RETURN
1863         .p2align 4
1864 L(Fill16):
1865         movdqu  %xmm0, (%edi)
1866         RETURN
1868         .p2align 4
1869 L(CopyFrom1To16BytesUnalignedXmm2):
1870         movdqu  %xmm2, (%edi, %ecx)
1872         .p2align 4
1873 L(CopyFrom1To16BytesXmmExit):
1874         bsf     %edx, %edx
1875         add     $15, %ebx
1876         add     %ecx, %edi
1877 #ifdef USE_AS_STPCPY
1878         lea     (%edi, %edx), %eax
1879 #endif
1880         sub     %edx, %ebx
1881         lea     1(%edi, %edx), %edi
1883         .p2align 4
1884 L(StrncpyFillTailWithZero):
1885         pxor    %xmm0, %xmm0
1886         xor     %edx, %edx
1887         sub     $16, %ebx
1888         jbe     L(StrncpyFillExit)
1890         movdqu  %xmm0, (%edi)
1891         add     $16, %edi
1893         mov     %edi, %esi
1894         and     $0xf, %esi
1895         sub     %esi, %edi
1896         add     %esi, %ebx
1897         sub     $64, %ebx
1898         jb      L(StrncpyFillLess64)
1900 L(StrncpyFillLoopMovdqa):
1901         movdqa  %xmm0, (%edi)
1902         movdqa  %xmm0, 16(%edi)
1903         movdqa  %xmm0, 32(%edi)
1904         movdqa  %xmm0, 48(%edi)
1905         add     $64, %edi
1906         sub     $64, %ebx
1907         jae     L(StrncpyFillLoopMovdqa)
1909 L(StrncpyFillLess64):
1910         add     $32, %ebx
1911         jl      L(StrncpyFillLess32)
1912         movdqa  %xmm0, (%edi)
1913         movdqa  %xmm0, 16(%edi)
1914         add     $32, %edi
1915         sub     $16, %ebx
1916         jl      L(StrncpyFillExit)
1917         movdqa  %xmm0, (%edi)
1918         add     $16, %edi
1919         BRANCH_TO_JMPTBL_ENTRY (L(FillTable), %ebx, 4)
1921 L(StrncpyFillLess32):
1922         add     $16, %ebx
1923         jl      L(StrncpyFillExit)
1924         movdqa  %xmm0, (%edi)
1925         add     $16, %edi
1926         BRANCH_TO_JMPTBL_ENTRY (L(FillTable), %ebx, 4)
1928 L(StrncpyFillExit):
1929         add     $16, %ebx
1930         BRANCH_TO_JMPTBL_ENTRY (L(FillTable), %ebx, 4)
1932         .p2align 4
1933 L(AlignedLeaveCase2OrCase3):
1934         test    %edx, %edx
1935         jnz     L(Aligned64LeaveCase2)
1936 L(Aligned64LeaveCase3):
1937         lea     64(%ebx), %ecx
1938         and     $-16, %ecx
1939         add     $48, %ebx
1940         jl      L(CopyFrom1To16BytesCase3)
1941         movdqa  %xmm4, (%edi)
1942         sub     $16, %ebx
1943         jb      L(CopyFrom1To16BytesCase3)
1944         movdqa  %xmm5, 16(%edi)
1945         sub     $16, %ebx
1946         jb      L(CopyFrom1To16BytesCase3)
1947         movdqa  %xmm6, 32(%edi)
1948         sub     $16, %ebx
1949         jb      L(CopyFrom1To16BytesCase3)
1950         movdqa  %xmm7, 48(%edi)
1951 #ifdef USE_AS_STPCPY
1952         lea     64(%edi), %eax
1953 #endif
1954         RETURN
1956         .p2align 4
1957 L(Aligned64LeaveCase2):
1958         pxor    %xmm0, %xmm0
1959         xor     %ecx, %ecx
1960         pcmpeqb %xmm4, %xmm0
1961         pmovmskb %xmm0, %edx
1962         add     $48, %ebx
1963         jle     L(CopyFrom1To16BytesCase2OrCase3)
1964         test    %edx, %edx
1965         jnz     L(CopyFrom1To16BytesXmm4)
1967         pcmpeqb %xmm5, %xmm0
1968         pmovmskb %xmm0, %edx
1969         movdqa  %xmm4, (%edi)
1970         add     $16, %ecx
1971         sub     $16, %ebx
1972         jbe     L(CopyFrom1To16BytesCase2OrCase3)
1973         test    %edx, %edx
1974         jnz     L(CopyFrom1To16BytesXmm5)
1976         pcmpeqb %xmm6, %xmm0
1977         pmovmskb %xmm0, %edx
1978         movdqa  %xmm5, 16(%edi)
1979         add     $16, %ecx
1980         sub     $16, %ebx
1981         jbe     L(CopyFrom1To16BytesCase2OrCase3)
1982         test    %edx, %edx
1983         jnz     L(CopyFrom1To16BytesXmm6)
1985         pcmpeqb %xmm7, %xmm0
1986         pmovmskb %xmm0, %edx
1987         movdqa  %xmm6, 32(%edi)
1988         lea     16(%edi, %ecx), %edi
1989         lea     16(%esi, %ecx), %esi
1990         bsf     %edx, %edx
1991         cmp     %ebx, %edx
1992         jb      L(CopyFrom1To16BytesExit)
1993         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
1995         .p2align 4
1996 L(UnalignedLeaveCase2OrCase3):
1997         test    %edx, %edx
1998         jnz     L(Unaligned64LeaveCase2)
1999 L(Unaligned64LeaveCase3):
2000         lea     64(%ebx), %ecx
2001         and     $-16, %ecx
2002         add     $48, %ebx
2003         jl      L(CopyFrom1To16BytesCase3)
2004         movdqu  %xmm4, (%edi)
2005         sub     $16, %ebx
2006         jb      L(CopyFrom1To16BytesCase3)
2007         movdqu  %xmm5, 16(%edi)
2008         sub     $16, %ebx
2009         jb      L(CopyFrom1To16BytesCase3)
2010         movdqu  %xmm6, 32(%edi)
2011         sub     $16, %ebx
2012         jb      L(CopyFrom1To16BytesCase3)
2013         movdqu  %xmm7, 48(%edi)
2014 #ifdef USE_AS_STPCPY
2015         lea     64(%edi), %eax
2016 #endif
2017         RETURN
2019         .p2align 4
2020 L(Unaligned64LeaveCase2):
2021         pxor    %xmm0, %xmm0
2022         xor     %ecx, %ecx
2023         pcmpeqb %xmm4, %xmm0
2024         pmovmskb %xmm0, %edx
2025         add     $48, %ebx
2026         jle     L(CopyFrom1To16BytesCase2OrCase3)
2027         test    %edx, %edx
2028         jnz     L(CopyFrom1To16BytesUnalignedXmm4)
2030         pcmpeqb %xmm5, %xmm0
2031         pmovmskb %xmm0, %edx
2032         movdqu  %xmm4, (%edi)
2033         add     $16, %ecx
2034         sub     $16, %ebx
2035         jbe     L(CopyFrom1To16BytesCase2OrCase3)
2036         test    %edx, %edx
2037         jnz     L(CopyFrom1To16BytesUnalignedXmm5)
2039         pcmpeqb %xmm6, %xmm0
2040         pmovmskb %xmm0, %edx
2041         movdqu  %xmm5, 16(%edi)
2042         add     $16, %ecx
2043         sub     $16, %ebx
2044         jbe     L(CopyFrom1To16BytesCase2OrCase3)
2045         test    %edx, %edx
2046         jnz     L(CopyFrom1To16BytesUnalignedXmm6)
2048         pcmpeqb %xmm7, %xmm0
2049         pmovmskb %xmm0, %edx
2050         movdqu  %xmm6, 32(%edi)
2051         lea     16(%edi, %ecx), %edi
2052         lea     16(%esi, %ecx), %esi
2053         bsf     %edx, %edx
2054         cmp     %ebx, %edx
2055         jb      L(CopyFrom1To16BytesExit)
2056         BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %ebx, 4)
2058         .p2align 4
2059 L(ExitZero):
2060         movl    %edi, %eax
2061         RETURN
2062 #endif
2064 END (STRCPY)
2066         .p2align 4
2067         .section .rodata
2068 L(ExitTable):
2069         .int    JMPTBL(L(Exit1), L(ExitTable))
2070         .int    JMPTBL(L(Exit2), L(ExitTable))
2071         .int    JMPTBL(L(Exit3), L(ExitTable))
2072         .int    JMPTBL(L(Exit4), L(ExitTable))
2073         .int    JMPTBL(L(Exit5), L(ExitTable))
2074         .int    JMPTBL(L(Exit6), L(ExitTable))
2075         .int    JMPTBL(L(Exit7), L(ExitTable))
2076         .int    JMPTBL(L(Exit8), L(ExitTable))
2077         .int    JMPTBL(L(Exit9), L(ExitTable))
2078         .int    JMPTBL(L(Exit10), L(ExitTable))
2079         .int    JMPTBL(L(Exit11), L(ExitTable))
2080         .int    JMPTBL(L(Exit12), L(ExitTable))
2081         .int    JMPTBL(L(Exit13), L(ExitTable))
2082         .int    JMPTBL(L(Exit14), L(ExitTable))
2083         .int    JMPTBL(L(Exit15), L(ExitTable))
2084         .int    JMPTBL(L(Exit16), L(ExitTable))
2085         .int    JMPTBL(L(Exit17), L(ExitTable))
2086         .int    JMPTBL(L(Exit18), L(ExitTable))
2087         .int    JMPTBL(L(Exit19), L(ExitTable))
2088         .int    JMPTBL(L(Exit20), L(ExitTable))
2089         .int    JMPTBL(L(Exit21), L(ExitTable))
2090         .int    JMPTBL(L(Exit22), L(ExitTable))
2091         .int    JMPTBL(L(Exit23), L(ExitTable))
2092         .int    JMPTBL(L(Exit24), L(ExitTable))
2093         .int    JMPTBL(L(Exit25), L(ExitTable))
2094         .int    JMPTBL(L(Exit26), L(ExitTable))
2095         .int    JMPTBL(L(Exit27), L(ExitTable))
2096         .int    JMPTBL(L(Exit28), L(ExitTable))
2097         .int    JMPTBL(L(Exit29), L(ExitTable))
2098         .int    JMPTBL(L(Exit30), L(ExitTable))
2099         .int    JMPTBL(L(Exit31), L(ExitTable))
2100         .int    JMPTBL(L(Exit32), L(ExitTable))
2101 #ifdef USE_AS_STRNCPY
2102 L(ExitStrncpyTable):
2103         .int    JMPTBL(L(Exit0), L(ExitStrncpyTable))
2104         .int    JMPTBL(L(StrncpyExit1), L(ExitStrncpyTable))
2105         .int    JMPTBL(L(StrncpyExit2), L(ExitStrncpyTable))
2106         .int    JMPTBL(L(StrncpyExit3), L(ExitStrncpyTable))
2107         .int    JMPTBL(L(StrncpyExit4), L(ExitStrncpyTable))
2108         .int    JMPTBL(L(StrncpyExit5), L(ExitStrncpyTable))
2109         .int    JMPTBL(L(StrncpyExit6), L(ExitStrncpyTable))
2110         .int    JMPTBL(L(StrncpyExit7), L(ExitStrncpyTable))
2111         .int    JMPTBL(L(StrncpyExit8), L(ExitStrncpyTable))
2112         .int    JMPTBL(L(StrncpyExit9), L(ExitStrncpyTable))
2113         .int    JMPTBL(L(StrncpyExit10), L(ExitStrncpyTable))
2114         .int    JMPTBL(L(StrncpyExit11), L(ExitStrncpyTable))
2115         .int    JMPTBL(L(StrncpyExit12), L(ExitStrncpyTable))
2116         .int    JMPTBL(L(StrncpyExit13), L(ExitStrncpyTable))
2117         .int    JMPTBL(L(StrncpyExit14), L(ExitStrncpyTable))
2118         .int    JMPTBL(L(StrncpyExit15), L(ExitStrncpyTable))
2119         .int    JMPTBL(L(StrncpyExit16), L(ExitStrncpyTable))
2120         .int    JMPTBL(L(StrncpyExit17), L(ExitStrncpyTable))
2121         .int    JMPTBL(L(StrncpyExit18), L(ExitStrncpyTable))
2122         .int    JMPTBL(L(StrncpyExit19), L(ExitStrncpyTable))
2123         .int    JMPTBL(L(StrncpyExit20), L(ExitStrncpyTable))
2124         .int    JMPTBL(L(StrncpyExit21), L(ExitStrncpyTable))
2125         .int    JMPTBL(L(StrncpyExit22), L(ExitStrncpyTable))
2126         .int    JMPTBL(L(StrncpyExit23), L(ExitStrncpyTable))
2127         .int    JMPTBL(L(StrncpyExit24), L(ExitStrncpyTable))
2128         .int    JMPTBL(L(StrncpyExit25), L(ExitStrncpyTable))
2129         .int    JMPTBL(L(StrncpyExit26), L(ExitStrncpyTable))
2130         .int    JMPTBL(L(StrncpyExit27), L(ExitStrncpyTable))
2131         .int    JMPTBL(L(StrncpyExit28), L(ExitStrncpyTable))
2132         .int    JMPTBL(L(StrncpyExit29), L(ExitStrncpyTable))
2133         .int    JMPTBL(L(StrncpyExit30), L(ExitStrncpyTable))
2134         .int    JMPTBL(L(StrncpyExit31), L(ExitStrncpyTable))
2135         .int    JMPTBL(L(StrncpyExit32), L(ExitStrncpyTable))
2136         .int    JMPTBL(L(StrncpyExit33), L(ExitStrncpyTable))
2138         .p2align 4
2139 L(FillTable):
2140         .int    JMPTBL(L(Fill0), L(FillTable))
2141         .int    JMPTBL(L(Fill1), L(FillTable))
2142         .int    JMPTBL(L(Fill2), L(FillTable))
2143         .int    JMPTBL(L(Fill3), L(FillTable))
2144         .int    JMPTBL(L(Fill4), L(FillTable))
2145         .int    JMPTBL(L(Fill5), L(FillTable))
2146         .int    JMPTBL(L(Fill6), L(FillTable))
2147         .int    JMPTBL(L(Fill7), L(FillTable))
2148         .int    JMPTBL(L(Fill8), L(FillTable))
2149         .int    JMPTBL(L(Fill9), L(FillTable))
2150         .int    JMPTBL(L(Fill10), L(FillTable))
2151         .int    JMPTBL(L(Fill11), L(FillTable))
2152         .int    JMPTBL(L(Fill12), L(FillTable))
2153         .int    JMPTBL(L(Fill13), L(FillTable))
2154         .int    JMPTBL(L(Fill14), L(FillTable))
2155         .int    JMPTBL(L(Fill15), L(FillTable))
2156         .int    JMPTBL(L(Fill16), L(FillTable))
2157 #endif