]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libc/amd64/string/memset.S
amd64: add missing ALIGN_TEXT to loops in memset and memmove
[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         ALIGN_TEXT
50 103200:
51         movq    %r10,(%rdi)
52         movq    %r10,8(%rdi)
53         movq    %r10,16(%rdi)
54         movq    %r10,24(%rdi)
55         leaq    32(%rdi),%rdi
56         subq    $32,%rcx
57         cmpq    $32,%rcx
58         ja      103200b
59         cmpb    $16,%cl
60         ja      201632f
61         movq    %r10,-16(%rdi,%rcx)
62         movq    %r10,-8(%rdi,%rcx)
63         ret
64         ALIGN_TEXT
65 101632:
66         cmpb    $16,%cl
67         jl      100816f
68 201632:
69         movq    %r10,(%rdi)
70         movq    %r10,8(%rdi)
71         movq    %r10,-16(%rdi,%rcx)
72         movq    %r10,-8(%rdi,%rcx)
73         ret
74         ALIGN_TEXT
75 100816:
76         cmpb    $8,%cl
77         jl      100408f
78         movq    %r10,(%rdi)
79         movq    %r10,-8(%rdi,%rcx)
80         ret
81         ALIGN_TEXT
82 100408:
83         cmpb    $4,%cl
84         jl      100204f
85         movl    %r10d,(%rdi)
86         movl    %r10d,-4(%rdi,%rcx)
87         ret
88         ALIGN_TEXT
89 100204:
90         cmpb    $2,%cl
91         jl      100001f
92         movw    %r10w,(%rdi)
93         movw    %r10w,-2(%rdi,%rcx)
94         ret
95         ALIGN_TEXT
96 100001:
97         cmpb    $0,%cl
98         je      100000f
99         movb    %r10b,(%rdi)
100 100000:
101         ret
102         ALIGN_TEXT
103 1256:
104         movq    %rdi,%r9
105         movq    %r10,%rax
106         testl   $15,%edi
107         jnz     3f
108 1:
109 .if \erms == 1
110         rep
111         stosb
112         movq    %r9,%rax
113 .else
114         movq    %rcx,%rdx
115         shrq    $3,%rcx
116         rep
117         stosq
118         movq    %r9,%rax
119         andl    $7,%edx
120         jnz     2f
121         ret
122 2:
123         movq    %r10,-8(%rdi,%rdx)
124 .endif
125         ret
126         ALIGN_TEXT
127 3:
128         movq    %r10,(%rdi)
129         movq    %r10,8(%rdi)
130         movq    %rdi,%r8
131         andq    $15,%r8
132         leaq    -16(%rcx,%r8),%rcx
133         neg     %r8
134         leaq    16(%rdi,%r8),%rdi
135         jmp     1b
136 .endm
137
138
139 ENTRY(memset)
140         MEMSET erms=0
141 END(memset)
142
143         .section .note.GNU-stack,"",%progbits