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