This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PING] [PATCH] Faster memset on x64.
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: libc-alpha at sourceware dot org
- Date: Mon, 6 May 2013 09:42:48 +0200
- Subject: [PING] [PATCH] Faster memset on x64.
- References: <20130429181611 dot GA28442 at domone dot kolej dot mff dot cuni dot cz> <20130430154132 dot GA6521 at domone dot kolej dot mff dot cuni dot cz>
ping
On Tue, Apr 30, 2013 at 05:41:32PM +0200, OndÅej BÃlka wrote:
> Last post contained older version. Here is up-to-date version.
>
> On Mon, Apr 29, 2013 at 08:16:11PM +0200, OndÅej BÃlka wrote:
> > Hi,
> > this is second part of what I worked, memset.
> > It is basicaly memcpy from previous patch with loads replaced by
> > constant. However control flow is bit different as memset receives
> > bigger inputs than memcpy (generator attached.).
> >
> > Performance characteristics are here:
> >
> > http://kam.mff.cuni.cz/~ondra/memset_profile.html
> >
> > When hooking gcc I got about 10% improvement for most architectures.
> > As this implementation has simpler control flow without computed jumps
> > it is faster by about 50 cycles on most architectures.
> > Exception are old core2 and athlon. There I need assumption that memset
> > receives 16-byte aligned inputs which is according to my profile in 99%
> > of cases true.
> >
> >
> > I added optimized __bzero as in my previous patch.
> >
> > As I asked at
> > http://www.sourceware.org/ml/libc-alpha/2013-02/msg00213.html
> > I added candidate __memset_tail function which I will use in strncpy.
> > A code is equivalent to:
> > char* __memset_tail (char *x, int c, size_t n,char *ret)
> > {
> > memset(x,c,n);
> > return ret;
> > }
> > But can be used to save call overhead by making this tail call.
> >
> >
> > What could be done are prefetching and nontemporal loads.
> > I do not know how to make prefetching that pays itself on big inputs
> > more than what it loses on small inputs. I currently do not use
> > nontemporal loads.
> >
> > I become more and more convinced that prefetching could be better
> > handled at cpu level. Idealy I want these in lower levels of cache (say
> > first 10% of L1 cache), rest in L2 cache (and so on when it does not
> > fit).
> >
> > Possible implementation is following: Give i-th cache line in
> > stream weigth 1/i. We add this line to cache only if replacement has
> > frequency lower than weigth. If we do not add it to cache we decrease
> > replacement frequency.
> >
> > I could implement wmemset as in commented code below. Is this wise to
> > keep it there should I move that separately?
> >
> > OK for 2.18?
> >
> > Ondra
> >
> * sysdeps/x86_64/memset.S (memset): New implementation.
> (__bzero): Likewise.
> (__memset_tail): New function.
>
>
> ---
> sysdeps/x86_64/memset.S | 1414 ++++-------------------------------------------
> 1 files changed, 99 insertions(+), 1315 deletions(-)
>
> diff --git a/sysdeps/x86_64/memset.S b/sysdeps/x86_64/memset.S
> index b393efe..d7fc5fe 100644
> --- a/sysdeps/x86_64/memset.S
> +++ b/sysdeps/x86_64/memset.S
> @@ -19,17 +19,41 @@
>
> #include <sysdep.h>
>
> -#define __STOS_LOWER_BOUNDARY $8192
> -#define __STOS_UPPER_BOUNDARY $65536
> +#ifndef ALIGN
> +# define ALIGN(n) .p2align n
> +#endif
>
> .text
> #if !defined NOT_IN_libc
> ENTRY(__bzero)
> - mov %rsi,%rdx /* Adjust parameter. */
> - xorl %esi,%esi /* Fill with 0s. */
> - jmp L(memset_entry)
> + movq %rdi, %rax # Set return value.
> + movq %rsi, %rdx # Set n.
> + pxor %xmm8, %xmm8
> + jmp L(entry_from_bzero)
> END(__bzero)
> weak_alias (__bzero, bzero)
> +
> +/* Like memset but takes additional parameter with return value. */
> +ENTRY(__memset_tail)
> + movq %rcx, %rax # Set return value.
> +
> + movd %esi, %xmm8
> + punpcklbw %xmm8, %xmm8
> + punpcklwd %xmm8, %xmm8
> + pshufd $0, %xmm8, %xmm8
> +
> + jmp L(entry_from_bzero)
> +END(__memset_tail)
> +
> +/*
> +ENTRY(wmemset)
> + movd %esi, %xmm8
> + movq %rdi, %rax
> + pshufd $0, %xmm8, %xmm8
> + jmp L(entry_from_bzero)
> +END(wmemset)
> +*/
> +
> #endif
>
> #if defined PIC && !defined NOT_IN_libc
> @@ -39,1317 +63,77 @@ ENTRY_CHK (__memset_chk)
> END_CHK (__memset_chk)
> #endif
> ENTRY (memset)
> -L(memset_entry):
> - cmp $0x1,%rdx
> - mov %rdi,%rax /* memset returns the dest address. */
> - jne L(ck2)
> - mov %sil,(%rdi)
> - retq
> -L(ck2):
> - mov $0x101010101010101,%r9
> - mov %rdx,%r8
> - movzbq %sil,%rdx
> - imul %r9,%rdx
> -L(now_dw_aligned):
> - cmp $0x90,%r8
> - ja L(ck_mem_ops_method)
> -L(now_dw_aligned_small):
> - add %r8,%rdi
> -#ifndef PIC
> - lea L(setPxQx)(%rip),%r11
> - jmpq *(%r11,%r8,8)
> -#else
> - lea L(Got0)(%rip),%r11
> - lea L(setPxQx)(%rip),%rcx
> - movswq (%rcx,%r8,2),%rcx
> - lea (%rcx,%r11,1),%r11
> - jmpq *%r11
> -#endif
> -
> -L(Got0):
> - retq
> -
> - .pushsection .rodata
> - .balign 16
> -#ifndef PIC
> -L(setPxQx):
> - .quad L(Got0), L(P1Q0), L(P2Q0), L(P3Q0)
> - .quad L(P4Q0), L(P5Q0), L(P6Q0), L(P7Q0)
> - .quad L(P0Q1), L(P1Q1), L(P2Q1), L(P3Q1)
> - .quad L(P4Q1), L(P5Q1), L(P6Q1), L(P7Q1)
> - .quad L(P0Q2), L(P1Q2), L(P2Q2), L(P3Q2)
> - .quad L(P4Q2), L(P5Q2), L(P6Q2), L(P7Q2)
> - .quad L(P0Q3), L(P1Q3), L(P2Q3), L(P3Q3)
> - .quad L(P4Q3), L(P5Q3), L(P6Q3), L(P7Q3)
> - .quad L(P0Q4), L(P1Q4), L(P2Q4), L(P3Q4)
> - .quad L(P4Q4), L(P5Q4), L(P6Q4), L(P7Q4)
> - .quad L(P0Q5), L(P1Q5), L(P2Q5), L(P3Q5)
> - .quad L(P4Q5), L(P5Q5), L(P6Q5), L(P7Q5)
> - .quad L(P0Q6), L(P1Q6), L(P2Q6), L(P3Q6)
> - .quad L(P4Q6), L(P5Q6), L(P6Q6), L(P7Q6)
> - .quad L(P0Q7), L(P1Q7), L(P2Q7), L(P3Q7)
> - .quad L(P4Q7), L(P5Q7), L(P6Q7), L(P7Q7)
> - .quad L(P0Q8), L(P1Q8), L(P2Q8), L(P3Q8)
> - .quad L(P4Q8), L(P5Q8), L(P6Q8), L(P7Q8)
> - .quad L(P0Q9), L(P1Q9), L(P2Q9), L(P3Q9)
> - .quad L(P4Q9), L(P5Q9), L(P6Q9), L(P7Q9)
> - .quad L(P0QA), L(P1QA), L(P2QA), L(P3QA)
> - .quad L(P4QA), L(P5QA), L(P6QA), L(P7QA)
> - .quad L(P0QB), L(P1QB), L(P2QB), L(P3QB)
> - .quad L(P4QB), L(P5QB), L(P6QB), L(P7QB)
> - .quad L(P0QC), L(P1QC), L(P2QC), L(P3QC)
> - .quad L(P4QC), L(P5QC), L(P6QC), L(P7QC)
> - .quad L(P0QD), L(P1QD), L(P2QD), L(P3QD)
> - .quad L(P4QD), L(P5QD), L(P6QD), L(P7QD)
> - .quad L(P0QE), L(P1QE), L(P2QE), L(P3QE)
> - .quad L(P4QE), L(P5QE), L(P6QE), L(P7QE)
> - .quad L(P0QF), L(P1QF), L(P2QF), L(P3QF)
> - .quad L(P4QF), L(P5QF), L(P6QF), L(P7QF)
> - .quad L(P0QG), L(P1QG), L(P2QG), L(P3QG)
> - .quad L(P4QG), L(P5QG), L(P6QG), L(P7QG)
> - .quad L(P0QH), L(P1QH), L(P2QH), L(P3QH)
> - .quad L(P4QH), L(P5QH), L(P6QH), L(P7QH)
> - .quad L(P0QI)
> -# ifdef USE_EXTRA_TABLE
> - .quad L(P1QI), L(P2QI), L(P3QI), L(P4QI)
> - .quad L(P5QI), L(P6QI), L(P7QI)
> -# endif
> -#else
> -L(setPxQx):
> - .short L(Got0)-L(Got0)
> - .short L(P1Q0)-L(Got0)
> - .short L(P2Q0)-L(Got0)
> - .short L(P3Q0)-L(Got0)
> - .short L(P4Q0)-L(Got0)
> - .short L(P5Q0)-L(Got0)
> - .short L(P6Q0)-L(Got0)
> - .short L(P7Q0)-L(Got0)
> -
> - .short L(P0Q1)-L(Got0)
> - .short L(P1Q1)-L(Got0)
> - .short L(P2Q1)-L(Got0)
> - .short L(P3Q1)-L(Got0)
> - .short L(P4Q1)-L(Got0)
> - .short L(P5Q1)-L(Got0)
> - .short L(P6Q1)-L(Got0)
> - .short L(P7Q1)-L(Got0)
> -
> - .short L(P0Q2)-L(Got0)
> - .short L(P1Q2)-L(Got0)
> - .short L(P2Q2)-L(Got0)
> - .short L(P3Q2)-L(Got0)
> - .short L(P4Q2)-L(Got0)
> - .short L(P5Q2)-L(Got0)
> - .short L(P6Q2)-L(Got0)
> - .short L(P7Q2)-L(Got0)
> -
> - .short L(P0Q3)-L(Got0)
> - .short L(P1Q3)-L(Got0)
> - .short L(P2Q3)-L(Got0)
> - .short L(P3Q3)-L(Got0)
> - .short L(P4Q3)-L(Got0)
> - .short L(P5Q3)-L(Got0)
> - .short L(P6Q3)-L(Got0)
> - .short L(P7Q3)-L(Got0)
> -
> - .short L(P0Q4)-L(Got0)
> - .short L(P1Q4)-L(Got0)
> - .short L(P2Q4)-L(Got0)
> - .short L(P3Q4)-L(Got0)
> - .short L(P4Q4)-L(Got0)
> - .short L(P5Q4)-L(Got0)
> - .short L(P6Q4)-L(Got0)
> - .short L(P7Q4)-L(Got0)
> -
> - .short L(P0Q5)-L(Got0)
> - .short L(P1Q5)-L(Got0)
> - .short L(P2Q5)-L(Got0)
> - .short L(P3Q5)-L(Got0)
> - .short L(P4Q5)-L(Got0)
> - .short L(P5Q5)-L(Got0)
> - .short L(P6Q5)-L(Got0)
> - .short L(P7Q5)-L(Got0)
> -
> - .short L(P0Q6)-L(Got0)
> - .short L(P1Q6)-L(Got0)
> - .short L(P2Q6)-L(Got0)
> - .short L(P3Q6)-L(Got0)
> - .short L(P4Q6)-L(Got0)
> - .short L(P5Q6)-L(Got0)
> - .short L(P6Q6)-L(Got0)
> - .short L(P7Q6)-L(Got0)
> -
> - .short L(P0Q7)-L(Got0)
> - .short L(P1Q7)-L(Got0)
> - .short L(P2Q7)-L(Got0)
> - .short L(P3Q7)-L(Got0)
> - .short L(P4Q7)-L(Got0)
> - .short L(P5Q7)-L(Got0)
> - .short L(P6Q7)-L(Got0)
> - .short L(P7Q7)-L(Got0)
> -
> - .short L(P0Q8)-L(Got0)
> - .short L(P1Q8)-L(Got0)
> - .short L(P2Q8)-L(Got0)
> - .short L(P3Q8)-L(Got0)
> - .short L(P4Q8)-L(Got0)
> - .short L(P5Q8)-L(Got0)
> - .short L(P6Q8)-L(Got0)
> - .short L(P7Q8)-L(Got0)
> -
> - .short L(P0Q9)-L(Got0)
> - .short L(P1Q9)-L(Got0)
> - .short L(P2Q9)-L(Got0)
> - .short L(P3Q9)-L(Got0)
> - .short L(P4Q9)-L(Got0)
> - .short L(P5Q9)-L(Got0)
> - .short L(P6Q9)-L(Got0)
> - .short L(P7Q9)-L(Got0)
> -
> - .short L(P0QA)-L(Got0)
> - .short L(P1QA)-L(Got0)
> - .short L(P2QA)-L(Got0)
> - .short L(P3QA)-L(Got0)
> - .short L(P4QA)-L(Got0)
> - .short L(P5QA)-L(Got0)
> - .short L(P6QA)-L(Got0)
> - .short L(P7QA)-L(Got0)
> -
> - .short L(P0QB)-L(Got0)
> - .short L(P1QB)-L(Got0)
> - .short L(P2QB)-L(Got0)
> - .short L(P3QB)-L(Got0)
> - .short L(P4QB)-L(Got0)
> - .short L(P5QB)-L(Got0)
> - .short L(P6QB)-L(Got0)
> - .short L(P7QB)-L(Got0)
> -
> - .short L(P0QC)-L(Got0)
> - .short L(P1QC)-L(Got0)
> - .short L(P2QC)-L(Got0)
> - .short L(P3QC)-L(Got0)
> - .short L(P4QC)-L(Got0)
> - .short L(P5QC)-L(Got0)
> - .short L(P6QC)-L(Got0)
> - .short L(P7QC)-L(Got0)
> -
> - .short L(P0QD)-L(Got0)
> - .short L(P1QD)-L(Got0)
> - .short L(P2QD)-L(Got0)
> - .short L(P3QD)-L(Got0)
> - .short L(P4QD)-L(Got0)
> - .short L(P5QD)-L(Got0)
> - .short L(P6QD)-L(Got0)
> - .short L(P7QD)-L(Got0)
> -
> - .short L(P0QE)-L(Got0)
> - .short L(P1QE)-L(Got0)
> - .short L(P2QE)-L(Got0)
> - .short L(P3QE)-L(Got0)
> - .short L(P4QE)-L(Got0)
> - .short L(P5QE)-L(Got0)
> - .short L(P6QE)-L(Got0)
> - .short L(P7QE)-L(Got0)
> -
> - .short L(P0QF)-L(Got0)
> - .short L(P1QF)-L(Got0)
> - .short L(P2QF)-L(Got0)
> - .short L(P3QF)-L(Got0)
> - .short L(P4QF)-L(Got0)
> - .short L(P5QF)-L(Got0)
> - .short L(P6QF)-L(Got0)
> - .short L(P7QF)-L(Got0)
> -
> - .short L(P0QG)-L(Got0)
> - .short L(P1QG)-L(Got0)
> - .short L(P2QG)-L(Got0)
> - .short L(P3QG)-L(Got0)
> - .short L(P4QG)-L(Got0)
> - .short L(P5QG)-L(Got0)
> - .short L(P6QG)-L(Got0)
> - .short L(P7QG)-L(Got0)
> -
> - .short L(P0QH)-L(Got0)
> - .short L(P1QH)-L(Got0)
> - .short L(P2QH)-L(Got0)
> - .short L(P3QH)-L(Got0)
> - .short L(P4QH)-L(Got0)
> - .short L(P5QH)-L(Got0)
> - .short L(P6QH)-L(Got0)
> - .short L(P7QH)-L(Got0)
> -
> - .short L(P0QI)-L(Got0)
> -# ifdef USE_EXTRA_TABLE
> - .short L(P1QI)-L(Got0)
> - .short L(P2QI)-L(Got0)
> - .short L(P3QI)-L(Got0)
> - .short L(P4QI)-L(Got0)
> - .short L(P5QI)-L(Got0)
> - .short L(P6QI)-L(Got0)
> - .short L(P7QI)-L(Got0)
> -# endif
> -#endif
> - .popsection
> -
> - .balign 16
> -#ifdef USE_EXTRA_TABLE
> -L(P1QI): mov %rdx,-0x91(%rdi)
> -#endif
> -L(P1QH): mov %rdx,-0x89(%rdi)
> -L(P1QG): mov %rdx,-0x81(%rdi)
> -# .balign 16
> -L(P1QF): mov %rdx,-0x79(%rdi)
> -L(P1QE): mov %rdx,-0x71(%rdi)
> -L(P1QD): mov %rdx,-0x69(%rdi)
> -L(P1QC): mov %rdx,-0x61(%rdi)
> -L(P1QB): mov %rdx,-0x59(%rdi)
> -L(P1QA): mov %rdx,-0x51(%rdi)
> -L(P1Q9): mov %rdx,-0x49(%rdi)
> -L(P1Q8): mov %rdx,-0x41(%rdi)
> -L(P1Q7): mov %rdx,-0x39(%rdi)
> -L(P1Q6): mov %rdx,-0x31(%rdi)
> -L(P1Q5): mov %rdx,-0x29(%rdi)
> -L(P1Q4): mov %rdx,-0x21(%rdi)
> -L(P1Q3): mov %rdx,-0x19(%rdi)
> -L(P1Q2): mov %rdx,-0x11(%rdi)
> -L(P1Q1): mov %rdx,-0x9(%rdi)
> -L(P1Q0): mov %dl,-0x1(%rdi)
> - retq
> -
> - .balign 16
> -L(P0QI): mov %rdx,-0x90(%rdi)
> -L(P0QH): mov %rdx,-0x88(%rdi)
> -# .balign 16
> -L(P0QG): mov %rdx,-0x80(%rdi)
> -L(P0QF): mov %rdx,-0x78(%rdi)
> -L(P0QE): mov %rdx,-0x70(%rdi)
> -L(P0QD): mov %rdx,-0x68(%rdi)
> -L(P0QC): mov %rdx,-0x60(%rdi)
> -L(P0QB): mov %rdx,-0x58(%rdi)
> -L(P0QA): mov %rdx,-0x50(%rdi)
> -L(P0Q9): mov %rdx,-0x48(%rdi)
> -L(P0Q8): mov %rdx,-0x40(%rdi)
> -L(P0Q7): mov %rdx,-0x38(%rdi)
> -L(P0Q6): mov %rdx,-0x30(%rdi)
> -L(P0Q5): mov %rdx,-0x28(%rdi)
> -L(P0Q4): mov %rdx,-0x20(%rdi)
> -L(P0Q3): mov %rdx,-0x18(%rdi)
> -L(P0Q2): mov %rdx,-0x10(%rdi)
> -L(P0Q1): mov %rdx,-0x8(%rdi)
> -L(P0Q0): retq
> -
> -
> - .balign 16
> -#ifdef USE_EXTRA_TABLE
> -L(P2QI): mov %rdx,-0x92(%rdi)
> -#endif
> -L(P2QH): mov %rdx,-0x8a(%rdi)
> -L(P2QG): mov %rdx,-0x82(%rdi)
> -# .balign 16
> -L(P2QF): mov %rdx,-0x7a(%rdi)
> -L(P2QE): mov %rdx,-0x72(%rdi)
> -L(P2QD): mov %rdx,-0x6a(%rdi)
> -L(P2QC): mov %rdx,-0x62(%rdi)
> -L(P2QB): mov %rdx,-0x5a(%rdi)
> -L(P2QA): mov %rdx,-0x52(%rdi)
> -L(P2Q9): mov %rdx,-0x4a(%rdi)
> -L(P2Q8): mov %rdx,-0x42(%rdi)
> -L(P2Q7): mov %rdx,-0x3a(%rdi)
> -L(P2Q6): mov %rdx,-0x32(%rdi)
> -L(P2Q5): mov %rdx,-0x2a(%rdi)
> -L(P2Q4): mov %rdx,-0x22(%rdi)
> -L(P2Q3): mov %rdx,-0x1a(%rdi)
> -L(P2Q2): mov %rdx,-0x12(%rdi)
> -L(P2Q1): mov %rdx,-0xa(%rdi)
> -L(P2Q0): mov %dx,-0x2(%rdi)
> - retq
> -
> - .balign 16
> -#ifdef USE_EXTRA_TABLE
> -L(P3QI): mov %rdx,-0x93(%rdi)
> -#endif
> -L(P3QH): mov %rdx,-0x8b(%rdi)
> -L(P3QG): mov %rdx,-0x83(%rdi)
> -# .balign 16
> -L(P3QF): mov %rdx,-0x7b(%rdi)
> -L(P3QE): mov %rdx,-0x73(%rdi)
> -L(P3QD): mov %rdx,-0x6b(%rdi)
> -L(P3QC): mov %rdx,-0x63(%rdi)
> -L(P3QB): mov %rdx,-0x5b(%rdi)
> -L(P3QA): mov %rdx,-0x53(%rdi)
> -L(P3Q9): mov %rdx,-0x4b(%rdi)
> -L(P3Q8): mov %rdx,-0x43(%rdi)
> -L(P3Q7): mov %rdx,-0x3b(%rdi)
> -L(P3Q6): mov %rdx,-0x33(%rdi)
> -L(P3Q5): mov %rdx,-0x2b(%rdi)
> -L(P3Q4): mov %rdx,-0x23(%rdi)
> -L(P3Q3): mov %rdx,-0x1b(%rdi)
> -L(P3Q2): mov %rdx,-0x13(%rdi)
> -L(P3Q1): mov %rdx,-0xb(%rdi)
> -L(P3Q0): mov %dx,-0x3(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> - .balign 16
> -#ifdef USE_EXTRA_TABLE
> -L(P4QI): mov %rdx,-0x94(%rdi)
> -#endif
> -L(P4QH): mov %rdx,-0x8c(%rdi)
> -L(P4QG): mov %rdx,-0x84(%rdi)
> -# .balign 16
> -L(P4QF): mov %rdx,-0x7c(%rdi)
> -L(P4QE): mov %rdx,-0x74(%rdi)
> -L(P4QD): mov %rdx,-0x6c(%rdi)
> -L(P4QC): mov %rdx,-0x64(%rdi)
> -L(P4QB): mov %rdx,-0x5c(%rdi)
> -L(P4QA): mov %rdx,-0x54(%rdi)
> -L(P4Q9): mov %rdx,-0x4c(%rdi)
> -L(P4Q8): mov %rdx,-0x44(%rdi)
> -L(P4Q7): mov %rdx,-0x3c(%rdi)
> -L(P4Q6): mov %rdx,-0x34(%rdi)
> -L(P4Q5): mov %rdx,-0x2c(%rdi)
> -L(P4Q4): mov %rdx,-0x24(%rdi)
> -L(P4Q3): mov %rdx,-0x1c(%rdi)
> -L(P4Q2): mov %rdx,-0x14(%rdi)
> -L(P4Q1): mov %rdx,-0xc(%rdi)
> -L(P4Q0): mov %edx,-0x4(%rdi)
> - retq
> -
> - .balign 16
> -#ifdef USE_EXTRA_TABLE
> -L(P5QI): mov %rdx,-0x95(%rdi)
> -#endif
> -L(P5QH): mov %rdx,-0x8d(%rdi)
> -L(P5QG): mov %rdx,-0x85(%rdi)
> -# .balign 16
> -L(P5QF): mov %rdx,-0x7d(%rdi)
> -L(P5QE): mov %rdx,-0x75(%rdi)
> -L(P5QD): mov %rdx,-0x6d(%rdi)
> -L(P5QC): mov %rdx,-0x65(%rdi)
> -L(P5QB): mov %rdx,-0x5d(%rdi)
> -L(P5QA): mov %rdx,-0x55(%rdi)
> -L(P5Q9): mov %rdx,-0x4d(%rdi)
> -L(P5Q8): mov %rdx,-0x45(%rdi)
> -L(P5Q7): mov %rdx,-0x3d(%rdi)
> -L(P5Q6): mov %rdx,-0x35(%rdi)
> -L(P5Q5): mov %rdx,-0x2d(%rdi)
> -L(P5Q4): mov %rdx,-0x25(%rdi)
> -L(P5Q3): mov %rdx,-0x1d(%rdi)
> -L(P5Q2): mov %rdx,-0x15(%rdi)
> -L(P5Q1): mov %rdx,-0xd(%rdi)
> -L(P5Q0): mov %edx,-0x5(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> - .balign 16
> -#ifdef USE_EXTRA_TABLE
> -L(P6QI): mov %rdx,-0x96(%rdi)
> -#endif
> -L(P6QH): mov %rdx,-0x8e(%rdi)
> -L(P6QG): mov %rdx,-0x86(%rdi)
> -# .balign 16
> -L(P6QF): mov %rdx,-0x7e(%rdi)
> -L(P6QE): mov %rdx,-0x76(%rdi)
> -L(P6QD): mov %rdx,-0x6e(%rdi)
> -L(P6QC): mov %rdx,-0x66(%rdi)
> -L(P6QB): mov %rdx,-0x5e(%rdi)
> -L(P6QA): mov %rdx,-0x56(%rdi)
> -L(P6Q9): mov %rdx,-0x4e(%rdi)
> -L(P6Q8): mov %rdx,-0x46(%rdi)
> -L(P6Q7): mov %rdx,-0x3e(%rdi)
> -L(P6Q6): mov %rdx,-0x36(%rdi)
> -L(P6Q5): mov %rdx,-0x2e(%rdi)
> -L(P6Q4): mov %rdx,-0x26(%rdi)
> -L(P6Q3): mov %rdx,-0x1e(%rdi)
> -L(P6Q2): mov %rdx,-0x16(%rdi)
> -L(P6Q1): mov %rdx,-0xe(%rdi)
> -L(P6Q0): mov %edx,-0x6(%rdi)
> - mov %dx,-0x2(%rdi)
> - retq
> -
> - .balign 16
> -#ifdef USE_EXTRA_TABLE
> -L(P7QI): mov %rdx,-0x97(%rdi)
> -#endif
> -L(P7QH): mov %rdx,-0x8f(%rdi)
> -L(P7QG): mov %rdx,-0x87(%rdi)
> -# .balign 16
> -L(P7QF): mov %rdx,-0x7f(%rdi)
> -L(P7QE): mov %rdx,-0x77(%rdi)
> -L(P7QD): mov %rdx,-0x6f(%rdi)
> -L(P7QC): mov %rdx,-0x67(%rdi)
> -L(P7QB): mov %rdx,-0x5f(%rdi)
> -L(P7QA): mov %rdx,-0x57(%rdi)
> -L(P7Q9): mov %rdx,-0x4f(%rdi)
> -L(P7Q8): mov %rdx,-0x47(%rdi)
> -L(P7Q7): mov %rdx,-0x3f(%rdi)
> -L(P7Q6): mov %rdx,-0x37(%rdi)
> -L(P7Q5): mov %rdx,-0x2f(%rdi)
> -L(P7Q4): mov %rdx,-0x27(%rdi)
> -L(P7Q3): mov %rdx,-0x1f(%rdi)
> -L(P7Q2): mov %rdx,-0x17(%rdi)
> -L(P7Q1): mov %rdx,-0xf(%rdi)
> -L(P7Q0): mov %edx,-0x7(%rdi)
> - mov %dx,-0x3(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> - .balign 16
> -L(ck_mem_ops_method):
> -
> -# align to 16 byte boundary first
> - #test $0xf,%rdi
> - #jz L(aligned_now)
> - mov $0x10,%r10
> - mov %rdi,%r9
> - and $0xf,%r9
> - sub %r9,%r10
> - and $0xf,%r10
> - add %r10,%rdi
> - sub %r10,%r8
> -#ifndef PIC
> - lea L(AliPxQx)(%rip),%r11
> - jmpq *(%r11,%r10,8)
> -#else
> - lea L(aligned_now)(%rip), %r11
> - lea L(AliPxQx)(%rip),%rcx
> - movswq (%rcx,%r10,2),%rcx
> - lea (%rcx,%r11,1),%r11
> - jmpq *%r11
> -#endif
> -
> - .pushsection .rodata
> - .balign 16
> -#ifndef PIC
> -L(AliPxQx):
> - .quad L(aligned_now), L(A1Q0), L(A2Q0), L(A3Q0)
> - .quad L(A4Q0), L(A5Q0), L(A6Q0), L(A7Q0)
> - .quad L(A0Q1), L(A1Q1), L(A2Q1), L(A3Q1)
> - .quad L(A4Q1), L(A5Q1), L(A6Q1), L(A7Q1)
> -#else
> -L(AliPxQx):
> - .short L(aligned_now)-L(aligned_now)
> - .short L(A1Q0)-L(aligned_now)
> - .short L(A2Q0)-L(aligned_now)
> - .short L(A3Q0)-L(aligned_now)
> - .short L(A4Q0)-L(aligned_now)
> - .short L(A5Q0)-L(aligned_now)
> - .short L(A6Q0)-L(aligned_now)
> - .short L(A7Q0)-L(aligned_now)
> -
> - .short L(A0Q1)-L(aligned_now)
> - .short L(A1Q1)-L(aligned_now)
> - .short L(A2Q1)-L(aligned_now)
> - .short L(A3Q1)-L(aligned_now)
> - .short L(A4Q1)-L(aligned_now)
> - .short L(A5Q1)-L(aligned_now)
> - .short L(A6Q1)-L(aligned_now)
> - .short L(A7Q1)-L(aligned_now)
> -#endif
> - .popsection
> -
> - .balign 16
> -L(A5Q1): mov %dl,-0xd(%rdi)
> -L(A4Q1): mov %edx,-0xc(%rdi)
> -L(A0Q1): mov %rdx,-0x8(%rdi)
> -L(A0Q0): jmp L(aligned_now)
> -
> - .balign 16
> -L(A1Q1): mov %dl,-0x9(%rdi)
> - mov %rdx,-0x8(%rdi)
> - jmp L(aligned_now)
> -
> - .balign 16
> -L(A1Q0): mov %dl,-0x1(%rdi)
> - jmp L(aligned_now)
> -
> - .balign 16
> -L(A3Q1): mov %dl,-0xb(%rdi)
> -L(A2Q1): mov %dx,-0xa(%rdi)
> - mov %rdx,-0x8(%rdi)
> - jmp L(aligned_now)
> -
> - .balign 16
> -L(A3Q0): mov %dl,-0x3(%rdi)
> -L(A2Q0): mov %dx,-0x2(%rdi)
> - jmp L(aligned_now)
> -
> - .balign 16
> -L(A5Q0): mov %dl,-0x5(%rdi)
> -L(A4Q0): mov %edx,-0x4(%rdi)
> - jmp L(aligned_now)
> -
> - .balign 16
> -L(A7Q1): mov %dl,-0xf(%rdi)
> -L(A6Q1): mov %dx,-0xe(%rdi)
> - mov %edx,-0xc(%rdi)
> - mov %rdx,-0x8(%rdi)
> - jmp L(aligned_now)
> -
> - .balign 16
> -L(A7Q0): mov %dl,-0x7(%rdi)
> -L(A6Q0): mov %dx,-0x6(%rdi)
> - mov %edx,-0x4(%rdi)
> -
> -#ifndef USE_MULTIARCH
> - jmp L(aligned_now)
> -
> -L(SSE_pre):
> -#else
> -L(aligned_now):
> -#endif
> -#if !defined USE_MULTIARCH || defined USE_SSE2
> - # fill RegXMM0 with the pattern
> - movd %rdx,%xmm0
> - punpcklqdq %xmm0,%xmm0
> -
> - cmp $0xb0,%r8 # 176
> - jae L(byte32sse2_pre)
> -
> - add %r8,%rdi
> -# ifndef PIC
> - lea L(SSExDx)(%rip),%r9
> - jmpq *(%r9,%r8,8)
> -# else
> - lea L(SSE0Q0)(%rip),%r9
> - lea L(SSExDx)(%rip),%rcx
> - movswq (%rcx,%r8,2),%rcx
> - lea (%rcx,%r9,1),%r9
> - jmpq *%r9
> -# endif
> -
> -L(SSE0QB): movdqa %xmm0,-0xb0(%rdi)
> -L(SSE0QA): movdqa %xmm0,-0xa0(%rdi)
> -L(SSE0Q9): movdqa %xmm0,-0x90(%rdi)
> -L(SSE0Q8): movdqa %xmm0,-0x80(%rdi)
> -L(SSE0Q7): movdqa %xmm0,-0x70(%rdi)
> -L(SSE0Q6): movdqa %xmm0,-0x60(%rdi)
> -L(SSE0Q5): movdqa %xmm0,-0x50(%rdi)
> -L(SSE0Q4): movdqa %xmm0,-0x40(%rdi)
> -L(SSE0Q3): movdqa %xmm0,-0x30(%rdi)
> -L(SSE0Q2): movdqa %xmm0,-0x20(%rdi)
> -L(SSE0Q1): movdqa %xmm0,-0x10(%rdi)
> -L(SSE0Q0): retq
> -
> -L(SSE1QB): movdqa %xmm0,-0xb1(%rdi)
> -L(SSE1QA): movdqa %xmm0,-0xa1(%rdi)
> -L(SSE1Q9): movdqa %xmm0,-0x91(%rdi)
> -L(SSE1Q8): movdqa %xmm0,-0x81(%rdi)
> -L(SSE1Q7): movdqa %xmm0,-0x71(%rdi)
> -L(SSE1Q6): movdqa %xmm0,-0x61(%rdi)
> -L(SSE1Q5): movdqa %xmm0,-0x51(%rdi)
> -L(SSE1Q4): movdqa %xmm0,-0x41(%rdi)
> -L(SSE1Q3): movdqa %xmm0,-0x31(%rdi)
> -L(SSE1Q2): movdqa %xmm0,-0x21(%rdi)
> -L(SSE1Q1): movdqa %xmm0,-0x11(%rdi)
> -L(SSE1Q0): mov %dl,-0x1(%rdi)
> - retq
> -
> -L(SSE2QB): movdqa %xmm0,-0xb2(%rdi)
> -L(SSE2QA): movdqa %xmm0,-0xa2(%rdi)
> -L(SSE2Q9): movdqa %xmm0,-0x92(%rdi)
> -L(SSE2Q8): movdqa %xmm0,-0x82(%rdi)
> -L(SSE2Q7): movdqa %xmm0,-0x72(%rdi)
> -L(SSE2Q6): movdqa %xmm0,-0x62(%rdi)
> -L(SSE2Q5): movdqa %xmm0,-0x52(%rdi)
> -L(SSE2Q4): movdqa %xmm0,-0x42(%rdi)
> -L(SSE2Q3): movdqa %xmm0,-0x32(%rdi)
> -L(SSE2Q2): movdqa %xmm0,-0x22(%rdi)
> -L(SSE2Q1): movdqa %xmm0,-0x12(%rdi)
> -L(SSE2Q0): mov %dx,-0x2(%rdi)
> - retq
> -
> -L(SSE3QB): movdqa %xmm0,-0xb3(%rdi)
> -L(SSE3QA): movdqa %xmm0,-0xa3(%rdi)
> -L(SSE3Q9): movdqa %xmm0,-0x93(%rdi)
> -L(SSE3Q8): movdqa %xmm0,-0x83(%rdi)
> -L(SSE3Q7): movdqa %xmm0,-0x73(%rdi)
> -L(SSE3Q6): movdqa %xmm0,-0x63(%rdi)
> -L(SSE3Q5): movdqa %xmm0,-0x53(%rdi)
> -L(SSE3Q4): movdqa %xmm0,-0x43(%rdi)
> -L(SSE3Q3): movdqa %xmm0,-0x33(%rdi)
> -L(SSE3Q2): movdqa %xmm0,-0x23(%rdi)
> -L(SSE3Q1): movdqa %xmm0,-0x13(%rdi)
> -L(SSE3Q0): mov %dx,-0x3(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> -L(SSE4QB): movdqa %xmm0,-0xb4(%rdi)
> -L(SSE4QA): movdqa %xmm0,-0xa4(%rdi)
> -L(SSE4Q9): movdqa %xmm0,-0x94(%rdi)
> -L(SSE4Q8): movdqa %xmm0,-0x84(%rdi)
> -L(SSE4Q7): movdqa %xmm0,-0x74(%rdi)
> -L(SSE4Q6): movdqa %xmm0,-0x64(%rdi)
> -L(SSE4Q5): movdqa %xmm0,-0x54(%rdi)
> -L(SSE4Q4): movdqa %xmm0,-0x44(%rdi)
> -L(SSE4Q3): movdqa %xmm0,-0x34(%rdi)
> -L(SSE4Q2): movdqa %xmm0,-0x24(%rdi)
> -L(SSE4Q1): movdqa %xmm0,-0x14(%rdi)
> -L(SSE4Q0): mov %edx,-0x4(%rdi)
> - retq
> -
> -L(SSE5QB): movdqa %xmm0,-0xb5(%rdi)
> -L(SSE5QA): movdqa %xmm0,-0xa5(%rdi)
> -L(SSE5Q9): movdqa %xmm0,-0x95(%rdi)
> -L(SSE5Q8): movdqa %xmm0,-0x85(%rdi)
> -L(SSE5Q7): movdqa %xmm0,-0x75(%rdi)
> -L(SSE5Q6): movdqa %xmm0,-0x65(%rdi)
> -L(SSE5Q5): movdqa %xmm0,-0x55(%rdi)
> -L(SSE5Q4): movdqa %xmm0,-0x45(%rdi)
> -L(SSE5Q3): movdqa %xmm0,-0x35(%rdi)
> -L(SSE5Q2): movdqa %xmm0,-0x25(%rdi)
> -L(SSE5Q1): movdqa %xmm0,-0x15(%rdi)
> -L(SSE5Q0): mov %edx,-0x5(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> -
> -L(SSE6QB): movdqa %xmm0,-0xb6(%rdi)
> -L(SSE6QA): movdqa %xmm0,-0xa6(%rdi)
> -L(SSE6Q9): movdqa %xmm0,-0x96(%rdi)
> -L(SSE6Q8): movdqa %xmm0,-0x86(%rdi)
> -L(SSE6Q7): movdqa %xmm0,-0x76(%rdi)
> -L(SSE6Q6): movdqa %xmm0,-0x66(%rdi)
> -L(SSE6Q5): movdqa %xmm0,-0x56(%rdi)
> -L(SSE6Q4): movdqa %xmm0,-0x46(%rdi)
> -L(SSE6Q3): movdqa %xmm0,-0x36(%rdi)
> -L(SSE6Q2): movdqa %xmm0,-0x26(%rdi)
> -L(SSE6Q1): movdqa %xmm0,-0x16(%rdi)
> -L(SSE6Q0): mov %edx,-0x6(%rdi)
> - mov %dx,-0x2(%rdi)
> - retq
> -
> -L(SSE7QB): movdqa %xmm0,-0xb7(%rdi)
> -L(SSE7QA): movdqa %xmm0,-0xa7(%rdi)
> -L(SSE7Q9): movdqa %xmm0,-0x97(%rdi)
> -L(SSE7Q8): movdqa %xmm0,-0x87(%rdi)
> -L(SSE7Q7): movdqa %xmm0,-0x77(%rdi)
> -L(SSE7Q6): movdqa %xmm0,-0x67(%rdi)
> -L(SSE7Q5): movdqa %xmm0,-0x57(%rdi)
> -L(SSE7Q4): movdqa %xmm0,-0x47(%rdi)
> -L(SSE7Q3): movdqa %xmm0,-0x37(%rdi)
> -L(SSE7Q2): movdqa %xmm0,-0x27(%rdi)
> -L(SSE7Q1): movdqa %xmm0,-0x17(%rdi)
> -L(SSE7Q0): mov %edx,-0x7(%rdi)
> - mov %dx,-0x3(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> -L(SSE8QB): movdqa %xmm0,-0xb8(%rdi)
> -L(SSE8QA): movdqa %xmm0,-0xa8(%rdi)
> -L(SSE8Q9): movdqa %xmm0,-0x98(%rdi)
> -L(SSE8Q8): movdqa %xmm0,-0x88(%rdi)
> -L(SSE8Q7): movdqa %xmm0,-0x78(%rdi)
> -L(SSE8Q6): movdqa %xmm0,-0x68(%rdi)
> -L(SSE8Q5): movdqa %xmm0,-0x58(%rdi)
> -L(SSE8Q4): movdqa %xmm0,-0x48(%rdi)
> -L(SSE8Q3): movdqa %xmm0,-0x38(%rdi)
> -L(SSE8Q2): movdqa %xmm0,-0x28(%rdi)
> -L(SSE8Q1): movdqa %xmm0,-0x18(%rdi)
> -L(SSE8Q0): mov %rdx,-0x8(%rdi)
> - retq
> -
> -L(SSE9QB): movdqa %xmm0,-0xb9(%rdi)
> -L(SSE9QA): movdqa %xmm0,-0xa9(%rdi)
> -L(SSE9Q9): movdqa %xmm0,-0x99(%rdi)
> -L(SSE9Q8): movdqa %xmm0,-0x89(%rdi)
> -L(SSE9Q7): movdqa %xmm0,-0x79(%rdi)
> -L(SSE9Q6): movdqa %xmm0,-0x69(%rdi)
> -L(SSE9Q5): movdqa %xmm0,-0x59(%rdi)
> -L(SSE9Q4): movdqa %xmm0,-0x49(%rdi)
> -L(SSE9Q3): movdqa %xmm0,-0x39(%rdi)
> -L(SSE9Q2): movdqa %xmm0,-0x29(%rdi)
> -L(SSE9Q1): movdqa %xmm0,-0x19(%rdi)
> -L(SSE9Q0): mov %rdx,-0x9(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> -L(SSE10QB): movdqa %xmm0,-0xba(%rdi)
> -L(SSE10QA): movdqa %xmm0,-0xaa(%rdi)
> -L(SSE10Q9): movdqa %xmm0,-0x9a(%rdi)
> -L(SSE10Q8): movdqa %xmm0,-0x8a(%rdi)
> -L(SSE10Q7): movdqa %xmm0,-0x7a(%rdi)
> -L(SSE10Q6): movdqa %xmm0,-0x6a(%rdi)
> -L(SSE10Q5): movdqa %xmm0,-0x5a(%rdi)
> -L(SSE10Q4): movdqa %xmm0,-0x4a(%rdi)
> -L(SSE10Q3): movdqa %xmm0,-0x3a(%rdi)
> -L(SSE10Q2): movdqa %xmm0,-0x2a(%rdi)
> -L(SSE10Q1): movdqa %xmm0,-0x1a(%rdi)
> -L(SSE10Q0): mov %rdx,-0xa(%rdi)
> - mov %dx,-0x2(%rdi)
> - retq
> -
> -L(SSE11QB): movdqa %xmm0,-0xbb(%rdi)
> -L(SSE11QA): movdqa %xmm0,-0xab(%rdi)
> -L(SSE11Q9): movdqa %xmm0,-0x9b(%rdi)
> -L(SSE11Q8): movdqa %xmm0,-0x8b(%rdi)
> -L(SSE11Q7): movdqa %xmm0,-0x7b(%rdi)
> -L(SSE11Q6): movdqa %xmm0,-0x6b(%rdi)
> -L(SSE11Q5): movdqa %xmm0,-0x5b(%rdi)
> -L(SSE11Q4): movdqa %xmm0,-0x4b(%rdi)
> -L(SSE11Q3): movdqa %xmm0,-0x3b(%rdi)
> -L(SSE11Q2): movdqa %xmm0,-0x2b(%rdi)
> -L(SSE11Q1): movdqa %xmm0,-0x1b(%rdi)
> -L(SSE11Q0): mov %rdx,-0xb(%rdi)
> - mov %dx,-0x3(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> -L(SSE12QB): movdqa %xmm0,-0xbc(%rdi)
> -L(SSE12QA): movdqa %xmm0,-0xac(%rdi)
> -L(SSE12Q9): movdqa %xmm0,-0x9c(%rdi)
> -L(SSE12Q8): movdqa %xmm0,-0x8c(%rdi)
> -L(SSE12Q7): movdqa %xmm0,-0x7c(%rdi)
> -L(SSE12Q6): movdqa %xmm0,-0x6c(%rdi)
> -L(SSE12Q5): movdqa %xmm0,-0x5c(%rdi)
> -L(SSE12Q4): movdqa %xmm0,-0x4c(%rdi)
> -L(SSE12Q3): movdqa %xmm0,-0x3c(%rdi)
> -L(SSE12Q2): movdqa %xmm0,-0x2c(%rdi)
> -L(SSE12Q1): movdqa %xmm0,-0x1c(%rdi)
> -L(SSE12Q0): mov %rdx,-0xc(%rdi)
> - mov %edx,-0x4(%rdi)
> - retq
> -
> -L(SSE13QB): movdqa %xmm0,-0xbd(%rdi)
> -L(SSE13QA): movdqa %xmm0,-0xad(%rdi)
> -L(SSE13Q9): movdqa %xmm0,-0x9d(%rdi)
> -L(SSE13Q8): movdqa %xmm0,-0x8d(%rdi)
> -L(SSE13Q7): movdqa %xmm0,-0x7d(%rdi)
> -L(SSE13Q6): movdqa %xmm0,-0x6d(%rdi)
> -L(SSE13Q5): movdqa %xmm0,-0x5d(%rdi)
> -L(SSE13Q4): movdqa %xmm0,-0x4d(%rdi)
> -L(SSE13Q3): movdqa %xmm0,-0x3d(%rdi)
> -L(SSE13Q2): movdqa %xmm0,-0x2d(%rdi)
> -L(SSE13Q1): movdqa %xmm0,-0x1d(%rdi)
> -L(SSE13Q0): mov %rdx,-0xd(%rdi)
> - mov %edx,-0x5(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> -L(SSE14QB): movdqa %xmm0,-0xbe(%rdi)
> -L(SSE14QA): movdqa %xmm0,-0xae(%rdi)
> -L(SSE14Q9): movdqa %xmm0,-0x9e(%rdi)
> -L(SSE14Q8): movdqa %xmm0,-0x8e(%rdi)
> -L(SSE14Q7): movdqa %xmm0,-0x7e(%rdi)
> -L(SSE14Q6): movdqa %xmm0,-0x6e(%rdi)
> -L(SSE14Q5): movdqa %xmm0,-0x5e(%rdi)
> -L(SSE14Q4): movdqa %xmm0,-0x4e(%rdi)
> -L(SSE14Q3): movdqa %xmm0,-0x3e(%rdi)
> -L(SSE14Q2): movdqa %xmm0,-0x2e(%rdi)
> -L(SSE14Q1): movdqa %xmm0,-0x1e(%rdi)
> -L(SSE14Q0): mov %rdx,-0xe(%rdi)
> - mov %edx,-0x6(%rdi)
> - mov %dx,-0x2(%rdi)
> - retq
> -
> -L(SSE15QB): movdqa %xmm0,-0xbf(%rdi)
> -L(SSE15QA): movdqa %xmm0,-0xaf(%rdi)
> -L(SSE15Q9): movdqa %xmm0,-0x9f(%rdi)
> -L(SSE15Q8): movdqa %xmm0,-0x8f(%rdi)
> -L(SSE15Q7): movdqa %xmm0,-0x7f(%rdi)
> -L(SSE15Q6): movdqa %xmm0,-0x6f(%rdi)
> -L(SSE15Q5): movdqa %xmm0,-0x5f(%rdi)
> -L(SSE15Q4): movdqa %xmm0,-0x4f(%rdi)
> -L(SSE15Q3): movdqa %xmm0,-0x3f(%rdi)
> -L(SSE15Q2): movdqa %xmm0,-0x2f(%rdi)
> -L(SSE15Q1): movdqa %xmm0,-0x1f(%rdi)
> -L(SSE15Q0): mov %rdx,-0xf(%rdi)
> - mov %edx,-0x7(%rdi)
> - mov %dx,-0x3(%rdi)
> - mov %dl,-0x1(%rdi)
> - retq
> -
> - .balign 16
> -L(byte32sse2_pre):
> -
> - mov __x86_shared_cache_size(%rip),%r9d # The largest cache size
> - cmp %r9,%r8
> - ja L(sse2_nt_move_pre)
> - #jmp L(byte32sse2)
> - .balign 16
> -L(byte32sse2):
> - lea -0x80(%r8),%r8 # 128
> - cmp $0x80,%r8 # 128
> - movdqa %xmm0,(%rdi)
> - movdqa %xmm0,0x10(%rdi)
> - movdqa %xmm0,0x20(%rdi)
> - movdqa %xmm0,0x30(%rdi)
> - movdqa %xmm0,0x40(%rdi)
> - movdqa %xmm0,0x50(%rdi)
> - movdqa %xmm0,0x60(%rdi)
> - movdqa %xmm0,0x70(%rdi)
> -
> - lea 0x80(%rdi),%rdi
> - jae L(byte32sse2)
> - add %r8,%rdi
> -# ifndef PIC
> - lea L(SSExDx)(%rip),%r11
> - jmpq *(%r11,%r8,8)
> -# else
> - lea L(SSE0Q0)(%rip),%r11
> - lea L(SSExDx)(%rip),%rcx
> - movswq (%rcx,%r8,2),%rcx
> - lea (%rcx,%r11,1),%r11
> - jmpq *%r11
> -# endif
> -
> - .balign 16
> -L(sse2_nt_move_pre):
> - cmp $0x0,%r9
> - je L(byte32sse2)
> - jmp L(sse2_nt_move)
> -
> - .balign 16
> -L(sse2_nt_move):
> - lea -0x80(%r8),%r8
> - cmp $0x80,%r8
> -
> - movntdq %xmm0,(%rdi)
> - movntdq %xmm0,0x10(%rdi)
> - movntdq %xmm0,0x20(%rdi)
> - movntdq %xmm0,0x30(%rdi)
> - movntdq %xmm0,0x40(%rdi)
> - movntdq %xmm0,0x50(%rdi)
> - movntdq %xmm0,0x60(%rdi)
> - movntdq %xmm0,0x70(%rdi)
> -
> - lea 0x80(%rdi),%rdi
> - jae L(sse2_nt_move)
> - sfence
> - add %r8,%rdi
> -# ifndef PIC
> - lea L(SSExDx)(%rip),%r11
> - jmpq *(%r11,%r8,8)
> -# else
> - lea L(SSE0Q0)(%rip),%r11
> - lea L(SSExDx)(%rip),%rcx
> - movswq (%rcx,%r8,2),%rcx
> - lea (%rcx,%r11,1),%r11
> - jmpq *%r11
> -# endif
> -
> - .pushsection .rodata
> - .balign 16
> -# ifndef PIC
> -L(SSExDx):
> - .quad L(SSE0Q0), L(SSE1Q0), L(SSE2Q0), L(SSE3Q0)
> - .quad L(SSE4Q0), L(SSE5Q0), L(SSE6Q0), L(SSE7Q0)
> - .quad L(SSE8Q0), L(SSE9Q0), L(SSE10Q0), L(SSE11Q0)
> - .quad L(SSE12Q0), L(SSE13Q0), L(SSE14Q0), L(SSE15Q0)
> - .quad L(SSE0Q1), L(SSE1Q1), L(SSE2Q1), L(SSE3Q1)
> - .quad L(SSE4Q1), L(SSE5Q1), L(SSE6Q1), L(SSE7Q1)
> - .quad L(SSE8Q1), L(SSE9Q1), L(SSE10Q1), L(SSE11Q1)
> - .quad L(SSE12Q1), L(SSE13Q1), L(SSE14Q1), L(SSE15Q1)
> - .quad L(SSE0Q2), L(SSE1Q2), L(SSE2Q2), L(SSE3Q2)
> - .quad L(SSE4Q2), L(SSE5Q2), L(SSE6Q2), L(SSE7Q2)
> - .quad L(SSE8Q2), L(SSE9Q2), L(SSE10Q2), L(SSE11Q2)
> - .quad L(SSE12Q2), L(SSE13Q2), L(SSE14Q2), L(SSE15Q2)
> - .quad L(SSE0Q3), L(SSE1Q3), L(SSE2Q3), L(SSE3Q3)
> - .quad L(SSE4Q3), L(SSE5Q3), L(SSE6Q3), L(SSE7Q3)
> - .quad L(SSE8Q3), L(SSE9Q3), L(SSE10Q3), L(SSE11Q3)
> - .quad L(SSE12Q3), L(SSE13Q3), L(SSE14Q3), L(SSE15Q3)
> - .quad L(SSE0Q4), L(SSE1Q4), L(SSE2Q4), L(SSE3Q4)
> - .quad L(SSE4Q4), L(SSE5Q4), L(SSE6Q4), L(SSE7Q4)
> - .quad L(SSE8Q4), L(SSE9Q4), L(SSE10Q4), L(SSE11Q4)
> - .quad L(SSE12Q4), L(SSE13Q4), L(SSE14Q4), L(SSE15Q4)
> - .quad L(SSE0Q5), L(SSE1Q5), L(SSE2Q5), L(SSE3Q5)
> - .quad L(SSE4Q5), L(SSE5Q5), L(SSE6Q5), L(SSE7Q5)
> - .quad L(SSE8Q5), L(SSE9Q5), L(SSE10Q5), L(SSE11Q5)
> - .quad L(SSE12Q5), L(SSE13Q5), L(SSE14Q5), L(SSE15Q5)
> - .quad L(SSE0Q6), L(SSE1Q6), L(SSE2Q6), L(SSE3Q6)
> - .quad L(SSE4Q6), L(SSE5Q6), L(SSE6Q6), L(SSE7Q6)
> - .quad L(SSE8Q6), L(SSE9Q6), L(SSE10Q6), L(SSE11Q6)
> - .quad L(SSE12Q6), L(SSE13Q6), L(SSE14Q6), L(SSE15Q6)
> - .quad L(SSE0Q7), L(SSE1Q7), L(SSE2Q7), L(SSE3Q7)
> - .quad L(SSE4Q7), L(SSE5Q7), L(SSE6Q7), L(SSE7Q7)
> - .quad L(SSE8Q7), L(SSE9Q7), L(SSE10Q7), L(SSE11Q7)
> - .quad L(SSE12Q7), L(SSE13Q7), L(SSE14Q7), L(SSE15Q7)
> - .quad L(SSE0Q8), L(SSE1Q8), L(SSE2Q8), L(SSE3Q8)
> - .quad L(SSE4Q8), L(SSE5Q8), L(SSE6Q8), L(SSE7Q8)
> - .quad L(SSE8Q8), L(SSE9Q8), L(SSE10Q8), L(SSE11Q8)
> - .quad L(SSE12Q8), L(SSE13Q8), L(SSE14Q8), L(SSE15Q8)
> - .quad L(SSE0Q9), L(SSE1Q9), L(SSE2Q9), L(SSE3Q9)
> - .quad L(SSE4Q9), L(SSE5Q9), L(SSE6Q9), L(SSE7Q9)
> - .quad L(SSE8Q9), L(SSE9Q9), L(SSE10Q9), L(SSE11Q9)
> - .quad L(SSE12Q9), L(SSE13Q9), L(SSE14Q9), L(SSE15Q9)
> - .quad L(SSE0QA), L(SSE1QA), L(SSE2QA), L(SSE3QA)
> - .quad L(SSE4QA), L(SSE5QA), L(SSE6QA), L(SSE7QA)
> - .quad L(SSE8QA), L(SSE9QA), L(SSE10QA), L(SSE11QA)
> - .quad L(SSE12QA), L(SSE13QA), L(SSE14QA), L(SSE15QA)
> - .quad L(SSE0QB), L(SSE1QB), L(SSE2QB), L(SSE3QB)
> - .quad L(SSE4QB), L(SSE5QB), L(SSE6QB), L(SSE7QB)
> - .quad L(SSE8QB), L(SSE9QB), L(SSE10QB), L(SSE11QB)
> - .quad L(SSE12QB), L(SSE13QB), L(SSE14QB), L(SSE15QB)
> -# else
> -L(SSExDx):
> - .short L(SSE0Q0) -L(SSE0Q0)
> - .short L(SSE1Q0) -L(SSE0Q0)
> - .short L(SSE2Q0) -L(SSE0Q0)
> - .short L(SSE3Q0) -L(SSE0Q0)
> - .short L(SSE4Q0) -L(SSE0Q0)
> - .short L(SSE5Q0) -L(SSE0Q0)
> - .short L(SSE6Q0) -L(SSE0Q0)
> - .short L(SSE7Q0) -L(SSE0Q0)
> -
> - .short L(SSE8Q0) -L(SSE0Q0)
> - .short L(SSE9Q0) -L(SSE0Q0)
> - .short L(SSE10Q0)-L(SSE0Q0)
> - .short L(SSE11Q0)-L(SSE0Q0)
> - .short L(SSE12Q0)-L(SSE0Q0)
> - .short L(SSE13Q0)-L(SSE0Q0)
> - .short L(SSE14Q0)-L(SSE0Q0)
> - .short L(SSE15Q0)-L(SSE0Q0)
> -
> - .short L(SSE0Q1) -L(SSE0Q0)
> - .short L(SSE1Q1) -L(SSE0Q0)
> - .short L(SSE2Q1) -L(SSE0Q0)
> - .short L(SSE3Q1) -L(SSE0Q0)
> - .short L(SSE4Q1) -L(SSE0Q0)
> - .short L(SSE5Q1) -L(SSE0Q0)
> - .short L(SSE6Q1) -L(SSE0Q0)
> - .short L(SSE7Q1) -L(SSE0Q0)
> -
> - .short L(SSE8Q1) -L(SSE0Q0)
> - .short L(SSE9Q1) -L(SSE0Q0)
> - .short L(SSE10Q1)-L(SSE0Q0)
> - .short L(SSE11Q1)-L(SSE0Q0)
> - .short L(SSE12Q1)-L(SSE0Q0)
> - .short L(SSE13Q1)-L(SSE0Q0)
> - .short L(SSE14Q1)-L(SSE0Q0)
> - .short L(SSE15Q1)-L(SSE0Q0)
> -
> - .short L(SSE0Q2) -L(SSE0Q0)
> - .short L(SSE1Q2) -L(SSE0Q0)
> - .short L(SSE2Q2) -L(SSE0Q0)
> - .short L(SSE3Q2) -L(SSE0Q0)
> - .short L(SSE4Q2) -L(SSE0Q0)
> - .short L(SSE5Q2) -L(SSE0Q0)
> - .short L(SSE6Q2) -L(SSE0Q0)
> - .short L(SSE7Q2) -L(SSE0Q0)
> -
> - .short L(SSE8Q2) -L(SSE0Q0)
> - .short L(SSE9Q2) -L(SSE0Q0)
> - .short L(SSE10Q2)-L(SSE0Q0)
> - .short L(SSE11Q2)-L(SSE0Q0)
> - .short L(SSE12Q2)-L(SSE0Q0)
> - .short L(SSE13Q2)-L(SSE0Q0)
> - .short L(SSE14Q2)-L(SSE0Q0)
> - .short L(SSE15Q2)-L(SSE0Q0)
> -
> - .short L(SSE0Q3) -L(SSE0Q0)
> - .short L(SSE1Q3) -L(SSE0Q0)
> - .short L(SSE2Q3) -L(SSE0Q0)
> - .short L(SSE3Q3) -L(SSE0Q0)
> - .short L(SSE4Q3) -L(SSE0Q0)
> - .short L(SSE5Q3) -L(SSE0Q0)
> - .short L(SSE6Q3) -L(SSE0Q0)
> - .short L(SSE7Q3) -L(SSE0Q0)
> -
> - .short L(SSE8Q3) -L(SSE0Q0)
> - .short L(SSE9Q3) -L(SSE0Q0)
> - .short L(SSE10Q3)-L(SSE0Q0)
> - .short L(SSE11Q3)-L(SSE0Q0)
> - .short L(SSE12Q3)-L(SSE0Q0)
> - .short L(SSE13Q3)-L(SSE0Q0)
> - .short L(SSE14Q3)-L(SSE0Q0)
> - .short L(SSE15Q3)-L(SSE0Q0)
> -
> - .short L(SSE0Q4) -L(SSE0Q0)
> - .short L(SSE1Q4) -L(SSE0Q0)
> - .short L(SSE2Q4) -L(SSE0Q0)
> - .short L(SSE3Q4) -L(SSE0Q0)
> - .short L(SSE4Q4) -L(SSE0Q0)
> - .short L(SSE5Q4) -L(SSE0Q0)
> - .short L(SSE6Q4) -L(SSE0Q0)
> - .short L(SSE7Q4) -L(SSE0Q0)
> -
> - .short L(SSE8Q4) -L(SSE0Q0)
> - .short L(SSE9Q4) -L(SSE0Q0)
> - .short L(SSE10Q4)-L(SSE0Q0)
> - .short L(SSE11Q4)-L(SSE0Q0)
> - .short L(SSE12Q4)-L(SSE0Q0)
> - .short L(SSE13Q4)-L(SSE0Q0)
> - .short L(SSE14Q4)-L(SSE0Q0)
> - .short L(SSE15Q4)-L(SSE0Q0)
> -
> - .short L(SSE0Q5) -L(SSE0Q0)
> - .short L(SSE1Q5) -L(SSE0Q0)
> - .short L(SSE2Q5) -L(SSE0Q0)
> - .short L(SSE3Q5) -L(SSE0Q0)
> - .short L(SSE4Q5) -L(SSE0Q0)
> - .short L(SSE5Q5) -L(SSE0Q0)
> - .short L(SSE6Q5) -L(SSE0Q0)
> - .short L(SSE7Q5) -L(SSE0Q0)
> -
> - .short L(SSE8Q5) -L(SSE0Q0)
> - .short L(SSE9Q5) -L(SSE0Q0)
> - .short L(SSE10Q5)-L(SSE0Q0)
> - .short L(SSE11Q5)-L(SSE0Q0)
> - .short L(SSE12Q5)-L(SSE0Q0)
> - .short L(SSE13Q5)-L(SSE0Q0)
> - .short L(SSE14Q5)-L(SSE0Q0)
> - .short L(SSE15Q5)-L(SSE0Q0)
> -
> - .short L(SSE0Q6) -L(SSE0Q0)
> - .short L(SSE1Q6) -L(SSE0Q0)
> - .short L(SSE2Q6) -L(SSE0Q0)
> - .short L(SSE3Q6) -L(SSE0Q0)
> - .short L(SSE4Q6) -L(SSE0Q0)
> - .short L(SSE5Q6) -L(SSE0Q0)
> - .short L(SSE6Q6) -L(SSE0Q0)
> - .short L(SSE7Q6) -L(SSE0Q0)
> -
> - .short L(SSE8Q6) -L(SSE0Q0)
> - .short L(SSE9Q6) -L(SSE0Q0)
> - .short L(SSE10Q6)-L(SSE0Q0)
> - .short L(SSE11Q6)-L(SSE0Q0)
> - .short L(SSE12Q6)-L(SSE0Q0)
> - .short L(SSE13Q6)-L(SSE0Q0)
> - .short L(SSE14Q6)-L(SSE0Q0)
> - .short L(SSE15Q6)-L(SSE0Q0)
> -
> - .short L(SSE0Q7) -L(SSE0Q0)
> - .short L(SSE1Q7) -L(SSE0Q0)
> - .short L(SSE2Q7) -L(SSE0Q0)
> - .short L(SSE3Q7) -L(SSE0Q0)
> - .short L(SSE4Q7) -L(SSE0Q0)
> - .short L(SSE5Q7) -L(SSE0Q0)
> - .short L(SSE6Q7) -L(SSE0Q0)
> - .short L(SSE7Q7) -L(SSE0Q0)
> -
> - .short L(SSE8Q7) -L(SSE0Q0)
> - .short L(SSE9Q7) -L(SSE0Q0)
> - .short L(SSE10Q7)-L(SSE0Q0)
> - .short L(SSE11Q7)-L(SSE0Q0)
> - .short L(SSE12Q7)-L(SSE0Q0)
> - .short L(SSE13Q7)-L(SSE0Q0)
> - .short L(SSE14Q7)-L(SSE0Q0)
> - .short L(SSE15Q7)-L(SSE0Q0)
> -
> - .short L(SSE0Q8) -L(SSE0Q0)
> - .short L(SSE1Q8) -L(SSE0Q0)
> - .short L(SSE2Q8) -L(SSE0Q0)
> - .short L(SSE3Q8) -L(SSE0Q0)
> - .short L(SSE4Q8) -L(SSE0Q0)
> - .short L(SSE5Q8) -L(SSE0Q0)
> - .short L(SSE6Q8) -L(SSE0Q0)
> - .short L(SSE7Q8) -L(SSE0Q0)
> -
> - .short L(SSE8Q8) -L(SSE0Q0)
> - .short L(SSE9Q8) -L(SSE0Q0)
> - .short L(SSE10Q8)-L(SSE0Q0)
> - .short L(SSE11Q8)-L(SSE0Q0)
> - .short L(SSE12Q8)-L(SSE0Q0)
> - .short L(SSE13Q8)-L(SSE0Q0)
> - .short L(SSE14Q8)-L(SSE0Q0)
> - .short L(SSE15Q8)-L(SSE0Q0)
> -
> - .short L(SSE0Q9) -L(SSE0Q0)
> - .short L(SSE1Q9) -L(SSE0Q0)
> - .short L(SSE2Q9) -L(SSE0Q0)
> - .short L(SSE3Q9) -L(SSE0Q0)
> - .short L(SSE4Q9) -L(SSE0Q0)
> - .short L(SSE5Q9) -L(SSE0Q0)
> - .short L(SSE6Q9) -L(SSE0Q0)
> - .short L(SSE7Q9) -L(SSE0Q0)
> -
> - .short L(SSE8Q9) -L(SSE0Q0)
> - .short L(SSE9Q9) -L(SSE0Q0)
> - .short L(SSE10Q9)-L(SSE0Q0)
> - .short L(SSE11Q9)-L(SSE0Q0)
> - .short L(SSE12Q9)-L(SSE0Q0)
> - .short L(SSE13Q9)-L(SSE0Q0)
> - .short L(SSE14Q9)-L(SSE0Q0)
> - .short L(SSE15Q9)-L(SSE0Q0)
> -
> - .short L(SSE0QA) -L(SSE0Q0)
> - .short L(SSE1QA) -L(SSE0Q0)
> - .short L(SSE2QA) -L(SSE0Q0)
> - .short L(SSE3QA) -L(SSE0Q0)
> - .short L(SSE4QA) -L(SSE0Q0)
> - .short L(SSE5QA) -L(SSE0Q0)
> - .short L(SSE6QA) -L(SSE0Q0)
> - .short L(SSE7QA) -L(SSE0Q0)
> -
> - .short L(SSE8QA) -L(SSE0Q0)
> - .short L(SSE9QA) -L(SSE0Q0)
> - .short L(SSE10QA)-L(SSE0Q0)
> - .short L(SSE11QA)-L(SSE0Q0)
> - .short L(SSE12QA)-L(SSE0Q0)
> - .short L(SSE13QA)-L(SSE0Q0)
> - .short L(SSE14QA)-L(SSE0Q0)
> - .short L(SSE15QA)-L(SSE0Q0)
> -
> - .short L(SSE0QB) -L(SSE0Q0)
> - .short L(SSE1QB) -L(SSE0Q0)
> - .short L(SSE2QB) -L(SSE0Q0)
> - .short L(SSE3QB) -L(SSE0Q0)
> - .short L(SSE4QB) -L(SSE0Q0)
> - .short L(SSE5QB) -L(SSE0Q0)
> - .short L(SSE6QB) -L(SSE0Q0)
> - .short L(SSE7QB) -L(SSE0Q0)
> -
> - .short L(SSE8QB) -L(SSE0Q0)
> - .short L(SSE9QB) -L(SSE0Q0)
> - .short L(SSE10QB)-L(SSE0Q0)
> - .short L(SSE11QB)-L(SSE0Q0)
> - .short L(SSE12QB)-L(SSE0Q0)
> - .short L(SSE13QB)-L(SSE0Q0)
> - .short L(SSE14QB)-L(SSE0Q0)
> - .short L(SSE15QB)-L(SSE0Q0)
> -# endif
> - .popsection
> -#endif /* !defined USE_MULTIARCH || defined USE_SSE2 */
> -
> - .balign 16
> -#ifndef USE_MULTIARCH
> -L(aligned_now):
> -
> - cmpl $0x1,__x86_preferred_memory_instruction(%rip)
> - jg L(SSE_pre)
> -#endif /* USE_MULTIARCH */
> -
> -L(8byte_move_try):
> - cmpq __STOS_LOWER_BOUNDARY,%r8
> - jae L(8byte_stos_try)
> -
> - .balign 16
> -L(8byte_move):
> - movq %r8,%rcx
> - shrq $7,%rcx
> - jz L(8byte_move_skip)
> -
> - .p2align 4
> -
> -L(8byte_move_loop):
> - decq %rcx
> -
> - movq %rdx, (%rdi)
> - movq %rdx, 8 (%rdi)
> - movq %rdx, 16 (%rdi)
> - movq %rdx, 24 (%rdi)
> - movq %rdx, 32 (%rdi)
> - movq %rdx, 40 (%rdi)
> - movq %rdx, 48 (%rdi)
> - movq %rdx, 56 (%rdi)
> - movq %rdx, 64 (%rdi)
> - movq %rdx, 72 (%rdi)
> - movq %rdx, 80 (%rdi)
> - movq %rdx, 88 (%rdi)
> - movq %rdx, 96 (%rdi)
> - movq %rdx, 104 (%rdi)
> - movq %rdx, 112 (%rdi)
> - movq %rdx, 120 (%rdi)
> -
> - leaq 128 (%rdi),%rdi
> -
> - jnz L(8byte_move_loop)
> -
> -L(8byte_move_skip):
> - andl $127,%r8d
> - lea (%rdi,%r8,1),%rdi
> -
> -#ifndef PIC
> - lea L(setPxQx)(%rip),%r11
> - jmpq *(%r11,%r8,8) # old scheme remained for nonPIC
> -#else
> - lea L(Got0)(%rip),%r11
> - lea L(setPxQx)(%rip),%rcx
> - movswq (%rcx,%r8,2),%rcx
> - lea (%rcx,%r11,1),%r11
> - jmpq *%r11
> -#endif
> -
> - .balign 16
> -L(8byte_stos_try):
> - mov __x86_shared_cache_size(%rip),%r9d // ck largest cache size
> - cmpq %r8,%r9 // calculate the lesser of remaining
> - cmovaq %r8,%r9 // bytes and largest cache size
> - jbe L(8byte_stos)
> -
> -L(8byte_move_reuse_try):
> - cmp __STOS_UPPER_BOUNDARY,%r8
> - jae L(8byte_move)
> -
> - .balign 16
> -L(8byte_stos):
> - movq %r9,%rcx
> - andq $-8,%r9
> -
> - shrq $3,%rcx
> - jz L(8byte_stos_skip)
> -
> - xchgq %rax,%rdx
> -
> + movd %esi, %xmm8
> + movq %rdi, %rax
> + punpcklbw %xmm8, %xmm8
> + punpcklwd %xmm8, %xmm8
> + pshufd $0, %xmm8, %xmm8
> +L(entry_from_bzero):
> + cmpq $64, %rdx
> + ja L(loop_start)
> + cmpq $16, %rdx
> + jbe L(less_16_bytes)
> + cmpq $32, %rdx
> + movdqu %xmm8, (%rdi)
> + movdqu %xmm8, -16(%rdi,%rdx)
> + ja L(between_32_64_bytes)
> +L(return):
> rep
> - stosq
> -
> - xchgq %rax,%rdx
> -
> -L(8byte_stos_skip):
> - subq %r9,%r8
> - ja L(8byte_nt_move)
> -
> - andl $7,%r8d
> - lea (%rdi,%r8,1),%rdi
> -#ifndef PIC
> - lea L(setPxQx)(%rip),%r11
> - jmpq *(%r11,%r8,8) # old scheme remained for nonPIC
> -#else
> - lea L(Got0)(%rip),%r11
> - lea L(setPxQx)(%rip),%rcx
> - movswq (%rcx,%r8,2),%rcx
> - lea (%rcx,%r11,1),%r11
> - jmpq *%r11
> -#endif
> -
> - .balign 16
> -L(8byte_nt_move):
> - movq %r8,%rcx
> - shrq $7,%rcx
> - jz L(8byte_nt_move_skip)
> -
> - .balign 16
> -L(8byte_nt_move_loop):
> - decq %rcx
> -
> - movntiq %rdx, (%rdi)
> - movntiq %rdx, 8 (%rdi)
> - movntiq %rdx, 16 (%rdi)
> - movntiq %rdx, 24 (%rdi)
> - movntiq %rdx, 32 (%rdi)
> - movntiq %rdx, 40 (%rdi)
> - movntiq %rdx, 48 (%rdi)
> - movntiq %rdx, 56 (%rdi)
> - movntiq %rdx, 64 (%rdi)
> - movntiq %rdx, 72 (%rdi)
> - movntiq %rdx, 80 (%rdi)
> - movntiq %rdx, 88 (%rdi)
> - movntiq %rdx, 96 (%rdi)
> - movntiq %rdx, 104 (%rdi)
> - movntiq %rdx, 112 (%rdi)
> - movntiq %rdx, 120 (%rdi)
> -
> - leaq 128 (%rdi),%rdi
> -
> - jnz L(8byte_nt_move_loop)
> -
> - sfence
> -
> -L(8byte_nt_move_skip):
> - andl $127,%r8d
> -
> - lea (%rdi,%r8,1),%rdi
> -#ifndef PIC
> - lea L(setPxQx)(%rip),%r11
> - jmpq *(%r11,%r8,8) # old scheme remained for nonPIC
> -#else
> - lea L(Got0)(%rip),%r11
> - lea L(setPxQx)(%rip),%rcx
> - movswq (%rcx,%r8,2),%rcx
> - lea (%rcx,%r11,1),%r11
> - jmpq *%r11
> -#endif
> + ret
> + ALIGN (4)
> +L(between_32_64_bytes):
> + movdqu %xmm8, 16(%rdi)
> + movdqu %xmm8, -32(%rdi,%rdx)
> + ret
> + ALIGN (4)
> +L(loop_start):
> + leaq 64(%rdi), %rcx
> + movdqu %xmm8, (%rdi)
> + andq $-64, %rcx
> + movdqu %xmm8, -16(%rdi,%rdx)
> + movdqu %xmm8, 16(%rdi)
> + movdqu %xmm8, -32(%rdi,%rdx)
> + movdqu %xmm8, 32(%rdi)
> + movdqu %xmm8, -48(%rdi,%rdx)
> + movdqu %xmm8, 48(%rdi)
> + movdqu %xmm8, -64(%rdi,%rdx)
> + addq %rdi, %rdx
> + andq $-64, %rdx
> + cmpq %rdx, %rcx
> + je L(return)
> + ALIGN (4)
> +L(loop):
> + movdqa %xmm8, (%rcx)
> + movdqa %xmm8, 16(%rcx)
> + movdqa %xmm8, 32(%rcx)
> + movdqa %xmm8, 48(%rcx)
> + addq $64, %rcx
> + cmpq %rcx, %rdx
> + jne L(loop)
> + rep
> + ret
> +L(less_16_bytes):
> + movq %xmm8, %rcx
> + testb $24, %dl
> + jne L(between8_16bytes)
> + testb $4, %dl
> + jne L(between4_7bytes)
> + testb $1, %dl
> + je L(odd_byte)
> + movb %cl, (%rdi)
> +L(odd_byte):
> + testb $2, %dl
> + je L(return)
> + movw %cx, -2(%rax,%rdx)
> + ret
> +L(between4_7bytes):
> + movl %ecx, (%rdi)
> + movl %ecx, -4(%rdi,%rdx)
> + ret
> +L(between8_16bytes):
> + movq %rcx, (%rdi)
> + movq %rcx, -8(%rdi,%rdx)
> + ret
>
> END (memset)
> libc_hidden_builtin_def (memset)
> --
> 1.7.4.4
>
> #include <emmintrin.h>
> #include <stdint.h>
> #include <stdlib.h>
> typedef __m128i tp_vector;
> typedef uint64_t tp_mask;
>
> #define LOAD(x) _mm_load_si128 ((tp_vector *) (x))
> #define LOADU(x) _mm_loadu_si128 ((tp_vector *) (x))
> #define STORE(x, y) _mm_store_si128 ((tp_vector *) (x), (y))
> #define STOREU(x, y) _mm_storeu_si128 ((tp_vector *) (x), (y))
> #define STORENT(x, y) _mm_stream_si128 ((tp_vector *) (x), (y))
>
>
> #define CONCAT(x, y, n) _mm_alignr_epi8 (y , x ,n)
> #define MIN _mm_min_epu8
> #define EQ _mm_cmpeq_epi8
> #define OR _mm_or_si128
>
> #define BROADCAST(x) _mm_set1_epi8 (x)
> #define get_mask(x) ((uint64_t) _mm_movemask_epi8 (x))
>
> /* Align VALUE down by ALIGN bytes. */
> #define ALIGN_DOWN(value, align) \
> ALIGN_DOWN_M1(value, align - 1)
> /* Align VALUE down by ALIGN_M1 + 1 bytes.
> Useful if you have precomputed ALIGN - 1. */
> #define ALIGN_DOWN_M1(value, align_m1) \
> (void *)((uintptr_t)(value) \
> & ~(uintptr_t)(align_m1))
>
> /* Align VALUE up by ALIGN bytes. */
> #define ALIGN_UP(value, align) \
> ALIGN_UP_M1(value, align - 1)
> /* Align VALUE up by ALIGN_M1 + 1 bytes.
> Useful if you have precomputed ALIGN - 1. */
> #define ALIGN_UP_M1(value, align_m1) \
> (void *)(((uintptr_t)(value) + (uintptr_t)(align_m1)) \
> & ~(uintptr_t)(align_m1))
>
>
> static char *memset_small (char *dest, uint64_t c, size_t no, char *ret);
> void *memset_new(char *dest, int _c, size_t n)
> {
> char *from,*to;
> int i;
> char *dest2 = dest;
> unsigned char c = _c;
> tp_vector vc = BROADCAST(c);
> uint64_t mc = *(uint64_t*)(&vc);
> if (n <= 64){
> if (__builtin_expect(n<=16,0))
> return memset_small(dest, mc, n, dest);
> STOREU(dest, vc);
> STOREU(dest+n-16, vc);
> if (n <= 32) return dest;
> STOREU(dest+16, vc);
> STOREU(dest+n-32, vc);
> return dest;
> }
> STOREU(dest, vc);
> STOREU(dest+n-16, vc);
> STOREU(dest+16, vc);
> STOREU(dest+n-32, vc);
> STOREU(dest+32, vc);
> STOREU(dest+n-48, vc);
> STOREU(dest+48, vc);
> STOREU(dest+n-64, vc);
> from = ALIGN_DOWN(dest + 64, 64);
> to = ALIGN_DOWN(dest + n , 64);
> while (from != to)
> {
> STORE(from,vc);
> STORE(from+16,vc);
> STORE(from+32,vc);
> STORE(from+48,vc);
> from += 64;
> }
> return dest;
> }
> static char *memset_small (char *dest, uint64_t c, size_t no, char *ret)
> {
>
> if (no & (8 | 16))
> {
> ((uint64_t *) dest)[0] = c;
> ((uint64_t *)(dest + no - 8))[0] = c;
> return ret;
> }
> if (no & 4)
> {
> ((uint32_t *) dest)[0] = c;
> ((uint32_t *)(dest + no - 4))[0] = c;
> return ret;
> }
> if (no & 1)
> {
> dest[0] = c;
> }
> if (no & 2)
> {
> ((uint16_t *)(dest + no - 2))[0] = c;
> }
> return ret;
> }
> void __bzero_new (char *dest, size_t n)
> {
> memset_new(dest, 0, n);
> }
>
> char *memset_tail (char *dest, int c, size_t n, char *ret){
> memset (dest, c, n);
> return ret+1;
> }
>
--
That's easy to fix, but I can't be bothered.