* string/tester.c (test_memcmp): Add a few more tests.
[glibc.git] / sysdeps / x86_64 / memset.S
blobc7bf2318de3d176c81e751721ece430653dc11f1
1 /* memset/bzero -- set memory area to CH/0
2    Optimized version for x86-64.
3    Copyright (C) 2002-2005, 2007, 2008 Free Software Foundation, Inc.
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 #define __STOS_LOWER_BOUNDARY   $8192
24 #define __STOS_UPPER_BOUNDARY   $65536
26         .text
27 #ifndef NOT_IN_libc
28 ENTRY(__bzero)
29         mov     %rsi,%rdx       /* Adjust parameter.  */
30         xorl    %esi,%esi       /* Fill with 0s.  */
31         jmp     L(memset_entry)
32 END(__bzero)
33 weak_alias (__bzero, bzero)
34 #endif
36 #if defined PIC && !defined NOT_IN_libc
37 ENTRY (__memset_chk)
38         cmpq    %rdx, %rcx
39         jb      HIDDEN_JUMPTARGET (__chk_fail)
40 END (__memset_chk)
41 #endif
42 ENTRY (memset)
43 L(memset_entry):
44         cmp    $0x1,%rdx
45         mov    %rdi,%rax        /* memset returns the dest address.  */
46         jne    L(ck2)
47         mov    %sil,(%rdi)
48         retq
49 L(ck2):
50         mov    $0x101010101010101,%r9
51         mov    %rdx,%r8
52         movzbq %sil,%rdx
53         imul   %r9,%rdx
54 L(now_dw_aligned):
55         cmp    $0x90,%r8
56         jg     L(ck_mem_ops_method)
57 L(now_dw_aligned_small):
58         lea    L(setPxQx)(%rip),%r11
59         add    %r8,%rdi
60 #ifndef PIC
61         jmpq   *(%r11,%r8,8)
62 #else
63         movslq (%r11,%r8,4),%rcx
64         lea    (%rcx,%r11,1),%r11
65         jmpq   *%r11
66 #endif
68 L(Got0):
69         retq
71         .pushsection .rodata
72         .balign     16
73 #ifndef PIC
74 L(setPxQx):
75         .quad       L(Got0), L(P1Q0), L(P2Q0), L(P3Q0)
76         .quad       L(P4Q0), L(P5Q0), L(P6Q0), L(P7Q0)
77         .quad       L(P0Q1), L(P1Q1), L(P2Q1), L(P3Q1)
78         .quad       L(P4Q1), L(P5Q1), L(P6Q1), L(P7Q1)
79         .quad       L(P0Q2), L(P1Q2), L(P2Q2), L(P3Q2)
80         .quad       L(P4Q2), L(P5Q2), L(P6Q2), L(P7Q2)
81         .quad       L(P0Q3), L(P1Q3), L(P2Q3), L(P3Q3)
82         .quad       L(P4Q3), L(P5Q3), L(P6Q3), L(P7Q3)
83         .quad       L(P0Q4), L(P1Q4), L(P2Q4), L(P3Q4)
84         .quad       L(P4Q4), L(P5Q4), L(P6Q4), L(P7Q4)
85         .quad       L(P0Q5), L(P1Q5), L(P2Q5), L(P3Q5)
86         .quad       L(P4Q5), L(P5Q5), L(P6Q5), L(P7Q5)
87         .quad       L(P0Q6), L(P1Q6), L(P2Q6), L(P3Q6)
88         .quad       L(P4Q6), L(P5Q6), L(P6Q6), L(P7Q6)
89         .quad       L(P0Q7), L(P1Q7), L(P2Q7), L(P3Q7)
90         .quad       L(P4Q7), L(P5Q7), L(P6Q7), L(P7Q7)
91         .quad       L(P0Q8), L(P1Q8), L(P2Q8), L(P3Q8)
92         .quad       L(P4Q8), L(P5Q8), L(P6Q8), L(P7Q8)
93         .quad       L(P0Q9), L(P1Q9), L(P2Q9), L(P3Q9)
94         .quad       L(P4Q9), L(P5Q9), L(P6Q9), L(P7Q9)
95         .quad       L(P0QA), L(P1QA), L(P2QA), L(P3QA)
96         .quad       L(P4QA), L(P5QA), L(P6QA), L(P7QA)
97         .quad       L(P0QB), L(P1QB), L(P2QB), L(P3QB)
98         .quad       L(P4QB), L(P5QB), L(P6QB), L(P7QB)
99         .quad       L(P0QC), L(P1QC), L(P2QC), L(P3QC)
100         .quad       L(P4QC), L(P5QC), L(P6QC), L(P7QC)
101         .quad       L(P0QD), L(P1QD), L(P2QD), L(P3QD)
102         .quad       L(P4QD), L(P5QD), L(P6QD), L(P7QD)
103         .quad       L(P0QE), L(P1QE), L(P2QE), L(P3QE)
104         .quad       L(P4QE), L(P5QE), L(P6QE), L(P7QE)
105         .quad       L(P0QF), L(P1QF), L(P2QF), L(P3QF)
106         .quad       L(P4QF), L(P5QF), L(P6QF), L(P7QF)
107         .quad       L(P0QG), L(P1QG), L(P2QG), L(P3QG)
108         .quad       L(P4QG), L(P5QG), L(P6QG), L(P7QG)
109         .quad       L(P0QH), L(P1QH), L(P2QH), L(P3QH)
110         .quad       L(P4QH), L(P5QH), L(P6QH), L(P7QH)
111         .quad       L(P0QI)
112 # ifdef USE_EXTRA_TABLE
113         .quad       L(P1QI), L(P2QI), L(P3QI), L(P4QI)
114         .quad       L(P5QI), L(P6QI), L(P7QI)
115 # endif
116 #else
117 L(setPxQx):
118         .int       L(Got0)-L(setPxQx)
119         .int       L(P1Q0)-L(setPxQx)
120         .int       L(P2Q0)-L(setPxQx)
121         .int       L(P3Q0)-L(setPxQx)
122         .int       L(P4Q0)-L(setPxQx)
123         .int       L(P5Q0)-L(setPxQx)
124         .int       L(P6Q0)-L(setPxQx)
125         .int       L(P7Q0)-L(setPxQx)
127         .int       L(P0Q1)-L(setPxQx)
128         .int       L(P1Q1)-L(setPxQx)
129         .int       L(P2Q1)-L(setPxQx)
130         .int       L(P3Q1)-L(setPxQx)
131         .int       L(P4Q1)-L(setPxQx)
132         .int       L(P5Q1)-L(setPxQx)
133         .int       L(P6Q1)-L(setPxQx)
134         .int       L(P7Q1)-L(setPxQx)
136         .int       L(P0Q2)-L(setPxQx)
137         .int       L(P1Q2)-L(setPxQx)
138         .int       L(P2Q2)-L(setPxQx)
139         .int       L(P3Q2)-L(setPxQx)
140         .int       L(P4Q2)-L(setPxQx)
141         .int       L(P5Q2)-L(setPxQx)
142         .int       L(P6Q2)-L(setPxQx)
143         .int       L(P7Q2)-L(setPxQx)
145         .int       L(P0Q3)-L(setPxQx)
146         .int       L(P1Q3)-L(setPxQx)
147         .int       L(P2Q3)-L(setPxQx)
148         .int       L(P3Q3)-L(setPxQx)
149         .int       L(P4Q3)-L(setPxQx)
150         .int       L(P5Q3)-L(setPxQx)
151         .int       L(P6Q3)-L(setPxQx)
152         .int       L(P7Q3)-L(setPxQx)
154         .int       L(P0Q4)-L(setPxQx)
155         .int       L(P1Q4)-L(setPxQx)
156         .int       L(P2Q4)-L(setPxQx)
157         .int       L(P3Q4)-L(setPxQx)
158         .int       L(P4Q4)-L(setPxQx)
159         .int       L(P5Q4)-L(setPxQx)
160         .int       L(P6Q4)-L(setPxQx)
161         .int       L(P7Q4)-L(setPxQx)
163         .int       L(P0Q5)-L(setPxQx)
164         .int       L(P1Q5)-L(setPxQx)
165         .int       L(P2Q5)-L(setPxQx)
166         .int       L(P3Q5)-L(setPxQx)
167         .int       L(P4Q5)-L(setPxQx)
168         .int       L(P5Q5)-L(setPxQx)
169         .int       L(P6Q5)-L(setPxQx)
170         .int       L(P7Q5)-L(setPxQx)
172         .int       L(P0Q6)-L(setPxQx)
173         .int       L(P1Q6)-L(setPxQx)
174         .int       L(P2Q6)-L(setPxQx)
175         .int       L(P3Q6)-L(setPxQx)
176         .int       L(P4Q6)-L(setPxQx)
177         .int       L(P5Q6)-L(setPxQx)
178         .int       L(P6Q6)-L(setPxQx)
179         .int       L(P7Q6)-L(setPxQx)
181         .int       L(P0Q7)-L(setPxQx)
182         .int       L(P1Q7)-L(setPxQx)
183         .int       L(P2Q7)-L(setPxQx)
184         .int       L(P3Q7)-L(setPxQx)
185         .int       L(P4Q7)-L(setPxQx)
186         .int       L(P5Q7)-L(setPxQx)
187         .int       L(P6Q7)-L(setPxQx)
188         .int       L(P7Q7)-L(setPxQx)
190         .int       L(P0Q8)-L(setPxQx)
191         .int       L(P1Q8)-L(setPxQx)
192         .int       L(P2Q8)-L(setPxQx)
193         .int       L(P3Q8)-L(setPxQx)
194         .int       L(P4Q8)-L(setPxQx)
195         .int       L(P5Q8)-L(setPxQx)
196         .int       L(P6Q8)-L(setPxQx)
197         .int       L(P7Q8)-L(setPxQx)
199         .int       L(P0Q9)-L(setPxQx)
200         .int       L(P1Q9)-L(setPxQx)
201         .int       L(P2Q9)-L(setPxQx)
202         .int       L(P3Q9)-L(setPxQx)
203         .int       L(P4Q9)-L(setPxQx)
204         .int       L(P5Q9)-L(setPxQx)
205         .int       L(P6Q9)-L(setPxQx)
206         .int       L(P7Q9)-L(setPxQx)
208         .int       L(P0QA)-L(setPxQx)
209         .int       L(P1QA)-L(setPxQx)
210         .int       L(P2QA)-L(setPxQx)
211         .int       L(P3QA)-L(setPxQx)
212         .int       L(P4QA)-L(setPxQx)
213         .int       L(P5QA)-L(setPxQx)
214         .int       L(P6QA)-L(setPxQx)
215         .int       L(P7QA)-L(setPxQx)
217         .int       L(P0QB)-L(setPxQx)
218         .int       L(P1QB)-L(setPxQx)
219         .int       L(P2QB)-L(setPxQx)
220         .int       L(P3QB)-L(setPxQx)
221         .int       L(P4QB)-L(setPxQx)
222         .int       L(P5QB)-L(setPxQx)
223         .int       L(P6QB)-L(setPxQx)
224         .int       L(P7QB)-L(setPxQx)
226         .int       L(P0QC)-L(setPxQx)
227         .int       L(P1QC)-L(setPxQx)
228         .int       L(P2QC)-L(setPxQx)
229         .int       L(P3QC)-L(setPxQx)
230         .int       L(P4QC)-L(setPxQx)
231         .int       L(P5QC)-L(setPxQx)
232         .int       L(P6QC)-L(setPxQx)
233         .int       L(P7QC)-L(setPxQx)
235         .int       L(P0QD)-L(setPxQx)
236         .int       L(P1QD)-L(setPxQx)
237         .int       L(P2QD)-L(setPxQx)
238         .int       L(P3QD)-L(setPxQx)
239         .int       L(P4QD)-L(setPxQx)
240         .int       L(P5QD)-L(setPxQx)
241         .int       L(P6QD)-L(setPxQx)
242         .int       L(P7QD)-L(setPxQx)
244         .int       L(P0QE)-L(setPxQx)
245         .int       L(P1QE)-L(setPxQx)
246         .int       L(P2QE)-L(setPxQx)
247         .int       L(P3QE)-L(setPxQx)
248         .int       L(P4QE)-L(setPxQx)
249         .int       L(P5QE)-L(setPxQx)
250         .int       L(P6QE)-L(setPxQx)
251         .int       L(P7QE)-L(setPxQx)
253         .int       L(P0QF)-L(setPxQx)
254         .int       L(P1QF)-L(setPxQx)
255         .int       L(P2QF)-L(setPxQx)
256         .int       L(P3QF)-L(setPxQx)
257         .int       L(P4QF)-L(setPxQx)
258         .int       L(P5QF)-L(setPxQx)
259         .int       L(P6QF)-L(setPxQx)
260         .int       L(P7QF)-L(setPxQx)
262         .int       L(P0QG)-L(setPxQx)
263         .int       L(P1QG)-L(setPxQx)
264         .int       L(P2QG)-L(setPxQx)
265         .int       L(P3QG)-L(setPxQx)
266         .int       L(P4QG)-L(setPxQx)
267         .int       L(P5QG)-L(setPxQx)
268         .int       L(P6QG)-L(setPxQx)
269         .int       L(P7QG)-L(setPxQx)
271         .int       L(P0QH)-L(setPxQx)
272         .int       L(P1QH)-L(setPxQx)
273         .int       L(P2QH)-L(setPxQx)
274         .int       L(P3QH)-L(setPxQx)
275         .int       L(P4QH)-L(setPxQx)
276         .int       L(P5QH)-L(setPxQx)
277         .int       L(P6QH)-L(setPxQx)
278         .int       L(P7QH)-L(setPxQx)
280         .int       L(P0QI)-L(setPxQx)
281 # ifdef USE_EXTRA_TABLE
282         .int       L(P1QI)-L(setPxQx)
283         .int       L(P2QI)-L(setPxQx)
284         .int       L(P3QI)-L(setPxQx)
285         .int       L(P4QI)-L(setPxQx)
286         .int       L(P5QI)-L(setPxQx)
287         .int       L(P6QI)-L(setPxQx)
288         .int       L(P7QI)-L(setPxQx)
289 # endif
290 #endif
291         .popsection
293         .balign     16
294 #ifdef USE_EXTRA_TABLE
295 L(P1QI): mov    %rdx,-0x91(%rdi)
296 #endif
297 L(P1QH): mov    %rdx,-0x89(%rdi)
298 L(P1QG): mov    %rdx,-0x81(%rdi)
299 #                  .balign     16
300 L(P1QF): mov    %rdx,-0x79(%rdi)
301 L(P1QE): mov    %rdx,-0x71(%rdi)
302 L(P1QD): mov    %rdx,-0x69(%rdi)
303 L(P1QC): mov    %rdx,-0x61(%rdi)
304 L(P1QB): mov    %rdx,-0x59(%rdi)
305 L(P1QA): mov    %rdx,-0x51(%rdi)
306 L(P1Q9): mov    %rdx,-0x49(%rdi)
307 L(P1Q8): mov    %rdx,-0x41(%rdi)
308 L(P1Q7): mov    %rdx,-0x39(%rdi)
309 L(P1Q6): mov    %rdx,-0x31(%rdi)
310 L(P1Q5): mov    %rdx,-0x29(%rdi)
311 L(P1Q4): mov    %rdx,-0x21(%rdi)
312 L(P1Q3): mov    %rdx,-0x19(%rdi)
313 L(P1Q2): mov    %rdx,-0x11(%rdi)
314 L(P1Q1): mov    %rdx,-0x9(%rdi)
315 L(P1Q0): mov    %dl,-0x1(%rdi)
316                 retq
318         .balign     16
319 L(P0QI): mov    %rdx,-0x90(%rdi)
320 L(P0QH): mov    %rdx,-0x88(%rdi)
321 #                  .balign     16
322 L(P0QG): mov    %rdx,-0x80(%rdi)
323 L(P0QF): mov    %rdx,-0x78(%rdi)
324 L(P0QE): mov    %rdx,-0x70(%rdi)
325 L(P0QD): mov    %rdx,-0x68(%rdi)
326 L(P0QC): mov    %rdx,-0x60(%rdi)
327 L(P0QB): mov    %rdx,-0x58(%rdi)
328 L(P0QA): mov    %rdx,-0x50(%rdi)
329 L(P0Q9): mov    %rdx,-0x48(%rdi)
330 L(P0Q8): mov    %rdx,-0x40(%rdi)
331 L(P0Q7): mov    %rdx,-0x38(%rdi)
332 L(P0Q6): mov    %rdx,-0x30(%rdi)
333 L(P0Q5): mov    %rdx,-0x28(%rdi)
334 L(P0Q4): mov    %rdx,-0x20(%rdi)
335 L(P0Q3): mov    %rdx,-0x18(%rdi)
336 L(P0Q2): mov    %rdx,-0x10(%rdi)
337 L(P0Q1): mov    %rdx,-0x8(%rdi)
338 L(P0Q0): retq
341         .balign     16
342 #ifdef USE_EXTRA_TABLE
343 L(P2QI): mov    %rdx,-0x92(%rdi)
344 #endif
345 L(P2QH): mov    %rdx,-0x8a(%rdi)
346 L(P2QG): mov    %rdx,-0x82(%rdi)
347 #                  .balign     16
348 L(P2QF): mov    %rdx,-0x7a(%rdi)
349 L(P2QE): mov    %rdx,-0x72(%rdi)
350 L(P2QD): mov    %rdx,-0x6a(%rdi)
351 L(P2QC): mov    %rdx,-0x62(%rdi)
352 L(P2QB): mov    %rdx,-0x5a(%rdi)
353 L(P2QA): mov    %rdx,-0x52(%rdi)
354 L(P2Q9): mov    %rdx,-0x4a(%rdi)
355 L(P2Q8): mov    %rdx,-0x42(%rdi)
356 L(P2Q7): mov    %rdx,-0x3a(%rdi)
357 L(P2Q6): mov    %rdx,-0x32(%rdi)
358 L(P2Q5): mov    %rdx,-0x2a(%rdi)
359 L(P2Q4): mov    %rdx,-0x22(%rdi)
360 L(P2Q3): mov    %rdx,-0x1a(%rdi)
361 L(P2Q2): mov    %rdx,-0x12(%rdi)
362 L(P2Q1): mov    %rdx,-0xa(%rdi)
363 L(P2Q0): mov    %dx,-0x2(%rdi)
364                 retq
366         .balign     16
367 #ifdef USE_EXTRA_TABLE
368 L(P3QI): mov    %rdx,-0x93(%rdi)
369 #endif
370 L(P3QH): mov    %rdx,-0x8b(%rdi)
371 L(P3QG): mov    %rdx,-0x83(%rdi)
372 #                  .balign     16
373 L(P3QF): mov    %rdx,-0x7b(%rdi)
374 L(P3QE): mov    %rdx,-0x73(%rdi)
375 L(P3QD): mov    %rdx,-0x6b(%rdi)
376 L(P3QC): mov    %rdx,-0x63(%rdi)
377 L(P3QB): mov    %rdx,-0x5b(%rdi)
378 L(P3QA): mov    %rdx,-0x53(%rdi)
379 L(P3Q9): mov    %rdx,-0x4b(%rdi)
380 L(P3Q8): mov    %rdx,-0x43(%rdi)
381 L(P3Q7): mov    %rdx,-0x3b(%rdi)
382 L(P3Q6): mov    %rdx,-0x33(%rdi)
383 L(P3Q5): mov    %rdx,-0x2b(%rdi)
384 L(P3Q4): mov    %rdx,-0x23(%rdi)
385 L(P3Q3): mov    %rdx,-0x1b(%rdi)
386 L(P3Q2): mov    %rdx,-0x13(%rdi)
387 L(P3Q1): mov    %rdx,-0xb(%rdi)
388 L(P3Q0): mov    %dx,-0x3(%rdi)
389                 mov    %dl,-0x1(%rdi)
390                 retq
392         .balign     16
393 #ifdef USE_EXTRA_TABLE
394 L(P4QI): mov    %rdx,-0x94(%rdi)
395 #endif
396 L(P4QH): mov    %rdx,-0x8c(%rdi)
397 L(P4QG): mov    %rdx,-0x84(%rdi)
398 #                  .balign     16
399 L(P4QF): mov    %rdx,-0x7c(%rdi)
400 L(P4QE): mov    %rdx,-0x74(%rdi)
401 L(P4QD): mov    %rdx,-0x6c(%rdi)
402 L(P4QC): mov    %rdx,-0x64(%rdi)
403 L(P4QB): mov    %rdx,-0x5c(%rdi)
404 L(P4QA): mov    %rdx,-0x54(%rdi)
405 L(P4Q9): mov    %rdx,-0x4c(%rdi)
406 L(P4Q8): mov    %rdx,-0x44(%rdi)
407 L(P4Q7): mov    %rdx,-0x3c(%rdi)
408 L(P4Q6): mov    %rdx,-0x34(%rdi)
409 L(P4Q5): mov    %rdx,-0x2c(%rdi)
410 L(P4Q4): mov    %rdx,-0x24(%rdi)
411 L(P4Q3): mov    %rdx,-0x1c(%rdi)
412 L(P4Q2): mov    %rdx,-0x14(%rdi)
413 L(P4Q1): mov    %rdx,-0xc(%rdi)
414 L(P4Q0): mov    %edx,-0x4(%rdi)
415                 retq
417         .balign     16
418 #if defined(USE_EXTRA_TABLE)
419 L(P5QI): mov    %rdx,-0x95(%rdi)
420 #endif
421 L(P5QH): mov    %rdx,-0x8d(%rdi)
422 L(P5QG): mov    %rdx,-0x85(%rdi)
423 #                  .balign     16
424 L(P5QF): mov    %rdx,-0x7d(%rdi)
425 L(P5QE): mov    %rdx,-0x75(%rdi)
426 L(P5QD): mov    %rdx,-0x6d(%rdi)
427 L(P5QC): mov    %rdx,-0x65(%rdi)
428 L(P5QB): mov    %rdx,-0x5d(%rdi)
429 L(P5QA): mov    %rdx,-0x55(%rdi)
430 L(P5Q9): mov    %rdx,-0x4d(%rdi)
431 L(P5Q8): mov    %rdx,-0x45(%rdi)
432 L(P5Q7): mov    %rdx,-0x3d(%rdi)
433 L(P5Q6): mov    %rdx,-0x35(%rdi)
434 L(P5Q5): mov    %rdx,-0x2d(%rdi)
435 L(P5Q4): mov    %rdx,-0x25(%rdi)
436 L(P5Q3): mov    %rdx,-0x1d(%rdi)
437 L(P5Q2): mov    %rdx,-0x15(%rdi)
438 L(P5Q1): mov    %rdx,-0xd(%rdi)
439 L(P5Q0): mov    %edx,-0x5(%rdi)
440                 mov    %dl,-0x1(%rdi)
441                 retq
443         .balign     16
444 #ifdef USE_EXTRA_TABLE
445 L(P6QI): mov    %rdx,-0x96(%rdi)
446 #endif
447 L(P6QH): mov    %rdx,-0x8e(%rdi)
448 L(P6QG): mov    %rdx,-0x86(%rdi)
449 #                  .balign     16
450 L(P6QF): mov    %rdx,-0x7e(%rdi)
451 L(P6QE): mov    %rdx,-0x76(%rdi)
452 L(P6QD): mov    %rdx,-0x6e(%rdi)
453 L(P6QC): mov    %rdx,-0x66(%rdi)
454 L(P6QB): mov    %rdx,-0x5e(%rdi)
455 L(P6QA): mov    %rdx,-0x56(%rdi)
456 L(P6Q9): mov    %rdx,-0x4e(%rdi)
457 L(P6Q8): mov    %rdx,-0x46(%rdi)
458 L(P6Q7): mov    %rdx,-0x3e(%rdi)
459 L(P6Q6): mov    %rdx,-0x36(%rdi)
460 L(P6Q5): mov    %rdx,-0x2e(%rdi)
461 L(P6Q4): mov    %rdx,-0x26(%rdi)
462 L(P6Q3): mov    %rdx,-0x1e(%rdi)
463 L(P6Q2): mov    %rdx,-0x16(%rdi)
464 L(P6Q1): mov    %rdx,-0xe(%rdi)
465 L(P6Q0): mov    %edx,-0x6(%rdi)
466                 mov    %dx,-0x2(%rdi)
467                 retq
469         .balign     16
470 #ifdef USE_EXTRA_TABLE
471 L(P7QI): mov    %rdx,-0x97(%rdi)
472 #endif
473 L(P7QH): mov    %rdx,-0x8f(%rdi)
474 L(P7QG): mov    %rdx,-0x87(%rdi)
475 #                  .balign     16
476 L(P7QF): mov    %rdx,-0x7f(%rdi)
477 L(P7QE): mov    %rdx,-0x77(%rdi)
478 L(P7QD): mov    %rdx,-0x6f(%rdi)
479 L(P7QC): mov    %rdx,-0x67(%rdi)
480 L(P7QB): mov    %rdx,-0x5f(%rdi)
481 L(P7QA): mov    %rdx,-0x57(%rdi)
482 L(P7Q9): mov    %rdx,-0x4f(%rdi)
483 L(P7Q8): mov    %rdx,-0x47(%rdi)
484 L(P7Q7): mov    %rdx,-0x3f(%rdi)
485 L(P7Q6): mov    %rdx,-0x37(%rdi)
486 L(P7Q5): mov    %rdx,-0x2f(%rdi)
487 L(P7Q4): mov    %rdx,-0x27(%rdi)
488 L(P7Q3): mov    %rdx,-0x1f(%rdi)
489 L(P7Q2): mov    %rdx,-0x17(%rdi)
490 L(P7Q1): mov    %rdx,-0xf(%rdi)
491 L(P7Q0): mov    %edx,-0x7(%rdi)
492                 mov    %dx,-0x3(%rdi)
493                 mov    %dl,-0x1(%rdi)
494                 retq
496         .balign     16
497 L(ck_mem_ops_method):
499 # align to 16 byte boundary first
500         #test $0xf,%rdi
501         #jz L(aligned_now)
502          lea    L(AliPxQx)(%rip),%r11
503          mov    $0x10,%r10
504          mov    %rdi,%r9
505          and    $0xf,%r9
506          sub    %r9,%r10
507          and    $0xf,%r10
508          add    %r10,%rdi
509          sub    %r10,%r8
510 #ifndef PIC
511         jmpq   *(%r11,%r10,8)
512 #else
513         movslq (%r11,%r10,4),%rcx
514         lea    (%rcx,%r11,1),%r11
515         jmpq   *%r11
516 #endif
518         .pushsection .rodata
519         .balign     16
520 #ifndef PIC
521 L(AliPxQx):
522         .quad       L(aligned_now), L(A1Q0), L(A2Q0), L(A3Q0)
523         .quad       L(A4Q0), L(A5Q0), L(A6Q0), L(A7Q0)
524         .quad       L(A0Q1), L(A1Q1), L(A2Q1), L(A3Q1)
525         .quad       L(A4Q1), L(A5Q1), L(A6Q1), L(A7Q1)
526 #else
527 L(AliPxQx):
528         .int       L(aligned_now)-L(AliPxQx)
529         .int       L(A1Q0)-L(AliPxQx)
530         .int       L(A2Q0)-L(AliPxQx)
531         .int       L(A3Q0)-L(AliPxQx)
532         .int       L(A4Q0)-L(AliPxQx)
533         .int       L(A5Q0)-L(AliPxQx)
534         .int       L(A6Q0)-L(AliPxQx)
535         .int       L(A7Q0)-L(AliPxQx)
537         .int       L(A0Q1)-L(AliPxQx)
538         .int       L(A1Q1)-L(AliPxQx)
539         .int       L(A2Q1)-L(AliPxQx)
540         .int       L(A3Q1)-L(AliPxQx)
541         .int       L(A4Q1)-L(AliPxQx)
542         .int       L(A5Q1)-L(AliPxQx)
543         .int       L(A6Q1)-L(AliPxQx)
544         .int       L(A7Q1)-L(AliPxQx)
545 #endif
546         .popsection
548         .balign     16
549 L(A5Q1):    mov    %dl,-0xd(%rdi)
550 L(A4Q1):    mov    %edx,-0xc(%rdi)
551 L(A0Q1):    mov    %rdx,-0x8(%rdi)
552 L(A0Q0):    jmp     L(aligned_now)
554         .balign     16
555 L(A1Q1):   mov    %dl,-0x9(%rdi)
556         mov    %rdx,-0x8(%rdi)
557         jmp    L(aligned_now)
559         .balign     16
560 L(A1Q0):   mov    %dl,-0x1(%rdi)
561         jmp    L(aligned_now)
563         .balign     16
564 L(A3Q1):    mov    %dl,-0xb(%rdi)
565 L(A2Q1):    mov    %dx,-0xa(%rdi)
566         mov    %rdx,-0x8(%rdi)
567         jmp    L(aligned_now)
569         .balign     16
570 L(A3Q0):    mov    %dl,-0x3(%rdi)
571 L(A2Q0):    mov    %dx,-0x2(%rdi)
572         jmp    L(aligned_now)
574         .balign     16
575 L(A5Q0):    mov    %dl,-0x5(%rdi)
576 L(A4Q0):    mov    %edx,-0x4(%rdi)
577         jmp    L(aligned_now)
579         .balign     16
580 L(A7Q1):    mov    %dl,-0xf(%rdi)
581 L(A6Q1):    mov    %dx,-0xe(%rdi)
582         mov    %edx,-0xc(%rdi)
583         mov    %rdx,-0x8(%rdi)
584         jmp    L(aligned_now)
586         .balign     16
587 L(A7Q0):    mov    %dl,-0x7(%rdi)
588 L(A6Q0):    mov    %dx,-0x6(%rdi)
589         mov    %edx,-0x4(%rdi)
590         jmp    L(aligned_now)
592         .balign     16
593 L(aligned_now):
595          cmpl   $0x1,__x86_64_preferred_memory_instruction(%rip)
596          jg     L(SSE_pre)
598 L(8byte_move_try):
599         cmpq    __STOS_LOWER_BOUNDARY,%r8
600         jae     L(8byte_stos_try)
602         .balign     16
603 L(8byte_move):
604         movq    %r8,%rcx
605         shrq    $7,%rcx
606         jz      L(8byte_move_skip)
608         .p2align 4
610 L(8byte_move_loop):
611         decq    %rcx
613         movq    %rdx,    (%rdi)
614         movq    %rdx,  8 (%rdi)
615         movq    %rdx, 16 (%rdi)
616         movq    %rdx, 24 (%rdi)
617         movq    %rdx, 32 (%rdi)
618         movq    %rdx, 40 (%rdi)
619         movq    %rdx, 48 (%rdi)
620         movq    %rdx, 56 (%rdi)
621         movq    %rdx, 64 (%rdi)
622         movq    %rdx, 72 (%rdi)
623         movq    %rdx, 80 (%rdi)
624         movq    %rdx, 88 (%rdi)
625         movq    %rdx, 96 (%rdi)
626         movq    %rdx, 104 (%rdi)
627         movq    %rdx, 112 (%rdi)
628         movq    %rdx, 120 (%rdi)
630         leaq    128 (%rdi),%rdi
632         jnz     L(8byte_move_loop)
634 L(8byte_move_skip):
635         andl    $127,%r8d
636         lea     (%rdi,%r8,1),%rdi
637         lea     L(setPxQx)(%rip),%r11
639 #ifndef PIC
640         jmpq    *(%r11,%r8,8) # old scheme remained for nonPIC
641 #else
642         movslq  (%r11,%r8,4),%rcx
643         lea     (%rcx,%r11,1),%r11
644         jmpq    *%r11
645 #endif
647         .balign     16
648 L(8byte_stos_try):
649         mov    __x86_64_shared_cache_size(%rip),%r9d // ck largest cache size
650         cmpq    %r8,%r9         // calculate the lesser of remaining
651         cmovaq  %r8,%r9         // bytes and largest cache size
652         jbe     L(8byte_stos)
654 L(8byte_move_reuse_try):
655         cmp     __STOS_UPPER_BOUNDARY,%r8
656         jae     L(8byte_move)
658         .balign     16
659 L(8byte_stos):
660         movq    %r9,%rcx
661         andq    $-8,%r9
663         shrq    $3,%rcx
664         jz      L(8byte_stos_skip)
666         xchgq   %rax,%rdx
668         rep
669         stosq
671         xchgq   %rax,%rdx
673 L(8byte_stos_skip):
674         subq    %r9,%r8
675         ja      L(8byte_nt_move)
677         andl    $7,%r8d
678         lea     (%rdi,%r8,1),%rdi
679         lea     L(setPxQx)(%rip),%r11
680 #ifndef PIC
681         jmpq    *(%r11,%r8,8) # old scheme remained for nonPIC
682 #else
683         movslq  (%r11,%r8,4),%rcx
684         lea     (%rcx,%r11,1),%r11
685         jmpq    *%r11
686 #endif
688         .balign     16
689 L(8byte_nt_move):
690         movq    %r8,%rcx
691         shrq    $7,%rcx
692         jz      L(8byte_nt_move_skip)
694         .balign     16
695 L(8byte_nt_move_loop):
696         decq    %rcx
698         movntiq %rdx,     (%rdi)
699         movntiq %rdx,   8 (%rdi)
700         movntiq %rdx,  16 (%rdi)
701         movntiq %rdx,  24 (%rdi)
702         movntiq %rdx,  32 (%rdi)
703         movntiq %rdx,  40 (%rdi)
704         movntiq %rdx,  48 (%rdi)
705         movntiq %rdx,  56 (%rdi)
706         movntiq %rdx,  64 (%rdi)
707         movntiq %rdx,  72 (%rdi)
708         movntiq %rdx,  80 (%rdi)
709         movntiq %rdx,  88 (%rdi)
710         movntiq %rdx,  96 (%rdi)
711         movntiq %rdx, 104 (%rdi)
712         movntiq %rdx, 112 (%rdi)
713         movntiq %rdx, 120 (%rdi)
715         leaq    128 (%rdi),%rdi
717         jnz     L(8byte_nt_move_loop)
719         sfence
721 L(8byte_nt_move_skip):
722         andl    $127,%r8d
724         lea     (%rdi,%r8,1),%rdi
725         lea     L(setPxQx)(%rip),%r11
726 #ifndef PIC
727         jmpq    *(%r11,%r8,8) # old scheme remained for nonPIC
728 #else
729         movslq  (%r11,%r8,4),%rcx
730         lea     (%rcx,%r11,1),%r11
731         jmpq    *%r11
732 #endif
734 L(SSE_pre):
735          # fill RegXMM0 with the pattern
736          movd   %rdx,%xmm0
737          punpcklqdq %xmm0,%xmm0
739          lea    L(SSExDx)(%rip),%r9        # for later after the alignment
740          cmp    $0xb0,%r8 # 176
741          jge    L(byte32sse2_pre)
743          add    %r8,%rdi
744 #ifndef PIC
745          jmpq   *(%r9,%r8,8)
746 #else
747          movslq    (%r9,%r8,4),%rcx
748          lea    (%rcx,%r9,1),%r9
749          jmpq   *%r9
750 #endif
752 L(SSE0QB):  movdqa %xmm0,-0xb0(%rdi)
753 L(SSE0QA):  movdqa %xmm0,-0xa0(%rdi)
754 L(SSE0Q9):  movdqa %xmm0,-0x90(%rdi)
755 L(SSE0Q8):  movdqa %xmm0,-0x80(%rdi)
756 L(SSE0Q7):  movdqa %xmm0,-0x70(%rdi)
757 L(SSE0Q6):  movdqa %xmm0,-0x60(%rdi)
758 L(SSE0Q5):  movdqa %xmm0,-0x50(%rdi)
759 L(SSE0Q4):  movdqa %xmm0,-0x40(%rdi)
760 L(SSE0Q3):  movdqa %xmm0,-0x30(%rdi)
761 L(SSE0Q2):  movdqa %xmm0,-0x20(%rdi)
762 L(SSE0Q1):  movdqa %xmm0,-0x10(%rdi)
763 L(SSE0Q0):  retq
765 L(SSE1QB):  movdqa %xmm0,-0xb1(%rdi)
766 L(SSE1QA):  movdqa %xmm0,-0xa1(%rdi)
767 L(SSE1Q9):  movdqa %xmm0,-0x91(%rdi)
768 L(SSE1Q8):  movdqa %xmm0,-0x81(%rdi)
769 L(SSE1Q7):  movdqa %xmm0,-0x71(%rdi)
770 L(SSE1Q6):  movdqa %xmm0,-0x61(%rdi)
771 L(SSE1Q5):  movdqa %xmm0,-0x51(%rdi)
772 L(SSE1Q4):  movdqa %xmm0,-0x41(%rdi)
773 L(SSE1Q3):  movdqa %xmm0,-0x31(%rdi)
774 L(SSE1Q2):  movdqa %xmm0,-0x21(%rdi)
775 L(SSE1Q1):  movdqa %xmm0,-0x11(%rdi)
776 L(SSE1Q0):  mov    %dl,-0x1(%rdi)
777         retq
779 L(SSE2QB):  movdqa %xmm0,-0xb2(%rdi)
780 L(SSE2QA):  movdqa %xmm0,-0xa2(%rdi)
781 L(SSE2Q9):  movdqa %xmm0,-0x92(%rdi)
782 L(SSE2Q8):  movdqa %xmm0,-0x82(%rdi)
783 L(SSE2Q7):  movdqa %xmm0,-0x72(%rdi)
784 L(SSE2Q6):  movdqa %xmm0,-0x62(%rdi)
785 L(SSE2Q5):  movdqa %xmm0,-0x52(%rdi)
786 L(SSE2Q4):  movdqa %xmm0,-0x42(%rdi)
787 L(SSE2Q3):  movdqa %xmm0,-0x32(%rdi)
788 L(SSE2Q2):  movdqa %xmm0,-0x22(%rdi)
789 L(SSE2Q1):  movdqa %xmm0,-0x12(%rdi)
790 L(SSE2Q0):  mov    %dx,-0x2(%rdi)
791         retq
793 L(SSE3QB):  movdqa %xmm0,-0xb3(%rdi)
794 L(SSE3QA):  movdqa %xmm0,-0xa3(%rdi)
795 L(SSE3Q9):  movdqa %xmm0,-0x93(%rdi)
796 L(SSE3Q8):  movdqa %xmm0,-0x83(%rdi)
797 L(SSE3Q7):  movdqa %xmm0,-0x73(%rdi)
798 L(SSE3Q6):  movdqa %xmm0,-0x63(%rdi)
799 L(SSE3Q5):  movdqa %xmm0,-0x53(%rdi)
800 L(SSE3Q4):  movdqa %xmm0,-0x43(%rdi)
801 L(SSE3Q3):  movdqa %xmm0,-0x33(%rdi)
802 L(SSE3Q2):  movdqa %xmm0,-0x23(%rdi)
803 L(SSE3Q1):  movdqa %xmm0,-0x13(%rdi)
804 L(SSE3Q0):  mov    %dx,-0x3(%rdi)
805         mov    %dl,-0x1(%rdi)
806         retq
808 L(SSE4QB):  movdqa %xmm0,-0xb4(%rdi)
809 L(SSE4QA):  movdqa %xmm0,-0xa4(%rdi)
810 L(SSE4Q9):  movdqa %xmm0,-0x94(%rdi)
811 L(SSE4Q8):  movdqa %xmm0,-0x84(%rdi)
812 L(SSE4Q7):  movdqa %xmm0,-0x74(%rdi)
813 L(SSE4Q6):  movdqa %xmm0,-0x64(%rdi)
814 L(SSE4Q5):  movdqa %xmm0,-0x54(%rdi)
815 L(SSE4Q4):  movdqa %xmm0,-0x44(%rdi)
816 L(SSE4Q3):  movdqa %xmm0,-0x34(%rdi)
817 L(SSE4Q2):  movdqa %xmm0,-0x24(%rdi)
818 L(SSE4Q1):  movdqa %xmm0,-0x14(%rdi)
819 L(SSE4Q0):  mov    %edx,-0x4(%rdi)
820         retq
822 L(SSE5QB):  movdqa %xmm0,-0xb5(%rdi)
823 L(SSE5QA):  movdqa %xmm0,-0xa5(%rdi)
824 L(SSE5Q9):  movdqa %xmm0,-0x95(%rdi)
825 L(SSE5Q8):  movdqa %xmm0,-0x85(%rdi)
826 L(SSE5Q7):  movdqa %xmm0,-0x75(%rdi)
827 L(SSE5Q6):  movdqa %xmm0,-0x65(%rdi)
828 L(SSE5Q5):  movdqa %xmm0,-0x55(%rdi)
829 L(SSE5Q4):  movdqa %xmm0,-0x45(%rdi)
830 L(SSE5Q3):  movdqa %xmm0,-0x35(%rdi)
831 L(SSE5Q2):  movdqa %xmm0,-0x25(%rdi)
832 L(SSE5Q1):  movdqa %xmm0,-0x15(%rdi)
833 L(SSE5Q0):  mov    %edx,-0x5(%rdi)
834         mov    %dl,-0x1(%rdi)
835         retq
838 L(SSE6QB):  movdqa %xmm0,-0xb6(%rdi)
839 L(SSE6QA):  movdqa %xmm0,-0xa6(%rdi)
840 L(SSE6Q9):  movdqa %xmm0,-0x96(%rdi)
841 L(SSE6Q8):  movdqa %xmm0,-0x86(%rdi)
842 L(SSE6Q7):  movdqa %xmm0,-0x76(%rdi)
843 L(SSE6Q6):  movdqa %xmm0,-0x66(%rdi)
844 L(SSE6Q5):  movdqa %xmm0,-0x56(%rdi)
845 L(SSE6Q4):  movdqa %xmm0,-0x46(%rdi)
846 L(SSE6Q3):  movdqa %xmm0,-0x36(%rdi)
847 L(SSE6Q2):  movdqa %xmm0,-0x26(%rdi)
848 L(SSE6Q1):  movdqa %xmm0,-0x16(%rdi)
849 L(SSE6Q0):  mov    %edx,-0x6(%rdi)
850         mov    %dx,-0x2(%rdi)
851         retq
853 L(SSE7QB):  movdqa %xmm0,-0xb7(%rdi)
854 L(SSE7QA):  movdqa %xmm0,-0xa7(%rdi)
855 L(SSE7Q9):  movdqa %xmm0,-0x97(%rdi)
856 L(SSE7Q8):  movdqa %xmm0,-0x87(%rdi)
857 L(SSE7Q7):  movdqa %xmm0,-0x77(%rdi)
858 L(SSE7Q6):  movdqa %xmm0,-0x67(%rdi)
859 L(SSE7Q5):  movdqa %xmm0,-0x57(%rdi)
860 L(SSE7Q4):  movdqa %xmm0,-0x47(%rdi)
861 L(SSE7Q3):  movdqa %xmm0,-0x37(%rdi)
862 L(SSE7Q2):  movdqa %xmm0,-0x27(%rdi)
863 L(SSE7Q1):  movdqa %xmm0,-0x17(%rdi)
864 L(SSE7Q0):  mov    %edx,-0x7(%rdi)
865         mov    %dx,-0x3(%rdi)
866         mov    %dl,-0x1(%rdi)
867         retq
869 L(SSE8QB):  movdqa %xmm0,-0xb8(%rdi)
870 L(SSE8QA):  movdqa %xmm0,-0xa8(%rdi)
871 L(SSE8Q9):  movdqa %xmm0,-0x98(%rdi)
872 L(SSE8Q8):  movdqa %xmm0,-0x88(%rdi)
873 L(SSE8Q7):  movdqa %xmm0,-0x78(%rdi)
874 L(SSE8Q6):  movdqa %xmm0,-0x68(%rdi)
875 L(SSE8Q5):  movdqa %xmm0,-0x58(%rdi)
876 L(SSE8Q4):  movdqa %xmm0,-0x48(%rdi)
877 L(SSE8Q3):  movdqa %xmm0,-0x38(%rdi)
878 L(SSE8Q2):  movdqa %xmm0,-0x28(%rdi)
879 L(SSE8Q1):  movdqa %xmm0,-0x18(%rdi)
880 L(SSE8Q0):  mov    %rdx,-0x8(%rdi)
881         retq
883 L(SSE9QB):  movdqa %xmm0,-0xb9(%rdi)
884 L(SSE9QA):  movdqa %xmm0,-0xa9(%rdi)
885 L(SSE9Q9):  movdqa %xmm0,-0x99(%rdi)
886 L(SSE9Q8):  movdqa %xmm0,-0x89(%rdi)
887 L(SSE9Q7):  movdqa %xmm0,-0x79(%rdi)
888 L(SSE9Q6):  movdqa %xmm0,-0x69(%rdi)
889 L(SSE9Q5):  movdqa %xmm0,-0x59(%rdi)
890 L(SSE9Q4):  movdqa %xmm0,-0x49(%rdi)
891 L(SSE9Q3):  movdqa %xmm0,-0x39(%rdi)
892 L(SSE9Q2):  movdqa %xmm0,-0x29(%rdi)
893 L(SSE9Q1):  movdqa %xmm0,-0x19(%rdi)
894 L(SSE9Q0):  mov    %rdx,-0x9(%rdi)
895         mov    %dl,-0x1(%rdi)
896         retq
898 L(SSE10QB): movdqa %xmm0,-0xba(%rdi)
899 L(SSE10QA): movdqa %xmm0,-0xaa(%rdi)
900 L(SSE10Q9): movdqa %xmm0,-0x9a(%rdi)
901 L(SSE10Q8): movdqa %xmm0,-0x8a(%rdi)
902 L(SSE10Q7): movdqa %xmm0,-0x7a(%rdi)
903 L(SSE10Q6): movdqa %xmm0,-0x6a(%rdi)
904 L(SSE10Q5): movdqa %xmm0,-0x5a(%rdi)
905 L(SSE10Q4): movdqa %xmm0,-0x4a(%rdi)
906 L(SSE10Q3): movdqa %xmm0,-0x3a(%rdi)
907 L(SSE10Q2): movdqa %xmm0,-0x2a(%rdi)
908 L(SSE10Q1): movdqa %xmm0,-0x1a(%rdi)
909 L(SSE10Q0): mov    %rdx,-0xa(%rdi)
910         mov    %dx,-0x2(%rdi)
911         retq
913 L(SSE11QB): movdqa %xmm0,-0xbb(%rdi)
914 L(SSE11QA): movdqa %xmm0,-0xab(%rdi)
915 L(SSE11Q9): movdqa %xmm0,-0x9b(%rdi)
916 L(SSE11Q8): movdqa %xmm0,-0x8b(%rdi)
917 L(SSE11Q7): movdqa %xmm0,-0x7b(%rdi)
918 L(SSE11Q6): movdqa %xmm0,-0x6b(%rdi)
919 L(SSE11Q5): movdqa %xmm0,-0x5b(%rdi)
920 L(SSE11Q4): movdqa %xmm0,-0x4b(%rdi)
921 L(SSE11Q3): movdqa %xmm0,-0x3b(%rdi)
922 L(SSE11Q2): movdqa %xmm0,-0x2b(%rdi)
923 L(SSE11Q1): movdqa %xmm0,-0x1b(%rdi)
924 L(SSE11Q0): mov    %rdx,-0xb(%rdi)
925         mov    %dx,-0x3(%rdi)
926         mov    %dl,-0x1(%rdi)
927         retq
929 L(SSE12QB): movdqa %xmm0,-0xbc(%rdi)
930 L(SSE12QA): movdqa %xmm0,-0xac(%rdi)
931 L(SSE12Q9): movdqa %xmm0,-0x9c(%rdi)
932 L(SSE12Q8): movdqa %xmm0,-0x8c(%rdi)
933 L(SSE12Q7): movdqa %xmm0,-0x7c(%rdi)
934 L(SSE12Q6): movdqa %xmm0,-0x6c(%rdi)
935 L(SSE12Q5): movdqa %xmm0,-0x5c(%rdi)
936 L(SSE12Q4): movdqa %xmm0,-0x4c(%rdi)
937 L(SSE12Q3): movdqa %xmm0,-0x3c(%rdi)
938 L(SSE12Q2): movdqa %xmm0,-0x2c(%rdi)
939 L(SSE12Q1): movdqa %xmm0,-0x1c(%rdi)
940 L(SSE12Q0): mov    %rdx,-0xc(%rdi)
941         mov    %edx,-0x4(%rdi)
942         retq
944 L(SSE13QB): movdqa %xmm0,-0xbd(%rdi)
945 L(SSE13QA): movdqa %xmm0,-0xad(%rdi)
946 L(SSE13Q9): movdqa %xmm0,-0x9d(%rdi)
947 L(SSE13Q8): movdqa %xmm0,-0x8d(%rdi)
948 L(SSE13Q7): movdqa %xmm0,-0x7d(%rdi)
949 L(SSE13Q6): movdqa %xmm0,-0x6d(%rdi)
950 L(SSE13Q5): movdqa %xmm0,-0x5d(%rdi)
951 L(SSE13Q4): movdqa %xmm0,-0x4d(%rdi)
952 L(SSE13Q3): movdqa %xmm0,-0x3d(%rdi)
953 L(SSE13Q2): movdqa %xmm0,-0x2d(%rdi)
954 L(SSE13Q1): movdqa %xmm0,-0x1d(%rdi)
955 L(SSE13Q0): mov    %rdx,-0xd(%rdi)
956         mov    %edx,-0x5(%rdi)
957         mov    %dl,-0x1(%rdi)
958         retq
960 L(SSE14QB): movdqa %xmm0,-0xbe(%rdi)
961 L(SSE14QA): movdqa %xmm0,-0xae(%rdi)
962 L(SSE14Q9): movdqa %xmm0,-0x9e(%rdi)
963 L(SSE14Q8): movdqa %xmm0,-0x8e(%rdi)
964 L(SSE14Q7): movdqa %xmm0,-0x7e(%rdi)
965 L(SSE14Q6): movdqa %xmm0,-0x6e(%rdi)
966 L(SSE14Q5): movdqa %xmm0,-0x5e(%rdi)
967 L(SSE14Q4): movdqa %xmm0,-0x4e(%rdi)
968 L(SSE14Q3): movdqa %xmm0,-0x3e(%rdi)
969 L(SSE14Q2): movdqa %xmm0,-0x2e(%rdi)
970 L(SSE14Q1): movdqa %xmm0,-0x1e(%rdi)
971 L(SSE14Q0): mov    %rdx,-0xe(%rdi)
972         mov    %edx,-0x6(%rdi)
973         mov    %dx,-0x2(%rdi)
974         retq
976 L(SSE15QB): movdqa %xmm0,-0xbf(%rdi)
977 L(SSE15QA): movdqa %xmm0,-0xaf(%rdi)
978 L(SSE15Q9): movdqa %xmm0,-0x9f(%rdi)
979 L(SSE15Q8): movdqa %xmm0,-0x8f(%rdi)
980 L(SSE15Q7): movdqa %xmm0,-0x7f(%rdi)
981 L(SSE15Q6): movdqa %xmm0,-0x6f(%rdi)
982 L(SSE15Q5): movdqa %xmm0,-0x5f(%rdi)
983 L(SSE15Q4): movdqa %xmm0,-0x4f(%rdi)
984 L(SSE15Q3): movdqa %xmm0,-0x3f(%rdi)
985 L(SSE15Q2): movdqa %xmm0,-0x2f(%rdi)
986 L(SSE15Q1): movdqa %xmm0,-0x1f(%rdi)
987 L(SSE15Q0): mov    %rdx,-0xf(%rdi)
988         mov    %edx,-0x7(%rdi)
989         mov    %dx,-0x3(%rdi)
990         mov    %dl,-0x1(%rdi)
991         retq
993         .balign     16
994 L(byte32sse2_pre):
996         mov    __x86_64_shared_cache_size(%rip),%r9d  # The largest cache size
997         cmp    %r9,%r8
998         jg     L(sse2_nt_move_pre)
999         #jmp    L(byte32sse2)
1000         .balign     16
1001 L(byte32sse2):
1002         lea    -0x80(%r8),%r8 # 128
1003         cmp    $0x80,%r8   # 128
1004         movdqa %xmm0,(%rdi)
1005         movdqa %xmm0,0x10(%rdi)
1006         movdqa %xmm0,0x20(%rdi)
1007         movdqa %xmm0,0x30(%rdi)
1008         movdqa %xmm0,0x40(%rdi)
1009         movdqa %xmm0,0x50(%rdi)
1010         movdqa %xmm0,0x60(%rdi)
1011         movdqa %xmm0,0x70(%rdi)
1013         lea    0x80(%rdi),%rdi
1014         jge    L(byte32sse2)
1015         lea    L(SSExDx)(%rip),%r11
1016         add    %r8,%rdi
1017 #ifndef PIC
1018         jmpq   *(%r11,%r8,8)
1019 #else
1020         movslq    (%r11,%r8,4),%rcx
1021         lea   (%rcx,%r11,1),%r11
1022         jmpq   *%r11
1023 #endif
1025         .balign     16
1026 L(sse2_nt_move_pre):
1027         cmp    $0x0,%r9
1028         je     L(byte32sse2)
1029         jmp    L(sse2_nt_move)
1031         .balign     16
1032 L(sse2_nt_move):
1033         lea    -0x80(%r8),%r8
1034         cmp    $0x80,%r8
1036         movntdq %xmm0,(%rdi)
1037         movntdq %xmm0,0x10(%rdi)
1038         movntdq %xmm0,0x20(%rdi)
1039         movntdq %xmm0,0x30(%rdi)
1040         movntdq %xmm0,0x40(%rdi)
1041         movntdq %xmm0,0x50(%rdi)
1042         movntdq %xmm0,0x60(%rdi)
1043         movntdq %xmm0,0x70(%rdi)
1045         lea    0x80(%rdi),%rdi
1046         jge    L(sse2_nt_move)
1047         lea    L(SSExDx)(%rip),%r11
1048         sfence
1049         add    %r8,%rdi
1050 #ifndef PIC
1051         jmpq   *(%r11,%r8,8)
1052 #else
1053         movslq (%r11,%r8,4),%rcx
1054         lea   (%rcx,%r11,1),%r11
1055         jmpq   *%r11
1056 #endif
1058         .pushsection .rodata
1059         .balign     16
1060 #ifndef PIC
1061 L(SSExDx):
1062         .quad       L(SSE0Q0), L(SSE1Q0), L(SSE2Q0), L(SSE3Q0)
1063         .quad       L(SSE4Q0), L(SSE5Q0), L(SSE6Q0), L(SSE7Q0)
1064         .quad       L(SSE8Q0), L(SSE9Q0), L(SSE10Q0), L(SSE11Q0)
1065         .quad       L(SSE12Q0), L(SSE13Q0), L(SSE14Q0), L(SSE15Q0)
1066         .quad       L(SSE0Q1), L(SSE1Q1), L(SSE2Q1), L(SSE3Q1)
1067         .quad       L(SSE4Q1), L(SSE5Q1), L(SSE6Q1), L(SSE7Q1)
1068         .quad       L(SSE8Q1), L(SSE9Q1), L(SSE10Q1), L(SSE11Q1)
1069         .quad       L(SSE12Q1), L(SSE13Q1), L(SSE14Q1), L(SSE15Q1)
1070         .quad       L(SSE0Q2), L(SSE1Q2), L(SSE2Q2), L(SSE3Q2)
1071         .quad       L(SSE4Q2), L(SSE5Q2), L(SSE6Q2), L(SSE7Q2)
1072         .quad       L(SSE8Q2), L(SSE9Q2), L(SSE10Q2), L(SSE11Q2)
1073         .quad       L(SSE12Q2), L(SSE13Q2), L(SSE14Q2), L(SSE15Q2)
1074         .quad       L(SSE0Q3), L(SSE1Q3), L(SSE2Q3), L(SSE3Q3)
1075         .quad       L(SSE4Q3), L(SSE5Q3), L(SSE6Q3), L(SSE7Q3)
1076         .quad       L(SSE8Q3), L(SSE9Q3), L(SSE10Q3), L(SSE11Q3)
1077         .quad       L(SSE12Q3), L(SSE13Q3), L(SSE14Q3), L(SSE15Q3)
1078         .quad       L(SSE0Q4), L(SSE1Q4), L(SSE2Q4), L(SSE3Q4)
1079         .quad       L(SSE4Q4), L(SSE5Q4), L(SSE6Q4), L(SSE7Q4)
1080         .quad       L(SSE8Q4), L(SSE9Q4), L(SSE10Q4), L(SSE11Q4)
1081         .quad       L(SSE12Q4), L(SSE13Q4), L(SSE14Q4), L(SSE15Q4)
1082         .quad       L(SSE0Q5), L(SSE1Q5), L(SSE2Q5), L(SSE3Q5)
1083         .quad       L(SSE4Q5), L(SSE5Q5), L(SSE6Q5), L(SSE7Q5)
1084         .quad       L(SSE8Q5), L(SSE9Q5), L(SSE10Q5), L(SSE11Q5)
1085         .quad       L(SSE12Q5), L(SSE13Q5), L(SSE14Q5), L(SSE15Q5)
1086         .quad       L(SSE0Q6), L(SSE1Q6), L(SSE2Q6), L(SSE3Q6)
1087         .quad       L(SSE4Q6), L(SSE5Q6), L(SSE6Q6), L(SSE7Q6)
1088         .quad       L(SSE8Q6), L(SSE9Q6), L(SSE10Q6), L(SSE11Q6)
1089         .quad       L(SSE12Q6), L(SSE13Q6), L(SSE14Q6), L(SSE15Q6)
1090         .quad       L(SSE0Q7), L(SSE1Q7), L(SSE2Q7), L(SSE3Q7)
1091         .quad       L(SSE4Q7), L(SSE5Q7), L(SSE6Q7), L(SSE7Q7)
1092         .quad       L(SSE8Q7), L(SSE9Q7), L(SSE10Q7), L(SSE11Q7)
1093         .quad       L(SSE12Q7), L(SSE13Q7), L(SSE14Q7), L(SSE15Q7)
1094         .quad       L(SSE0Q8), L(SSE1Q8), L(SSE2Q8), L(SSE3Q8)
1095         .quad       L(SSE4Q8), L(SSE5Q8), L(SSE6Q8), L(SSE7Q8)
1096         .quad       L(SSE8Q8), L(SSE9Q8), L(SSE10Q8), L(SSE11Q8)
1097         .quad       L(SSE12Q8), L(SSE13Q8), L(SSE14Q8), L(SSE15Q8)
1098         .quad       L(SSE0Q9), L(SSE1Q9), L(SSE2Q9), L(SSE3Q9)
1099         .quad       L(SSE4Q9), L(SSE5Q9), L(SSE6Q9), L(SSE7Q9)
1100         .quad       L(SSE8Q9), L(SSE9Q9), L(SSE10Q9), L(SSE11Q9)
1101         .quad       L(SSE12Q9), L(SSE13Q9), L(SSE14Q9), L(SSE15Q9)
1102         .quad       L(SSE0QA), L(SSE1QA), L(SSE2QA), L(SSE3QA)
1103         .quad       L(SSE4QA), L(SSE5QA), L(SSE6QA), L(SSE7QA)
1104         .quad       L(SSE8QA), L(SSE9QA), L(SSE10QA), L(SSE11QA)
1105         .quad       L(SSE12QA), L(SSE13QA), L(SSE14QA), L(SSE15QA)
1106         .quad       L(SSE0QB), L(SSE1QB), L(SSE2QB), L(SSE3QB)
1107         .quad       L(SSE4QB), L(SSE5QB), L(SSE6QB), L(SSE7QB)
1108         .quad       L(SSE8QB), L(SSE9QB), L(SSE10QB), L(SSE11QB)
1109         .quad       L(SSE12QB), L(SSE13QB), L(SSE14QB), L(SSE15QB)
1110 #else
1111 L(SSExDx):
1112         .int       L(SSE0Q0) -L(SSExDx)
1113         .int       L(SSE1Q0) -L(SSExDx)
1114         .int       L(SSE2Q0) -L(SSExDx)
1115         .int       L(SSE3Q0) -L(SSExDx)
1116         .int       L(SSE4Q0) -L(SSExDx)
1117         .int       L(SSE5Q0) -L(SSExDx)
1118         .int       L(SSE6Q0) -L(SSExDx)
1119         .int       L(SSE7Q0) -L(SSExDx)
1121         .int       L(SSE8Q0) -L(SSExDx)
1122         .int       L(SSE9Q0) -L(SSExDx)
1123         .int       L(SSE10Q0)-L(SSExDx)
1124         .int       L(SSE11Q0)-L(SSExDx)
1125         .int       L(SSE12Q0)-L(SSExDx)
1126         .int       L(SSE13Q0)-L(SSExDx)
1127         .int       L(SSE14Q0)-L(SSExDx)
1128         .int       L(SSE15Q0)-L(SSExDx)
1130         .int       L(SSE0Q1) -L(SSExDx)
1131         .int       L(SSE1Q1) -L(SSExDx)
1132         .int       L(SSE2Q1) -L(SSExDx)
1133         .int       L(SSE3Q1) -L(SSExDx)
1134         .int       L(SSE4Q1) -L(SSExDx)
1135         .int       L(SSE5Q1) -L(SSExDx)
1136         .int       L(SSE6Q1) -L(SSExDx)
1137         .int       L(SSE7Q1) -L(SSExDx)
1139         .int       L(SSE8Q1) -L(SSExDx)
1140         .int       L(SSE9Q1) -L(SSExDx)
1141         .int       L(SSE10Q1)-L(SSExDx)
1142         .int       L(SSE11Q1)-L(SSExDx)
1143         .int       L(SSE12Q1)-L(SSExDx)
1144         .int       L(SSE13Q1)-L(SSExDx)
1145         .int       L(SSE14Q1)-L(SSExDx)
1146         .int       L(SSE15Q1)-L(SSExDx)
1148         .int       L(SSE0Q2) -L(SSExDx)
1149         .int       L(SSE1Q2) -L(SSExDx)
1150         .int       L(SSE2Q2) -L(SSExDx)
1151         .int       L(SSE3Q2) -L(SSExDx)
1152         .int       L(SSE4Q2) -L(SSExDx)
1153         .int       L(SSE5Q2) -L(SSExDx)
1154         .int       L(SSE6Q2) -L(SSExDx)
1155         .int       L(SSE7Q2) -L(SSExDx)
1157         .int       L(SSE8Q2) -L(SSExDx)
1158         .int       L(SSE9Q2) -L(SSExDx)
1159         .int       L(SSE10Q2)-L(SSExDx)
1160         .int       L(SSE11Q2)-L(SSExDx)
1161         .int       L(SSE12Q2)-L(SSExDx)
1162         .int       L(SSE13Q2)-L(SSExDx)
1163         .int       L(SSE14Q2)-L(SSExDx)
1164         .int       L(SSE15Q2)-L(SSExDx)
1166         .int       L(SSE0Q3) -L(SSExDx)
1167         .int       L(SSE1Q3) -L(SSExDx)
1168         .int       L(SSE2Q3) -L(SSExDx)
1169         .int       L(SSE3Q3) -L(SSExDx)
1170         .int       L(SSE4Q3) -L(SSExDx)
1171         .int       L(SSE5Q3) -L(SSExDx)
1172         .int       L(SSE6Q3) -L(SSExDx)
1173         .int       L(SSE7Q3) -L(SSExDx)
1175         .int       L(SSE8Q3) -L(SSExDx)
1176         .int       L(SSE9Q3) -L(SSExDx)
1177         .int       L(SSE10Q3)-L(SSExDx)
1178         .int       L(SSE11Q3)-L(SSExDx)
1179         .int       L(SSE12Q3)-L(SSExDx)
1180         .int       L(SSE13Q3)-L(SSExDx)
1181         .int       L(SSE14Q3)-L(SSExDx)
1182         .int       L(SSE15Q3)-L(SSExDx)
1184         .int       L(SSE0Q4) -L(SSExDx)
1185         .int       L(SSE1Q4) -L(SSExDx)
1186         .int       L(SSE2Q4) -L(SSExDx)
1187         .int       L(SSE3Q4) -L(SSExDx)
1188         .int       L(SSE4Q4) -L(SSExDx)
1189         .int       L(SSE5Q4) -L(SSExDx)
1190         .int       L(SSE6Q4) -L(SSExDx)
1191         .int       L(SSE7Q4) -L(SSExDx)
1193         .int       L(SSE8Q4) -L(SSExDx)
1194         .int       L(SSE9Q4) -L(SSExDx)
1195         .int       L(SSE10Q4)-L(SSExDx)
1196         .int       L(SSE11Q4)-L(SSExDx)
1197         .int       L(SSE12Q4)-L(SSExDx)
1198         .int       L(SSE13Q4)-L(SSExDx)
1199         .int       L(SSE14Q4)-L(SSExDx)
1200         .int       L(SSE15Q4)-L(SSExDx)
1202         .int       L(SSE0Q5) -L(SSExDx)
1203         .int       L(SSE1Q5) -L(SSExDx)
1204         .int       L(SSE2Q5) -L(SSExDx)
1205         .int       L(SSE3Q5) -L(SSExDx)
1206         .int       L(SSE4Q5) -L(SSExDx)
1207         .int       L(SSE5Q5) -L(SSExDx)
1208         .int       L(SSE6Q5) -L(SSExDx)
1209         .int       L(SSE7Q5) -L(SSExDx)
1211         .int       L(SSE8Q5) -L(SSExDx)
1212         .int       L(SSE9Q5) -L(SSExDx)
1213         .int       L(SSE10Q5)-L(SSExDx)
1214         .int       L(SSE11Q5)-L(SSExDx)
1215         .int       L(SSE12Q5)-L(SSExDx)
1216         .int       L(SSE13Q5)-L(SSExDx)
1217         .int       L(SSE14Q5)-L(SSExDx)
1218         .int       L(SSE15Q5)-L(SSExDx)
1220         .int       L(SSE0Q6) -L(SSExDx)
1221         .int       L(SSE1Q6) -L(SSExDx)
1222         .int       L(SSE2Q6) -L(SSExDx)
1223         .int       L(SSE3Q6) -L(SSExDx)
1224         .int       L(SSE4Q6) -L(SSExDx)
1225         .int       L(SSE5Q6) -L(SSExDx)
1226         .int       L(SSE6Q6) -L(SSExDx)
1227         .int       L(SSE7Q6) -L(SSExDx)
1229         .int       L(SSE8Q6) -L(SSExDx)
1230         .int       L(SSE9Q6) -L(SSExDx)
1231         .int       L(SSE10Q6)-L(SSExDx)
1232         .int       L(SSE11Q6)-L(SSExDx)
1233         .int       L(SSE12Q6)-L(SSExDx)
1234         .int       L(SSE13Q6)-L(SSExDx)
1235         .int       L(SSE14Q6)-L(SSExDx)
1236         .int       L(SSE15Q6)-L(SSExDx)
1238         .int       L(SSE0Q7) -L(SSExDx)
1239         .int       L(SSE1Q7) -L(SSExDx)
1240         .int       L(SSE2Q7) -L(SSExDx)
1241         .int       L(SSE3Q7) -L(SSExDx)
1242         .int       L(SSE4Q7) -L(SSExDx)
1243         .int       L(SSE5Q7) -L(SSExDx)
1244         .int       L(SSE6Q7) -L(SSExDx)
1245         .int       L(SSE7Q7) -L(SSExDx)
1247         .int       L(SSE8Q7) -L(SSExDx)
1248         .int       L(SSE9Q7) -L(SSExDx)
1249         .int       L(SSE10Q7)-L(SSExDx)
1250         .int       L(SSE11Q7)-L(SSExDx)
1251         .int       L(SSE12Q7)-L(SSExDx)
1252         .int       L(SSE13Q7)-L(SSExDx)
1253         .int       L(SSE14Q7)-L(SSExDx)
1254         .int       L(SSE15Q7)-L(SSExDx)
1256         .int       L(SSE0Q8) -L(SSExDx)
1257         .int       L(SSE1Q8) -L(SSExDx)
1258         .int       L(SSE2Q8) -L(SSExDx)
1259         .int       L(SSE3Q8) -L(SSExDx)
1260         .int       L(SSE4Q8) -L(SSExDx)
1261         .int       L(SSE5Q8) -L(SSExDx)
1262         .int       L(SSE6Q8) -L(SSExDx)
1263         .int       L(SSE7Q8) -L(SSExDx)
1265         .int       L(SSE8Q8) -L(SSExDx)
1266         .int       L(SSE9Q8) -L(SSExDx)
1267         .int       L(SSE10Q8)-L(SSExDx)
1268         .int       L(SSE11Q8)-L(SSExDx)
1269         .int       L(SSE12Q8)-L(SSExDx)
1270         .int       L(SSE13Q8)-L(SSExDx)
1271         .int       L(SSE14Q8)-L(SSExDx)
1272         .int       L(SSE15Q8)-L(SSExDx)
1274         .int       L(SSE0Q9) -L(SSExDx)
1275         .int       L(SSE1Q9) -L(SSExDx)
1276         .int       L(SSE2Q9) -L(SSExDx)
1277         .int       L(SSE3Q9) -L(SSExDx)
1278         .int       L(SSE4Q9) -L(SSExDx)
1279         .int       L(SSE5Q9) -L(SSExDx)
1280         .int       L(SSE6Q9) -L(SSExDx)
1281         .int       L(SSE7Q9) -L(SSExDx)
1283         .int       L(SSE8Q9) -L(SSExDx)
1284         .int       L(SSE9Q9) -L(SSExDx)
1285         .int       L(SSE10Q9)-L(SSExDx)
1286         .int       L(SSE11Q9)-L(SSExDx)
1287         .int       L(SSE12Q9)-L(SSExDx)
1288         .int       L(SSE13Q9)-L(SSExDx)
1289         .int       L(SSE14Q9)-L(SSExDx)
1290         .int       L(SSE15Q9)-L(SSExDx)
1292         .int       L(SSE0QA) -L(SSExDx)
1293         .int       L(SSE1QA) -L(SSExDx)
1294         .int       L(SSE2QA) -L(SSExDx)
1295         .int       L(SSE3QA) -L(SSExDx)
1296         .int       L(SSE4QA) -L(SSExDx)
1297         .int       L(SSE5QA) -L(SSExDx)
1298         .int       L(SSE6QA) -L(SSExDx)
1299         .int       L(SSE7QA) -L(SSExDx)
1301         .int       L(SSE8QA) -L(SSExDx)
1302         .int       L(SSE9QA) -L(SSExDx)
1303         .int       L(SSE10QA)-L(SSExDx)
1304         .int       L(SSE11QA)-L(SSExDx)
1305         .int       L(SSE12QA)-L(SSExDx)
1306         .int       L(SSE13QA)-L(SSExDx)
1307         .int       L(SSE14QA)-L(SSExDx)
1308         .int       L(SSE15QA)-L(SSExDx)
1310         .int       L(SSE0QB) -L(SSExDx)
1311         .int       L(SSE1QB) -L(SSExDx)
1312         .int       L(SSE2QB) -L(SSExDx)
1313         .int       L(SSE3QB) -L(SSExDx)
1314         .int       L(SSE4QB) -L(SSExDx)
1315         .int       L(SSE5QB) -L(SSExDx)
1316         .int       L(SSE6QB) -L(SSExDx)
1317         .int       L(SSE7QB) -L(SSExDx)
1319         .int       L(SSE8QB) -L(SSExDx)
1320         .int       L(SSE9QB) -L(SSExDx)
1321         .int       L(SSE10QB)-L(SSExDx)
1322         .int       L(SSE11QB)-L(SSExDx)
1323         .int       L(SSE12QB)-L(SSExDx)
1324         .int       L(SSE13QB)-L(SSExDx)
1325         .int       L(SSE14QB)-L(SSExDx)
1326         .int       L(SSE15QB)-L(SSExDx)
1327 #endif
1328         .popsection
1330 END (memset)
1331 libc_hidden_builtin_def (memset)
1333 #if defined PIC && !defined NOT_IN_libc
1334 strong_alias (__memset_chk, __memset_zero_constant_len_parameter)
1335         .section .gnu.warning.__memset_zero_constant_len_parameter
1336         .string "memset used with constant zero length parameter; this could be due to transposed parameters"
1337 #endif