Fix issues in x86 memcpy-ssse3.S
[glibc.git] / sysdeps / i386 / i686 / multiarch / memcpy-ssse3.S
blobec9eeb95e4e57105b8e1513440c69c458dda9186
1 /* memcpy with SSSE3
2    Copyright (C) 2010 Free Software Foundation, Inc.
3    Contributed by Intel Corporation.
4    This file is part of the GNU C Library.
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.
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.
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.  */
21 #include <sysdep.h>
23 #if !defined NOT_IN_libc \
24     && (defined SHARED \
25         || defined USE_AS_MEMMOVE \
26         || !defined USE_MULTIARCH)
28 #include "asm-syntax.h"
30 #ifndef MEMCPY
31 # define MEMCPY         __memcpy_ssse3
32 # define MEMCPY_CHK     __memcpy_chk_ssse3
33 #endif
35 #ifdef USE_AS_BCOPY
36 # define SRC            PARMS
37 # define DEST           SRC+4
38 # define LEN            DEST+4
39 #else
40 # define DEST           PARMS
41 # define SRC            DEST+4
42 # define LEN            SRC+4
43 #endif
45 #define CFI_PUSH(REG)                                           \
46   cfi_adjust_cfa_offset (4);                                    \
47   cfi_rel_offset (REG, 0)
49 #define CFI_POP(REG)                                            \
50   cfi_adjust_cfa_offset (-4);                                   \
51   cfi_restore (REG)
53 #define PUSH(REG)       pushl REG; CFI_PUSH (REG)
54 #define POP(REG)        popl REG; CFI_POP (REG)
56 #ifdef SHARED
57 # define PARMS          8               /* Preserve EBX.  */
58 # define ENTRANCE       PUSH (%ebx);
59 # define RETURN_END     POP (%ebx); ret
60 # define RETURN         RETURN_END; CFI_PUSH (%ebx)
61 # define JMPTBL(I, B)   I - B
63 /* Load an entry in a jump table into EBX and branch to it.  TABLE is a
64    jump table with relative offsets.  INDEX is a register contains the
65    index into the jump table.   SCALE is the scale of INDEX. */
66 # define BRANCH_TO_JMPTBL_ENTRY(TABLE, INDEX, SCALE)            \
67     /* We first load PC into EBX.  */                           \
68     call        __i686.get_pc_thunk.bx;                         \
69     /* Get the address of the jump table.  */                   \
70     addl        $(TABLE - .), %ebx;                             \
71     /* Get the entry and convert the relative offset to the     \
72        absolute address.  */                                    \
73     addl        (%ebx,INDEX,SCALE), %ebx;                       \
74     /* We loaded the jump table.  Go.  */                       \
75     jmp         *%ebx
77 # define BRANCH_TO_JMPTBL_ENTRY_VALUE(TABLE)                    \
78     addl        $(TABLE - .), %ebx
80 # define BRANCH_TO_JMPTBL_ENTRY_TAIL(TABLE, INDEX, SCALE)       \
81     addl        (%ebx,INDEX,SCALE), %ebx;                       \
82     /* We loaded the jump table.  Go.  */                       \
83     jmp         *%ebx
85         .section        .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits
86         .globl  __i686.get_pc_thunk.bx
87         .hidden __i686.get_pc_thunk.bx
88         ALIGN (4)
89         .type   __i686.get_pc_thunk.bx,@function
90 __i686.get_pc_thunk.bx:
91         movl    (%esp), %ebx
92         ret
93 #else
94 # define PARMS          4
95 # define ENTRANCE
96 # define RETURN_END     ret
97 # define RETURN         RETURN_END
98 # define JMPTBL(I, B)   I
100 /* Branch to an entry in a jump table.  TABLE is a jump table with
101    absolute offsets.  INDEX is a register contains the index into the
102    jump table.  SCALE is the scale of INDEX. */
103 # define BRANCH_TO_JMPTBL_ENTRY(TABLE, INDEX, SCALE)            \
104     jmp         *TABLE(,INDEX,SCALE)
106 # define BRANCH_TO_JMPTBL_ENTRY_VALUE(TABLE)
108 # define BRANCH_TO_JMPTBL_ENTRY_TAIL(TABLE, INDEX, SCALE)               \
109     jmp         *TABLE(,INDEX,SCALE)
110 #endif
112         .section .text.ssse3,"ax",@progbits
113 #if defined SHARED && !defined NOT_IN_libc && !defined USE_AS_BCOPY
114 ENTRY (MEMCPY_CHK)
115         movl    12(%esp), %eax
116         cmpl    %eax, 16(%esp)
117         jb      HIDDEN_JUMPTARGET (__chk_fail)
118 END (MEMCPY_CHK)
119 #endif
120 ENTRY (MEMCPY)
121         ENTRANCE
122         movl    LEN(%esp), %ecx
123         movl    SRC(%esp), %eax
124         movl    DEST(%esp), %edx
126 #ifdef USE_AS_MEMMOVE
127         cmp     %eax, %edx
128         jb      L(copy_forward)
129         je      L(fwd_write_0bytes)
130         cmp     $32, %ecx
131         jae     L(memmove_bwd)
132         jmp     L(bk_write_less32bytes_2)
133 L(memmove_bwd):
134         add     %ecx, %eax
135         cmp     %eax, %edx
136         movl    SRC(%esp), %eax
137         jb      L(copy_backward)
139 L(copy_forward):
140 #endif
141         cmp     $48, %ecx
142         jae     L(48bytesormore)
144 L(fwd_write_less32bytes):
145 #ifndef USE_AS_MEMMOVE
146         cmp     %dl, %al
147         jb      L(bk_write)
148 #endif
149         add     %ecx, %edx
150         add     %ecx, %eax
151         BRANCH_TO_JMPTBL_ENTRY (L(table_48bytes_fwd), %ecx, 4)
152 #ifndef USE_AS_MEMMOVE
153 L(bk_write):
154         BRANCH_TO_JMPTBL_ENTRY (L(table_48_bytes_bwd), %ecx, 4)
155 #endif
157         ALIGN (4)
158 /* ECX > 32 and EDX is 4 byte aligned.  */
159 L(48bytesormore):
160         movdqu  (%eax), %xmm0
161         PUSH (%edi)
162         movl    %edx, %edi
163         and     $-16, %edx
164         PUSH (%esi)
165         cfi_remember_state
166         add     $16, %edx
167         movl    %edi, %esi
168         sub     %edx, %edi
169         add     %edi, %ecx
170         sub     %edi, %eax
172 #ifdef SHARED_CACHE_SIZE_HALF
173         cmp     $SHARED_CACHE_SIZE_HALF, %ecx
174 #else
175 # ifdef SHARED
176         call    __i686.get_pc_thunk.bx
177         add     $_GLOBAL_OFFSET_TABLE_, %ebx
178         cmp     __x86_shared_cache_size_half@GOTOFF(%ebx), %ecx
179 # else
180         cmp     __x86_shared_cache_size_half, %ecx
181 # endif
182 #endif
184         mov     %eax, %edi
185         jae     L(large_page)
186         and     $0xf, %edi
187         jz      L(shl_0)
189         BRANCH_TO_JMPTBL_ENTRY (L(shl_table), %edi, 4)
191         cfi_restore_state
192         cfi_remember_state
193         ALIGN (4)
194 L(shl_0):
195         movdqu  %xmm0, (%esi)
196         xor     %edi, %edi
197         POP (%esi)
198         cmp     $127, %ecx
199         ja      L(shl_0_gobble)
200         lea     -32(%ecx), %ecx
201 L(shl_0_loop):
202         movdqa  (%eax, %edi), %xmm0
203         movdqa  16(%eax, %edi), %xmm1
204         sub     $32, %ecx
205         movdqa  %xmm0, (%edx, %edi)
206         movdqa  %xmm1, 16(%edx, %edi)
207         lea     32(%edi), %edi
208         jb      L(shl_0_end)
210         movdqa  (%eax, %edi), %xmm0
211         movdqa  16(%eax, %edi), %xmm1
212         sub     $32, %ecx
213         movdqa  %xmm0, (%edx, %edi)
214         movdqa  %xmm1, 16(%edx, %edi)
215         lea     32(%edi), %edi
216         jb      L(shl_0_end)
218         movdqa  (%eax, %edi), %xmm0
219         movdqa  16(%eax, %edi), %xmm1
220         sub     $32, %ecx
221         movdqa  %xmm0, (%edx, %edi)
222         movdqa  %xmm1, 16(%edx, %edi)
223         lea     32(%edi), %edi
224         jb      L(shl_0_end)
226         movdqa  (%eax, %edi), %xmm0
227         movdqa  16(%eax, %edi), %xmm1
228         sub     $32, %ecx
229         movdqa  %xmm0, (%edx, %edi)
230         movdqa  %xmm1, 16(%edx, %edi)
231         lea     32(%edi), %edi
232 L(shl_0_end):
233         lea     32(%ecx), %ecx
234         add     %ecx, %edi
235         add     %edi, %edx
236         add     %edi, %eax
237         POP (%edi)
238         BRANCH_TO_JMPTBL_ENTRY (L(table_48bytes_fwd), %ecx, 4)
240         CFI_PUSH (%edi)
241 L(shl_0_gobble):
243 #ifdef DATA_CACHE_SIZE_HALF
244         cmp     $DATA_CACHE_SIZE_HALF, %ecx
245 #else
246 # ifdef SHARED
247         call    __i686.get_pc_thunk.bx
248         add     $_GLOBAL_OFFSET_TABLE_, %ebx
249         cmp     __x86_data_cache_size_half@GOTOFF(%ebx), %ecx
250 # else
251         cmp     __x86_data_cache_size_half, %ecx
252 # endif
253 #endif
255         POP (%edi)
256         lea     -128(%ecx), %ecx
257         jae     L(shl_0_gobble_mem_loop)
258 L(shl_0_gobble_cache_loop):
259         movdqa  (%eax), %xmm0
260         movdqa  0x10(%eax), %xmm1
261         movdqa  0x20(%eax), %xmm2
262         movdqa  0x30(%eax), %xmm3
263         movdqa  0x40(%eax), %xmm4
264         movdqa  0x50(%eax), %xmm5
265         movdqa  0x60(%eax), %xmm6
266         movdqa  0x70(%eax), %xmm7
267         lea     0x80(%eax), %eax
268         sub     $128, %ecx
269         movdqa  %xmm0, (%edx)
270         movdqa  %xmm1, 0x10(%edx)
271         movdqa  %xmm2, 0x20(%edx)
272         movdqa  %xmm3, 0x30(%edx)
273         movdqa  %xmm4, 0x40(%edx)
274         movdqa  %xmm5, 0x50(%edx)
275         movdqa  %xmm6, 0x60(%edx)
276         movdqa  %xmm7, 0x70(%edx)
277         lea     0x80(%edx), %edx
279         jae     L(shl_0_gobble_cache_loop)
280         cmp     $-0x40, %ecx
281         lea     0x80(%ecx), %ecx
282         jl      L(shl_0_cache_less_64bytes)
284         movdqa  (%eax), %xmm0
285         sub     $0x40, %ecx
286         movdqa  0x10(%eax), %xmm1
288         movdqa  %xmm0, (%edx)
289         movdqa  %xmm1, 0x10(%edx)
291         movdqa  0x20(%eax), %xmm0
292         movdqa  0x30(%eax), %xmm1
293         add     $0x40, %eax
295         movdqa  %xmm0, 0x20(%edx)
296         movdqa  %xmm1, 0x30(%edx)
297         add     $0x40, %edx
298 L(shl_0_cache_less_64bytes):
299         cmp     $0x20, %ecx
300         jb      L(shl_0_cache_less_32bytes)
301         movdqa  (%eax), %xmm0
302         sub     $0x20, %ecx
303         movdqa  0x10(%eax), %xmm1
304         add     $0x20, %eax
305         movdqa  %xmm0, (%edx)
306         movdqa  %xmm1, 0x10(%edx)
307         add     $0x20, %edx
308 L(shl_0_cache_less_32bytes):
309         cmp     $0x10, %ecx
310         jb      L(shl_0_cache_less_16bytes)
311         sub     $0x10, %ecx
312         movdqa  (%eax), %xmm0
313         add     $0x10, %eax
314         movdqa  %xmm0, (%edx)
315         add     $0x10, %edx
316 L(shl_0_cache_less_16bytes):
317         add     %ecx, %edx
318         add     %ecx, %eax
319         BRANCH_TO_JMPTBL_ENTRY (L(table_48bytes_fwd), %ecx, 4)
322         ALIGN (4)
323 L(shl_0_gobble_mem_loop):
324         prefetcht0 0x1c0(%eax)
325         prefetcht0 0x280(%eax)
326         prefetcht0 0x1c0(%edx)
328         movdqa  (%eax), %xmm0
329         movdqa  0x10(%eax), %xmm1
330         movdqa  0x20(%eax), %xmm2
331         movdqa  0x30(%eax), %xmm3
332         movdqa  0x40(%eax), %xmm4
333         movdqa  0x50(%eax), %xmm5
334         movdqa  0x60(%eax), %xmm6
335         movdqa  0x70(%eax), %xmm7
336         lea     0x80(%eax), %eax
337         sub     $0x80, %ecx
338         movdqa  %xmm0, (%edx)
339         movdqa  %xmm1, 0x10(%edx)
340         movdqa  %xmm2, 0x20(%edx)
341         movdqa  %xmm3, 0x30(%edx)
342         movdqa  %xmm4, 0x40(%edx)
343         movdqa  %xmm5, 0x50(%edx)
344         movdqa  %xmm6, 0x60(%edx)
345         movdqa  %xmm7, 0x70(%edx)
346         lea     0x80(%edx), %edx
348         jae     L(shl_0_gobble_mem_loop)
349         cmp     $-0x40, %ecx
350         lea     0x80(%ecx), %ecx
351         jl      L(shl_0_mem_less_64bytes)
353         movdqa  (%eax), %xmm0
354         sub     $0x40, %ecx
355         movdqa  0x10(%eax), %xmm1
357         movdqa  %xmm0, (%edx)
358         movdqa  %xmm1, 0x10(%edx)
360         movdqa  0x20(%eax), %xmm0
361         movdqa  0x30(%eax), %xmm1
362         add     $0x40, %eax
364         movdqa  %xmm0, 0x20(%edx)
365         movdqa  %xmm1, 0x30(%edx)
366         add     $0x40, %edx
367 L(shl_0_mem_less_64bytes):
368         cmp     $0x20, %ecx
369         jb      L(shl_0_mem_less_32bytes)
370         movdqa  (%eax), %xmm0
371         sub     $0x20, %ecx
372         movdqa  0x10(%eax), %xmm1
373         add     $0x20, %eax
374         movdqa  %xmm0, (%edx)
375         movdqa  %xmm1, 0x10(%edx)
376         add     $0x20, %edx
377 L(shl_0_mem_less_32bytes):
378         cmp     $0x10, %ecx
379         jb      L(shl_0_mem_less_16bytes)
380         sub     $0x10, %ecx
381         movdqa  (%eax), %xmm0
382         add     $0x10, %eax
383         movdqa  %xmm0, (%edx)
384         add     $0x10, %edx
385 L(shl_0_mem_less_16bytes):
386         add     %ecx, %edx
387         add     %ecx, %eax
388         BRANCH_TO_JMPTBL_ENTRY (L(table_48bytes_fwd), %ecx, 4)
390         cfi_restore_state
391         cfi_remember_state
392         ALIGN (4)
393 L(shl_1):
394         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
395         lea     -1(%eax), %eax
396         movaps  (%eax), %xmm1
397         xor     %edi, %edi
398         lea     -32(%ecx), %ecx
399         movdqu  %xmm0, (%esi)
400         POP (%esi)
401 L(shl_1_loop):
403         movdqa  16(%eax, %edi), %xmm2
404         sub     $32, %ecx
405         movdqa  32(%eax, %edi), %xmm3
406         movdqa  %xmm3, %xmm4
407         palignr $1, %xmm2, %xmm3
408         palignr $1, %xmm1, %xmm2
409         lea     32(%edi), %edi
410         movdqa  %xmm2, -32(%edx, %edi)
411         movdqa  %xmm3, -16(%edx, %edi)
413         jb      L(shl_1_end)
415         movdqa  16(%eax, %edi), %xmm2
416         sub     $32, %ecx
417         movdqa  32(%eax, %edi), %xmm3
418         movdqa  %xmm3, %xmm1
419         palignr $1, %xmm2, %xmm3
420         palignr $1, %xmm4, %xmm2
421         lea     32(%edi), %edi
422         movdqa  %xmm2, -32(%edx, %edi)
423         movdqa  %xmm3, -16(%edx, %edi)
425         jae     L(shl_1_loop)
427 L(shl_1_end):
428         lea     32(%ecx), %ecx
429         add     %ecx, %edi
430         add     %edi, %edx
431         lea     1(%edi, %eax), %eax
432         POP (%edi)
433         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
435         cfi_restore_state
436         cfi_remember_state
437         ALIGN (4)
438 L(shl_2):
439         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
440         lea     -2(%eax), %eax
441         movaps  (%eax), %xmm1
442         xor     %edi, %edi
443         lea     -32(%ecx), %ecx
444         movdqu  %xmm0, (%esi)
445         POP (%esi)
446 L(shl_2_loop):
448         movdqa  16(%eax, %edi), %xmm2
449         sub     $32, %ecx
450         movdqa  32(%eax, %edi), %xmm3
451         movdqa  %xmm3, %xmm4
452         palignr $2, %xmm2, %xmm3
453         palignr $2, %xmm1, %xmm2
454         lea     32(%edi), %edi
455         movdqa  %xmm2, -32(%edx, %edi)
456         movdqa  %xmm3, -16(%edx, %edi)
458         jb      L(shl_2_end)
460         movdqa  16(%eax, %edi), %xmm2
461         sub     $32, %ecx
462         movdqa  32(%eax, %edi), %xmm3
463         movdqa  %xmm3, %xmm1
464         palignr $2, %xmm2, %xmm3
465         palignr $2, %xmm4, %xmm2
466         lea     32(%edi), %edi
467         movdqa  %xmm2, -32(%edx, %edi)
468         movdqa  %xmm3, -16(%edx, %edi)
470         jae     L(shl_2_loop)
472 L(shl_2_end):
473         lea     32(%ecx), %ecx
474         add     %ecx, %edi
475         add     %edi, %edx
476         lea     2(%edi, %eax), %eax
477         POP (%edi)
478         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
480         cfi_restore_state
481         cfi_remember_state
482         ALIGN (4)
483 L(shl_3):
484         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
485         lea     -3(%eax), %eax
486         movaps  (%eax), %xmm1
487         xor     %edi, %edi
488         lea     -32(%ecx), %ecx
489         movdqu  %xmm0, (%esi)
490         POP (%esi)
491 L(shl_3_loop):
493         movdqa  16(%eax, %edi), %xmm2
494         sub     $32, %ecx
495         movdqa  32(%eax, %edi), %xmm3
496         movdqa  %xmm3, %xmm4
497         palignr $3, %xmm2, %xmm3
498         palignr $3, %xmm1, %xmm2
499         lea     32(%edi), %edi
500         movdqa  %xmm2, -32(%edx, %edi)
501         movdqa  %xmm3, -16(%edx, %edi)
503         jb      L(shl_3_end)
505         movdqa  16(%eax, %edi), %xmm2
506         sub     $32, %ecx
507         movdqa  32(%eax, %edi), %xmm3
508         movdqa  %xmm3, %xmm1
509         palignr $3, %xmm2, %xmm3
510         palignr $3, %xmm4, %xmm2
511         lea     32(%edi), %edi
512         movdqa  %xmm2, -32(%edx, %edi)
513         movdqa  %xmm3, -16(%edx, %edi)
515         jae     L(shl_3_loop)
517 L(shl_3_end):
518         lea     32(%ecx), %ecx
519         add     %ecx, %edi
520         add     %edi, %edx
521         lea     3(%edi, %eax), %eax
522         POP (%edi)
523         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
525         cfi_restore_state
526         cfi_remember_state
527         ALIGN (4)
528 L(shl_4):
529         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
530         lea     -4(%eax), %eax
531         movaps  (%eax), %xmm1
532         xor     %edi, %edi
533         lea     -32(%ecx), %ecx
534         movdqu  %xmm0, (%esi)
535         POP (%esi)
536 L(shl_4_loop):
538         movdqa  16(%eax, %edi), %xmm2
539         sub     $32, %ecx
540         movdqa  32(%eax, %edi), %xmm3
541         movdqa  %xmm3, %xmm4
542         palignr $4, %xmm2, %xmm3
543         palignr $4, %xmm1, %xmm2
544         lea     32(%edi), %edi
545         movdqa  %xmm2, -32(%edx, %edi)
546         movdqa  %xmm3, -16(%edx, %edi)
548         jb      L(shl_4_end)
550         movdqa  16(%eax, %edi), %xmm2
551         sub     $32, %ecx
552         movdqa  32(%eax, %edi), %xmm3
553         movdqa  %xmm3, %xmm1
554         palignr $4, %xmm2, %xmm3
555         palignr $4, %xmm4, %xmm2
556         lea     32(%edi), %edi
557         movdqa  %xmm2, -32(%edx, %edi)
558         movdqa  %xmm3, -16(%edx, %edi)
560         jae     L(shl_4_loop)
562 L(shl_4_end):
563         lea     32(%ecx), %ecx
564         add     %ecx, %edi
565         add     %edi, %edx
566         lea     4(%edi, %eax), %eax
567         POP (%edi)
568         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
570         cfi_restore_state
571         cfi_remember_state
572         ALIGN (4)
573 L(shl_5):
574         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
575         lea     -5(%eax), %eax
576         movaps  (%eax), %xmm1
577         xor     %edi, %edi
578         lea     -32(%ecx), %ecx
579         movdqu  %xmm0, (%esi)
580         POP (%esi)
581 L(shl_5_loop):
583         movdqa  16(%eax, %edi), %xmm2
584         sub     $32, %ecx
585         movdqa  32(%eax, %edi), %xmm3
586         movdqa  %xmm3, %xmm4
587         palignr $5, %xmm2, %xmm3
588         palignr $5, %xmm1, %xmm2
589         lea     32(%edi), %edi
590         movdqa  %xmm2, -32(%edx, %edi)
591         movdqa  %xmm3, -16(%edx, %edi)
593         jb      L(shl_5_end)
595         movdqa  16(%eax, %edi), %xmm2
596         sub     $32, %ecx
597         movdqa  32(%eax, %edi), %xmm3
598         movdqa  %xmm3, %xmm1
599         palignr $5, %xmm2, %xmm3
600         palignr $5, %xmm4, %xmm2
601         lea     32(%edi), %edi
602         movdqa  %xmm2, -32(%edx, %edi)
603         movdqa  %xmm3, -16(%edx, %edi)
605         jae     L(shl_5_loop)
607 L(shl_5_end):
608         lea     32(%ecx), %ecx
609         add     %ecx, %edi
610         add     %edi, %edx
611         lea     5(%edi, %eax), %eax
612         POP (%edi)
613         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
615         cfi_restore_state
616         cfi_remember_state
617         ALIGN (4)
618 L(shl_6):
619         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
620         lea     -6(%eax), %eax
621         movaps  (%eax), %xmm1
622         xor     %edi, %edi
623         lea     -32(%ecx), %ecx
624         movdqu  %xmm0, (%esi)
625         POP (%esi)
626 L(shl_6_loop):
628         movdqa  16(%eax, %edi), %xmm2
629         sub     $32, %ecx
630         movdqa  32(%eax, %edi), %xmm3
631         movdqa  %xmm3, %xmm4
632         palignr $6, %xmm2, %xmm3
633         palignr $6, %xmm1, %xmm2
634         lea     32(%edi), %edi
635         movdqa  %xmm2, -32(%edx, %edi)
636         movdqa  %xmm3, -16(%edx, %edi)
638         jb      L(shl_6_end)
640         movdqa  16(%eax, %edi), %xmm2
641         sub     $32, %ecx
642         movdqa  32(%eax, %edi), %xmm3
643         movdqa  %xmm3, %xmm1
644         palignr $6, %xmm2, %xmm3
645         palignr $6, %xmm4, %xmm2
646         lea     32(%edi), %edi
647         movdqa  %xmm2, -32(%edx, %edi)
648         movdqa  %xmm3, -16(%edx, %edi)
650         jae     L(shl_6_loop)
652 L(shl_6_end):
653         lea     32(%ecx), %ecx
654         add     %ecx, %edi
655         add     %edi, %edx
656         lea     6(%edi, %eax), %eax
657         POP (%edi)
658         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
660         cfi_restore_state
661         cfi_remember_state
662         ALIGN (4)
663 L(shl_7):
664         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
665         lea     -7(%eax), %eax
666         movaps  (%eax), %xmm1
667         xor     %edi, %edi
668         lea     -32(%ecx), %ecx
669         movdqu  %xmm0, (%esi)
670         POP (%esi)
671 L(shl_7_loop):
673         movdqa  16(%eax, %edi), %xmm2
674         sub     $32, %ecx
675         movdqa  32(%eax, %edi), %xmm3
676         movdqa  %xmm3, %xmm4
677         palignr $7, %xmm2, %xmm3
678         palignr $7, %xmm1, %xmm2
679         lea     32(%edi), %edi
680         movdqa  %xmm2, -32(%edx, %edi)
681         movdqa  %xmm3, -16(%edx, %edi)
683         jb      L(shl_7_end)
685         movdqa  16(%eax, %edi), %xmm2
686         sub     $32, %ecx
687         movdqa  32(%eax, %edi), %xmm3
688         movdqa  %xmm3, %xmm1
689         palignr $7, %xmm2, %xmm3
690         palignr $7, %xmm4, %xmm2
691         lea     32(%edi), %edi
692         movdqa  %xmm2, -32(%edx, %edi)
693         movdqa  %xmm3, -16(%edx, %edi)
695         jae     L(shl_7_loop)
697 L(shl_7_end):
698         lea     32(%ecx), %ecx
699         add     %ecx, %edi
700         add     %edi, %edx
701         lea     7(%edi, %eax), %eax
702         POP (%edi)
703         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
705         cfi_restore_state
706         cfi_remember_state
707         ALIGN (4)
708 L(shl_8):
709         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
710         lea     -8(%eax), %eax
711         movaps  (%eax), %xmm1
712         xor     %edi, %edi
713         lea     -32(%ecx), %ecx
714         movdqu  %xmm0, (%esi)
715         POP (%esi)
716 L(shl_8_loop):
718         movdqa  16(%eax, %edi), %xmm2
719         sub     $32, %ecx
720         movdqa  32(%eax, %edi), %xmm3
721         movdqa  %xmm3, %xmm4
722         palignr $8, %xmm2, %xmm3
723         palignr $8, %xmm1, %xmm2
724         lea     32(%edi), %edi
725         movdqa  %xmm2, -32(%edx, %edi)
726         movdqa  %xmm3, -16(%edx, %edi)
728         jb      L(shl_8_end)
730         movdqa  16(%eax, %edi), %xmm2
731         sub     $32, %ecx
732         movdqa  32(%eax, %edi), %xmm3
733         movdqa  %xmm3, %xmm1
734         palignr $8, %xmm2, %xmm3
735         palignr $8, %xmm4, %xmm2
736         lea     32(%edi), %edi
737         movdqa  %xmm2, -32(%edx, %edi)
738         movdqa  %xmm3, -16(%edx, %edi)
740         jae     L(shl_8_loop)
742 L(shl_8_end):
743         lea     32(%ecx), %ecx
744         add     %ecx, %edi
745         add     %edi, %edx
746         lea     8(%edi, %eax), %eax
747         POP (%edi)
748         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
750         cfi_restore_state
751         cfi_remember_state
752         ALIGN (4)
753 L(shl_9):
754         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
755         lea     -9(%eax), %eax
756         movaps  (%eax), %xmm1
757         xor     %edi, %edi
758         lea     -32(%ecx), %ecx
759         movdqu  %xmm0, (%esi)
760         POP (%esi)
761 L(shl_9_loop):
763         movdqa  16(%eax, %edi), %xmm2
764         sub     $32, %ecx
765         movdqa  32(%eax, %edi), %xmm3
766         movdqa  %xmm3, %xmm4
767         palignr $9, %xmm2, %xmm3
768         palignr $9, %xmm1, %xmm2
769         lea     32(%edi), %edi
770         movdqa  %xmm2, -32(%edx, %edi)
771         movdqa  %xmm3, -16(%edx, %edi)
773         jb      L(shl_9_end)
775         movdqa  16(%eax, %edi), %xmm2
776         sub     $32, %ecx
777         movdqa  32(%eax, %edi), %xmm3
778         movdqa  %xmm3, %xmm1
779         palignr $9, %xmm2, %xmm3
780         palignr $9, %xmm4, %xmm2
781         lea     32(%edi), %edi
782         movdqa  %xmm2, -32(%edx, %edi)
783         movdqa  %xmm3, -16(%edx, %edi)
785         jae     L(shl_9_loop)
787 L(shl_9_end):
788         lea     32(%ecx), %ecx
789         add     %ecx, %edi
790         add     %edi, %edx
791         lea     9(%edi, %eax), %eax
792         POP (%edi)
793         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
795         cfi_restore_state
796         cfi_remember_state
797         ALIGN (4)
798 L(shl_10):
799         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
800         lea     -10(%eax), %eax
801         movaps  (%eax), %xmm1
802         xor     %edi, %edi
803         lea     -32(%ecx), %ecx
804         movdqu  %xmm0, (%esi)
805         POP (%esi)
806 L(shl_10_loop):
808         movdqa  16(%eax, %edi), %xmm2
809         sub     $32, %ecx
810         movdqa  32(%eax, %edi), %xmm3
811         movdqa  %xmm3, %xmm4
812         palignr $10, %xmm2, %xmm3
813         palignr $10, %xmm1, %xmm2
814         lea     32(%edi), %edi
815         movdqa  %xmm2, -32(%edx, %edi)
816         movdqa  %xmm3, -16(%edx, %edi)
818         jb      L(shl_10_end)
820         movdqa  16(%eax, %edi), %xmm2
821         sub     $32, %ecx
822         movdqa  32(%eax, %edi), %xmm3
823         movdqa  %xmm3, %xmm1
824         palignr $10, %xmm2, %xmm3
825         palignr $10, %xmm4, %xmm2
826         lea     32(%edi), %edi
827         movdqa  %xmm2, -32(%edx, %edi)
828         movdqa  %xmm3, -16(%edx, %edi)
830         jae     L(shl_10_loop)
832 L(shl_10_end):
833         lea     32(%ecx), %ecx
834         add     %ecx, %edi
835         add     %edi, %edx
836         lea     10(%edi, %eax), %eax
837         POP (%edi)
838         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
840         cfi_restore_state
841         cfi_remember_state
842         ALIGN (4)
843 L(shl_11):
844         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
845         lea     -11(%eax), %eax
846         movaps  (%eax), %xmm1
847         xor     %edi, %edi
848         lea     -32(%ecx), %ecx
849         movdqu  %xmm0, (%esi)
850         POP (%esi)
851 L(shl_11_loop):
853         movdqa  16(%eax, %edi), %xmm2
854         sub     $32, %ecx
855         movdqa  32(%eax, %edi), %xmm3
856         movdqa  %xmm3, %xmm4
857         palignr $11, %xmm2, %xmm3
858         palignr $11, %xmm1, %xmm2
859         lea     32(%edi), %edi
860         movdqa  %xmm2, -32(%edx, %edi)
861         movdqa  %xmm3, -16(%edx, %edi)
863         jb      L(shl_11_end)
865         movdqa  16(%eax, %edi), %xmm2
866         sub     $32, %ecx
867         movdqa  32(%eax, %edi), %xmm3
868         movdqa  %xmm3, %xmm1
869         palignr $11, %xmm2, %xmm3
870         palignr $11, %xmm4, %xmm2
871         lea     32(%edi), %edi
872         movdqa  %xmm2, -32(%edx, %edi)
873         movdqa  %xmm3, -16(%edx, %edi)
875         jae     L(shl_11_loop)
877 L(shl_11_end):
878         lea     32(%ecx), %ecx
879         add     %ecx, %edi
880         add     %edi, %edx
881         lea     11(%edi, %eax), %eax
882         POP (%edi)
883         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
885         cfi_restore_state
886         cfi_remember_state
887         ALIGN (4)
888 L(shl_12):
889         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
890         lea     -12(%eax), %eax
891         movaps  (%eax), %xmm1
892         xor     %edi, %edi
893         lea     -32(%ecx), %ecx
894         movdqu  %xmm0, (%esi)
895         POP (%esi)
896 L(shl_12_loop):
898         movdqa  16(%eax, %edi), %xmm2
899         sub     $32, %ecx
900         movdqa  32(%eax, %edi), %xmm3
901         movdqa  %xmm3, %xmm4
902         palignr $12, %xmm2, %xmm3
903         palignr $12, %xmm1, %xmm2
904         lea     32(%edi), %edi
905         movdqa  %xmm2, -32(%edx, %edi)
906         movdqa  %xmm3, -16(%edx, %edi)
908         jb      L(shl_12_end)
910         movdqa  16(%eax, %edi), %xmm2
911         sub     $32, %ecx
912         movdqa  32(%eax, %edi), %xmm3
913         movdqa  %xmm3, %xmm1
914         palignr $12, %xmm2, %xmm3
915         palignr $12, %xmm4, %xmm2
916         lea     32(%edi), %edi
917         movdqa  %xmm2, -32(%edx, %edi)
918         movdqa  %xmm3, -16(%edx, %edi)
920         jae     L(shl_12_loop)
922 L(shl_12_end):
923         lea     32(%ecx), %ecx
924         add     %ecx, %edi
925         add     %edi, %edx
926         lea     12(%edi, %eax), %eax
927         POP (%edi)
928         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
930         cfi_restore_state
931         cfi_remember_state
932         ALIGN (4)
933 L(shl_13):
934         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
935         lea     -13(%eax), %eax
936         movaps  (%eax), %xmm1
937         xor     %edi, %edi
938         lea     -32(%ecx), %ecx
939         movdqu  %xmm0, (%esi)
940         POP (%esi)
941 L(shl_13_loop):
943         movdqa  16(%eax, %edi), %xmm2
944         sub     $32, %ecx
945         movdqa  32(%eax, %edi), %xmm3
946         movdqa  %xmm3, %xmm4
947         palignr $13, %xmm2, %xmm3
948         palignr $13, %xmm1, %xmm2
949         lea     32(%edi), %edi
950         movdqa  %xmm2, -32(%edx, %edi)
951         movdqa  %xmm3, -16(%edx, %edi)
953         jb      L(shl_13_end)
955         movdqa  16(%eax, %edi), %xmm2
956         sub     $32, %ecx
957         movdqa  32(%eax, %edi), %xmm3
958         movdqa  %xmm3, %xmm1
959         palignr $13, %xmm2, %xmm3
960         palignr $13, %xmm4, %xmm2
961         lea     32(%edi), %edi
962         movdqa  %xmm2, -32(%edx, %edi)
963         movdqa  %xmm3, -16(%edx, %edi)
965         jae     L(shl_13_loop)
967 L(shl_13_end):
968         lea     32(%ecx), %ecx
969         add     %ecx, %edi
970         add     %edi, %edx
971         lea     13(%edi, %eax), %eax
972         POP (%edi)
973         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
975         cfi_restore_state
976         cfi_remember_state
977         ALIGN (4)
978 L(shl_14):
979         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
980         lea     -14(%eax), %eax
981         movaps  (%eax), %xmm1
982         xor     %edi, %edi
983         lea     -32(%ecx), %ecx
984         movdqu  %xmm0, (%esi)
985         POP (%esi)
986 L(shl_14_loop):
988         movdqa  16(%eax, %edi), %xmm2
989         sub     $32, %ecx
990         movdqa  32(%eax, %edi), %xmm3
991         movdqa  %xmm3, %xmm4
992         palignr $14, %xmm2, %xmm3
993         palignr $14, %xmm1, %xmm2
994         lea     32(%edi), %edi
995         movdqa  %xmm2, -32(%edx, %edi)
996         movdqa  %xmm3, -16(%edx, %edi)
998         jb      L(shl_14_end)
1000         movdqa  16(%eax, %edi), %xmm2
1001         sub     $32, %ecx
1002         movdqa  32(%eax, %edi), %xmm3
1003         movdqa  %xmm3, %xmm1
1004         palignr $14, %xmm2, %xmm3
1005         palignr $14, %xmm4, %xmm2
1006         lea     32(%edi), %edi
1007         movdqa  %xmm2, -32(%edx, %edi)
1008         movdqa  %xmm3, -16(%edx, %edi)
1010         jae     L(shl_14_loop)
1012 L(shl_14_end):
1013         lea     32(%ecx), %ecx
1014         add     %ecx, %edi
1015         add     %edi, %edx
1016         lea     14(%edi, %eax), %eax
1017         POP (%edi)
1018         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
1020         cfi_restore_state
1021         cfi_remember_state
1022         ALIGN (4)
1023 L(shl_15):
1024         BRANCH_TO_JMPTBL_ENTRY_VALUE(L(table_48bytes_fwd))
1025         lea     -15(%eax), %eax
1026         movaps  (%eax), %xmm1
1027         xor     %edi, %edi
1028         lea     -32(%ecx), %ecx
1029         movdqu  %xmm0, (%esi)
1030         POP (%esi)
1031 L(shl_15_loop):
1033         movdqa  16(%eax, %edi), %xmm2
1034         sub     $32, %ecx
1035         movdqa  32(%eax, %edi), %xmm3
1036         movdqa  %xmm3, %xmm4
1037         palignr $15, %xmm2, %xmm3
1038         palignr $15, %xmm1, %xmm2
1039         lea     32(%edi), %edi
1040         movdqa  %xmm2, -32(%edx, %edi)
1041         movdqa  %xmm3, -16(%edx, %edi)
1043         jb      L(shl_15_end)
1045         movdqa  16(%eax, %edi), %xmm2
1046         sub     $32, %ecx
1047         movdqa  32(%eax, %edi), %xmm3
1048         movdqa  %xmm3, %xmm1
1049         palignr $15, %xmm2, %xmm3
1050         palignr $15, %xmm4, %xmm2
1051         lea     32(%edi), %edi
1052         movdqa  %xmm2, -32(%edx, %edi)
1053         movdqa  %xmm3, -16(%edx, %edi)
1055         jae     L(shl_15_loop)
1057 L(shl_15_end):
1058         lea     32(%ecx), %ecx
1059         add     %ecx, %edi
1060         add     %edi, %edx
1061         lea     15(%edi, %eax), %eax
1062         POP (%edi)
1063         BRANCH_TO_JMPTBL_ENTRY_TAIL(L(table_48bytes_fwd), %ecx, 4)
1066         ALIGN (4)
1067 L(fwd_write_44bytes):
1068         movl    -44(%eax), %ecx
1069         movl    %ecx, -44(%edx)
1070 L(fwd_write_40bytes):
1071         movl    -40(%eax), %ecx
1072         movl    %ecx, -40(%edx)
1073 L(fwd_write_36bytes):
1074         movl    -36(%eax), %ecx
1075         movl    %ecx, -36(%edx)
1076 L(fwd_write_32bytes):
1077         movl    -32(%eax), %ecx
1078         movl    %ecx, -32(%edx)
1079 L(fwd_write_28bytes):
1080         movl    -28(%eax), %ecx
1081         movl    %ecx, -28(%edx)
1082 L(fwd_write_24bytes):
1083         movl    -24(%eax), %ecx
1084         movl    %ecx, -24(%edx)
1085 L(fwd_write_20bytes):
1086         movl    -20(%eax), %ecx
1087         movl    %ecx, -20(%edx)
1088 L(fwd_write_16bytes):
1089         movl    -16(%eax), %ecx
1090         movl    %ecx, -16(%edx)
1091 L(fwd_write_12bytes):
1092         movl    -12(%eax), %ecx
1093         movl    %ecx, -12(%edx)
1094 L(fwd_write_8bytes):
1095         movl    -8(%eax), %ecx
1096         movl    %ecx, -8(%edx)
1097 L(fwd_write_4bytes):
1098         movl    -4(%eax), %ecx
1099         movl    %ecx, -4(%edx)
1100 L(fwd_write_0bytes):
1101 #ifndef USE_AS_BCOPY
1102 # ifdef USE_AS_MEMPCPY
1103         movl    %edx, %eax
1104 # else
1105         movl    DEST(%esp), %eax
1106 # endif
1107 #endif
1108         RETURN
1110         ALIGN (4)
1111 L(fwd_write_5bytes):
1112         movl    -5(%eax), %ecx
1113         movl    -4(%eax), %eax
1114         movl    %ecx, -5(%edx)
1115         movl    %eax, -4(%edx)
1116 #ifndef USE_AS_BCOPY
1117 # ifdef USE_AS_MEMPCPY
1118         movl    %edx, %eax
1119 # else
1120         movl    DEST(%esp), %eax
1121 # endif
1122 #endif
1123         RETURN
1125         ALIGN (4)
1126 L(fwd_write_45bytes):
1127         movl    -45(%eax), %ecx
1128         movl    %ecx, -45(%edx)
1129 L(fwd_write_41bytes):
1130         movl    -41(%eax), %ecx
1131         movl    %ecx, -41(%edx)
1132 L(fwd_write_37bytes):
1133         movl    -37(%eax), %ecx
1134         movl    %ecx, -37(%edx)
1135 L(fwd_write_33bytes):
1136         movl    -33(%eax), %ecx
1137         movl    %ecx, -33(%edx)
1138 L(fwd_write_29bytes):
1139         movl    -29(%eax), %ecx
1140         movl    %ecx, -29(%edx)
1141 L(fwd_write_25bytes):
1142         movl    -25(%eax), %ecx
1143         movl    %ecx, -25(%edx)
1144 L(fwd_write_21bytes):
1145         movl    -21(%eax), %ecx
1146         movl    %ecx, -21(%edx)
1147 L(fwd_write_17bytes):
1148         movl    -17(%eax), %ecx
1149         movl    %ecx, -17(%edx)
1150 L(fwd_write_13bytes):
1151         movl    -13(%eax), %ecx
1152         movl    %ecx, -13(%edx)
1153 L(fwd_write_9bytes):
1154         movl    -9(%eax), %ecx
1155         movl    %ecx, -9(%edx)
1156         movl    -5(%eax), %ecx
1157         movl    %ecx, -5(%edx)
1158 L(fwd_write_1bytes):
1159         movzbl  -1(%eax), %ecx
1160         movb    %cl, -1(%edx)
1161 #ifndef USE_AS_BCOPY
1162 # ifdef USE_AS_MEMPCPY
1163         movl    %edx, %eax
1164 # else
1165         movl    DEST(%esp), %eax
1166 # endif
1167 #endif
1168         RETURN
1170         ALIGN (4)
1171 L(fwd_write_46bytes):
1172         movl    -46(%eax), %ecx
1173         movl    %ecx, -46(%edx)
1174 L(fwd_write_42bytes):
1175         movl    -42(%eax), %ecx
1176         movl    %ecx, -42(%edx)
1177 L(fwd_write_38bytes):
1178         movl    -38(%eax), %ecx
1179         movl    %ecx, -38(%edx)
1180 L(fwd_write_34bytes):
1181         movl    -34(%eax), %ecx
1182         movl    %ecx, -34(%edx)
1183 L(fwd_write_30bytes):
1184         movl    -30(%eax), %ecx
1185         movl    %ecx, -30(%edx)
1186 L(fwd_write_26bytes):
1187         movl    -26(%eax), %ecx
1188         movl    %ecx, -26(%edx)
1189 L(fwd_write_22bytes):
1190         movl    -22(%eax), %ecx
1191         movl    %ecx, -22(%edx)
1192 L(fwd_write_18bytes):
1193         movl    -18(%eax), %ecx
1194         movl    %ecx, -18(%edx)
1195 L(fwd_write_14bytes):
1196         movl    -14(%eax), %ecx
1197         movl    %ecx, -14(%edx)
1198 L(fwd_write_10bytes):
1199         movl    -10(%eax), %ecx
1200         movl    %ecx, -10(%edx)
1201 L(fwd_write_6bytes):
1202         movl    -6(%eax), %ecx
1203         movl    %ecx, -6(%edx)
1204 L(fwd_write_2bytes):
1205         movzwl  -2(%eax), %ecx
1206         movw    %cx, -2(%edx)
1207 #ifndef USE_AS_BCOPY
1208 # ifdef USE_AS_MEMPCPY
1209         movl    %edx, %eax
1210 # else
1211         movl    DEST(%esp), %eax
1212 # endif
1213 #endif
1214         RETURN
1216         ALIGN (4)
1217 L(fwd_write_47bytes):
1218         movl    -47(%eax), %ecx
1219         movl    %ecx, -47(%edx)
1220 L(fwd_write_43bytes):
1221         movl    -43(%eax), %ecx
1222         movl    %ecx, -43(%edx)
1223 L(fwd_write_39bytes):
1224         movl    -39(%eax), %ecx
1225         movl    %ecx, -39(%edx)
1226 L(fwd_write_35bytes):
1227         movl    -35(%eax), %ecx
1228         movl    %ecx, -35(%edx)
1229 L(fwd_write_31bytes):
1230         movl    -31(%eax), %ecx
1231         movl    %ecx, -31(%edx)
1232 L(fwd_write_27bytes):
1233         movl    -27(%eax), %ecx
1234         movl    %ecx, -27(%edx)
1235 L(fwd_write_23bytes):
1236         movl    -23(%eax), %ecx
1237         movl    %ecx, -23(%edx)
1238 L(fwd_write_19bytes):
1239         movl    -19(%eax), %ecx
1240         movl    %ecx, -19(%edx)
1241 L(fwd_write_15bytes):
1242         movl    -15(%eax), %ecx
1243         movl    %ecx, -15(%edx)
1244 L(fwd_write_11bytes):
1245         movl    -11(%eax), %ecx
1246         movl    %ecx, -11(%edx)
1247 L(fwd_write_7bytes):
1248         movl    -7(%eax), %ecx
1249         movl    %ecx, -7(%edx)
1250 L(fwd_write_3bytes):
1251         movzwl  -3(%eax), %ecx
1252         movzbl  -1(%eax), %eax
1253         movw    %cx, -3(%edx)
1254         movb    %al, -1(%edx)
1255 #ifndef USE_AS_BCOPY
1256 # ifdef USE_AS_MEMPCPY
1257         movl    %edx, %eax
1258 # else
1259         movl    DEST(%esp), %eax
1260 # endif
1261 #endif
1262         RETURN_END
1264         cfi_restore_state
1265         cfi_remember_state
1266         ALIGN (4)
1267 L(large_page):
1268         movdqu  (%eax), %xmm1
1269         lea     16(%eax), %eax
1270         movdqu  %xmm0, (%esi)
1271         movntdq %xmm1, (%edx)
1272         lea     16(%edx), %edx
1273         POP (%esi)
1274         lea     -0x90(%ecx), %ecx
1275         POP (%edi)
1276 L(large_page_loop):
1277         movdqu  (%eax), %xmm0
1278         movdqu  0x10(%eax), %xmm1
1279         movdqu  0x20(%eax), %xmm2
1280         movdqu  0x30(%eax), %xmm3
1281         movdqu  0x40(%eax), %xmm4
1282         movdqu  0x50(%eax), %xmm5
1283         movdqu  0x60(%eax), %xmm6
1284         movdqu  0x70(%eax), %xmm7
1285         lea     0x80(%eax), %eax
1287         sub     $0x80, %ecx
1288         movntdq %xmm0, (%edx)
1289         movntdq %xmm1, 0x10(%edx)
1290         movntdq %xmm2, 0x20(%edx)
1291         movntdq %xmm3, 0x30(%edx)
1292         movntdq %xmm4, 0x40(%edx)
1293         movntdq %xmm5, 0x50(%edx)
1294         movntdq %xmm6, 0x60(%edx)
1295         movntdq %xmm7, 0x70(%edx)
1296         lea     0x80(%edx), %edx
1297         jae     L(large_page_loop)
1298         cmp     $-0x40, %ecx
1299         lea     0x80(%ecx), %ecx
1300         jl      L(large_page_less_64bytes)
1302         movdqu  (%eax), %xmm0
1303         movdqu  0x10(%eax), %xmm1
1304         movdqu  0x20(%eax), %xmm2
1305         movdqu  0x30(%eax), %xmm3
1306         lea     0x40(%eax), %eax
1308         movntdq %xmm0, (%edx)
1309         movntdq %xmm1, 0x10(%edx)
1310         movntdq %xmm2, 0x20(%edx)
1311         movntdq %xmm3, 0x30(%edx)
1312         lea     0x40(%edx), %edx
1313         sub     $0x40, %ecx
1314 L(large_page_less_64bytes):
1315         cmp     $32, %ecx
1316         jb      L(large_page_less_32bytes)
1317         movdqu  (%eax), %xmm0
1318         movdqu  0x10(%eax), %xmm1
1319         lea     0x20(%eax), %eax
1320         movntdq %xmm0, (%edx)
1321         movntdq %xmm1, 0x10(%edx)
1322         lea     0x20(%edx), %edx
1323         sub     $0x20, %ecx
1324 L(large_page_less_32bytes):
1325         add     %ecx, %edx
1326         add     %ecx, %eax
1327         sfence
1328         BRANCH_TO_JMPTBL_ENTRY (L(table_48bytes_fwd), %ecx, 4)
1331         ALIGN (4)
1332 L(bk_write_44bytes):
1333         movl    40(%eax), %ecx
1334         movl    %ecx, 40(%edx)
1335 L(bk_write_40bytes):
1336         movl    36(%eax), %ecx
1337         movl    %ecx, 36(%edx)
1338 L(bk_write_36bytes):
1339         movl    32(%eax), %ecx
1340         movl    %ecx, 32(%edx)
1341 L(bk_write_32bytes):
1342         movl    28(%eax), %ecx
1343         movl    %ecx, 28(%edx)
1344 L(bk_write_28bytes):
1345         movl    24(%eax), %ecx
1346         movl    %ecx, 24(%edx)
1347 L(bk_write_24bytes):
1348         movl    20(%eax), %ecx
1349         movl    %ecx, 20(%edx)
1350 L(bk_write_20bytes):
1351         movl    16(%eax), %ecx
1352         movl    %ecx, 16(%edx)
1353 L(bk_write_16bytes):
1354         movl    12(%eax), %ecx
1355         movl    %ecx, 12(%edx)
1356 L(bk_write_12bytes):
1357         movl    8(%eax), %ecx
1358         movl    %ecx, 8(%edx)
1359 L(bk_write_8bytes):
1360         movl    4(%eax), %ecx
1361         movl    %ecx, 4(%edx)
1362 L(bk_write_4bytes):
1363         movl    (%eax), %ecx
1364         movl    %ecx, (%edx)
1365 L(bk_write_0bytes):
1366 #ifndef USE_AS_BCOPY
1367         movl    DEST(%esp), %eax
1368 # ifdef USE_AS_MEMPCPY
1369         movl    LEN(%esp), %ecx
1370         add     %ecx, %eax
1371 # endif
1372 #endif
1373         RETURN
1375         ALIGN (4)
1376 L(bk_write_45bytes):
1377         movl    41(%eax), %ecx
1378         movl    %ecx, 41(%edx)
1379 L(bk_write_41bytes):
1380         movl    37(%eax), %ecx
1381         movl    %ecx, 37(%edx)
1382 L(bk_write_37bytes):
1383         movl    33(%eax), %ecx
1384         movl    %ecx, 33(%edx)
1385 L(bk_write_33bytes):
1386         movl    29(%eax), %ecx
1387         movl    %ecx, 29(%edx)
1388 L(bk_write_29bytes):
1389         movl    25(%eax), %ecx
1390         movl    %ecx, 25(%edx)
1391 L(bk_write_25bytes):
1392         movl    21(%eax), %ecx
1393         movl    %ecx, 21(%edx)
1394 L(bk_write_21bytes):
1395         movl    17(%eax), %ecx
1396         movl    %ecx, 17(%edx)
1397 L(bk_write_17bytes):
1398         movl    13(%eax), %ecx
1399         movl    %ecx, 13(%edx)
1400 L(bk_write_13bytes):
1401         movl    9(%eax), %ecx
1402         movl    %ecx, 9(%edx)
1403 L(bk_write_9bytes):
1404         movl    5(%eax), %ecx
1405         movl    %ecx, 5(%edx)
1406 L(bk_write_5bytes):
1407         movl    1(%eax), %ecx
1408         movl    %ecx, 1(%edx)
1409 L(bk_write_1bytes):
1410         movzbl  (%eax), %ecx
1411         movb    %cl, (%edx)
1412 #ifndef USE_AS_BCOPY
1413         movl    DEST(%esp), %eax
1414 # ifdef USE_AS_MEMPCPY
1415         movl    LEN(%esp), %ecx
1416         add     %ecx, %eax
1417 # endif
1418 #endif
1419         RETURN
1421         ALIGN (4)
1422 L(bk_write_46bytes):
1423         movl    42(%eax), %ecx
1424         movl    %ecx, 42(%edx)
1425 L(bk_write_42bytes):
1426         movl    38(%eax), %ecx
1427         movl    %ecx, 38(%edx)
1428 L(bk_write_38bytes):
1429         movl    34(%eax), %ecx
1430         movl    %ecx, 34(%edx)
1431 L(bk_write_34bytes):
1432         movl    30(%eax), %ecx
1433         movl    %ecx, 30(%edx)
1434 L(bk_write_30bytes):
1435         movl    26(%eax), %ecx
1436         movl    %ecx, 26(%edx)
1437 L(bk_write_26bytes):
1438         movl    22(%eax), %ecx
1439         movl    %ecx, 22(%edx)
1440 L(bk_write_22bytes):
1441         movl    18(%eax), %ecx
1442         movl    %ecx, 18(%edx)
1443 L(bk_write_18bytes):
1444         movl    14(%eax), %ecx
1445         movl    %ecx, 14(%edx)
1446 L(bk_write_14bytes):
1447         movl    10(%eax), %ecx
1448         movl    %ecx, 10(%edx)
1449 L(bk_write_10bytes):
1450         movl    6(%eax), %ecx
1451         movl    %ecx, 6(%edx)
1452 L(bk_write_6bytes):
1453         movl    2(%eax), %ecx
1454         movl    %ecx, 2(%edx)
1455 L(bk_write_2bytes):
1456         movzwl  (%eax), %ecx
1457         movw    %cx, (%edx)
1458 #ifndef USE_AS_BCOPY
1459         movl    DEST(%esp), %eax
1460 # ifdef USE_AS_MEMPCPY
1461         movl    LEN(%esp), %ecx
1462         add     %ecx, %eax
1463 # endif
1464 #endif
1465         RETURN
1467         ALIGN (4)
1468 L(bk_write_47bytes):
1469         movl    43(%eax), %ecx
1470         movl    %ecx, 43(%edx)
1471 L(bk_write_43bytes):
1472         movl    39(%eax), %ecx
1473         movl    %ecx, 39(%edx)
1474 L(bk_write_39bytes):
1475         movl    35(%eax), %ecx
1476         movl    %ecx, 35(%edx)
1477 L(bk_write_35bytes):
1478         movl    31(%eax), %ecx
1479         movl    %ecx, 31(%edx)
1480 L(bk_write_31bytes):
1481         movl    27(%eax), %ecx
1482         movl    %ecx, 27(%edx)
1483 L(bk_write_27bytes):
1484         movl    23(%eax), %ecx
1485         movl    %ecx, 23(%edx)
1486 L(bk_write_23bytes):
1487         movl    19(%eax), %ecx
1488         movl    %ecx, 19(%edx)
1489 L(bk_write_19bytes):
1490         movl    15(%eax), %ecx
1491         movl    %ecx, 15(%edx)
1492 L(bk_write_15bytes):
1493         movl    11(%eax), %ecx
1494         movl    %ecx, 11(%edx)
1495 L(bk_write_11bytes):
1496         movl    7(%eax), %ecx
1497         movl    %ecx, 7(%edx)
1498 L(bk_write_7bytes):
1499         movl    3(%eax), %ecx
1500         movl    %ecx, 3(%edx)
1501 L(bk_write_3bytes):
1502         movzwl  1(%eax), %ecx
1503         movw    %cx, 1(%edx)
1504         movzbl  (%eax), %eax
1505         movb    %al, (%edx)
1506 #ifndef USE_AS_BCOPY
1507         movl    DEST(%esp), %eax
1508 # ifdef USE_AS_MEMPCPY
1509         movl    LEN(%esp), %ecx
1510         add     %ecx, %eax
1511 # endif
1512 #endif
1513         RETURN_END
1516         .pushsection .rodata.ssse3,"a",@progbits
1517         ALIGN (2)
1518 L(table_48bytes_fwd):
1519         .int    JMPTBL (L(fwd_write_0bytes), L(table_48bytes_fwd))
1520         .int    JMPTBL (L(fwd_write_1bytes), L(table_48bytes_fwd))
1521         .int    JMPTBL (L(fwd_write_2bytes), L(table_48bytes_fwd))
1522         .int    JMPTBL (L(fwd_write_3bytes), L(table_48bytes_fwd))
1523         .int    JMPTBL (L(fwd_write_4bytes), L(table_48bytes_fwd))
1524         .int    JMPTBL (L(fwd_write_5bytes), L(table_48bytes_fwd))
1525         .int    JMPTBL (L(fwd_write_6bytes), L(table_48bytes_fwd))
1526         .int    JMPTBL (L(fwd_write_7bytes), L(table_48bytes_fwd))
1527         .int    JMPTBL (L(fwd_write_8bytes), L(table_48bytes_fwd))
1528         .int    JMPTBL (L(fwd_write_9bytes), L(table_48bytes_fwd))
1529         .int    JMPTBL (L(fwd_write_10bytes), L(table_48bytes_fwd))
1530         .int    JMPTBL (L(fwd_write_11bytes), L(table_48bytes_fwd))
1531         .int    JMPTBL (L(fwd_write_12bytes), L(table_48bytes_fwd))
1532         .int    JMPTBL (L(fwd_write_13bytes), L(table_48bytes_fwd))
1533         .int    JMPTBL (L(fwd_write_14bytes), L(table_48bytes_fwd))
1534         .int    JMPTBL (L(fwd_write_15bytes), L(table_48bytes_fwd))
1535         .int    JMPTBL (L(fwd_write_16bytes), L(table_48bytes_fwd))
1536         .int    JMPTBL (L(fwd_write_17bytes), L(table_48bytes_fwd))
1537         .int    JMPTBL (L(fwd_write_18bytes), L(table_48bytes_fwd))
1538         .int    JMPTBL (L(fwd_write_19bytes), L(table_48bytes_fwd))
1539         .int    JMPTBL (L(fwd_write_20bytes), L(table_48bytes_fwd))
1540         .int    JMPTBL (L(fwd_write_21bytes), L(table_48bytes_fwd))
1541         .int    JMPTBL (L(fwd_write_22bytes), L(table_48bytes_fwd))
1542         .int    JMPTBL (L(fwd_write_23bytes), L(table_48bytes_fwd))
1543         .int    JMPTBL (L(fwd_write_24bytes), L(table_48bytes_fwd))
1544         .int    JMPTBL (L(fwd_write_25bytes), L(table_48bytes_fwd))
1545         .int    JMPTBL (L(fwd_write_26bytes), L(table_48bytes_fwd))
1546         .int    JMPTBL (L(fwd_write_27bytes), L(table_48bytes_fwd))
1547         .int    JMPTBL (L(fwd_write_28bytes), L(table_48bytes_fwd))
1548         .int    JMPTBL (L(fwd_write_29bytes), L(table_48bytes_fwd))
1549         .int    JMPTBL (L(fwd_write_30bytes), L(table_48bytes_fwd))
1550         .int    JMPTBL (L(fwd_write_31bytes), L(table_48bytes_fwd))
1551         .int    JMPTBL (L(fwd_write_32bytes), L(table_48bytes_fwd))
1552         .int    JMPTBL (L(fwd_write_33bytes), L(table_48bytes_fwd))
1553         .int    JMPTBL (L(fwd_write_34bytes), L(table_48bytes_fwd))
1554         .int    JMPTBL (L(fwd_write_35bytes), L(table_48bytes_fwd))
1555         .int    JMPTBL (L(fwd_write_36bytes), L(table_48bytes_fwd))
1556         .int    JMPTBL (L(fwd_write_37bytes), L(table_48bytes_fwd))
1557         .int    JMPTBL (L(fwd_write_38bytes), L(table_48bytes_fwd))
1558         .int    JMPTBL (L(fwd_write_39bytes), L(table_48bytes_fwd))
1559         .int    JMPTBL (L(fwd_write_40bytes), L(table_48bytes_fwd))
1560         .int    JMPTBL (L(fwd_write_41bytes), L(table_48bytes_fwd))
1561         .int    JMPTBL (L(fwd_write_42bytes), L(table_48bytes_fwd))
1562         .int    JMPTBL (L(fwd_write_43bytes), L(table_48bytes_fwd))
1563         .int    JMPTBL (L(fwd_write_44bytes), L(table_48bytes_fwd))
1564         .int    JMPTBL (L(fwd_write_45bytes), L(table_48bytes_fwd))
1565         .int    JMPTBL (L(fwd_write_46bytes), L(table_48bytes_fwd))
1566         .int    JMPTBL (L(fwd_write_47bytes), L(table_48bytes_fwd))
1568         ALIGN (2)
1569 L(shl_table):
1570         .int    JMPTBL (L(shl_0), L(shl_table))
1571         .int    JMPTBL (L(shl_1), L(shl_table))
1572         .int    JMPTBL (L(shl_2), L(shl_table))
1573         .int    JMPTBL (L(shl_3), L(shl_table))
1574         .int    JMPTBL (L(shl_4), L(shl_table))
1575         .int    JMPTBL (L(shl_5), L(shl_table))
1576         .int    JMPTBL (L(shl_6), L(shl_table))
1577         .int    JMPTBL (L(shl_7), L(shl_table))
1578         .int    JMPTBL (L(shl_8), L(shl_table))
1579         .int    JMPTBL (L(shl_9), L(shl_table))
1580         .int    JMPTBL (L(shl_10), L(shl_table))
1581         .int    JMPTBL (L(shl_11), L(shl_table))
1582         .int    JMPTBL (L(shl_12), L(shl_table))
1583         .int    JMPTBL (L(shl_13), L(shl_table))
1584         .int    JMPTBL (L(shl_14), L(shl_table))
1585         .int    JMPTBL (L(shl_15), L(shl_table))
1587         ALIGN (2)
1588 L(table_48_bytes_bwd):
1589         .int    JMPTBL (L(bk_write_0bytes), L(table_48_bytes_bwd))
1590         .int    JMPTBL (L(bk_write_1bytes), L(table_48_bytes_bwd))
1591         .int    JMPTBL (L(bk_write_2bytes), L(table_48_bytes_bwd))
1592         .int    JMPTBL (L(bk_write_3bytes), L(table_48_bytes_bwd))
1593         .int    JMPTBL (L(bk_write_4bytes), L(table_48_bytes_bwd))
1594         .int    JMPTBL (L(bk_write_5bytes), L(table_48_bytes_bwd))
1595         .int    JMPTBL (L(bk_write_6bytes), L(table_48_bytes_bwd))
1596         .int    JMPTBL (L(bk_write_7bytes), L(table_48_bytes_bwd))
1597         .int    JMPTBL (L(bk_write_8bytes), L(table_48_bytes_bwd))
1598         .int    JMPTBL (L(bk_write_9bytes), L(table_48_bytes_bwd))
1599         .int    JMPTBL (L(bk_write_10bytes), L(table_48_bytes_bwd))
1600         .int    JMPTBL (L(bk_write_11bytes), L(table_48_bytes_bwd))
1601         .int    JMPTBL (L(bk_write_12bytes), L(table_48_bytes_bwd))
1602         .int    JMPTBL (L(bk_write_13bytes), L(table_48_bytes_bwd))
1603         .int    JMPTBL (L(bk_write_14bytes), L(table_48_bytes_bwd))
1604         .int    JMPTBL (L(bk_write_15bytes), L(table_48_bytes_bwd))
1605         .int    JMPTBL (L(bk_write_16bytes), L(table_48_bytes_bwd))
1606         .int    JMPTBL (L(bk_write_17bytes), L(table_48_bytes_bwd))
1607         .int    JMPTBL (L(bk_write_18bytes), L(table_48_bytes_bwd))
1608         .int    JMPTBL (L(bk_write_19bytes), L(table_48_bytes_bwd))
1609         .int    JMPTBL (L(bk_write_20bytes), L(table_48_bytes_bwd))
1610         .int    JMPTBL (L(bk_write_21bytes), L(table_48_bytes_bwd))
1611         .int    JMPTBL (L(bk_write_22bytes), L(table_48_bytes_bwd))
1612         .int    JMPTBL (L(bk_write_23bytes), L(table_48_bytes_bwd))
1613         .int    JMPTBL (L(bk_write_24bytes), L(table_48_bytes_bwd))
1614         .int    JMPTBL (L(bk_write_25bytes), L(table_48_bytes_bwd))
1615         .int    JMPTBL (L(bk_write_26bytes), L(table_48_bytes_bwd))
1616         .int    JMPTBL (L(bk_write_27bytes), L(table_48_bytes_bwd))
1617         .int    JMPTBL (L(bk_write_28bytes), L(table_48_bytes_bwd))
1618         .int    JMPTBL (L(bk_write_29bytes), L(table_48_bytes_bwd))
1619         .int    JMPTBL (L(bk_write_30bytes), L(table_48_bytes_bwd))
1620         .int    JMPTBL (L(bk_write_31bytes), L(table_48_bytes_bwd))
1621         .int    JMPTBL (L(bk_write_32bytes), L(table_48_bytes_bwd))
1622         .int    JMPTBL (L(bk_write_33bytes), L(table_48_bytes_bwd))
1623         .int    JMPTBL (L(bk_write_34bytes), L(table_48_bytes_bwd))
1624         .int    JMPTBL (L(bk_write_35bytes), L(table_48_bytes_bwd))
1625         .int    JMPTBL (L(bk_write_36bytes), L(table_48_bytes_bwd))
1626         .int    JMPTBL (L(bk_write_37bytes), L(table_48_bytes_bwd))
1627         .int    JMPTBL (L(bk_write_38bytes), L(table_48_bytes_bwd))
1628         .int    JMPTBL (L(bk_write_39bytes), L(table_48_bytes_bwd))
1629         .int    JMPTBL (L(bk_write_40bytes), L(table_48_bytes_bwd))
1630         .int    JMPTBL (L(bk_write_41bytes), L(table_48_bytes_bwd))
1631         .int    JMPTBL (L(bk_write_42bytes), L(table_48_bytes_bwd))
1632         .int    JMPTBL (L(bk_write_43bytes), L(table_48_bytes_bwd))
1633         .int    JMPTBL (L(bk_write_44bytes), L(table_48_bytes_bwd))
1634         .int    JMPTBL (L(bk_write_45bytes), L(table_48_bytes_bwd))
1635         .int    JMPTBL (L(bk_write_46bytes), L(table_48_bytes_bwd))
1636         .int    JMPTBL (L(bk_write_47bytes), L(table_48_bytes_bwd))
1638         .popsection
1640 #ifdef USE_AS_MEMMOVE
1641         ALIGN (4)
1642 L(copy_backward):
1643         PUSH (%esi)
1644         movl    %eax, %esi
1645         lea     (%ecx,%edx,1),%edx
1646         lea     (%ecx,%esi,1),%esi
1647         testl   $0x3, %edx
1648         jnz     L(bk_align)
1650 L(bk_aligned_4):
1651         cmp     $64, %ecx
1652         jae     L(bk_write_more64bytes)
1654 L(bk_write_64bytesless):
1655         cmp     $32, %ecx
1656         jb      L(bk_write_less32bytes)
1658 L(bk_write_more32bytes):
1659         /* Copy 32 bytes at a time.  */
1660         sub     $32, %ecx
1661         movl    -4(%esi), %eax
1662         movl    %eax, -4(%edx)
1663         movl    -8(%esi), %eax
1664         movl    %eax, -8(%edx)
1665         movl    -12(%esi), %eax
1666         movl    %eax, -12(%edx)
1667         movl    -16(%esi), %eax
1668         movl    %eax, -16(%edx)
1669         movl    -20(%esi), %eax
1670         movl    %eax, -20(%edx)
1671         movl    -24(%esi), %eax
1672         movl    %eax, -24(%edx)
1673         movl    -28(%esi), %eax
1674         movl    %eax, -28(%edx)
1675         movl    -32(%esi), %eax
1676         movl    %eax, -32(%edx)
1677         sub     $32, %edx
1678         sub     $32, %esi
1680 L(bk_write_less32bytes):
1681         movl    %esi, %eax
1682         sub     %ecx, %edx
1683         sub     %ecx, %eax
1684         POP (%esi)
1685 L(bk_write_less32bytes_2):
1686         BRANCH_TO_JMPTBL_ENTRY (L(table_48_bytes_bwd), %ecx, 4)
1688         CFI_PUSH (%esi)
1689         ALIGN (4)
1690 L(bk_align):
1691         cmp     $8, %ecx
1692         jbe     L(bk_write_less32bytes)
1693         testl   $1, %edx
1694         /* We get here only if (EDX & 3 ) != 0 so if (EDX & 1) ==0,
1695            then (EDX & 2) must be != 0.  */
1696         jz      L(bk_got2)
1697         sub     $1, %esi
1698         sub     $1, %ecx
1699         sub     $1, %edx
1700         movzbl  (%esi), %eax
1701         movb    %al, (%edx)
1703         testl   $2, %edx
1704         jz      L(bk_aligned_4)
1706 L(bk_got2):
1707         sub     $2, %esi
1708         sub     $2, %ecx
1709         sub     $2, %edx
1710         movzwl  (%esi), %eax
1711         movw    %ax, (%edx)
1712         jmp     L(bk_aligned_4)
1714         ALIGN (4)
1715 L(bk_write_more64bytes):
1716         /* Check alignment of last byte.  */
1717         testl   $15, %edx
1718         jz      L(bk_ssse3_cpy_pre)
1720 /* EDX is aligned 4 bytes, but not 16 bytes.  */
1721 L(bk_ssse3_align):
1722         sub     $4, %esi
1723         sub     $4, %ecx
1724         sub     $4, %edx
1725         movl    (%esi), %eax
1726         movl    %eax, (%edx)
1728         testl   $15, %edx
1729         jz      L(bk_ssse3_cpy_pre)
1731         sub     $4, %esi
1732         sub     $4, %ecx
1733         sub     $4, %edx
1734         movl    (%esi), %eax
1735         movl    %eax, (%edx)
1737         testl   $15, %edx
1738         jz      L(bk_ssse3_cpy_pre)
1740         sub     $4, %esi
1741         sub     $4, %ecx
1742         sub     $4, %edx
1743         movl    (%esi), %eax
1744         movl    %eax, (%edx)
1746 L(bk_ssse3_cpy_pre):
1747         cmp     $64, %ecx
1748         jb      L(bk_write_more32bytes)
1750 L(bk_ssse3_cpy):
1751         sub     $64, %esi
1752         sub     $64, %ecx
1753         sub     $64, %edx
1754         movdqu  0x30(%esi), %xmm3
1755         movdqa  %xmm3, 0x30(%edx)
1756         movdqu  0x20(%esi), %xmm2
1757         movdqa  %xmm2, 0x20(%edx)
1758         movdqu  0x10(%esi), %xmm1
1759         movdqa  %xmm1, 0x10(%edx)
1760         movdqu  (%esi), %xmm0
1761         movdqa  %xmm0, (%edx)
1762         cmp     $64, %ecx
1763         jae     L(bk_ssse3_cpy)
1764         jmp     L(bk_write_64bytesless)
1766 #endif
1768 END (MEMCPY)
1770 #endif