]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libc/amd64/string/memset.S
MFV r346563:
[FreeBSD/FreeBSD.git] / lib / libc / amd64 / string / memset.S
1 /*-
2  * Copyright (c) 2018 The FreeBSD Foundation
3  *
4  * This software was developed by Mateusz Guzik <mjg@FreeBSD.org>
5  * under sponsorship from the FreeBSD Foundation.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 #include <machine/asm.h>
32 __FBSDID("$FreeBSD$");
33
34 #define ALIGN_TEXT      .p2align 4,0x90 /* 16-byte alignment, nop filled */
35
36 .macro MEMSET erms
37         movq    %rdi,%rax
38         movq    %rdx,%rcx
39         movzbq  %sil,%r8
40         movabs  $0x0101010101010101,%r10
41         imulq   %r8,%r10
42
43         cmpq    $32,%rcx
44         jbe     101632f
45
46         cmpq    $256,%rcx
47         ja      1256f
48
49 103200:
50         movq    %r10,(%rdi)
51         movq    %r10,8(%rdi)
52         movq    %r10,16(%rdi)
53         movq    %r10,24(%rdi)
54         leaq    32(%rdi),%rdi
55         subq    $32,%rcx
56         cmpq    $32,%rcx
57         ja      103200b
58         cmpb    $16,%cl
59         ja      201632f
60         movq    %r10,-16(%rdi,%rcx)
61         movq    %r10,-8(%rdi,%rcx)
62         ret
63         ALIGN_TEXT
64 101632:
65         cmpb    $16,%cl
66         jl      100816f
67 201632:
68         movq    %r10,(%rdi)
69         movq    %r10,8(%rdi)
70         movq    %r10,-16(%rdi,%rcx)
71         movq    %r10,-8(%rdi,%rcx)
72         ret
73         ALIGN_TEXT
74 100816:
75         cmpb    $8,%cl
76         jl      100408f
77         movq    %r10,(%rdi)
78         movq    %r10,-8(%rdi,%rcx)
79         ret
80         ALIGN_TEXT
81 100408:
82         cmpb    $4,%cl
83         jl      100204f
84         movl    %r10d,(%rdi)
85         movl    %r10d,-4(%rdi,%rcx)
86         ret
87         ALIGN_TEXT
88 100204:
89         cmpb    $2,%cl
90         jl      100001f
91         movw    %r10w,(%rdi)
92         movw    %r10w,-2(%rdi,%rcx)
93         ret
94         ALIGN_TEXT
95 100001:
96         cmpb    $0,%cl
97         je      100000f
98         movb    %r10b,(%rdi)
99 100000:
100         ret
101         ALIGN_TEXT
102 1256:
103         movq    %rdi,%r9
104         movq    %r10,%rax
105         testl   $15,%edi
106         jnz     3f
107 1:
108 .if \erms == 1
109         rep
110         stosb
111         movq    %r9,%rax
112 .else
113         movq    %rcx,%rdx
114         shrq    $3,%rcx
115         rep
116         stosq
117         movq    %r9,%rax
118         andl    $7,%edx
119         jnz     2f
120         ret
121 2:
122         movq    %r10,-8(%rdi,%rdx)
123 .endif
124         ret
125         ALIGN_TEXT
126 3:
127         movq    %r10,(%rdi)
128         movq    %r10,8(%rdi)
129         movq    %rdi,%r8
130         andq    $15,%r8
131         leaq    -16(%rcx,%r8),%rcx
132         neg     %r8
133         leaq    16(%rdi,%r8),%rdi
134         jmp     1b
135 .endm
136
137
138 ENTRY(memset)
139         MEMSET erms=0
140 END(memset)
141
142         .section .note.GNU-stack,"",%progbits