efbd3bfccb8e872eae4927268842e82b75204ce3
[platform/upstream/glibc.git] / sysdeps / x86_64 / multiarch / strcpy-ssse3.S
1 /* strcpy with SSSE3
2    Copyright (C) 2011 Free Software Foundation, Inc.
3    Contributed by Intel Corporation.
4    This file is part of the GNU C Library.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
20
21 #ifndef NOT_IN_libc
22
23 # include <sysdep.h>
24
25 # ifndef STRCPY
26 #  define STRCPY  __strcpy_ssse3
27 # endif
28
29         .section .text.ssse3,"ax",@progbits
30 ENTRY (STRCPY)
31         mov     %rsi, %rcx
32 # ifdef USE_AS_STRNCPY
33         mov     %rdx, %r8
34 # endif
35         mov     %rdi, %rdx
36 # ifdef USE_AS_STRNCPY
37         test    %r8, %r8
38         jz      L(Exit0)
39         cmp     $8, %r8
40         jbe     L(StrncpyExit8Bytes)
41 # endif
42         cmpb    $0, (%rcx)
43         jz      L(Exit1)
44         cmpb    $0, 1(%rcx)
45         jz      L(Exit2)
46         cmpb    $0, 2(%rcx)
47         jz      L(Exit3)
48         cmpb    $0, 3(%rcx)
49         jz      L(Exit4)
50         cmpb    $0, 4(%rcx)
51         jz      L(Exit5)
52         cmpb    $0, 5(%rcx)
53         jz      L(Exit6)
54         cmpb    $0, 6(%rcx)
55         jz      L(Exit7)
56         cmpb    $0, 7(%rcx)
57         jz      L(Exit8)
58 # ifdef USE_AS_STRNCPY
59         cmp     $16, %r8
60         jb      L(StrncpyExit15Bytes)
61 # endif
62         cmpb    $0, 8(%rcx)
63         jz      L(Exit9)
64         cmpb    $0, 9(%rcx)
65         jz      L(Exit10)
66         cmpb    $0, 10(%rcx)
67         jz      L(Exit11)
68         cmpb    $0, 11(%rcx)
69         jz      L(Exit12)
70         cmpb    $0, 12(%rcx)
71         jz      L(Exit13)
72         cmpb    $0, 13(%rcx)
73         jz      L(Exit14)
74         cmpb    $0, 14(%rcx)
75         jz      L(Exit15)
76 # ifdef USE_AS_STRNCPY
77         cmp     $16, %r8
78         je      L(Exit16)
79 # endif
80         cmpb    $0, 15(%rcx)
81         jz      L(Exit16)
82
83 # ifdef USE_AS_STRNCPY
84         mov     %rcx, %rsi
85         and     $0xf, %rsi
86
87 /* add 16 bytes rcx_shift to r8 */
88
89         add     %rsi, %r8
90 # endif
91         lea     16(%rcx), %rsi
92 /* Now:
93         rsi     = alignment_16(rcx) + rcx_shift + 16;
94         rcx_shift = rcx - alignment_16(rcx)
95 */
96         and     $-16, %rsi
97 /* Now:
98         rsi     = alignment_16(rcx) + 16
99 */
100         pxor    %xmm0, %xmm0
101         mov     (%rcx), %r9
102         mov     %r9, (%rdx)
103 /*
104         look    if there is zero symbol in next 16 bytes of string
105         from    rsi to rsi + 15 and form mask in xmm0
106 */
107         pcmpeqb (%rsi), %xmm0
108         mov     8(%rcx), %r9
109         mov     %r9, 8(%rdx)
110
111 /* convert byte mask in xmm0 to bit mask */
112
113         pmovmskb %xmm0, %rax
114         sub     %rcx, %rsi
115
116 /* rsi = 16 - rcx_shift */
117
118 /* rax = 0: there isn't end of string from position rsi to rsi+15 */
119
120 # ifdef USE_AS_STRNCPY
121         sub     $32, %r8
122         jbe     L(CopyFrom1To16BytesCase2OrCase3)
123 # endif
124         test    %rax, %rax
125         jnz     L(CopyFrom1To16Bytes)
126
127         mov     %rdx, %rax
128         lea     16(%rdx), %rdx
129 /* Now:
130         rdx     = rdx + 16 = alignment_16(rdx) + rdx_shift + 16
131 */
132         and     $-16, %rdx
133
134 /* Now: rdx = alignment_16(rdx) + 16 */
135
136         sub     %rdx, %rax
137
138 /* Now: rax = rdx_shift - 16 */
139
140 # ifdef USE_AS_STRNCPY
141         add     %rax, %rsi
142         lea     -1(%rsi), %rsi
143         and     $1<<31, %esi
144         test    %rsi, %rsi
145         jnz     L(ContinueCopy)
146         lea     16(%r8), %r8
147
148 L(ContinueCopy):
149 # endif
150         sub     %rax, %rcx
151 /* Now:
152         case    rcx_shift >= rdx_shift:
153         rcx     = alignment_16(rcx) + (rcx_shift  - rdx_shift) + 16
154         case    rcx_shift < rdx_shift:
155         rcx     = alignment_16(rcx) + (16 + rcx_shift  - rdx_shift)
156 */
157         mov     %rcx, %rax
158         and     $0xf, %rax
159 /* Now:
160         case    rcx_shift >= rdx_shift: rax = rcx_shift  - rdx_shift
161         case    rcx_shift < rdx_shift: rax = (16 + rcx_shift  - rdx_shift)
162         rax     can be 0, 1,    ..., 15
163 */
164         mov     $0, %rsi
165
166 /* case: rcx_shift == rdx_shift */
167
168         jz      L(Align16Both)
169
170         cmp     $8, %rax
171         jae     L(ShlHigh8)
172         cmp     $1, %rax
173         je      L(Shl1)
174         cmp     $2, %rax
175         je      L(Shl2)
176         cmp     $3, %rax
177         je      L(Shl3)
178         cmp     $4, %rax
179         je      L(Shl4)
180         cmp     $5, %rax
181         je      L(Shl5)
182         cmp     $6, %rax
183         je      L(Shl6)
184         jmp     L(Shl7)
185
186 L(ShlHigh8):
187         je      L(Shl8)
188         cmp     $9, %rax
189         je      L(Shl9)
190         cmp     $10, %rax
191         je      L(Shl10)
192         cmp     $11, %rax
193         je      L(Shl11)
194         cmp     $12, %rax
195         je      L(Shl12)
196         cmp     $13, %rax
197         je      L(Shl13)
198         cmp     $14, %rax
199         je      L(Shl14)
200         jmp     L(Shl15)
201
202 L(Align16Both):
203         movaps  (%rcx), %xmm1
204         movaps  16(%rcx), %xmm2
205         movaps  %xmm1, (%rdx)
206         pcmpeqb %xmm2, %xmm0
207         pmovmskb %xmm0, %rax
208         lea     16(%rsi), %rsi
209 # ifdef USE_AS_STRNCPY
210         sub     $16, %r8
211         jbe     L(CopyFrom1To16BytesCase2OrCase3)
212 # endif
213         test    %rax, %rax
214         jnz     L(CopyFrom1To16Bytes)
215
216         movaps  16(%rcx, %rsi), %xmm3
217         movaps  %xmm2, (%rdx, %rsi)
218         pcmpeqb %xmm3, %xmm0
219         pmovmskb %xmm0, %rax
220         lea     16(%rsi), %rsi
221 # ifdef USE_AS_STRNCPY
222         sub     $16, %r8
223         jbe     L(CopyFrom1To16BytesCase2OrCase3)
224 # endif
225         test    %rax, %rax
226         jnz     L(CopyFrom1To16Bytes)
227
228         movaps  16(%rcx, %rsi), %xmm4
229         movaps  %xmm3, (%rdx, %rsi)
230         pcmpeqb %xmm4, %xmm0
231         pmovmskb %xmm0, %rax
232         lea     16(%rsi), %rsi
233 # ifdef USE_AS_STRNCPY
234         sub     $16, %r8
235         jbe     L(CopyFrom1To16BytesCase2OrCase3)
236 # endif
237         test    %rax, %rax
238         jnz     L(CopyFrom1To16Bytes)
239
240         movaps  16(%rcx, %rsi), %xmm1
241         movaps  %xmm4, (%rdx, %rsi)
242         pcmpeqb %xmm1, %xmm0
243         pmovmskb %xmm0, %rax
244         lea     16(%rsi), %rsi
245 # ifdef USE_AS_STRNCPY
246         sub     $16, %r8
247         jbe     L(CopyFrom1To16BytesCase2OrCase3)
248 # endif
249         test    %rax, %rax
250         jnz     L(CopyFrom1To16Bytes)
251
252         movaps  16(%rcx, %rsi), %xmm2
253         movaps  %xmm1, (%rdx, %rsi)
254         pcmpeqb %xmm2, %xmm0
255         pmovmskb %xmm0, %rax
256         lea     16(%rsi), %rsi
257 # ifdef USE_AS_STRNCPY
258         sub     $16, %r8
259         jbe     L(CopyFrom1To16BytesCase2OrCase3)
260 # endif
261         test    %rax, %rax
262         jnz     L(CopyFrom1To16Bytes)
263
264         movaps  16(%rcx, %rsi), %xmm3
265         movaps  %xmm2, (%rdx, %rsi)
266         pcmpeqb %xmm3, %xmm0
267         pmovmskb %xmm0, %rax
268         lea     16(%rsi), %rsi
269 # ifdef USE_AS_STRNCPY
270         sub     $16, %r8
271         jbe     L(CopyFrom1To16BytesCase2OrCase3)
272 # endif
273         test    %rax, %rax
274         jnz     L(CopyFrom1To16Bytes)
275
276         movaps  %xmm3, (%rdx, %rsi)
277         mov     %rcx, %rax
278         lea     16(%rcx, %rsi), %rcx
279         and     $-0x40, %rcx
280         sub     %rcx, %rax
281         sub     %rax, %rdx
282 # ifdef USE_AS_STRNCPY
283         lea     48+64(%r8, %rax), %r8
284 # endif
285         mov     $-0x40, %rsi
286
287 L(Aligned64Loop):
288         movaps  (%rcx), %xmm2
289         movaps  %xmm2, %xmm4
290         movaps  16(%rcx), %xmm5
291         movaps  32(%rcx), %xmm3
292         movaps  %xmm3, %xmm6
293         movaps  48(%rcx), %xmm7
294         pminub  %xmm5, %xmm2
295         pminub  %xmm7, %xmm3
296         pminub  %xmm2, %xmm3
297         pcmpeqb %xmm0, %xmm3
298         pmovmskb %xmm3, %rax
299         lea     64(%rdx), %rdx
300         lea     64(%rcx), %rcx
301 # ifdef USE_AS_STRNCPY
302         sub     $64, %r8
303         jbe     L(StrncpyLeaveCase2OrCase3)
304 # endif
305         test    %rax, %rax
306         jnz     L(Aligned64Leave)
307         movaps  %xmm4, -64(%rdx)
308         movaps  %xmm5, -48(%rdx)
309         movaps  %xmm6, -32(%rdx)
310         movaps  %xmm7, -16(%rdx)
311         jmp     L(Aligned64Loop)
312
313 L(Aligned64Leave):
314 # ifdef USE_AS_STRNCPY
315         lea     48(%r8), %r8
316 # endif
317         pcmpeqb %xmm4, %xmm0
318         pmovmskb %xmm0, %rax
319         test    %rax, %rax
320         jnz     L(CopyFrom1To16Bytes)
321
322         pcmpeqb %xmm5, %xmm0
323 # ifdef USE_AS_STRNCPY
324         lea     -16(%r8), %r8
325 # endif
326         pmovmskb %xmm0, %rax
327         movaps  %xmm4, -64(%rdx)
328         test    %rax, %rax
329         lea     16(%rsi), %rsi
330         jnz     L(CopyFrom1To16Bytes)
331
332         pcmpeqb %xmm6, %xmm0
333 # ifdef USE_AS_STRNCPY
334         lea     -16(%r8), %r8
335 # endif
336         pmovmskb %xmm0, %rax
337         movaps  %xmm5, -48(%rdx)
338         test    %rax, %rax
339         lea     16(%rsi), %rsi
340         jnz     L(CopyFrom1To16Bytes)
341
342         movaps  %xmm6, -32(%rdx)
343         pcmpeqb %xmm7, %xmm0
344 # ifdef USE_AS_STRNCPY
345         lea     -16(%r8), %r8
346 # endif
347         pmovmskb %xmm0, %rax
348         lea     16(%rsi), %rsi
349         jmp     L(CopyFrom1To16Bytes)
350
351         .p2align 4
352 L(Shl1):
353         movaps  -1(%rcx), %xmm1
354         movaps  15(%rcx), %xmm2
355 L(Shl1Start):
356         pcmpeqb %xmm2, %xmm0
357         pmovmskb %xmm0, %rax
358         movaps  %xmm2, %xmm3
359 # ifdef USE_AS_STRNCPY
360         sub     $16, %r8
361         jbe     L(StrncpyExit1Case2OrCase3)
362 # endif
363         test    %rax, %rax
364         jnz     L(Shl1LoopExit)
365
366         palignr $1, %xmm1, %xmm2
367         movaps  %xmm3, %xmm1
368         movaps  %xmm2, (%rdx)
369         movaps  31(%rcx), %xmm2
370
371         pcmpeqb %xmm2, %xmm0
372         lea     16(%rdx), %rdx
373         pmovmskb %xmm0, %rax
374         lea     16(%rcx), %rcx
375         movaps  %xmm2, %xmm3
376 # ifdef USE_AS_STRNCPY
377         sub     $16, %r8
378         jbe     L(StrncpyExit1Case2OrCase3)
379 # endif
380         test    %rax, %rax
381         jnz     L(Shl1LoopExit)
382
383         palignr $1, %xmm1, %xmm2
384         movaps  %xmm2, (%rdx)
385         movaps  31(%rcx), %xmm2
386         movaps  %xmm3, %xmm1
387
388         pcmpeqb %xmm2, %xmm0
389         lea     16(%rdx), %rdx
390         pmovmskb %xmm0, %rax
391         lea     16(%rcx), %rcx
392         movaps  %xmm2, %xmm3
393 # ifdef USE_AS_STRNCPY
394         sub     $16, %r8
395         jbe     L(StrncpyExit1Case2OrCase3)
396 # endif
397         test    %rax, %rax
398         jnz     L(Shl1LoopExit)
399
400         palignr $1, %xmm1, %xmm2
401         movaps  %xmm3, %xmm1
402         movaps  %xmm2, (%rdx)
403         movaps  31(%rcx), %xmm2
404
405         pcmpeqb %xmm2, %xmm0
406         lea     16(%rdx), %rdx
407         pmovmskb %xmm0, %rax
408         lea     16(%rcx), %rcx
409         movaps  %xmm2, %xmm3
410 # ifdef USE_AS_STRNCPY
411         sub     $16, %r8
412         jbe     L(StrncpyExit1Case2OrCase3)
413 # endif
414         test    %rax, %rax
415         jnz     L(Shl1LoopExit)
416
417         palignr $1, %xmm1, %xmm2
418         movaps  %xmm3, %xmm1
419         movaps  %xmm2, (%rdx)
420         lea     31(%rcx), %rcx
421         lea     16(%rdx), %rdx
422
423         mov     %rcx, %rax
424         and     $-0x40, %rcx
425         sub     %rcx, %rax
426         lea     -15(%rcx), %rcx
427         sub     %rax, %rdx
428 # ifdef USE_AS_STRNCPY
429         add     %rax, %r8
430 # endif
431         movaps  -1(%rcx), %xmm1
432
433 L(Shl1LoopStart):
434         movaps  15(%rcx), %xmm2
435         movaps  31(%rcx), %xmm3
436         movaps  %xmm3, %xmm6
437         movaps  47(%rcx), %xmm4
438         movaps  %xmm4, %xmm7
439         movaps  63(%rcx), %xmm5
440         pminub  %xmm2, %xmm6
441         pminub  %xmm5, %xmm7
442         pminub  %xmm6, %xmm7
443         pcmpeqb %xmm0, %xmm7
444         pmovmskb %xmm7, %rax
445         movaps  %xmm5, %xmm7
446         palignr $1, %xmm4, %xmm5
447         test    %rax, %rax
448         palignr $1, %xmm3, %xmm4
449         jnz     L(Shl1Start)
450 # ifdef USE_AS_STRNCPY
451         sub     $64, %r8
452         jbe     L(StrncpyLeave1)
453 # endif
454         palignr $1, %xmm2, %xmm3
455         lea     64(%rcx), %rcx
456         palignr $1, %xmm1, %xmm2
457         movaps  %xmm7, %xmm1
458         movaps  %xmm5, 48(%rdx)
459         movaps  %xmm4, 32(%rdx)
460         movaps  %xmm3, 16(%rdx)
461         movaps  %xmm2, (%rdx)
462         lea     64(%rdx), %rdx
463         jmp     L(Shl1LoopStart)
464
465 L(Shl1LoopExit):
466         movaps  (%rdx), %xmm6
467         psrldq  $15, %xmm6
468         mov     $15, %rsi
469         palignr $1, %xmm1, %xmm6
470         movaps  %xmm6, (%rdx)
471         jmp     L(CopyFrom1To16Bytes)
472
473         .p2align 4
474 L(Shl2):
475         movaps  -2(%rcx), %xmm1
476         movaps  14(%rcx), %xmm2
477 L(Shl2Start):
478         pcmpeqb %xmm2, %xmm0
479         pmovmskb %xmm0, %rax
480         movaps  %xmm2, %xmm3
481 # ifdef USE_AS_STRNCPY
482         sub     $16, %r8
483         jbe     L(StrncpyExit2Case2OrCase3)
484 # endif
485         test    %rax, %rax
486         jnz     L(Shl2LoopExit)
487
488         palignr $2, %xmm1, %xmm2
489         movaps  %xmm3, %xmm1
490         movaps  %xmm2, (%rdx)
491         movaps  30(%rcx), %xmm2
492
493         pcmpeqb %xmm2, %xmm0
494         lea     16(%rdx), %rdx
495         pmovmskb %xmm0, %rax
496         lea     16(%rcx), %rcx
497         movaps  %xmm2, %xmm3
498 # ifdef USE_AS_STRNCPY
499         sub     $16, %r8
500         jbe     L(StrncpyExit2Case2OrCase3)
501 # endif
502         test    %rax, %rax
503         jnz     L(Shl2LoopExit)
504
505         palignr $2, %xmm1, %xmm2
506         movaps  %xmm2, (%rdx)
507         movaps  30(%rcx), %xmm2
508         movaps  %xmm3, %xmm1
509
510         pcmpeqb %xmm2, %xmm0
511         lea     16(%rdx), %rdx
512         pmovmskb %xmm0, %rax
513         lea     16(%rcx), %rcx
514         movaps  %xmm2, %xmm3
515 # ifdef USE_AS_STRNCPY
516         sub     $16, %r8
517         jbe     L(StrncpyExit2Case2OrCase3)
518 # endif
519         test    %rax, %rax
520         jnz     L(Shl2LoopExit)
521
522         palignr $2, %xmm1, %xmm2
523         movaps  %xmm3, %xmm1
524         movaps  %xmm2, (%rdx)
525         movaps  30(%rcx), %xmm2
526
527         pcmpeqb %xmm2, %xmm0
528         lea     16(%rdx), %rdx
529         pmovmskb %xmm0, %rax
530         lea     16(%rcx), %rcx
531         movaps  %xmm2, %xmm3
532 # ifdef USE_AS_STRNCPY
533         sub     $16, %r8
534         jbe     L(StrncpyExit2Case2OrCase3)
535 # endif
536         test    %rax, %rax
537         jnz     L(Shl2LoopExit)
538
539         palignr $2, %xmm1, %xmm2
540         movaps  %xmm3, %xmm1
541         movaps  %xmm2, (%rdx)
542         lea     30(%rcx), %rcx
543         lea     16(%rdx), %rdx
544
545         mov     %rcx, %rax
546         and     $-0x40, %rcx
547         sub     %rcx, %rax
548         lea     -14(%rcx), %rcx
549         sub     %rax, %rdx
550 # ifdef USE_AS_STRNCPY
551         add     %rax, %r8
552 # endif
553         movaps  -2(%rcx), %xmm1
554
555 L(Shl2LoopStart):
556         movaps  14(%rcx), %xmm2
557         movaps  30(%rcx), %xmm3
558         movaps  %xmm3, %xmm6
559         movaps  46(%rcx), %xmm4
560         movaps  %xmm4, %xmm7
561         movaps  62(%rcx), %xmm5
562         pminub  %xmm2, %xmm6
563         pminub  %xmm5, %xmm7
564         pminub  %xmm6, %xmm7
565         pcmpeqb %xmm0, %xmm7
566         pmovmskb %xmm7, %rax
567         movaps  %xmm5, %xmm7
568         palignr $2, %xmm4, %xmm5
569         test    %rax, %rax
570         palignr $2, %xmm3, %xmm4
571         jnz     L(Shl2Start)
572 # ifdef USE_AS_STRNCPY
573         sub     $64, %r8
574         jbe     L(StrncpyLeave2)
575 # endif
576         palignr $2, %xmm2, %xmm3
577         lea     64(%rcx), %rcx
578         palignr $2, %xmm1, %xmm2
579         movaps  %xmm7, %xmm1
580         movaps  %xmm5, 48(%rdx)
581         movaps  %xmm4, 32(%rdx)
582         movaps  %xmm3, 16(%rdx)
583         movaps  %xmm2, (%rdx)
584         lea     64(%rdx), %rdx
585         jmp     L(Shl2LoopStart)
586
587 L(Shl2LoopExit):
588         movaps  (%rdx), %xmm6
589         psrldq  $14, %xmm6
590         mov     $14, %rsi
591         palignr $2, %xmm1, %xmm6
592         movaps  %xmm6, (%rdx)
593         jmp     L(CopyFrom1To16Bytes)
594
595         .p2align 4
596 L(Shl3):
597         movaps  -3(%rcx), %xmm1
598         movaps  13(%rcx), %xmm2
599 L(Shl3Start):
600         pcmpeqb %xmm2, %xmm0
601         pmovmskb %xmm0, %rax
602         movaps  %xmm2, %xmm3
603 # ifdef USE_AS_STRNCPY
604         sub     $16, %r8
605         jbe     L(StrncpyExit3Case2OrCase3)
606 # endif
607         test    %rax, %rax
608         jnz     L(Shl3LoopExit)
609
610         palignr $3, %xmm1, %xmm2
611         movaps  %xmm3, %xmm1
612         movaps  %xmm2, (%rdx)
613         movaps  29(%rcx), %xmm2
614
615         pcmpeqb %xmm2, %xmm0
616         lea     16(%rdx), %rdx
617         pmovmskb %xmm0, %rax
618         lea     16(%rcx), %rcx
619         movaps  %xmm2, %xmm3
620 # ifdef USE_AS_STRNCPY
621         sub     $16, %r8
622         jbe     L(StrncpyExit3Case2OrCase3)
623 # endif
624         test    %rax, %rax
625         jnz     L(Shl3LoopExit)
626
627         palignr $3, %xmm1, %xmm2
628         movaps  %xmm2, (%rdx)
629         movaps  29(%rcx), %xmm2
630         movaps  %xmm3, %xmm1
631
632         pcmpeqb %xmm2, %xmm0
633         lea     16(%rdx), %rdx
634         pmovmskb %xmm0, %rax
635         lea     16(%rcx), %rcx
636         movaps  %xmm2, %xmm3
637 # ifdef USE_AS_STRNCPY
638         sub     $16, %r8
639         jbe     L(StrncpyExit3Case2OrCase3)
640 # endif
641         test    %rax, %rax
642         jnz     L(Shl3LoopExit)
643
644         palignr $3, %xmm1, %xmm2
645         movaps  %xmm3, %xmm1
646         movaps  %xmm2, (%rdx)
647         movaps  29(%rcx), %xmm2
648
649         pcmpeqb %xmm2, %xmm0
650         lea     16(%rdx), %rdx
651         pmovmskb %xmm0, %rax
652         lea     16(%rcx), %rcx
653         movaps  %xmm2, %xmm3
654 # ifdef USE_AS_STRNCPY
655         sub     $16, %r8
656         jbe     L(StrncpyExit3Case2OrCase3)
657 # endif
658         test    %rax, %rax
659         jnz     L(Shl3LoopExit)
660
661         palignr $3, %xmm1, %xmm2
662         movaps  %xmm3, %xmm1
663         movaps  %xmm2, (%rdx)
664         lea     29(%rcx), %rcx
665         lea     16(%rdx), %rdx
666
667         mov     %rcx, %rax
668         and     $-0x40, %rcx
669         sub     %rcx, %rax
670         lea     -13(%rcx), %rcx
671         sub     %rax, %rdx
672 # ifdef USE_AS_STRNCPY
673         add     %rax, %r8
674 # endif
675         movaps  -3(%rcx), %xmm1
676
677 L(Shl3LoopStart):
678         movaps  13(%rcx), %xmm2
679         movaps  29(%rcx), %xmm3
680         movaps  %xmm3, %xmm6
681         movaps  45(%rcx), %xmm4
682         movaps  %xmm4, %xmm7
683         movaps  61(%rcx), %xmm5
684         pminub  %xmm2, %xmm6
685         pminub  %xmm5, %xmm7
686         pminub  %xmm6, %xmm7
687         pcmpeqb %xmm0, %xmm7
688         pmovmskb %xmm7, %rax
689         movaps  %xmm5, %xmm7
690         palignr $3, %xmm4, %xmm5
691         test    %rax, %rax
692         palignr $3, %xmm3, %xmm4
693         jnz     L(Shl3Start)
694 # ifdef USE_AS_STRNCPY
695         sub     $64, %r8
696         jbe     L(StrncpyLeave3)
697 # endif
698         palignr $3, %xmm2, %xmm3
699         lea     64(%rcx), %rcx
700         palignr $3, %xmm1, %xmm2
701         movaps  %xmm7, %xmm1
702         movaps  %xmm5, 48(%rdx)
703         movaps  %xmm4, 32(%rdx)
704         movaps  %xmm3, 16(%rdx)
705         movaps  %xmm2, (%rdx)
706         lea     64(%rdx), %rdx
707         jmp     L(Shl3LoopStart)
708
709 L(Shl3LoopExit):
710         movaps  (%rdx), %xmm6
711         psrldq  $13, %xmm6
712         mov     $13, %rsi
713         palignr $3, %xmm1, %xmm6
714         movaps  %xmm6, (%rdx)
715         jmp     L(CopyFrom1To16Bytes)
716
717         .p2align 4
718 L(Shl4):
719         movaps  -4(%rcx), %xmm1
720         movaps  12(%rcx), %xmm2
721 L(Shl4Start):
722         pcmpeqb %xmm2, %xmm0
723         pmovmskb %xmm0, %rax
724         movaps  %xmm2, %xmm3
725 # ifdef USE_AS_STRNCPY
726         sub     $16, %r8
727         jbe     L(StrncpyExit4Case2OrCase3)
728 # endif
729         test    %rax, %rax
730         jnz     L(Shl4LoopExit)
731
732         palignr $4, %xmm1, %xmm2
733         movaps  %xmm3, %xmm1
734         movaps  %xmm2, (%rdx)
735         movaps  28(%rcx), %xmm2
736
737         pcmpeqb %xmm2, %xmm0
738         lea     16(%rdx), %rdx
739         pmovmskb %xmm0, %rax
740         lea     16(%rcx), %rcx
741         movaps  %xmm2, %xmm3
742 # ifdef USE_AS_STRNCPY
743         sub     $16, %r8
744         jbe     L(StrncpyExit4Case2OrCase3)
745 # endif
746         test    %rax, %rax
747         jnz     L(Shl4LoopExit)
748
749         palignr $4, %xmm1, %xmm2
750         movaps  %xmm2, (%rdx)
751         movaps  28(%rcx), %xmm2
752         movaps  %xmm3, %xmm1
753
754         pcmpeqb %xmm2, %xmm0
755         lea     16(%rdx), %rdx
756         pmovmskb %xmm0, %rax
757         lea     16(%rcx), %rcx
758         movaps  %xmm2, %xmm3
759 # ifdef USE_AS_STRNCPY
760         sub     $16, %r8
761         jbe     L(StrncpyExit4Case2OrCase3)
762 # endif
763         test    %rax, %rax
764         jnz     L(Shl4LoopExit)
765
766         palignr $4, %xmm1, %xmm2
767         movaps  %xmm3, %xmm1
768         movaps  %xmm2, (%rdx)
769         movaps  28(%rcx), %xmm2
770
771         pcmpeqb %xmm2, %xmm0
772         lea     16(%rdx), %rdx
773         pmovmskb %xmm0, %rax
774         lea     16(%rcx), %rcx
775         movaps  %xmm2, %xmm3
776 # ifdef USE_AS_STRNCPY
777         sub     $16, %r8
778         jbe     L(StrncpyExit4Case2OrCase3)
779 # endif
780         test    %rax, %rax
781         jnz     L(Shl4LoopExit)
782
783         palignr $4, %xmm1, %xmm2
784         movaps  %xmm3, %xmm1
785         movaps  %xmm2, (%rdx)
786         lea     28(%rcx), %rcx
787         lea     16(%rdx), %rdx
788
789         mov     %rcx, %rax
790         and     $-0x40, %rcx
791         sub     %rcx, %rax
792         lea     -12(%rcx), %rcx
793         sub     %rax, %rdx
794 # ifdef USE_AS_STRNCPY
795         add     %rax, %r8
796 # endif
797         movaps  -4(%rcx), %xmm1
798
799 L(Shl4LoopStart):
800         movaps  12(%rcx), %xmm2
801         movaps  28(%rcx), %xmm3
802         movaps  %xmm3, %xmm6
803         movaps  44(%rcx), %xmm4
804         movaps  %xmm4, %xmm7
805         movaps  60(%rcx), %xmm5
806         pminub  %xmm2, %xmm6
807         pminub  %xmm5, %xmm7
808         pminub  %xmm6, %xmm7
809         pcmpeqb %xmm0, %xmm7
810         pmovmskb %xmm7, %rax
811         movaps  %xmm5, %xmm7
812         palignr $4, %xmm4, %xmm5
813         test    %rax, %rax
814         palignr $4, %xmm3, %xmm4
815         jnz     L(Shl4Start)
816 # ifdef USE_AS_STRNCPY
817         sub     $64, %r8
818         jbe     L(StrncpyLeave4)
819 # endif
820         palignr $4, %xmm2, %xmm3
821         lea     64(%rcx), %rcx
822         palignr $4, %xmm1, %xmm2
823         movaps  %xmm7, %xmm1
824         movaps  %xmm5, 48(%rdx)
825         movaps  %xmm4, 32(%rdx)
826         movaps  %xmm3, 16(%rdx)
827         movaps  %xmm2, (%rdx)
828         lea     64(%rdx), %rdx
829         jmp     L(Shl4LoopStart)
830
831 L(Shl4LoopExit):
832         movaps  (%rdx), %xmm6
833         psrldq  $12, %xmm6
834         mov     $12, %rsi
835         palignr $4, %xmm1, %xmm6
836         movaps  %xmm6, (%rdx)
837         jmp     L(CopyFrom1To16Bytes)
838
839         .p2align 4
840 L(Shl5):
841         movaps  -5(%rcx), %xmm1
842         movaps  11(%rcx), %xmm2
843 L(Shl5Start):
844         pcmpeqb %xmm2, %xmm0
845         pmovmskb %xmm0, %rax
846         movaps  %xmm2, %xmm3
847 # ifdef USE_AS_STRNCPY
848         sub     $16, %r8
849         jbe     L(StrncpyExit5Case2OrCase3)
850 # endif
851         test    %rax, %rax
852         jnz     L(Shl5LoopExit)
853
854         palignr $5, %xmm1, %xmm2
855         movaps  %xmm3, %xmm1
856         movaps  %xmm2, (%rdx)
857         movaps  27(%rcx), %xmm2
858
859         pcmpeqb %xmm2, %xmm0
860         lea     16(%rdx), %rdx
861         pmovmskb %xmm0, %rax
862         lea     16(%rcx), %rcx
863         movaps  %xmm2, %xmm3
864 # ifdef USE_AS_STRNCPY
865         sub     $16, %r8
866         jbe     L(StrncpyExit5Case2OrCase3)
867 # endif
868         test    %rax, %rax
869         jnz     L(Shl5LoopExit)
870
871         palignr $5, %xmm1, %xmm2
872         movaps  %xmm2, (%rdx)
873         movaps  27(%rcx), %xmm2
874         movaps  %xmm3, %xmm1
875
876         pcmpeqb %xmm2, %xmm0
877         lea     16(%rdx), %rdx
878         pmovmskb %xmm0, %rax
879         lea     16(%rcx), %rcx
880         movaps  %xmm2, %xmm3
881 # ifdef USE_AS_STRNCPY
882         sub     $16, %r8
883         jbe     L(StrncpyExit5Case2OrCase3)
884 # endif
885         test    %rax, %rax
886         jnz     L(Shl5LoopExit)
887
888         palignr $5, %xmm1, %xmm2
889         movaps  %xmm3, %xmm1
890         movaps  %xmm2, (%rdx)
891         movaps  27(%rcx), %xmm2
892
893         pcmpeqb %xmm2, %xmm0
894         lea     16(%rdx), %rdx
895         pmovmskb %xmm0, %rax
896         lea     16(%rcx), %rcx
897         movaps  %xmm2, %xmm3
898 # ifdef USE_AS_STRNCPY
899         sub     $16, %r8
900         jbe     L(StrncpyExit5Case2OrCase3)
901 # endif
902         test    %rax, %rax
903         jnz     L(Shl5LoopExit)
904
905         palignr $5, %xmm1, %xmm2
906         movaps  %xmm3, %xmm1
907         movaps  %xmm2, (%rdx)
908         lea     27(%rcx), %rcx
909         lea     16(%rdx), %rdx
910
911         mov     %rcx, %rax
912         and     $-0x40, %rcx
913         sub     %rcx, %rax
914         lea     -11(%rcx), %rcx
915         sub     %rax, %rdx
916 # ifdef USE_AS_STRNCPY
917         add     %rax, %r8
918 # endif
919         movaps  -5(%rcx), %xmm1
920
921 L(Shl5LoopStart):
922         movaps  11(%rcx), %xmm2
923         movaps  27(%rcx), %xmm3
924         movaps  %xmm3, %xmm6
925         movaps  43(%rcx), %xmm4
926         movaps  %xmm4, %xmm7
927         movaps  59(%rcx), %xmm5
928         pminub  %xmm2, %xmm6
929         pminub  %xmm5, %xmm7
930         pminub  %xmm6, %xmm7
931         pcmpeqb %xmm0, %xmm7
932         pmovmskb %xmm7, %rax
933         movaps  %xmm5, %xmm7
934         palignr $5, %xmm4, %xmm5
935         test    %rax, %rax
936         palignr $5, %xmm3, %xmm4
937         jnz     L(Shl5Start)
938 # ifdef USE_AS_STRNCPY
939         sub     $64, %r8
940         jbe     L(StrncpyLeave5)
941 # endif
942         palignr $5, %xmm2, %xmm3
943         lea     64(%rcx), %rcx
944         palignr $5, %xmm1, %xmm2
945         movaps  %xmm7, %xmm1
946         movaps  %xmm5, 48(%rdx)
947         movaps  %xmm4, 32(%rdx)
948         movaps  %xmm3, 16(%rdx)
949         movaps  %xmm2, (%rdx)
950         lea     64(%rdx), %rdx
951         jmp     L(Shl5LoopStart)
952
953 L(Shl5LoopExit):
954         movaps  (%rdx), %xmm6
955         psrldq  $11, %xmm6
956         mov     $11, %rsi
957         palignr $5, %xmm1, %xmm6
958         movaps  %xmm6, (%rdx)
959         jmp     L(CopyFrom1To16Bytes)
960
961         .p2align 4
962 L(Shl6):
963         movaps  -6(%rcx), %xmm1
964         movaps  10(%rcx), %xmm2
965 L(Shl6Start):
966         pcmpeqb %xmm2, %xmm0
967         pmovmskb %xmm0, %rax
968         movaps  %xmm2, %xmm3
969 # ifdef USE_AS_STRNCPY
970         sub     $16, %r8
971         jbe     L(StrncpyExit6Case2OrCase3)
972 # endif
973         test    %rax, %rax
974         jnz     L(Shl6LoopExit)
975
976         palignr $6, %xmm1, %xmm2
977         movaps  %xmm3, %xmm1
978         movaps  %xmm2, (%rdx)
979         movaps  26(%rcx), %xmm2
980
981         pcmpeqb %xmm2, %xmm0
982         lea     16(%rdx), %rdx
983         pmovmskb %xmm0, %rax
984         lea     16(%rcx), %rcx
985         movaps  %xmm2, %xmm3
986 # ifdef USE_AS_STRNCPY
987         sub     $16, %r8
988         jbe     L(StrncpyExit6Case2OrCase3)
989 # endif
990         test    %rax, %rax
991         jnz     L(Shl6LoopExit)
992
993         palignr $6, %xmm1, %xmm2
994         movaps  %xmm2, (%rdx)
995         movaps  26(%rcx), %xmm2
996         movaps  %xmm3, %xmm1
997
998         pcmpeqb %xmm2, %xmm0
999         lea     16(%rdx), %rdx
1000         pmovmskb %xmm0, %rax
1001         lea     16(%rcx), %rcx
1002         movaps  %xmm2, %xmm3
1003 # ifdef USE_AS_STRNCPY
1004         sub     $16, %r8
1005         jbe     L(StrncpyExit6Case2OrCase3)
1006 # endif
1007         test    %rax, %rax
1008         jnz     L(Shl6LoopExit)
1009
1010         palignr $6, %xmm1, %xmm2
1011         movaps  %xmm3, %xmm1
1012         movaps  %xmm2, (%rdx)
1013         movaps  26(%rcx), %xmm2
1014
1015         pcmpeqb %xmm2, %xmm0
1016         lea     16(%rdx), %rdx
1017         pmovmskb %xmm0, %rax
1018         lea     16(%rcx), %rcx
1019         movaps  %xmm2, %xmm3
1020 # ifdef USE_AS_STRNCPY
1021         sub     $16, %r8
1022         jbe     L(StrncpyExit6Case2OrCase3)
1023 # endif
1024         test    %rax, %rax
1025         jnz     L(Shl6LoopExit)
1026
1027         palignr $6, %xmm1, %xmm2
1028         movaps  %xmm3, %xmm1
1029         movaps  %xmm2, (%rdx)
1030         lea     26(%rcx), %rcx
1031         lea     16(%rdx), %rdx
1032
1033         mov     %rcx, %rax
1034         and     $-0x40, %rcx
1035         sub     %rcx, %rax
1036         lea     -10(%rcx), %rcx
1037         sub     %rax, %rdx
1038 # ifdef USE_AS_STRNCPY
1039         add     %rax, %r8
1040 # endif
1041         movaps  -6(%rcx), %xmm1
1042
1043 L(Shl6LoopStart):
1044         movaps  10(%rcx), %xmm2
1045         movaps  26(%rcx), %xmm3
1046         movaps  %xmm3, %xmm6
1047         movaps  42(%rcx), %xmm4
1048         movaps  %xmm4, %xmm7
1049         movaps  58(%rcx), %xmm5
1050         pminub  %xmm2, %xmm6
1051         pminub  %xmm5, %xmm7
1052         pminub  %xmm6, %xmm7
1053         pcmpeqb %xmm0, %xmm7
1054         pmovmskb %xmm7, %rax
1055         movaps  %xmm5, %xmm7
1056         palignr $6, %xmm4, %xmm5
1057         test    %rax, %rax
1058         palignr $6, %xmm3, %xmm4
1059         jnz     L(Shl6Start)
1060 # ifdef USE_AS_STRNCPY
1061         sub     $64, %r8
1062         jbe     L(StrncpyLeave6)
1063 # endif
1064         palignr $6, %xmm2, %xmm3
1065         lea     64(%rcx), %rcx
1066         palignr $6, %xmm1, %xmm2
1067         movaps  %xmm7, %xmm1
1068         movaps  %xmm5, 48(%rdx)
1069         movaps  %xmm4, 32(%rdx)
1070         movaps  %xmm3, 16(%rdx)
1071         movaps  %xmm2, (%rdx)
1072         lea     64(%rdx), %rdx
1073         jmp     L(Shl6LoopStart)
1074
1075 L(Shl6LoopExit):
1076         movaps  (%rdx), %xmm6
1077         psrldq  $10, %xmm6
1078         mov     $10, %rsi
1079         palignr $6, %xmm1, %xmm6
1080         movaps  %xmm6, (%rdx)
1081         jmp     L(CopyFrom1To16Bytes)
1082
1083         .p2align 4
1084 L(Shl7):
1085         movaps  -7(%rcx), %xmm1
1086         movaps  9(%rcx), %xmm2
1087 L(Shl7Start):
1088         pcmpeqb %xmm2, %xmm0
1089         pmovmskb %xmm0, %rax
1090         movaps  %xmm2, %xmm3
1091 # ifdef USE_AS_STRNCPY
1092         sub     $16, %r8
1093         jbe     L(StrncpyExit7Case2OrCase3)
1094 # endif
1095         test    %rax, %rax
1096         jnz     L(Shl7LoopExit)
1097
1098         palignr $7, %xmm1, %xmm2
1099         movaps  %xmm3, %xmm1
1100         movaps  %xmm2, (%rdx)
1101         movaps  25(%rcx), %xmm2
1102
1103         pcmpeqb %xmm2, %xmm0
1104         lea     16(%rdx), %rdx
1105         pmovmskb %xmm0, %rax
1106         lea     16(%rcx), %rcx
1107         movaps  %xmm2, %xmm3
1108 # ifdef USE_AS_STRNCPY
1109         sub     $16, %r8
1110         jbe     L(StrncpyExit7Case2OrCase3)
1111 # endif
1112         test    %rax, %rax
1113         jnz     L(Shl7LoopExit)
1114
1115         palignr $7, %xmm1, %xmm2
1116         movaps  %xmm2, (%rdx)
1117         movaps  25(%rcx), %xmm2
1118         movaps  %xmm3, %xmm1
1119
1120         pcmpeqb %xmm2, %xmm0
1121         lea     16(%rdx), %rdx
1122         pmovmskb %xmm0, %rax
1123         lea     16(%rcx), %rcx
1124         movaps  %xmm2, %xmm3
1125 # ifdef USE_AS_STRNCPY
1126         sub     $16, %r8
1127         jbe     L(StrncpyExit7Case2OrCase3)
1128 # endif
1129         test    %rax, %rax
1130         jnz     L(Shl7LoopExit)
1131
1132         palignr $7, %xmm1, %xmm2
1133         movaps  %xmm3, %xmm1
1134         movaps  %xmm2, (%rdx)
1135         movaps  25(%rcx), %xmm2
1136
1137         pcmpeqb %xmm2, %xmm0
1138         lea     16(%rdx), %rdx
1139         pmovmskb %xmm0, %rax
1140         lea     16(%rcx), %rcx
1141         movaps  %xmm2, %xmm3
1142 # ifdef USE_AS_STRNCPY
1143         sub     $16, %r8
1144         jbe     L(StrncpyExit7Case2OrCase3)
1145 # endif
1146         test    %rax, %rax
1147         jnz     L(Shl7LoopExit)
1148
1149         palignr $7, %xmm1, %xmm2
1150         movaps  %xmm3, %xmm1
1151         movaps  %xmm2, (%rdx)
1152         lea     25(%rcx), %rcx
1153         lea     16(%rdx), %rdx
1154
1155         mov     %rcx, %rax
1156         and     $-0x40, %rcx
1157         sub     %rcx, %rax
1158         lea     -9(%rcx), %rcx
1159         sub     %rax, %rdx
1160 # ifdef USE_AS_STRNCPY
1161         add     %rax, %r8
1162 # endif
1163         movaps  -7(%rcx), %xmm1
1164
1165 L(Shl7LoopStart):
1166         movaps  9(%rcx), %xmm2
1167         movaps  25(%rcx), %xmm3
1168         movaps  %xmm3, %xmm6
1169         movaps  41(%rcx), %xmm4
1170         movaps  %xmm4, %xmm7
1171         movaps  57(%rcx), %xmm5
1172         pminub  %xmm2, %xmm6
1173         pminub  %xmm5, %xmm7
1174         pminub  %xmm6, %xmm7
1175         pcmpeqb %xmm0, %xmm7
1176         pmovmskb %xmm7, %rax
1177         movaps  %xmm5, %xmm7
1178         palignr $7, %xmm4, %xmm5
1179         test    %rax, %rax
1180         palignr $7, %xmm3, %xmm4
1181         jnz     L(Shl7Start)
1182 # ifdef USE_AS_STRNCPY
1183         sub     $64, %r8
1184         jbe     L(StrncpyLeave7)
1185 # endif
1186         palignr $7, %xmm2, %xmm3
1187         lea     64(%rcx), %rcx
1188         palignr $7, %xmm1, %xmm2
1189         movaps  %xmm7, %xmm1
1190         movaps  %xmm5, 48(%rdx)
1191         movaps  %xmm4, 32(%rdx)
1192         movaps  %xmm3, 16(%rdx)
1193         movaps  %xmm2, (%rdx)
1194         lea     64(%rdx), %rdx
1195         jmp     L(Shl7LoopStart)
1196
1197 L(Shl7LoopExit):
1198         movaps  (%rdx), %xmm6
1199         psrldq  $9, %xmm6
1200         mov     $9, %rsi
1201         palignr $7, %xmm1, %xmm6
1202         movaps  %xmm6, (%rdx)
1203         jmp     L(CopyFrom1To16Bytes)
1204
1205         .p2align 4
1206 L(Shl8):
1207         movaps  -8(%rcx), %xmm1
1208         movaps  8(%rcx), %xmm2
1209 L(Shl8Start):
1210         pcmpeqb %xmm2, %xmm0
1211         pmovmskb %xmm0, %rax
1212         movaps  %xmm2, %xmm3
1213 # ifdef USE_AS_STRNCPY
1214         sub     $16, %r8
1215         jbe     L(StrncpyExit8Case2OrCase3)
1216 # endif
1217         test    %rax, %rax
1218         jnz     L(Shl8LoopExit)
1219
1220         palignr $8, %xmm1, %xmm2
1221         movaps  %xmm3, %xmm1
1222         movaps  %xmm2, (%rdx)
1223         movaps  24(%rcx), %xmm2
1224
1225         pcmpeqb %xmm2, %xmm0
1226         lea     16(%rdx), %rdx
1227         pmovmskb %xmm0, %rax
1228         lea     16(%rcx), %rcx
1229         movaps  %xmm2, %xmm3
1230 # ifdef USE_AS_STRNCPY
1231         sub     $16, %r8
1232         jbe     L(StrncpyExit8Case2OrCase3)
1233 # endif
1234         test    %rax, %rax
1235         jnz     L(Shl8LoopExit)
1236
1237         palignr $8, %xmm1, %xmm2
1238         movaps  %xmm2, (%rdx)
1239         movaps  24(%rcx), %xmm2
1240         movaps  %xmm3, %xmm1
1241
1242         pcmpeqb %xmm2, %xmm0
1243         lea     16(%rdx), %rdx
1244         pmovmskb %xmm0, %rax
1245         lea     16(%rcx), %rcx
1246         movaps  %xmm2, %xmm3
1247 # ifdef USE_AS_STRNCPY
1248         sub     $16, %r8
1249         jbe     L(StrncpyExit8Case2OrCase3)
1250 # endif
1251         test    %rax, %rax
1252         jnz     L(Shl8LoopExit)
1253
1254         palignr $8, %xmm1, %xmm2
1255         movaps  %xmm3, %xmm1
1256         movaps  %xmm2, (%rdx)
1257         movaps  24(%rcx), %xmm2
1258
1259         pcmpeqb %xmm2, %xmm0
1260         lea     16(%rdx), %rdx
1261         pmovmskb %xmm0, %rax
1262         lea     16(%rcx), %rcx
1263         movaps  %xmm2, %xmm3
1264 # ifdef USE_AS_STRNCPY
1265         sub     $16, %r8
1266         jbe     L(StrncpyExit8Case2OrCase3)
1267 # endif
1268         test    %rax, %rax
1269         jnz     L(Shl8LoopExit)
1270
1271         palignr $8, %xmm1, %xmm2
1272         movaps  %xmm3, %xmm1
1273         movaps  %xmm2, (%rdx)
1274         lea     24(%rcx), %rcx
1275         lea     16(%rdx), %rdx
1276
1277         mov     %rcx, %rax
1278         and     $-0x40, %rcx
1279         sub     %rcx, %rax
1280         lea     -8(%rcx), %rcx
1281         sub     %rax, %rdx
1282 # ifdef USE_AS_STRNCPY
1283         add     %rax, %r8
1284 # endif
1285         movaps  -8(%rcx), %xmm1
1286
1287 L(Shl8LoopStart):
1288         movaps  8(%rcx), %xmm2
1289         movaps  24(%rcx), %xmm3
1290         movaps  %xmm3, %xmm6
1291         movaps  40(%rcx), %xmm4
1292         movaps  %xmm4, %xmm7
1293         movaps  56(%rcx), %xmm5
1294         pminub  %xmm2, %xmm6
1295         pminub  %xmm5, %xmm7
1296         pminub  %xmm6, %xmm7
1297         pcmpeqb %xmm0, %xmm7
1298         pmovmskb %xmm7, %rax
1299         movaps  %xmm5, %xmm7
1300         palignr $8, %xmm4, %xmm5
1301         test    %rax, %rax
1302         palignr $8, %xmm3, %xmm4
1303         jnz     L(Shl8Start)
1304 # ifdef USE_AS_STRNCPY
1305         sub     $64, %r8
1306         jbe     L(StrncpyLeave8)
1307 # endif
1308         palignr $8, %xmm2, %xmm3
1309         lea     64(%rcx), %rcx
1310         palignr $8, %xmm1, %xmm2
1311         movaps  %xmm7, %xmm1
1312         movaps  %xmm5, 48(%rdx)
1313         movaps  %xmm4, 32(%rdx)
1314         movaps  %xmm3, 16(%rdx)
1315         movaps  %xmm2, (%rdx)
1316         lea     64(%rdx), %rdx
1317         jmp     L(Shl8LoopStart)
1318
1319 L(Shl8LoopExit):
1320         movaps  (%rdx), %xmm6
1321         psrldq  $8, %xmm6
1322         mov     $8, %rsi
1323         palignr $8, %xmm1, %xmm6
1324         movaps  %xmm6, (%rdx)
1325         jmp     L(CopyFrom1To16Bytes)
1326
1327         .p2align 4
1328 L(Shl9):
1329         movaps  -9(%rcx), %xmm1
1330         movaps  7(%rcx), %xmm2
1331 L(Shl9Start):
1332         pcmpeqb %xmm2, %xmm0
1333         pmovmskb %xmm0, %rax
1334         movaps  %xmm2, %xmm3
1335 # ifdef USE_AS_STRNCPY
1336         sub     $16, %r8
1337         jbe     L(StrncpyExit9Case2OrCase3)
1338 # endif
1339         test    %rax, %rax
1340         jnz     L(Shl9LoopExit)
1341
1342         palignr $9, %xmm1, %xmm2
1343         movaps  %xmm3, %xmm1
1344         movaps  %xmm2, (%rdx)
1345         movaps  23(%rcx), %xmm2
1346
1347         pcmpeqb %xmm2, %xmm0
1348         lea     16(%rdx), %rdx
1349         pmovmskb %xmm0, %rax
1350         lea     16(%rcx), %rcx
1351         movaps  %xmm2, %xmm3
1352 # ifdef USE_AS_STRNCPY
1353         sub     $16, %r8
1354         jbe     L(StrncpyExit9Case2OrCase3)
1355 # endif
1356         test    %rax, %rax
1357         jnz     L(Shl9LoopExit)
1358
1359         palignr $9, %xmm1, %xmm2
1360         movaps  %xmm2, (%rdx)
1361         movaps  23(%rcx), %xmm2
1362         movaps  %xmm3, %xmm1
1363
1364         pcmpeqb %xmm2, %xmm0
1365         lea     16(%rdx), %rdx
1366         pmovmskb %xmm0, %rax
1367         lea     16(%rcx), %rcx
1368         movaps  %xmm2, %xmm3
1369 # ifdef USE_AS_STRNCPY
1370         sub     $16, %r8
1371         jbe     L(StrncpyExit9Case2OrCase3)
1372 # endif
1373         test    %rax, %rax
1374         jnz     L(Shl9LoopExit)
1375
1376         palignr $9, %xmm1, %xmm2
1377         movaps  %xmm3, %xmm1
1378         movaps  %xmm2, (%rdx)
1379         movaps  23(%rcx), %xmm2
1380
1381         pcmpeqb %xmm2, %xmm0
1382         lea     16(%rdx), %rdx
1383         pmovmskb %xmm0, %rax
1384         lea     16(%rcx), %rcx
1385         movaps  %xmm2, %xmm3
1386 # ifdef USE_AS_STRNCPY
1387         sub     $16, %r8
1388         jbe     L(StrncpyExit9Case2OrCase3)
1389 # endif
1390         test    %rax, %rax
1391         jnz     L(Shl9LoopExit)
1392
1393         palignr $9, %xmm1, %xmm2
1394         movaps  %xmm3, %xmm1
1395         movaps  %xmm2, (%rdx)
1396         lea     23(%rcx), %rcx
1397         lea     16(%rdx), %rdx
1398
1399         mov     %rcx, %rax
1400         and     $-0x40, %rcx
1401         sub     %rcx, %rax
1402         lea     -7(%rcx), %rcx
1403         sub     %rax, %rdx
1404 # ifdef USE_AS_STRNCPY
1405         add     %rax, %r8
1406 # endif
1407         movaps  -9(%rcx), %xmm1
1408
1409 L(Shl9LoopStart):
1410         movaps  7(%rcx), %xmm2
1411         movaps  23(%rcx), %xmm3
1412         movaps  %xmm3, %xmm6
1413         movaps  39(%rcx), %xmm4
1414         movaps  %xmm4, %xmm7
1415         movaps  55(%rcx), %xmm5
1416         pminub  %xmm2, %xmm6
1417         pminub  %xmm5, %xmm7
1418         pminub  %xmm6, %xmm7
1419         pcmpeqb %xmm0, %xmm7
1420         pmovmskb %xmm7, %rax
1421         movaps  %xmm5, %xmm7
1422         palignr $9, %xmm4, %xmm5
1423         test    %rax, %rax
1424         palignr $9, %xmm3, %xmm4
1425         jnz     L(Shl9Start)
1426 # ifdef USE_AS_STRNCPY
1427         sub     $64, %r8
1428         jbe     L(StrncpyLeave9)
1429 # endif
1430         palignr $9, %xmm2, %xmm3
1431         lea     64(%rcx), %rcx
1432         palignr $9, %xmm1, %xmm2
1433         movaps  %xmm7, %xmm1
1434         movaps  %xmm5, 48(%rdx)
1435         movaps  %xmm4, 32(%rdx)
1436         movaps  %xmm3, 16(%rdx)
1437         movaps  %xmm2, (%rdx)
1438         lea     64(%rdx), %rdx
1439         jmp     L(Shl9LoopStart)
1440
1441 L(Shl9LoopExit):
1442         movaps  (%rdx), %xmm6
1443         psrldq  $7, %xmm6
1444         mov     $7, %rsi
1445         palignr $9, %xmm1, %xmm6
1446         movaps  %xmm6, (%rdx)
1447         jmp     L(CopyFrom1To16Bytes)
1448
1449         .p2align 4
1450 L(Shl10):
1451         movaps  -10(%rcx), %xmm1
1452         movaps  6(%rcx), %xmm2
1453 L(Shl10Start):
1454         pcmpeqb %xmm2, %xmm0
1455         pmovmskb %xmm0, %rax
1456         movaps  %xmm2, %xmm3
1457 # ifdef USE_AS_STRNCPY
1458         sub     $16, %r8
1459         jbe     L(StrncpyExit10Case2OrCase3)
1460 # endif
1461         test    %rax, %rax
1462         jnz     L(Shl10LoopExit)
1463
1464         palignr $10, %xmm1, %xmm2
1465         movaps  %xmm3, %xmm1
1466         movaps  %xmm2, (%rdx)
1467         movaps  22(%rcx), %xmm2
1468
1469         pcmpeqb %xmm2, %xmm0
1470         lea     16(%rdx), %rdx
1471         pmovmskb %xmm0, %rax
1472         lea     16(%rcx), %rcx
1473         movaps  %xmm2, %xmm3
1474 # ifdef USE_AS_STRNCPY
1475         sub     $16, %r8
1476         jbe     L(StrncpyExit10Case2OrCase3)
1477 # endif
1478         test    %rax, %rax
1479         jnz     L(Shl10LoopExit)
1480
1481         palignr $10, %xmm1, %xmm2
1482         movaps  %xmm2, (%rdx)
1483         movaps  22(%rcx), %xmm2
1484         movaps  %xmm3, %xmm1
1485
1486         pcmpeqb %xmm2, %xmm0
1487         lea     16(%rdx), %rdx
1488         pmovmskb %xmm0, %rax
1489         lea     16(%rcx), %rcx
1490         movaps  %xmm2, %xmm3
1491 # ifdef USE_AS_STRNCPY
1492         sub     $16, %r8
1493         jbe     L(StrncpyExit10Case2OrCase3)
1494 # endif
1495         test    %rax, %rax
1496         jnz     L(Shl10LoopExit)
1497
1498         palignr $10, %xmm1, %xmm2
1499         movaps  %xmm3, %xmm1
1500         movaps  %xmm2, (%rdx)
1501         movaps  22(%rcx), %xmm2
1502
1503         pcmpeqb %xmm2, %xmm0
1504         lea     16(%rdx), %rdx
1505         pmovmskb %xmm0, %rax
1506         lea     16(%rcx), %rcx
1507         movaps  %xmm2, %xmm3
1508 # ifdef USE_AS_STRNCPY
1509         sub     $16, %r8
1510         jbe     L(StrncpyExit10Case2OrCase3)
1511 # endif
1512         test    %rax, %rax
1513         jnz     L(Shl10LoopExit)
1514
1515         palignr $10, %xmm1, %xmm2
1516         movaps  %xmm3, %xmm1
1517         movaps  %xmm2, (%rdx)
1518         lea     22(%rcx), %rcx
1519         lea     16(%rdx), %rdx
1520
1521         mov     %rcx, %rax
1522         and     $-0x40, %rcx
1523         sub     %rcx, %rax
1524         lea     -6(%rcx), %rcx
1525         sub     %rax, %rdx
1526 # ifdef USE_AS_STRNCPY
1527         add     %rax, %r8
1528 # endif
1529         movaps  -10(%rcx), %xmm1
1530
1531 L(Shl10LoopStart):
1532         movaps  6(%rcx), %xmm2
1533         movaps  22(%rcx), %xmm3
1534         movaps  %xmm3, %xmm6
1535         movaps  38(%rcx), %xmm4
1536         movaps  %xmm4, %xmm7
1537         movaps  54(%rcx), %xmm5
1538         pminub  %xmm2, %xmm6
1539         pminub  %xmm5, %xmm7
1540         pminub  %xmm6, %xmm7
1541         pcmpeqb %xmm0, %xmm7
1542         pmovmskb %xmm7, %rax
1543         movaps  %xmm5, %xmm7
1544         palignr $10, %xmm4, %xmm5
1545         test    %rax, %rax
1546         palignr $10, %xmm3, %xmm4
1547         jnz     L(Shl10Start)
1548 # ifdef USE_AS_STRNCPY
1549         sub     $64, %r8
1550         jbe     L(StrncpyLeave10)
1551 # endif
1552         palignr $10, %xmm2, %xmm3
1553         lea     64(%rcx), %rcx
1554         palignr $10, %xmm1, %xmm2
1555         movaps  %xmm7, %xmm1
1556         movaps  %xmm5, 48(%rdx)
1557         movaps  %xmm4, 32(%rdx)
1558         movaps  %xmm3, 16(%rdx)
1559         movaps  %xmm2, (%rdx)
1560         lea     64(%rdx), %rdx
1561         jmp     L(Shl10LoopStart)
1562
1563 L(Shl10LoopExit):
1564         movaps  (%rdx), %xmm6
1565         psrldq  $6, %xmm6
1566         mov     $6, %rsi
1567         palignr $10, %xmm1, %xmm6
1568         movaps  %xmm6, (%rdx)
1569         jmp     L(CopyFrom1To16Bytes)
1570
1571         .p2align 4
1572 L(Shl11):
1573         movaps  -11(%rcx), %xmm1
1574         movaps  5(%rcx), %xmm2
1575 L(Shl11Start):
1576         pcmpeqb %xmm2, %xmm0
1577         pmovmskb %xmm0, %rax
1578         movaps  %xmm2, %xmm3
1579 # ifdef USE_AS_STRNCPY
1580         sub     $16, %r8
1581         jbe     L(StrncpyExit11Case2OrCase3)
1582 # endif
1583         test    %rax, %rax
1584         jnz     L(Shl11LoopExit)
1585
1586         palignr $11, %xmm1, %xmm2
1587         movaps  %xmm3, %xmm1
1588         movaps  %xmm2, (%rdx)
1589         movaps  21(%rcx), %xmm2
1590
1591         pcmpeqb %xmm2, %xmm0
1592         lea     16(%rdx), %rdx
1593         pmovmskb %xmm0, %rax
1594         lea     16(%rcx), %rcx
1595         movaps  %xmm2, %xmm3
1596 # ifdef USE_AS_STRNCPY
1597         sub     $16, %r8
1598         jbe     L(StrncpyExit11Case2OrCase3)
1599 # endif
1600         test    %rax, %rax
1601         jnz     L(Shl11LoopExit)
1602
1603         palignr $11, %xmm1, %xmm2
1604         movaps  %xmm2, (%rdx)
1605         movaps  21(%rcx), %xmm2
1606         movaps  %xmm3, %xmm1
1607
1608         pcmpeqb %xmm2, %xmm0
1609         lea     16(%rdx), %rdx
1610         pmovmskb %xmm0, %rax
1611         lea     16(%rcx), %rcx
1612         movaps  %xmm2, %xmm3
1613 # ifdef USE_AS_STRNCPY
1614         sub     $16, %r8
1615         jbe     L(StrncpyExit11Case2OrCase3)
1616 # endif
1617         test    %rax, %rax
1618         jnz     L(Shl11LoopExit)
1619
1620         palignr $11, %xmm1, %xmm2
1621         movaps  %xmm3, %xmm1
1622         movaps  %xmm2, (%rdx)
1623         movaps  21(%rcx), %xmm2
1624
1625         pcmpeqb %xmm2, %xmm0
1626         lea     16(%rdx), %rdx
1627         pmovmskb %xmm0, %rax
1628         lea     16(%rcx), %rcx
1629         movaps  %xmm2, %xmm3
1630 # ifdef USE_AS_STRNCPY
1631         sub     $16, %r8
1632         jbe     L(StrncpyExit11Case2OrCase3)
1633 # endif
1634         test    %rax, %rax
1635         jnz     L(Shl11LoopExit)
1636
1637         palignr $11, %xmm1, %xmm2
1638         movaps  %xmm3, %xmm1
1639         movaps  %xmm2, (%rdx)
1640         lea     21(%rcx), %rcx
1641         lea     16(%rdx), %rdx
1642
1643         mov     %rcx, %rax
1644         and     $-0x40, %rcx
1645         sub     %rcx, %rax
1646         lea     -5(%rcx), %rcx
1647         sub     %rax, %rdx
1648 # ifdef USE_AS_STRNCPY
1649         add     %rax, %r8
1650 # endif
1651         movaps  -11(%rcx), %xmm1
1652
1653 L(Shl11LoopStart):
1654         movaps  5(%rcx), %xmm2
1655         movaps  21(%rcx), %xmm3
1656         movaps  %xmm3, %xmm6
1657         movaps  37(%rcx), %xmm4
1658         movaps  %xmm4, %xmm7
1659         movaps  53(%rcx), %xmm5
1660         pminub  %xmm2, %xmm6
1661         pminub  %xmm5, %xmm7
1662         pminub  %xmm6, %xmm7
1663         pcmpeqb %xmm0, %xmm7
1664         pmovmskb %xmm7, %rax
1665         movaps  %xmm5, %xmm7
1666         palignr $11, %xmm4, %xmm5
1667         test    %rax, %rax
1668         palignr $11, %xmm3, %xmm4
1669         jnz     L(Shl11Start)
1670 # ifdef USE_AS_STRNCPY
1671         sub     $64, %r8
1672         jbe     L(StrncpyLeave11)
1673 # endif
1674         palignr $11, %xmm2, %xmm3
1675         lea     64(%rcx), %rcx
1676         palignr $11, %xmm1, %xmm2
1677         movaps  %xmm7, %xmm1
1678         movaps  %xmm5, 48(%rdx)
1679         movaps  %xmm4, 32(%rdx)
1680         movaps  %xmm3, 16(%rdx)
1681         movaps  %xmm2, (%rdx)
1682         lea     64(%rdx), %rdx
1683         jmp     L(Shl11LoopStart)
1684
1685 L(Shl11LoopExit):
1686         movaps  (%rdx), %xmm6
1687         psrldq  $5, %xmm6
1688         mov     $5, %rsi
1689         palignr $11, %xmm1, %xmm6
1690         movaps  %xmm6, (%rdx)
1691         jmp     L(CopyFrom1To16Bytes)
1692
1693         .p2align 4
1694 L(Shl12):
1695         movaps  -12(%rcx), %xmm1
1696         movaps  4(%rcx), %xmm2
1697 L(Shl12Start):
1698         pcmpeqb %xmm2, %xmm0
1699         pmovmskb %xmm0, %rax
1700         movaps  %xmm2, %xmm3
1701 # ifdef USE_AS_STRNCPY
1702         sub     $16, %r8
1703         jbe     L(StrncpyExit12Case2OrCase3)
1704 # endif
1705         test    %rax, %rax
1706         jnz     L(Shl12LoopExit)
1707
1708         palignr $12, %xmm1, %xmm2
1709         movaps  %xmm3, %xmm1
1710         movaps  %xmm2, (%rdx)
1711         movaps  20(%rcx), %xmm2
1712
1713         pcmpeqb %xmm2, %xmm0
1714         lea     16(%rdx), %rdx
1715         pmovmskb %xmm0, %rax
1716         lea     16(%rcx), %rcx
1717         movaps  %xmm2, %xmm3
1718 # ifdef USE_AS_STRNCPY
1719         sub     $16, %r8
1720         jbe     L(StrncpyExit12Case2OrCase3)
1721 # endif
1722         test    %rax, %rax
1723         jnz     L(Shl12LoopExit)
1724
1725         palignr $12, %xmm1, %xmm2
1726         movaps  %xmm2, (%rdx)
1727         movaps  20(%rcx), %xmm2
1728         movaps  %xmm3, %xmm1
1729
1730         pcmpeqb %xmm2, %xmm0
1731         lea     16(%rdx), %rdx
1732         pmovmskb %xmm0, %rax
1733         lea     16(%rcx), %rcx
1734         movaps  %xmm2, %xmm3
1735 # ifdef USE_AS_STRNCPY
1736         sub     $16, %r8
1737         jbe     L(StrncpyExit12Case2OrCase3)
1738 # endif
1739         test    %rax, %rax
1740         jnz     L(Shl12LoopExit)
1741
1742         palignr $12, %xmm1, %xmm2
1743         movaps  %xmm3, %xmm1
1744         movaps  %xmm2, (%rdx)
1745         movaps  20(%rcx), %xmm2
1746
1747         pcmpeqb %xmm2, %xmm0
1748         lea     16(%rdx), %rdx
1749         pmovmskb %xmm0, %rax
1750         lea     16(%rcx), %rcx
1751         movaps  %xmm2, %xmm3
1752 # ifdef USE_AS_STRNCPY
1753         sub     $16, %r8
1754         jbe     L(StrncpyExit12Case2OrCase3)
1755 # endif
1756         test    %rax, %rax
1757         jnz     L(Shl12LoopExit)
1758
1759         palignr $12, %xmm1, %xmm2
1760         movaps  %xmm3, %xmm1
1761         movaps  %xmm2, (%rdx)
1762         lea     20(%rcx), %rcx
1763         lea     16(%rdx), %rdx
1764
1765         mov     %rcx, %rax
1766         and     $-0x40, %rcx
1767         sub     %rcx, %rax
1768         lea     -4(%rcx), %rcx
1769         sub     %rax, %rdx
1770 # ifdef USE_AS_STRNCPY
1771         add     %rax, %r8
1772 # endif
1773         movaps  -12(%rcx), %xmm1
1774
1775 L(Shl12LoopStart):
1776         movaps  4(%rcx), %xmm2
1777         movaps  20(%rcx), %xmm3
1778         movaps  %xmm3, %xmm6
1779         movaps  36(%rcx), %xmm4
1780         movaps  %xmm4, %xmm7
1781         movaps  52(%rcx), %xmm5
1782         pminub  %xmm2, %xmm6
1783         pminub  %xmm5, %xmm7
1784         pminub  %xmm6, %xmm7
1785         pcmpeqb %xmm0, %xmm7
1786         pmovmskb %xmm7, %rax
1787         movaps  %xmm5, %xmm7
1788         palignr $12, %xmm4, %xmm5
1789         test    %rax, %rax
1790         palignr $12, %xmm3, %xmm4
1791         jnz     L(Shl12Start)
1792 # ifdef USE_AS_STRNCPY
1793         sub     $64, %r8
1794         jbe     L(StrncpyLeave12)
1795 # endif
1796         palignr $12, %xmm2, %xmm3
1797         lea     64(%rcx), %rcx
1798         palignr $12, %xmm1, %xmm2
1799         movaps  %xmm7, %xmm1
1800         movaps  %xmm5, 48(%rdx)
1801         movaps  %xmm4, 32(%rdx)
1802         movaps  %xmm3, 16(%rdx)
1803         movaps  %xmm2, (%rdx)
1804         lea     64(%rdx), %rdx
1805         jmp     L(Shl12LoopStart)
1806
1807 L(Shl12LoopExit):
1808         movaps  (%rdx), %xmm6
1809         psrldq  $4, %xmm6
1810         mov     $4, %rsi
1811         palignr $12, %xmm1, %xmm6
1812         movaps  %xmm6, (%rdx)
1813         jmp     L(CopyFrom1To16Bytes)
1814
1815         .p2align 4
1816 L(Shl13):
1817         movaps  -13(%rcx), %xmm1
1818         movaps  3(%rcx), %xmm2
1819 L(Shl13Start):
1820         pcmpeqb %xmm2, %xmm0
1821         pmovmskb %xmm0, %rax
1822         movaps  %xmm2, %xmm3
1823 # ifdef USE_AS_STRNCPY
1824         sub     $16, %r8
1825         jbe     L(StrncpyExit13Case2OrCase3)
1826 # endif
1827         test    %rax, %rax
1828         jnz     L(Shl13LoopExit)
1829
1830         palignr $13, %xmm1, %xmm2
1831         movaps  %xmm3, %xmm1
1832         movaps  %xmm2, (%rdx)
1833         movaps  19(%rcx), %xmm2
1834
1835         pcmpeqb %xmm2, %xmm0
1836         lea     16(%rdx), %rdx
1837         pmovmskb %xmm0, %rax
1838         lea     16(%rcx), %rcx
1839         movaps  %xmm2, %xmm3
1840 # ifdef USE_AS_STRNCPY
1841         sub     $16, %r8
1842         jbe     L(StrncpyExit13Case2OrCase3)
1843 # endif
1844         test    %rax, %rax
1845         jnz     L(Shl13LoopExit)
1846
1847         palignr $13, %xmm1, %xmm2
1848         movaps  %xmm2, (%rdx)
1849         movaps  19(%rcx), %xmm2
1850         movaps  %xmm3, %xmm1
1851
1852         pcmpeqb %xmm2, %xmm0
1853         lea     16(%rdx), %rdx
1854         pmovmskb %xmm0, %rax
1855         lea     16(%rcx), %rcx
1856         movaps  %xmm2, %xmm3
1857 # ifdef USE_AS_STRNCPY
1858         sub     $16, %r8
1859         jbe     L(StrncpyExit13Case2OrCase3)
1860 # endif
1861         test    %rax, %rax
1862         jnz     L(Shl13LoopExit)
1863
1864         palignr $13, %xmm1, %xmm2
1865         movaps  %xmm3, %xmm1
1866         movaps  %xmm2, (%rdx)
1867         movaps  19(%rcx), %xmm2
1868
1869         pcmpeqb %xmm2, %xmm0
1870         lea     16(%rdx), %rdx
1871         pmovmskb %xmm0, %rax
1872         lea     16(%rcx), %rcx
1873         movaps  %xmm2, %xmm3
1874 # ifdef USE_AS_STRNCPY
1875         sub     $16, %r8
1876         jbe     L(StrncpyExit13Case2OrCase3)
1877 # endif
1878         test    %rax, %rax
1879         jnz     L(Shl13LoopExit)
1880
1881         palignr $13, %xmm1, %xmm2
1882         movaps  %xmm3, %xmm1
1883         movaps  %xmm2, (%rdx)
1884         lea     19(%rcx), %rcx
1885         lea     16(%rdx), %rdx
1886
1887         mov     %rcx, %rax
1888         and     $-0x40, %rcx
1889         sub     %rcx, %rax
1890         lea     -3(%rcx), %rcx
1891         sub     %rax, %rdx
1892 # ifdef USE_AS_STRNCPY
1893         add     %rax, %r8
1894 # endif
1895         movaps  -13(%rcx), %xmm1
1896
1897 L(Shl13LoopStart):
1898         movaps  3(%rcx), %xmm2
1899         movaps  19(%rcx), %xmm3
1900         movaps  %xmm3, %xmm6
1901         movaps  35(%rcx), %xmm4
1902         movaps  %xmm4, %xmm7
1903         movaps  51(%rcx), %xmm5
1904         pminub  %xmm2, %xmm6
1905         pminub  %xmm5, %xmm7
1906         pminub  %xmm6, %xmm7
1907         pcmpeqb %xmm0, %xmm7
1908         pmovmskb %xmm7, %rax
1909         movaps  %xmm5, %xmm7
1910         palignr $13, %xmm4, %xmm5
1911         test    %rax, %rax
1912         palignr $13, %xmm3, %xmm4
1913         jnz     L(Shl13Start)
1914 # ifdef USE_AS_STRNCPY
1915         sub     $64, %r8
1916         jbe     L(StrncpyLeave13)
1917 # endif
1918         palignr $13, %xmm2, %xmm3
1919         lea     64(%rcx), %rcx
1920         palignr $13, %xmm1, %xmm2
1921         movaps  %xmm7, %xmm1
1922         movaps  %xmm5, 48(%rdx)
1923         movaps  %xmm4, 32(%rdx)
1924         movaps  %xmm3, 16(%rdx)
1925         movaps  %xmm2, (%rdx)
1926         lea     64(%rdx), %rdx
1927         jmp     L(Shl13LoopStart)
1928
1929 L(Shl13LoopExit):
1930         movaps  (%rdx), %xmm6
1931         psrldq  $3, %xmm6
1932         mov     $3, %rsi
1933         palignr $13, %xmm1, %xmm6
1934         movaps  %xmm6, (%rdx)
1935         jmp     L(CopyFrom1To16Bytes)
1936
1937         .p2align 4
1938 L(Shl14):
1939         movaps  -14(%rcx), %xmm1
1940         movaps  2(%rcx), %xmm2
1941 L(Shl14Start):
1942         pcmpeqb %xmm2, %xmm0
1943         pmovmskb %xmm0, %rax
1944         movaps  %xmm2, %xmm3
1945 # ifdef USE_AS_STRNCPY
1946         sub     $16, %r8
1947         jbe     L(StrncpyExit14Case2OrCase3)
1948 # endif
1949         test    %rax, %rax
1950         jnz     L(Shl14LoopExit)
1951
1952         palignr $14, %xmm1, %xmm2
1953         movaps  %xmm3, %xmm1
1954         movaps  %xmm2, (%rdx)
1955         movaps  18(%rcx), %xmm2
1956
1957         pcmpeqb %xmm2, %xmm0
1958         lea     16(%rdx), %rdx
1959         pmovmskb %xmm0, %rax
1960         lea     16(%rcx), %rcx
1961         movaps  %xmm2, %xmm3
1962 # ifdef USE_AS_STRNCPY
1963         sub     $16, %r8
1964         jbe     L(StrncpyExit14Case2OrCase3)
1965 # endif
1966         test    %rax, %rax
1967         jnz     L(Shl14LoopExit)
1968
1969         palignr $14, %xmm1, %xmm2
1970         movaps  %xmm2, (%rdx)
1971         movaps  18(%rcx), %xmm2
1972         movaps  %xmm3, %xmm1
1973
1974         pcmpeqb %xmm2, %xmm0
1975         lea     16(%rdx), %rdx
1976         pmovmskb %xmm0, %rax
1977         lea     16(%rcx), %rcx
1978         movaps  %xmm2, %xmm3
1979 # ifdef USE_AS_STRNCPY
1980         sub     $16, %r8
1981         jbe     L(StrncpyExit14Case2OrCase3)
1982 # endif
1983         test    %rax, %rax
1984         jnz     L(Shl14LoopExit)
1985
1986         palignr $14, %xmm1, %xmm2
1987         movaps  %xmm3, %xmm1
1988         movaps  %xmm2, (%rdx)
1989         movaps  18(%rcx), %xmm2
1990
1991         pcmpeqb %xmm2, %xmm0
1992         lea     16(%rdx), %rdx
1993         pmovmskb %xmm0, %rax
1994         lea     16(%rcx), %rcx
1995         movaps  %xmm2, %xmm3
1996 # ifdef USE_AS_STRNCPY
1997         sub     $16, %r8
1998         jbe     L(StrncpyExit14Case2OrCase3)
1999 # endif
2000         test    %rax, %rax
2001         jnz     L(Shl14LoopExit)
2002
2003         palignr $14, %xmm1, %xmm2
2004         movaps  %xmm3, %xmm1
2005         movaps  %xmm2, (%rdx)
2006         lea     18(%rcx), %rcx
2007         lea     16(%rdx), %rdx
2008
2009         mov     %rcx, %rax
2010         and     $-0x40, %rcx
2011         sub     %rcx, %rax
2012         lea     -2(%rcx), %rcx
2013         sub     %rax, %rdx
2014 # ifdef USE_AS_STRNCPY
2015         add     %rax, %r8
2016 # endif
2017         movaps  -14(%rcx), %xmm1
2018
2019 L(Shl14LoopStart):
2020         movaps  2(%rcx), %xmm2
2021         movaps  18(%rcx), %xmm3
2022         movaps  %xmm3, %xmm6
2023         movaps  34(%rcx), %xmm4
2024         movaps  %xmm4, %xmm7
2025         movaps  50(%rcx), %xmm5
2026         pminub  %xmm2, %xmm6
2027         pminub  %xmm5, %xmm7
2028         pminub  %xmm6, %xmm7
2029         pcmpeqb %xmm0, %xmm7
2030         pmovmskb %xmm7, %rax
2031         movaps  %xmm5, %xmm7
2032         palignr $14, %xmm4, %xmm5
2033         test    %rax, %rax
2034         palignr $14, %xmm3, %xmm4
2035         jnz     L(Shl14Start)
2036 # ifdef USE_AS_STRNCPY
2037         sub     $64, %r8
2038         jbe     L(StrncpyLeave14)
2039 # endif
2040         palignr $14, %xmm2, %xmm3
2041         lea     64(%rcx), %rcx
2042         palignr $14, %xmm1, %xmm2
2043         movaps  %xmm7, %xmm1
2044         movaps  %xmm5, 48(%rdx)
2045         movaps  %xmm4, 32(%rdx)
2046         movaps  %xmm3, 16(%rdx)
2047         movaps  %xmm2, (%rdx)
2048         lea     64(%rdx), %rdx
2049         jmp     L(Shl14LoopStart)
2050
2051 L(Shl14LoopExit):
2052         movaps  (%rdx), %xmm6
2053         psrldq  $2, %xmm6
2054         mov     $2, %rsi
2055         palignr $14, %xmm1, %xmm6
2056         movaps  %xmm6, (%rdx)
2057         jmp     L(CopyFrom1To16Bytes)
2058
2059         .p2align 4
2060 L(Shl15):
2061         movaps  -15(%rcx), %xmm1
2062         movaps  1(%rcx), %xmm2
2063 L(Shl15Start):
2064         pcmpeqb %xmm2, %xmm0
2065         pmovmskb %xmm0, %rax
2066         movaps  %xmm2, %xmm3
2067 # ifdef USE_AS_STRNCPY
2068         sub     $16, %r8
2069         jbe     L(StrncpyExit15Case2OrCase3)
2070 # endif
2071         test    %rax, %rax
2072         jnz     L(Shl15LoopExit)
2073
2074         palignr $15, %xmm1, %xmm2
2075         movaps  %xmm3, %xmm1
2076         movaps  %xmm2, (%rdx)
2077         movaps  17(%rcx), %xmm2
2078
2079         pcmpeqb %xmm2, %xmm0
2080         lea     16(%rdx), %rdx
2081         pmovmskb %xmm0, %rax
2082         lea     16(%rcx), %rcx
2083         movaps  %xmm2, %xmm3
2084 # ifdef USE_AS_STRNCPY
2085         sub     $16, %r8
2086         jbe     L(StrncpyExit15Case2OrCase3)
2087 # endif
2088         test    %rax, %rax
2089         jnz     L(Shl15LoopExit)
2090
2091         palignr $15, %xmm1, %xmm2
2092         movaps  %xmm2, (%rdx)
2093         movaps  17(%rcx), %xmm2
2094         movaps  %xmm3, %xmm1
2095
2096         pcmpeqb %xmm2, %xmm0
2097         lea     16(%rdx), %rdx
2098         pmovmskb %xmm0, %rax
2099         lea     16(%rcx), %rcx
2100         movaps  %xmm2, %xmm3
2101 # ifdef USE_AS_STRNCPY
2102         sub     $16, %r8
2103         jbe     L(StrncpyExit15Case2OrCase3)
2104 # endif
2105         test    %rax, %rax
2106         jnz     L(Shl15LoopExit)
2107
2108         palignr $15, %xmm1, %xmm2
2109         movaps  %xmm3, %xmm1
2110         movaps  %xmm2, (%rdx)
2111         movaps  17(%rcx), %xmm2
2112
2113         pcmpeqb %xmm2, %xmm0
2114         lea     16(%rdx), %rdx
2115         pmovmskb %xmm0, %rax
2116         lea     16(%rcx), %rcx
2117         movaps  %xmm2, %xmm3
2118 # ifdef USE_AS_STRNCPY
2119         sub     $16, %r8
2120         jbe     L(StrncpyExit15Case2OrCase3)
2121 # endif
2122         test    %rax, %rax
2123         jnz     L(Shl15LoopExit)
2124
2125         palignr $15, %xmm1, %xmm2
2126         movaps  %xmm3, %xmm1
2127         movaps  %xmm2, (%rdx)
2128         lea     17(%rcx), %rcx
2129         lea     16(%rdx), %rdx
2130
2131         mov     %rcx, %rax
2132         and     $-0x40, %rcx
2133         sub     %rcx, %rax
2134         lea     -1(%rcx), %rcx
2135         sub     %rax, %rdx
2136 # ifdef USE_AS_STRNCPY
2137         add     %rax, %r8
2138 # endif
2139         movaps  -15(%rcx), %xmm1
2140
2141 L(Shl15LoopStart):
2142         movaps  1(%rcx), %xmm2
2143         movaps  17(%rcx), %xmm3
2144         movaps  %xmm3, %xmm6
2145         movaps  33(%rcx), %xmm4
2146         movaps  %xmm4, %xmm7
2147         movaps  49(%rcx), %xmm5
2148         pminub  %xmm2, %xmm6
2149         pminub  %xmm5, %xmm7
2150         pminub  %xmm6, %xmm7
2151         pcmpeqb %xmm0, %xmm7
2152         pmovmskb %xmm7, %rax
2153         movaps  %xmm5, %xmm7
2154         palignr $15, %xmm4, %xmm5
2155         test    %rax, %rax
2156         palignr $15, %xmm3, %xmm4
2157         jnz     L(Shl15Start)
2158 # ifdef USE_AS_STRNCPY
2159         sub     $64, %r8
2160         jbe     L(StrncpyLeave15)
2161 # endif
2162         palignr $15, %xmm2, %xmm3
2163         lea     64(%rcx), %rcx
2164         palignr $15, %xmm1, %xmm2
2165         movaps  %xmm7, %xmm1
2166         movaps  %xmm5, 48(%rdx)
2167         movaps  %xmm4, 32(%rdx)
2168         movaps  %xmm3, 16(%rdx)
2169         movaps  %xmm2, (%rdx)
2170         lea     64(%rdx), %rdx
2171         jmp     L(Shl15LoopStart)
2172
2173 L(Shl15LoopExit):
2174         movaps  (%rdx), %xmm6
2175         psrldq  $1, %xmm6
2176         mov     $1, %rsi
2177         palignr $15, %xmm1, %xmm6
2178         movaps  %xmm6, (%rdx)
2179 # ifdef USE_AS_STRCAT
2180         jmp     L(CopyFrom1To16Bytes)
2181 # endif
2182
2183
2184         .p2align 4
2185 L(CopyFrom1To16Bytes):
2186 # ifdef USE_AS_STRNCPY
2187         add     $16, %r8
2188 # endif
2189         add     %rsi, %rdx
2190         add     %rsi, %rcx
2191
2192         test    %al, %al
2193         jz      L(ExitHigh)
2194         test    $0x01, %al
2195         jnz     L(Exit1)
2196         test    $0x02, %al
2197         jnz     L(Exit2)
2198         test    $0x04, %al
2199         jnz     L(Exit3)
2200         test    $0x08, %al
2201         jnz     L(Exit4)
2202         test    $0x10, %al
2203         jnz     L(Exit5)
2204         test    $0x20, %al
2205         jnz     L(Exit6)
2206         test    $0x40, %al
2207         jnz     L(Exit7)
2208
2209         .p2align 4
2210 L(Exit8):
2211         mov     (%rcx), %rax
2212         mov     %rax, (%rdx)
2213 # ifdef USE_AS_STPCPY
2214         lea     7(%rdx), %rax
2215 # else
2216         mov     %rdi, %rax
2217 # endif
2218 # ifdef USE_AS_STRNCPY
2219         sub     $8, %r8
2220         lea     8(%rdx), %rcx
2221         jnz     L(StrncpyFillTailWithZero1)
2222 # ifdef USE_AS_STPCPY
2223         cmpb    $1, (%rax)
2224         sbb     $-1, %rax
2225 # endif
2226 # endif
2227         ret
2228
2229         .p2align 4
2230 L(ExitHigh):
2231         test    $0x01, %ah
2232         jnz     L(Exit9)
2233         test    $0x02, %ah
2234         jnz     L(Exit10)
2235         test    $0x04, %ah
2236         jnz     L(Exit11)
2237         test    $0x08, %ah
2238         jnz     L(Exit12)
2239         test    $0x10, %ah
2240         jnz     L(Exit13)
2241         test    $0x20, %ah
2242         jnz     L(Exit14)
2243         test    $0x40, %ah
2244         jnz     L(Exit15)
2245
2246         .p2align 4
2247 L(Exit16):
2248         mov     (%rcx), %rax
2249         mov     %rax, (%rdx)
2250         mov     8(%rcx), %rax
2251         mov     %rax, 8(%rdx)
2252 # ifdef USE_AS_STPCPY
2253         lea     15(%rdx), %rax
2254 # else
2255         mov     %rdi, %rax
2256 # endif
2257 # ifdef USE_AS_STRNCPY
2258         sub     $16, %r8
2259         lea     16(%rdx), %rcx
2260         jnz     L(StrncpyFillTailWithZero1)
2261 # ifdef USE_AS_STPCPY
2262         cmpb    $1, (%rax)
2263         sbb     $-1, %rax
2264 # endif
2265 # endif
2266         ret
2267
2268 # ifdef USE_AS_STRNCPY
2269
2270         .p2align 4
2271 L(CopyFrom1To16BytesCase2):
2272         add     $16, %r8
2273         add     %rsi, %rcx
2274         lea     (%rsi, %rdx), %rsi
2275         lea     -9(%r8), %rdx
2276         and     $1<<7, %dh
2277         or      %al, %dh
2278         test    %dh, %dh
2279         lea     (%rsi), %rdx
2280         jz      L(ExitHighCase2)
2281
2282         cmp     $1, %r8
2283         je      L(Exit1)
2284         test    $0x01, %al
2285         jnz     L(Exit1)
2286         cmp     $2, %r8
2287         je      L(Exit2)
2288         test    $0x02, %al
2289         jnz     L(Exit2)
2290         cmp     $3, %r8
2291         je      L(Exit3)
2292         test    $0x04, %al
2293         jnz     L(Exit3)
2294         cmp     $4, %r8
2295         je      L(Exit4)
2296         test    $0x08, %al
2297         jnz     L(Exit4)
2298         cmp     $5, %r8
2299         je      L(Exit5)
2300         test    $0x10, %al
2301         jnz     L(Exit5)
2302         cmp     $6, %r8
2303         je      L(Exit6)
2304         test    $0x20, %al
2305         jnz     L(Exit6)
2306         cmp     $7, %r8
2307         je      L(Exit7)
2308         test    $0x40, %al
2309         jnz     L(Exit7)
2310         jmp     L(Exit8)
2311
2312         .p2align 4
2313 L(ExitHighCase2):
2314         cmp     $9, %r8
2315         je      L(Exit9)
2316         test    $0x01, %ah
2317         jnz     L(Exit9)
2318         cmp     $10, %r8
2319         je      L(Exit10)
2320         test    $0x02, %ah
2321         jnz     L(Exit10)
2322         cmp     $11, %r8
2323         je      L(Exit11)
2324         test    $0x04, %ah
2325         jnz     L(Exit11)
2326         cmp     $12, %r8
2327         je      L(Exit12)
2328         test    $0x8, %ah
2329         jnz     L(Exit12)
2330         cmp     $13, %r8
2331         je      L(Exit13)
2332         test    $0x10, %ah
2333         jnz     L(Exit13)
2334         cmp     $14, %r8
2335         je      L(Exit14)
2336         test    $0x20, %ah
2337         jnz     L(Exit14)
2338         cmp     $15, %r8
2339         je      L(Exit15)
2340         test    $0x40, %ah
2341         jnz     L(Exit15)
2342         jmp     L(Exit16)
2343
2344 L(CopyFrom1To16BytesCase2OrCase3):
2345         test    %rax, %rax
2346         jnz     L(CopyFrom1To16BytesCase2)
2347
2348         .p2align 4
2349 L(CopyFrom1To16BytesCase3):
2350         add     $16, %r8
2351         add     %rsi, %rdx
2352         add     %rsi, %rcx
2353
2354         cmp     $16, %r8
2355         je      L(Exit16)
2356         cmp     $8, %r8
2357         je      L(Exit8)
2358         jg      L(More8Case3)
2359         cmp     $4, %r8
2360         je      L(Exit4)
2361         jg      L(More4Case3)
2362         cmp     $2, %r8
2363         jl      L(Exit1)
2364         je      L(Exit2)
2365         jg      L(Exit3)
2366 L(More8Case3): /* but less than 16 */
2367         cmp     $12, %r8
2368         je      L(Exit12)
2369         jl      L(Less12Case3)
2370         cmp     $14, %r8
2371         jl      L(Exit13)
2372         je      L(Exit14)
2373         jg      L(Exit15)
2374 L(More4Case3): /* but less than 8 */
2375         cmp     $6, %r8
2376         jl      L(Exit5)
2377         je      L(Exit6)
2378         jg      L(Exit7)
2379 L(Less12Case3): /* but more than 8 */
2380         cmp     $10, %r8
2381         jl      L(Exit9)
2382         je      L(Exit10)
2383         jg      L(Exit11)
2384 # endif
2385
2386         .p2align 4
2387 L(Exit1):
2388         movb    (%rcx), %al
2389         movb    %al, (%rdx)
2390 # ifdef USE_AS_STPCPY
2391         lea     (%rdx), %rax
2392 # else
2393         mov     %rdi, %rax
2394 # endif
2395 # ifdef USE_AS_STRNCPY
2396         sub     $1, %r8
2397         lea     1(%rdx), %rcx
2398         jnz     L(StrncpyFillTailWithZero1)
2399 # ifdef USE_AS_STPCPY
2400         cmpb    $1, (%rax)
2401         sbb     $-1, %rax
2402 # endif
2403 # endif
2404         ret
2405
2406         .p2align 4
2407 L(Exit2):
2408         movw    (%rcx), %ax
2409         movw    %ax, (%rdx)
2410 # ifdef USE_AS_STPCPY
2411         lea     1(%rdx), %rax
2412 # else
2413         mov     %rdi, %rax
2414 # endif
2415 # ifdef USE_AS_STRNCPY
2416         sub     $2, %r8
2417         lea     2(%rdx), %rcx
2418         jnz     L(StrncpyFillTailWithZero1)
2419 # ifdef USE_AS_STPCPY
2420         cmpb    $1, (%rax)
2421         sbb     $-1, %rax
2422 # endif
2423 # endif
2424         ret
2425
2426         .p2align 4
2427 L(Exit3):
2428         movw    (%rcx), %ax
2429         movw    %ax, (%rdx)
2430         movb    2(%rcx), %al
2431         movb    %al, 2(%rdx)
2432 # ifdef USE_AS_STPCPY
2433         lea     2(%rdx), %rax
2434 # else
2435         mov     %rdi, %rax
2436 # endif
2437 # ifdef USE_AS_STRNCPY
2438         sub     $3, %r8
2439         lea     3(%rdx), %rcx
2440         jnz     L(StrncpyFillTailWithZero1)
2441 # ifdef USE_AS_STPCPY
2442         cmpb    $1, (%rax)
2443         sbb     $-1, %rax
2444 # endif
2445 # endif
2446         ret
2447
2448         .p2align 4
2449 L(Exit4):
2450         movl    (%rcx), %eax
2451         movl    %eax, (%rdx)
2452 # ifdef USE_AS_STPCPY
2453         lea     3(%rdx), %rax
2454 # else
2455         mov     %rdi, %rax
2456 # endif
2457 # ifdef USE_AS_STRNCPY
2458         sub     $4, %r8
2459         lea     4(%rdx), %rcx
2460         jnz     L(StrncpyFillTailWithZero1)
2461 # ifdef USE_AS_STPCPY
2462         cmpb    $1, (%rax)
2463         sbb     $-1, %rax
2464 # endif
2465 # endif
2466         ret
2467
2468         .p2align 4
2469 L(Exit5):
2470         movl    (%rcx), %eax
2471         movl    %eax, (%rdx)
2472         movb    4(%rcx), %al
2473         movb    %al, 4(%rdx)
2474 # ifdef USE_AS_STPCPY
2475         lea     4(%rdx), %rax
2476 # else
2477         mov     %rdi, %rax
2478 # endif
2479 # ifdef USE_AS_STRNCPY
2480         sub     $5, %r8
2481         lea     5(%rdx), %rcx
2482         jnz     L(StrncpyFillTailWithZero1)
2483 # ifdef USE_AS_STPCPY
2484         cmpb    $1, (%rax)
2485         sbb     $-1, %rax
2486 # endif
2487 # endif
2488         ret
2489
2490         .p2align 4
2491 L(Exit6):
2492         movl    (%rcx), %eax
2493         movl    %eax, (%rdx)
2494         movw    4(%rcx), %ax
2495         movw    %ax, 4(%rdx)
2496 # ifdef USE_AS_STPCPY
2497         lea     5(%rdx), %rax
2498 # else
2499         mov     %rdi, %rax
2500 # endif
2501 # ifdef USE_AS_STRNCPY
2502         sub     $6, %r8
2503         lea     6(%rdx), %rcx
2504         jnz     L(StrncpyFillTailWithZero1)
2505 # ifdef USE_AS_STPCPY
2506         cmpb    $1, (%rax)
2507         sbb     $-1, %rax
2508 # endif
2509 # endif
2510         ret
2511
2512         .p2align 4
2513 L(Exit7):
2514         movl    (%rcx), %eax
2515         movl    %eax, (%rdx)
2516         movl    3(%rcx), %eax
2517         movl    %eax, 3(%rdx)
2518 # ifdef USE_AS_STPCPY
2519         lea     6(%rdx), %rax
2520 # else
2521         mov     %rdi, %rax
2522 # endif
2523 # ifdef USE_AS_STRNCPY
2524         sub     $7, %r8
2525         lea     7(%rdx), %rcx
2526         jnz     L(StrncpyFillTailWithZero1)
2527 # ifdef USE_AS_STPCPY
2528         cmpb    $1, (%rax)
2529         sbb     $-1, %rax
2530 # endif
2531 # endif
2532         ret
2533
2534         .p2align 4
2535 L(Exit9):
2536         mov     (%rcx), %rax
2537         mov     %rax, (%rdx)
2538         mov     5(%rcx), %eax
2539         mov     %eax, 5(%rdx)
2540 # ifdef USE_AS_STPCPY
2541         lea     8(%rdx), %rax
2542 # else
2543         mov     %rdi, %rax
2544 # endif
2545 # ifdef USE_AS_STRNCPY
2546         sub     $9, %r8
2547         lea     9(%rdx), %rcx
2548         jnz     L(StrncpyFillTailWithZero1)
2549 # ifdef USE_AS_STPCPY
2550         cmpb    $1, (%rax)
2551         sbb     $-1, %rax
2552 # endif
2553 # endif
2554         ret
2555
2556         .p2align 4
2557 L(Exit10):
2558         mov     (%rcx), %rax
2559         mov     %rax, (%rdx)
2560         mov     6(%rcx), %eax
2561         mov     %eax, 6(%rdx)
2562 # ifdef USE_AS_STPCPY
2563         lea     9(%rdx), %rax
2564 # else
2565         mov     %rdi, %rax
2566 # endif
2567 # ifdef USE_AS_STRNCPY
2568         sub     $10, %r8
2569         lea     10(%rdx), %rcx
2570         jnz     L(StrncpyFillTailWithZero1)
2571 # ifdef USE_AS_STPCPY
2572         cmpb    $1, (%rax)
2573         sbb     $-1, %rax
2574 # endif
2575 # endif
2576         ret
2577
2578         .p2align 4
2579 L(Exit11):
2580         mov     (%rcx), %rax
2581         mov     %rax, (%rdx)
2582         mov     7(%rcx), %eax
2583         mov     %eax, 7(%rdx)
2584 # ifdef USE_AS_STPCPY
2585         lea     10(%rdx), %rax
2586 # else
2587         mov     %rdi, %rax
2588 # endif
2589 # ifdef USE_AS_STRNCPY
2590         sub     $11, %r8
2591         lea     11(%rdx), %rcx
2592         jnz     L(StrncpyFillTailWithZero1)
2593 # ifdef USE_AS_STPCPY
2594         cmpb    $1, (%rax)
2595         sbb     $-1, %rax
2596 # endif
2597 # endif
2598         ret
2599
2600         .p2align 4
2601 L(Exit12):
2602         mov     (%rcx), %rax
2603         mov     %rax, (%rdx)
2604         mov     8(%rcx), %eax
2605         mov     %eax, 8(%rdx)
2606 # ifdef USE_AS_STPCPY
2607         lea     11(%rdx), %rax
2608 # else
2609         mov     %rdi, %rax
2610 # endif
2611 # ifdef USE_AS_STRNCPY
2612         sub     $12, %r8
2613         lea     12(%rdx), %rcx
2614         jnz     L(StrncpyFillTailWithZero1)
2615 # ifdef USE_AS_STPCPY
2616         cmpb    $1, (%rax)
2617         sbb     $-1, %rax
2618 # endif
2619 # endif
2620         ret
2621
2622         .p2align 4
2623 L(Exit13):
2624         mov     (%rcx), %rax
2625         mov     %rax, (%rdx)
2626         mov     5(%rcx), %rax
2627         mov     %rax, 5(%rdx)
2628 # ifdef USE_AS_STPCPY
2629         lea     12(%rdx), %rax
2630 # else
2631         mov     %rdi, %rax
2632 # endif
2633 # ifdef USE_AS_STRNCPY
2634         sub     $13, %r8
2635         lea     13(%rdx), %rcx
2636         jnz     L(StrncpyFillTailWithZero1)
2637 # ifdef USE_AS_STPCPY
2638         cmpb    $1, (%rax)
2639         sbb     $-1, %rax
2640 # endif
2641 # endif
2642         ret
2643
2644         .p2align 4
2645 L(Exit14):
2646         mov     (%rcx), %rax
2647         mov     %rax, (%rdx)
2648         mov     6(%rcx), %rax
2649         mov     %rax, 6(%rdx)
2650 # ifdef USE_AS_STPCPY
2651         lea     13(%rdx), %rax
2652 # else
2653         mov     %rdi, %rax
2654 # endif
2655 # ifdef USE_AS_STRNCPY
2656         sub     $14, %r8
2657         lea     14(%rdx), %rcx
2658         jnz     L(StrncpyFillTailWithZero1)
2659 # ifdef USE_AS_STPCPY
2660         cmpb    $1, (%rax)
2661         sbb     $-1, %rax
2662 # endif
2663 # endif
2664         ret
2665
2666         .p2align 4
2667 L(Exit15):
2668         mov     (%rcx), %rax
2669         mov     %rax, (%rdx)
2670         mov     7(%rcx), %rax
2671         mov     %rax, 7(%rdx)
2672 # ifdef USE_AS_STPCPY
2673         lea     14(%rdx), %rax
2674 # else
2675         mov     %rdi, %rax
2676 # endif
2677 # ifdef USE_AS_STRNCPY
2678         sub     $15, %r8
2679         lea     15(%rdx), %rcx
2680         jnz     L(StrncpyFillTailWithZero1)
2681 # ifdef USE_AS_STPCPY
2682         cmpb    $1, (%rax)
2683         sbb     $-1, %rax
2684 # endif
2685 # endif
2686         ret
2687
2688 # ifdef USE_AS_STRNCPY
2689         .p2align 4
2690 L(Fill0):
2691         ret
2692
2693         .p2align 4
2694 L(Fill1):
2695         movb    %dl, (%rcx)
2696         ret
2697
2698         .p2align 4
2699 L(Fill2):
2700         movw    %dx, (%rcx)
2701         ret
2702
2703         .p2align 4
2704 L(Fill3):
2705         movw    %dx, (%rcx)
2706         movb    %dl, 2(%rcx)
2707         ret
2708
2709         .p2align 4
2710 L(Fill4):
2711         movl    %edx, (%rcx)
2712         ret
2713
2714         .p2align 4
2715 L(Fill5):
2716         movl    %edx, (%rcx)
2717         movb    %dl, 4(%rcx)
2718         ret
2719
2720         .p2align 4
2721 L(Fill6):
2722         movl    %edx, (%rcx)
2723         movw    %dx, 4(%rcx)
2724         ret
2725
2726         .p2align 4
2727 L(Fill7):
2728         movl    %edx, (%rcx)
2729         movl    %edx, 3(%rcx)
2730         ret
2731
2732         .p2align 4
2733 L(Fill8):
2734         mov     %rdx, (%rcx)
2735         ret
2736
2737         .p2align 4
2738 L(Fill9):
2739         mov     %rdx, (%rcx)
2740         movb    %dl, 8(%rcx)
2741         ret
2742
2743         .p2align 4
2744 L(Fill10):
2745         mov     %rdx, (%rcx)
2746         movw    %dx, 8(%rcx)
2747         ret
2748
2749         .p2align 4
2750 L(Fill11):
2751         mov     %rdx, (%rcx)
2752         movl    %edx, 7(%rcx)
2753         ret
2754
2755         .p2align 4
2756 L(Fill12):
2757         mov     %rdx, (%rcx)
2758         movl    %edx, 8(%rcx)
2759         ret
2760
2761         .p2align 4
2762 L(Fill13):
2763         mov     %rdx, (%rcx)
2764         mov     %rdx, 5(%rcx)
2765         ret
2766
2767         .p2align 4
2768 L(Fill14):
2769         mov     %rdx, (%rcx)
2770         mov     %rdx, 6(%rcx)
2771         ret
2772
2773         .p2align 4
2774 L(Fill15):
2775         mov     %rdx, (%rcx)
2776         mov     %rdx, 7(%rcx)
2777         ret
2778
2779         .p2align 4
2780 L(Fill16):
2781         mov     %rdx, (%rcx)
2782         mov     %rdx, 8(%rcx)
2783         ret
2784
2785         .p2align 4
2786 L(StrncpyFillExit1):
2787         lea     16(%r8), %r8
2788 L(FillFrom1To16Bytes):
2789         test    %r8, %r8
2790         jz      L(Fill0)
2791         cmp     $16, %r8
2792         je      L(Fill16)
2793         cmp     $8, %r8
2794         je      L(Fill8)
2795         jg      L(FillMore8)
2796         cmp     $4, %r8
2797         je      L(Fill4)
2798         jg      L(FillMore4)
2799         cmp     $2, %r8
2800         jl      L(Fill1)
2801         je      L(Fill2)
2802         jg      L(Fill3)
2803 L(FillMore8): /* but less than 16 */
2804         cmp     $12, %r8
2805         je      L(Fill12)
2806         jl      L(FillLess12)
2807         cmp     $14, %r8
2808         jl      L(Fill13)
2809         je      L(Fill14)
2810         jg      L(Fill15)
2811 L(FillMore4): /* but less than 8 */
2812         cmp     $6, %r8
2813         jl      L(Fill5)
2814         je      L(Fill6)
2815         jg      L(Fill7)
2816 L(FillLess12): /* but more than 8 */
2817         cmp     $10, %r8
2818         jl      L(Fill9)
2819         je      L(Fill10)
2820         jmp     L(Fill11)
2821
2822         .p2align 4
2823 L(StrncpyFillTailWithZero1):
2824         xor     %rdx, %rdx
2825         sub     $16, %r8
2826         jbe     L(StrncpyFillExit1)
2827
2828         pxor    %xmm0, %xmm0
2829         mov     %rdx, (%rcx)
2830         mov     %rdx, 8(%rcx)
2831
2832         lea     16(%rcx), %rcx
2833
2834         mov     %rcx, %rdx
2835         and     $0xf, %rdx
2836         sub     %rdx, %rcx
2837         add     %rdx, %r8
2838         xor     %rdx, %rdx
2839         sub     $64, %r8
2840         jb      L(StrncpyFillLess64)
2841
2842 L(StrncpyFillLoopMovdqa):
2843         movdqa  %xmm0, (%rcx)
2844         movdqa  %xmm0, 16(%rcx)
2845         movdqa  %xmm0, 32(%rcx)
2846         movdqa  %xmm0, 48(%rcx)
2847         lea     64(%rcx), %rcx
2848         sub     $64, %r8
2849         jae     L(StrncpyFillLoopMovdqa)
2850
2851 L(StrncpyFillLess64):
2852         add     $32, %r8
2853         jl      L(StrncpyFillLess32)
2854         movdqa  %xmm0, (%rcx)
2855         movdqa  %xmm0, 16(%rcx)
2856         lea     32(%rcx), %rcx
2857         sub     $16, %r8
2858         jl      L(StrncpyFillExit1)
2859         movdqa  %xmm0, (%rcx)
2860         lea     16(%rcx), %rcx
2861         jmp     L(FillFrom1To16Bytes)
2862
2863 L(StrncpyFillLess32):
2864         add     $16, %r8
2865         jl      L(StrncpyFillExit1)
2866         movdqa  %xmm0, (%rcx)
2867         lea     16(%rcx), %rcx
2868         jmp     L(FillFrom1To16Bytes)
2869
2870         .p2align 4
2871 L(Exit0):
2872         mov     %rdx, %rax
2873         ret
2874
2875         .p2align 4
2876 L(StrncpyExit15Bytes):
2877         cmp     $9, %r8
2878         je      L(Exit9)
2879         cmpb    $0, 8(%rcx)
2880         jz      L(Exit9)
2881         cmp     $10, %r8
2882         je      L(Exit10)
2883         cmpb    $0, 9(%rcx)
2884         jz      L(Exit10)
2885         cmp     $11, %r8
2886         je      L(Exit11)
2887         cmpb    $0, 10(%rcx)
2888         jz      L(Exit11)
2889         cmp     $12, %r8
2890         je      L(Exit12)
2891         cmpb    $0, 11(%rcx)
2892         jz      L(Exit12)
2893         cmp     $13, %r8
2894         je      L(Exit13)
2895         cmpb    $0, 12(%rcx)
2896         jz      L(Exit13)
2897         cmp     $14, %r8
2898         je      L(Exit14)
2899         cmpb    $0, 13(%rcx)
2900         jz      L(Exit14)
2901         mov     (%rcx), %rax
2902         mov     %rax, (%rdx)
2903         mov     7(%rcx), %rax
2904         mov     %rax, 7(%rdx)
2905 # ifdef USE_AS_STPCPY
2906         lea     14(%rdx), %rax
2907         cmpb    $1, (%rax)
2908         sbb     $-1, %rax
2909 # else
2910         mov     %rdi, %rax
2911 # endif
2912         ret
2913
2914         .p2align 4
2915 L(StrncpyExit8Bytes):
2916         cmp     $1, %r8
2917         je      L(Exit1)
2918         cmpb    $0, (%rcx)
2919         jz      L(Exit1)
2920         cmp     $2, %r8
2921         je      L(Exit2)
2922         cmpb    $0, 1(%rcx)
2923         jz      L(Exit2)
2924         cmp     $3, %r8
2925         je      L(Exit3)
2926         cmpb    $0, 2(%rcx)
2927         jz      L(Exit3)
2928         cmp     $4, %r8
2929         je      L(Exit4)
2930         cmpb    $0, 3(%rcx)
2931         jz      L(Exit4)
2932         cmp     $5, %r8
2933         je      L(Exit5)
2934         cmpb    $0, 4(%rcx)
2935         jz      L(Exit5)
2936         cmp     $6, %r8
2937         je      L(Exit6)
2938         cmpb    $0, 5(%rcx)
2939         jz      L(Exit6)
2940         cmp     $7, %r8
2941         je      L(Exit7)
2942         cmpb    $0, 6(%rcx)
2943         jz      L(Exit7)
2944         mov     (%rcx), %rax
2945         mov     %rax, (%rdx)
2946 # ifdef USE_AS_STPCPY
2947         lea     7(%rdx), %rax
2948         cmpb    $1, (%rax)
2949         sbb     $-1, %rax
2950 # else
2951         mov     %rdi, %rax
2952 # endif
2953         ret
2954
2955 # endif
2956
2957 # ifdef USE_AS_STRNCPY
2958
2959 L(StrncpyLeaveCase2OrCase3):
2960         test    %rax, %rax
2961         jnz     L(Aligned64LeaveCase2)
2962
2963 L(Aligned64LeaveCase3):
2964         lea     64(%r8), %r8
2965         sub     $16, %r8
2966         jbe     L(CopyFrom1To16BytesCase3)
2967         movaps  %xmm4, -64(%rdx)
2968         lea     16(%rsi), %rsi
2969         sub     $16, %r8
2970         jbe     L(CopyFrom1To16BytesCase3)
2971         movaps  %xmm5, -48(%rdx)
2972         lea     16(%rsi), %rsi
2973         sub     $16, %r8
2974         jbe     L(CopyFrom1To16BytesCase3)
2975         movaps  %xmm6, -32(%rdx)
2976         lea     16(%rsi), %rsi
2977         lea     -16(%r8), %r8
2978         jmp     L(CopyFrom1To16BytesCase3)
2979
2980 L(Aligned64LeaveCase2):
2981         pcmpeqb %xmm4, %xmm0
2982         pmovmskb %xmm0, %rax
2983         add     $48, %r8
2984         jle     L(CopyFrom1To16BytesCase2OrCase3)
2985         test    %rax, %rax
2986         jnz     L(CopyFrom1To16Bytes)
2987
2988         pcmpeqb %xmm5, %xmm0
2989         pmovmskb %xmm0, %rax
2990         movaps  %xmm4, -64(%rdx)
2991         lea     16(%rsi), %rsi
2992         sub     $16, %r8
2993         jbe     L(CopyFrom1To16BytesCase2OrCase3)
2994         test    %rax, %rax
2995         jnz     L(CopyFrom1To16Bytes)
2996
2997         pcmpeqb %xmm6, %xmm0
2998         pmovmskb %xmm0, %rax
2999         movaps  %xmm5, -48(%rdx)
3000         lea     16(%rsi), %rsi
3001         sub     $16, %r8
3002         jbe     L(CopyFrom1To16BytesCase2OrCase3)
3003         test    %rax, %rax
3004         jnz     L(CopyFrom1To16Bytes)
3005
3006         pcmpeqb %xmm7, %xmm0
3007         pmovmskb %xmm0, %rax
3008         movaps  %xmm6, -32(%rdx)
3009         lea     16(%rsi), %rsi
3010         lea     -16(%r8), %r8
3011         jmp     L(CopyFrom1To16BytesCase2)
3012 /*--------------------------------------------------*/
3013 L(StrncpyExit1Case2OrCase3):
3014         movaps  (%rdx), %xmm6
3015         psrldq  $15, %xmm6
3016         mov     $15, %rsi
3017         palignr $1, %xmm1, %xmm6
3018         movaps  %xmm6, (%rdx)
3019         test    %rax, %rax
3020         jnz     L(CopyFrom1To16BytesCase2)
3021         jmp     L(CopyFrom1To16BytesCase3)
3022
3023 L(StrncpyExit2Case2OrCase3):
3024         movaps  (%rdx), %xmm6
3025         psrldq  $14, %xmm6
3026         mov     $14, %rsi
3027         palignr $2, %xmm1, %xmm6
3028         movaps  %xmm6, (%rdx)
3029         test    %rax, %rax
3030         jnz     L(CopyFrom1To16BytesCase2)
3031         jmp     L(CopyFrom1To16BytesCase3)
3032
3033 L(StrncpyExit3Case2OrCase3):
3034         movaps  (%rdx), %xmm6
3035         psrldq  $13, %xmm6
3036         mov     $13, %rsi
3037         palignr $3, %xmm1, %xmm6
3038         movaps  %xmm6, (%rdx)
3039         test    %rax, %rax
3040         jnz     L(CopyFrom1To16BytesCase2)
3041         jmp     L(CopyFrom1To16BytesCase3)
3042
3043 L(StrncpyExit4Case2OrCase3):
3044         movaps  (%rdx), %xmm6
3045         psrldq  $12, %xmm6
3046         mov     $12, %rsi
3047         palignr $4, %xmm1, %xmm6
3048         movaps  %xmm6, (%rdx)
3049         test    %rax, %rax
3050         jnz     L(CopyFrom1To16BytesCase2)
3051         jmp     L(CopyFrom1To16BytesCase3)
3052
3053 L(StrncpyExit5Case2OrCase3):
3054         movaps  (%rdx), %xmm6
3055         psrldq  $11, %xmm6
3056         mov     $11, %rsi
3057         palignr $5, %xmm1, %xmm6
3058         movaps  %xmm6, (%rdx)
3059         test    %rax, %rax
3060         jnz     L(CopyFrom1To16BytesCase2)
3061         jmp     L(CopyFrom1To16BytesCase3)
3062
3063 L(StrncpyExit6Case2OrCase3):
3064         movaps  (%rdx), %xmm6
3065         psrldq  $10, %xmm6
3066         mov     $10, %rsi
3067         palignr $6, %xmm1, %xmm6
3068         movaps  %xmm6, (%rdx)
3069         test    %rax, %rax
3070         jnz     L(CopyFrom1To16BytesCase2)
3071         jmp     L(CopyFrom1To16BytesCase3)
3072
3073 L(StrncpyExit7Case2OrCase3):
3074         movaps  (%rdx), %xmm6
3075         psrldq  $9, %xmm6
3076         mov     $9, %rsi
3077         palignr $7, %xmm1, %xmm6
3078         movaps  %xmm6, (%rdx)
3079         test    %rax, %rax
3080         jnz     L(CopyFrom1To16BytesCase2)
3081         jmp     L(CopyFrom1To16BytesCase3)
3082
3083 L(StrncpyExit8Case2OrCase3):
3084         movaps  (%rdx), %xmm6
3085         psrldq  $8, %xmm6
3086         mov     $8, %rsi
3087         palignr $8, %xmm1, %xmm6
3088         movaps  %xmm6, (%rdx)
3089         test    %rax, %rax
3090         jnz     L(CopyFrom1To16BytesCase2)
3091         jmp     L(CopyFrom1To16BytesCase3)
3092
3093 L(StrncpyExit9Case2OrCase3):
3094         movaps  (%rdx), %xmm6
3095         psrldq  $7, %xmm6
3096         mov     $7, %rsi
3097         palignr $9, %xmm1, %xmm6
3098         movaps  %xmm6, (%rdx)
3099         test    %rax, %rax
3100         jnz     L(CopyFrom1To16BytesCase2)
3101         jmp     L(CopyFrom1To16BytesCase3)
3102
3103 L(StrncpyExit10Case2OrCase3):
3104         movaps  (%rdx), %xmm6
3105         psrldq  $6, %xmm6
3106         mov     $6, %rsi
3107         palignr $10, %xmm1, %xmm6
3108         movaps  %xmm6, (%rdx)
3109         test    %rax, %rax
3110         jnz     L(CopyFrom1To16BytesCase2)
3111         jmp     L(CopyFrom1To16BytesCase3)
3112
3113 L(StrncpyExit11Case2OrCase3):
3114         movaps  (%rdx), %xmm6
3115         psrldq  $5, %xmm6
3116         mov     $5, %rsi
3117         palignr $11, %xmm1, %xmm6
3118         movaps  %xmm6, (%rdx)
3119         test    %rax, %rax
3120         jnz     L(CopyFrom1To16BytesCase2)
3121         jmp     L(CopyFrom1To16BytesCase3)
3122
3123 L(StrncpyExit12Case2OrCase3):
3124         movaps  (%rdx), %xmm6
3125         psrldq  $4, %xmm6
3126         mov     $4, %rsi
3127         palignr $12, %xmm1, %xmm6
3128         movaps  %xmm6, (%rdx)
3129         test    %rax, %rax
3130         jnz     L(CopyFrom1To16BytesCase2)
3131         jmp     L(CopyFrom1To16BytesCase3)
3132
3133 L(StrncpyExit13Case2OrCase3):
3134         movaps  (%rdx), %xmm6
3135         psrldq  $3, %xmm6
3136         mov     $3, %rsi
3137         palignr $13, %xmm1, %xmm6
3138         movaps  %xmm6, (%rdx)
3139         test    %rax, %rax
3140         jnz     L(CopyFrom1To16BytesCase2)
3141         jmp     L(CopyFrom1To16BytesCase3)
3142
3143 L(StrncpyExit14Case2OrCase3):
3144         movaps  (%rdx), %xmm6
3145         psrldq  $2, %xmm6
3146         mov     $2, %rsi
3147         palignr $14, %xmm1, %xmm6
3148         movaps  %xmm6, (%rdx)
3149         test    %rax, %rax
3150         jnz     L(CopyFrom1To16BytesCase2)
3151         jmp     L(CopyFrom1To16BytesCase3)
3152
3153 L(StrncpyExit15Case2OrCase3):
3154         movaps  (%rdx), %xmm6
3155         psrldq  $1, %xmm6
3156         mov     $1, %rsi
3157         palignr $15, %xmm1, %xmm6
3158         movaps  %xmm6, (%rdx)
3159         test    %rax, %rax
3160         jnz     L(CopyFrom1To16BytesCase2)
3161         jmp     L(CopyFrom1To16BytesCase3)
3162
3163 L(StrncpyLeave1):
3164         movaps  %xmm2, %xmm3
3165         add     $48, %r8
3166         jle     L(StrncpyExit1)
3167         palignr $1, %xmm1, %xmm2
3168         movaps  %xmm3, %xmm1
3169         movaps  %xmm2, (%rdx)
3170         movaps  31(%rcx), %xmm2
3171         lea     16(%rsi), %rsi
3172         movaps  %xmm2, %xmm3
3173         sub     $16, %r8
3174         jbe     L(StrncpyExit1)
3175         palignr $1, %xmm1, %xmm2
3176         movaps  %xmm2, 16(%rdx)
3177         movaps  31+16(%rcx), %xmm2
3178         movaps  %xmm3, %xmm1
3179         lea     16(%rsi), %rsi
3180         sub     $16, %r8
3181         jbe     L(StrncpyExit1)
3182         movaps  %xmm2, %xmm1
3183         movaps  %xmm4, 32(%rdx)
3184         lea     16(%rsi), %rsi
3185         sub     $16, %r8
3186         jbe     L(StrncpyExit1)
3187         movaps  %xmm7, %xmm1
3188         movaps  %xmm5, 48(%rdx)
3189         lea     16(%rsi), %rsi
3190         lea     -16(%r8), %r8
3191
3192 L(StrncpyExit1):
3193         movaps  (%rdx, %rsi), %xmm6
3194         psrldq  $15, %xmm6
3195         palignr $1, %xmm1, %xmm6
3196         movaps  %xmm6, (%rdx, %rsi)
3197         lea     15(%rsi), %rsi
3198         jmp     L(CopyFrom1To16BytesCase3)
3199
3200 L(StrncpyLeave2):
3201         movaps  %xmm2, %xmm3
3202         add     $48, %r8
3203         jle     L(StrncpyExit2)
3204         palignr $2, %xmm1, %xmm2
3205         movaps  %xmm3, %xmm1
3206         movaps  %xmm2, (%rdx)
3207         movaps  30(%rcx), %xmm2
3208         lea     16(%rsi), %rsi
3209         movaps  %xmm2, %xmm3
3210         sub     $16, %r8
3211         jbe     L(StrncpyExit2)
3212         palignr $2, %xmm1, %xmm2
3213         movaps  %xmm2, 16(%rdx)
3214         movaps  30+16(%rcx), %xmm2
3215         movaps  %xmm3, %xmm1
3216         lea     16(%rsi), %rsi
3217         sub     $16, %r8
3218         jbe     L(StrncpyExit2)
3219         movaps  %xmm2, %xmm1
3220         movaps  %xmm4, 32(%rdx)
3221         lea     16(%rsi), %rsi
3222         sub     $16, %r8
3223         jbe     L(StrncpyExit2)
3224         movaps  %xmm7, %xmm1
3225         movaps  %xmm5, 48(%rdx)
3226         lea     16(%rsi), %rsi
3227         lea     -16(%r8), %r8
3228
3229 L(StrncpyExit2):
3230         movaps  (%rdx, %rsi), %xmm6
3231         psrldq  $14, %xmm6
3232         palignr $2, %xmm1, %xmm6
3233         movaps  %xmm6, (%rdx, %rsi)
3234         lea     14(%rsi), %rsi
3235         jmp     L(CopyFrom1To16BytesCase3)
3236
3237 L(StrncpyLeave3):
3238         movaps  %xmm2, %xmm3
3239         add     $48, %r8
3240         jle     L(StrncpyExit3)
3241         palignr $3, %xmm1, %xmm2
3242         movaps  %xmm3, %xmm1
3243         movaps  %xmm2, (%rdx)
3244         movaps  29(%rcx), %xmm2
3245         lea     16(%rsi), %rsi
3246         movaps  %xmm2, %xmm3
3247         sub     $16, %r8
3248         jbe     L(StrncpyExit3)
3249         palignr $3, %xmm1, %xmm2
3250         movaps  %xmm2, 16(%rdx)
3251         movaps  29+16(%rcx), %xmm2
3252         movaps  %xmm3, %xmm1
3253         lea     16(%rsi), %rsi
3254         sub     $16, %r8
3255         jbe     L(StrncpyExit3)
3256         movaps  %xmm2, %xmm1
3257         movaps  %xmm4, 32(%rdx)
3258         lea     16(%rsi), %rsi
3259         sub     $16, %r8
3260         jbe     L(StrncpyExit3)
3261         movaps  %xmm7, %xmm1
3262         movaps  %xmm5, 48(%rdx)
3263         lea     16(%rsi), %rsi
3264         lea     -16(%r8), %r8
3265
3266 L(StrncpyExit3):
3267         movaps  (%rdx, %rsi), %xmm6
3268         psrldq  $13, %xmm6
3269         palignr $3, %xmm1, %xmm6
3270         movaps  %xmm6, (%rdx, %rsi)
3271         lea     13(%rsi), %rsi
3272         jmp     L(CopyFrom1To16BytesCase3)
3273
3274 L(StrncpyLeave4):
3275         movaps  %xmm2, %xmm3
3276         add     $48, %r8
3277         jle     L(StrncpyExit4)
3278         palignr $4, %xmm1, %xmm2
3279         movaps  %xmm3, %xmm1
3280         movaps  %xmm2, (%rdx)
3281         movaps  28(%rcx), %xmm2
3282         lea     16(%rsi), %rsi
3283         movaps  %xmm2, %xmm3
3284         sub     $16, %r8
3285         jbe     L(StrncpyExit4)
3286         palignr $4, %xmm1, %xmm2
3287         movaps  %xmm2, 16(%rdx)
3288         movaps  28+16(%rcx), %xmm2
3289         movaps  %xmm3, %xmm1
3290         lea     16(%rsi), %rsi
3291         sub     $16, %r8
3292         jbe     L(StrncpyExit4)
3293         movaps  %xmm2, %xmm1
3294         movaps  %xmm4, 32(%rdx)
3295         lea     16(%rsi), %rsi
3296         sub     $16, %r8
3297         jbe     L(StrncpyExit4)
3298         movaps  %xmm7, %xmm1
3299         movaps  %xmm5, 48(%rdx)
3300         lea     16(%rsi), %rsi
3301         lea     -16(%r8), %r8
3302
3303 L(StrncpyExit4):
3304         movaps  (%rdx, %rsi), %xmm6
3305         psrldq  $12, %xmm6
3306         palignr $4, %xmm1, %xmm6
3307         movaps  %xmm6, (%rdx, %rsi)
3308         lea     12(%rsi), %rsi
3309         jmp     L(CopyFrom1To16BytesCase3)
3310
3311 L(StrncpyLeave5):
3312         movaps  %xmm2, %xmm3
3313         add     $48, %r8
3314         jle     L(StrncpyExit5)
3315         palignr $5, %xmm1, %xmm2
3316         movaps  %xmm3, %xmm1
3317         movaps  %xmm2, (%rdx)
3318         movaps  27(%rcx), %xmm2
3319         lea     16(%rsi), %rsi
3320         movaps  %xmm2, %xmm3
3321         sub     $16, %r8
3322         jbe     L(StrncpyExit5)
3323         palignr $5, %xmm1, %xmm2
3324         movaps  %xmm2, 16(%rdx)
3325         movaps  27+16(%rcx), %xmm2
3326         movaps  %xmm3, %xmm1
3327         lea     16(%rsi), %rsi
3328         sub     $16, %r8
3329         jbe     L(StrncpyExit5)
3330         movaps  %xmm2, %xmm1
3331         movaps  %xmm4, 32(%rdx)
3332         lea     16(%rsi), %rsi
3333         sub     $16, %r8
3334         jbe     L(StrncpyExit5)
3335         movaps  %xmm7, %xmm1
3336         movaps  %xmm5, 48(%rdx)
3337         lea     16(%rsi), %rsi
3338         lea     -16(%r8), %r8
3339
3340 L(StrncpyExit5):
3341         movaps  (%rdx, %rsi), %xmm6
3342         psrldq  $11, %xmm6
3343         palignr $5, %xmm1, %xmm6
3344         movaps  %xmm6, (%rdx, %rsi)
3345         lea     11(%rsi), %rsi
3346         jmp     L(CopyFrom1To16BytesCase3)
3347
3348 L(StrncpyLeave6):
3349         movaps  %xmm2, %xmm3
3350         add     $48, %r8
3351         jle     L(StrncpyExit6)
3352         palignr $6, %xmm1, %xmm2
3353         movaps  %xmm3, %xmm1
3354         movaps  %xmm2, (%rdx)
3355         movaps  26(%rcx), %xmm2
3356         lea     16(%rsi), %rsi
3357         movaps  %xmm2, %xmm3
3358         sub     $16, %r8
3359         jbe     L(StrncpyExit6)
3360         palignr $6, %xmm1, %xmm2
3361         movaps  %xmm2, 16(%rdx)
3362         movaps  26+16(%rcx), %xmm2
3363         movaps  %xmm3, %xmm1
3364         lea     16(%rsi), %rsi
3365         sub     $16, %r8
3366         jbe     L(StrncpyExit6)
3367         movaps  %xmm2, %xmm1
3368         movaps  %xmm4, 32(%rdx)
3369         lea     16(%rsi), %rsi
3370         sub     $16, %r8
3371         jbe     L(StrncpyExit6)
3372         movaps  %xmm7, %xmm1
3373         movaps  %xmm5, 48(%rdx)
3374         lea     16(%rsi), %rsi
3375         lea     -16(%r8), %r8
3376
3377 L(StrncpyExit6):
3378         movaps  (%rdx, %rsi), %xmm6
3379         psrldq  $10, %xmm6
3380         palignr $6, %xmm1, %xmm6
3381         movaps  %xmm6, (%rdx, %rsi)
3382         lea     10(%rsi), %rsi
3383         jmp     L(CopyFrom1To16BytesCase3)
3384
3385 L(StrncpyLeave7):
3386         movaps  %xmm2, %xmm3
3387         add     $48, %r8
3388         jle     L(StrncpyExit7)
3389         palignr $7, %xmm1, %xmm2
3390         movaps  %xmm3, %xmm1
3391         movaps  %xmm2, (%rdx)
3392         movaps  25(%rcx), %xmm2
3393         lea     16(%rsi), %rsi
3394         movaps  %xmm2, %xmm3
3395         sub     $16, %r8
3396         jbe     L(StrncpyExit7)
3397         palignr $7, %xmm1, %xmm2
3398         movaps  %xmm2, 16(%rdx)
3399         movaps  25+16(%rcx), %xmm2
3400         movaps  %xmm3, %xmm1
3401         lea     16(%rsi), %rsi
3402         sub     $16, %r8
3403         jbe     L(StrncpyExit7)
3404         movaps  %xmm2, %xmm1
3405         movaps  %xmm4, 32(%rdx)
3406         lea     16(%rsi), %rsi
3407         sub     $16, %r8
3408         jbe     L(StrncpyExit7)
3409         movaps  %xmm7, %xmm1
3410         movaps  %xmm5, 48(%rdx)
3411         lea     16(%rsi), %rsi
3412         lea     -16(%r8), %r8
3413
3414 L(StrncpyExit7):
3415         movaps  (%rdx, %rsi), %xmm6
3416         psrldq  $9, %xmm6
3417         palignr $7, %xmm1, %xmm6
3418         movaps  %xmm6, (%rdx, %rsi)
3419         lea     9(%rsi), %rsi
3420         jmp     L(CopyFrom1To16BytesCase3)
3421
3422 L(StrncpyLeave8):
3423         movaps  %xmm2, %xmm3
3424         add     $48, %r8
3425         jle     L(StrncpyExit8)
3426         palignr $8, %xmm1, %xmm2
3427         movaps  %xmm3, %xmm1
3428         movaps  %xmm2, (%rdx)
3429         movaps  24(%rcx), %xmm2
3430         lea     16(%rsi), %rsi
3431         movaps  %xmm2, %xmm3
3432         sub     $16, %r8
3433         jbe     L(StrncpyExit8)
3434         palignr $8, %xmm1, %xmm2
3435         movaps  %xmm2, 16(%rdx)
3436         movaps  24+16(%rcx), %xmm2
3437         movaps  %xmm3, %xmm1
3438         lea     16(%rsi), %rsi
3439         sub     $16, %r8
3440         jbe     L(StrncpyExit8)
3441         movaps  %xmm2, %xmm1
3442         movaps  %xmm4, 32(%rdx)
3443         lea     16(%rsi), %rsi
3444         sub     $16, %r8
3445         jbe     L(StrncpyExit8)
3446         movaps  %xmm7, %xmm1
3447         movaps  %xmm5, 48(%rdx)
3448         lea     16(%rsi), %rsi
3449         lea     -16(%r8), %r8
3450
3451 L(StrncpyExit8):
3452         movaps  (%rdx, %rsi), %xmm6
3453         psrldq  $8, %xmm6
3454         palignr $8, %xmm1, %xmm6
3455         movaps  %xmm6, (%rdx, %rsi)
3456         lea     8(%rsi), %rsi
3457         jmp     L(CopyFrom1To16BytesCase3)
3458
3459 L(StrncpyLeave9):
3460         movaps  %xmm2, %xmm3
3461         add     $48, %r8
3462         jle     L(StrncpyExit9)
3463         palignr $9, %xmm1, %xmm2
3464         movaps  %xmm3, %xmm1
3465         movaps  %xmm2, (%rdx)
3466         movaps  23(%rcx), %xmm2
3467         lea     16(%rsi), %rsi
3468         movaps  %xmm2, %xmm3
3469         sub     $16, %r8
3470         jbe     L(StrncpyExit9)
3471         palignr $9, %xmm1, %xmm2
3472         movaps  %xmm2, 16(%rdx)
3473         movaps  23+16(%rcx), %xmm2
3474         movaps  %xmm3, %xmm1
3475         lea     16(%rsi), %rsi
3476         sub     $16, %r8
3477         jbe     L(StrncpyExit9)
3478         movaps  %xmm2, %xmm1
3479         movaps  %xmm4, 32(%rdx)
3480         lea     16(%rsi), %rsi
3481         sub     $16, %r8
3482         jbe     L(StrncpyExit9)
3483         movaps  %xmm7, %xmm1
3484         movaps  %xmm5, 48(%rdx)
3485         lea     16(%rsi), %rsi
3486         lea     -16(%r8), %r8
3487
3488 L(StrncpyExit9):
3489         movaps  (%rdx, %rsi), %xmm6
3490         psrldq  $7, %xmm6
3491         palignr $9, %xmm1, %xmm6
3492         movaps  %xmm6, (%rdx, %rsi)
3493         lea     7(%rsi), %rsi
3494         jmp     L(CopyFrom1To16BytesCase3)
3495
3496 L(StrncpyLeave10):
3497         movaps  %xmm2, %xmm3
3498         add     $48, %r8
3499         jle     L(StrncpyExit10)
3500         palignr $10, %xmm1, %xmm2
3501         movaps  %xmm3, %xmm1
3502         movaps  %xmm2, (%rdx)
3503         movaps  22(%rcx), %xmm2
3504         lea     16(%rsi), %rsi
3505         movaps  %xmm2, %xmm3
3506         sub     $16, %r8
3507         jbe     L(StrncpyExit10)
3508         palignr $10, %xmm1, %xmm2
3509         movaps  %xmm2, 16(%rdx)
3510         movaps  22+16(%rcx), %xmm2
3511         movaps  %xmm3, %xmm1
3512         lea     16(%rsi), %rsi
3513         sub     $16, %r8
3514         jbe     L(StrncpyExit10)
3515         movaps  %xmm2, %xmm1
3516         movaps  %xmm4, 32(%rdx)
3517         lea     16(%rsi), %rsi
3518         sub     $16, %r8
3519         jbe     L(StrncpyExit10)
3520         movaps  %xmm7, %xmm1
3521         movaps  %xmm5, 48(%rdx)
3522         lea     16(%rsi), %rsi
3523         lea     -16(%r8), %r8
3524
3525 L(StrncpyExit10):
3526         movaps  (%rdx, %rsi), %xmm6
3527         psrldq  $6, %xmm6
3528         palignr $10, %xmm1, %xmm6
3529         movaps  %xmm6, (%rdx, %rsi)
3530         lea     6(%rsi), %rsi
3531         jmp     L(CopyFrom1To16BytesCase3)
3532
3533 L(StrncpyLeave11):
3534         movaps  %xmm2, %xmm3
3535         add     $48, %r8
3536         jle     L(StrncpyExit11)
3537         palignr $11, %xmm1, %xmm2
3538         movaps  %xmm3, %xmm1
3539         movaps  %xmm2, (%rdx)
3540         movaps  21(%rcx), %xmm2
3541         lea     16(%rsi), %rsi
3542         movaps  %xmm2, %xmm3
3543         sub     $16, %r8
3544         jbe     L(StrncpyExit11)
3545         palignr $11, %xmm1, %xmm2
3546         movaps  %xmm2, 16(%rdx)
3547         movaps  21+16(%rcx), %xmm2
3548         movaps  %xmm3, %xmm1
3549         lea     16(%rsi), %rsi
3550         sub     $16, %r8
3551         jbe     L(StrncpyExit11)
3552         movaps  %xmm2, %xmm1
3553         movaps  %xmm4, 32(%rdx)
3554         lea     16(%rsi), %rsi
3555         sub     $16, %r8
3556         jbe     L(StrncpyExit11)
3557         movaps  %xmm7, %xmm1
3558         movaps  %xmm5, 48(%rdx)
3559         lea     16(%rsi), %rsi
3560         lea     -16(%r8), %r8
3561
3562 L(StrncpyExit11):
3563         movaps  (%rdx, %rsi), %xmm6
3564         psrldq  $5, %xmm6
3565         palignr $11, %xmm1, %xmm6
3566         movaps  %xmm6, (%rdx, %rsi)
3567         lea     5(%rsi), %rsi
3568         jmp     L(CopyFrom1To16BytesCase3)
3569
3570 L(StrncpyLeave12):
3571         movaps  %xmm2, %xmm3
3572         add     $48, %r8
3573         jle     L(StrncpyExit12)
3574         palignr $12, %xmm1, %xmm2
3575         movaps  %xmm3, %xmm1
3576         movaps  %xmm2, (%rdx)
3577         movaps  20(%rcx), %xmm2
3578         lea     16(%rsi), %rsi
3579         movaps  %xmm2, %xmm3
3580         sub     $16, %r8
3581         jbe     L(StrncpyExit12)
3582         palignr $12, %xmm1, %xmm2
3583         movaps  %xmm2, 16(%rdx)
3584         movaps  20+16(%rcx), %xmm2
3585         movaps  %xmm3, %xmm1
3586         lea     16(%rsi), %rsi
3587         sub     $16, %r8
3588         jbe     L(StrncpyExit12)
3589         movaps  %xmm2, %xmm1
3590         movaps  %xmm4, 32(%rdx)
3591         lea     16(%rsi), %rsi
3592         sub     $16, %r8
3593         jbe     L(StrncpyExit12)
3594         movaps  %xmm7, %xmm1
3595         movaps  %xmm5, 48(%rdx)
3596         lea     16(%rsi), %rsi
3597         lea     -16(%r8), %r8
3598
3599 L(StrncpyExit12):
3600         movaps  (%rdx, %rsi), %xmm6
3601         psrldq  $4, %xmm6
3602         palignr $12, %xmm1, %xmm6
3603         movaps  %xmm6, (%rdx, %rsi)
3604         lea     4(%rsi), %rsi
3605         jmp     L(CopyFrom1To16BytesCase3)
3606
3607 L(StrncpyLeave13):
3608         movaps  %xmm2, %xmm3
3609         add     $48, %r8
3610         jle     L(StrncpyExit13)
3611         palignr $13, %xmm1, %xmm2
3612         movaps  %xmm3, %xmm1
3613         movaps  %xmm2, (%rdx)
3614         movaps  19(%rcx), %xmm2
3615         lea     16(%rsi), %rsi
3616         movaps  %xmm2, %xmm3
3617         sub     $16, %r8
3618         jbe     L(StrncpyExit13)
3619         palignr $13, %xmm1, %xmm2
3620         movaps  %xmm2, 16(%rdx)
3621         movaps  19+16(%rcx), %xmm2
3622         movaps  %xmm3, %xmm1
3623         lea     16(%rsi), %rsi
3624         sub     $16, %r8
3625         jbe     L(StrncpyExit13)
3626         movaps  %xmm2, %xmm1
3627         movaps  %xmm4, 32(%rdx)
3628         lea     16(%rsi), %rsi
3629         sub     $16, %r8
3630         jbe     L(StrncpyExit13)
3631         movaps  %xmm7, %xmm1
3632         movaps  %xmm5, 48(%rdx)
3633         lea     16(%rsi), %rsi
3634         lea     -16(%r8), %r8
3635
3636 L(StrncpyExit13):
3637         movaps  (%rdx, %rsi), %xmm6
3638         psrldq  $3, %xmm6
3639         palignr $13, %xmm1, %xmm6
3640         movaps  %xmm6, (%rdx, %rsi)
3641         lea     3(%rsi), %rsi
3642         jmp     L(CopyFrom1To16BytesCase3)
3643
3644 L(StrncpyLeave14):
3645         movaps  %xmm2, %xmm3
3646         add     $48, %r8
3647         jle     L(StrncpyExit14)
3648         palignr $14, %xmm1, %xmm2
3649         movaps  %xmm3, %xmm1
3650         movaps  %xmm2, (%rdx)
3651         movaps  18(%rcx), %xmm2
3652         lea     16(%rsi), %rsi
3653         movaps  %xmm2, %xmm3
3654         sub     $16, %r8
3655         jbe     L(StrncpyExit14)
3656         palignr $14, %xmm1, %xmm2
3657         movaps  %xmm2, 16(%rdx)
3658         movaps  18+16(%rcx), %xmm2
3659         movaps  %xmm3, %xmm1
3660         lea     16(%rsi), %rsi
3661         sub     $16, %r8
3662         jbe     L(StrncpyExit14)
3663         movaps  %xmm2, %xmm1
3664         movaps  %xmm4, 32(%rdx)
3665         lea     16(%rsi), %rsi
3666         sub     $16, %r8
3667         jbe     L(StrncpyExit14)
3668         movaps  %xmm7, %xmm1
3669         movaps  %xmm5, 48(%rdx)
3670         lea     16(%rsi), %rsi
3671         lea     -16(%r8), %r8
3672
3673 L(StrncpyExit14):
3674         movaps  (%rdx, %rsi), %xmm6
3675         psrldq  $2, %xmm6
3676         palignr $14, %xmm1, %xmm6
3677         movaps  %xmm6, (%rdx, %rsi)
3678         lea     2(%rsi), %rsi
3679         jmp     L(CopyFrom1To16BytesCase3)
3680
3681 L(StrncpyLeave15):
3682         movaps  %xmm2, %xmm3
3683         add     $48, %r8
3684         jle     L(StrncpyExit15)
3685         palignr $15, %xmm1, %xmm2
3686         movaps  %xmm3, %xmm1
3687         movaps  %xmm2, (%rdx)
3688         movaps  17(%rcx), %xmm2
3689         lea     16(%rsi), %rsi
3690         movaps  %xmm2, %xmm3
3691         sub     $16, %r8
3692         jbe     L(StrncpyExit15)
3693         palignr $15, %xmm1, %xmm2
3694         movaps  %xmm2, 16(%rdx)
3695         movaps  17+16(%rcx), %xmm2
3696         movaps  %xmm3, %xmm1
3697         lea     16(%rsi), %rsi
3698         sub     $16, %r8
3699         jbe     L(StrncpyExit15)
3700         movaps  %xmm2, %xmm1
3701         movaps  %xmm4, 32(%rdx)
3702         lea     16(%rsi), %rsi
3703         sub     $16, %r8
3704         jbe     L(StrncpyExit15)
3705         movaps  %xmm7, %xmm1
3706         movaps  %xmm5, 48(%rdx)
3707         lea     16(%rsi), %rsi
3708         lea     -16(%r8), %r8
3709
3710 L(StrncpyExit15):
3711         movaps  (%rdx, %rsi), %xmm6
3712         psrldq  $1, %xmm6
3713         palignr $15, %xmm1, %xmm6
3714         movaps  %xmm6, (%rdx, %rsi)
3715         lea     1(%rsi), %rsi
3716         jmp     L(CopyFrom1To16BytesCase3)
3717 # endif
3718
3719 END (STRCPY)
3720
3721 #endif