xref: /aosp_15_r20/bionic/libc/arch-x86_64/string/sse2-memset-slm.S (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker/*
2*8d67ca89SAndroid Build Coastguard WorkerCopyright (c) 2014, Intel Corporation
3*8d67ca89SAndroid Build Coastguard WorkerAll rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker
5*8d67ca89SAndroid Build Coastguard WorkerRedistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Workermodification, are permitted provided that the following conditions are met:
7*8d67ca89SAndroid Build Coastguard Worker
8*8d67ca89SAndroid Build Coastguard Worker    * Redistributions of source code must retain the above copyright notice,
9*8d67ca89SAndroid Build Coastguard Worker    * this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker
11*8d67ca89SAndroid Build Coastguard Worker    * Redistributions in binary form must reproduce the above copyright notice,
12*8d67ca89SAndroid Build Coastguard Worker    * this list of conditions and the following disclaimer in the documentation
13*8d67ca89SAndroid Build Coastguard Worker    * and/or other materials provided with the distribution.
14*8d67ca89SAndroid Build Coastguard Worker
15*8d67ca89SAndroid Build Coastguard Worker    * Neither the name of Intel Corporation nor the names of its contributors
16*8d67ca89SAndroid Build Coastguard Worker    * may be used to endorse or promote products derived from this software
17*8d67ca89SAndroid Build Coastguard Worker    * without specific prior written permission.
18*8d67ca89SAndroid Build Coastguard Worker
19*8d67ca89SAndroid Build Coastguard WorkerTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*8d67ca89SAndroid Build Coastguard WorkerANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*8d67ca89SAndroid Build Coastguard WorkerWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*8d67ca89SAndroid Build Coastguard WorkerDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23*8d67ca89SAndroid Build Coastguard WorkerANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*8d67ca89SAndroid Build Coastguard Worker(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*8d67ca89SAndroid Build Coastguard WorkerLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26*8d67ca89SAndroid Build Coastguard WorkerANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*8d67ca89SAndroid Build Coastguard Worker(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*8d67ca89SAndroid Build Coastguard WorkerSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*8d67ca89SAndroid Build Coastguard Worker*/
30*8d67ca89SAndroid Build Coastguard Worker
31*8d67ca89SAndroid Build Coastguard Worker#include <private/bionic_asm.h>
32*8d67ca89SAndroid Build Coastguard Worker
33*8d67ca89SAndroid Build Coastguard Worker
34*8d67ca89SAndroid Build Coastguard Worker#ifndef L
35*8d67ca89SAndroid Build Coastguard Worker# define L(label)	.L##label
36*8d67ca89SAndroid Build Coastguard Worker#endif
37*8d67ca89SAndroid Build Coastguard Worker
38*8d67ca89SAndroid Build Coastguard Worker#ifndef ALIGN
39*8d67ca89SAndroid Build Coastguard Worker# define ALIGN(n)	.p2align n
40*8d67ca89SAndroid Build Coastguard Worker#endif
41*8d67ca89SAndroid Build Coastguard Worker
42*8d67ca89SAndroid Build Coastguard Worker
43*8d67ca89SAndroid Build Coastguard WorkerENTRY(__memset_chk_generic)
44*8d67ca89SAndroid Build Coastguard Worker  # %rdi = dst, %rsi = byte, %rdx = n, %rcx = dst_len
45*8d67ca89SAndroid Build Coastguard Worker  cmp %rcx, %rdx
46*8d67ca89SAndroid Build Coastguard Worker  ja __memset_chk_fail
47*8d67ca89SAndroid Build Coastguard Worker  // Fall through to memset...
48*8d67ca89SAndroid Build Coastguard WorkerEND(__memset_chk_generic)
49*8d67ca89SAndroid Build Coastguard Worker
50*8d67ca89SAndroid Build Coastguard Worker
51*8d67ca89SAndroid Build Coastguard Worker	.section .text.sse2,"ax",@progbits
52*8d67ca89SAndroid Build Coastguard WorkerENTRY(memset_generic)
53*8d67ca89SAndroid Build Coastguard Worker	movq	%rdi, %rax
54*8d67ca89SAndroid Build Coastguard Worker	and	$0xff, %rsi
55*8d67ca89SAndroid Build Coastguard Worker	mov	$0x0101010101010101, %rcx
56*8d67ca89SAndroid Build Coastguard Worker	imul	%rsi, %rcx
57*8d67ca89SAndroid Build Coastguard Worker	cmpq	$16, %rdx
58*8d67ca89SAndroid Build Coastguard Worker	jae	L(16bytesormore)
59*8d67ca89SAndroid Build Coastguard Worker	testb	$8, %dl
60*8d67ca89SAndroid Build Coastguard Worker	jnz	L(8_15bytes)
61*8d67ca89SAndroid Build Coastguard Worker	testb	$4, %dl
62*8d67ca89SAndroid Build Coastguard Worker	jnz	L(4_7bytes)
63*8d67ca89SAndroid Build Coastguard Worker	testb	$2, %dl
64*8d67ca89SAndroid Build Coastguard Worker	jnz	L(2_3bytes)
65*8d67ca89SAndroid Build Coastguard Worker	testb	$1, %dl
66*8d67ca89SAndroid Build Coastguard Worker	jz	L(return)
67*8d67ca89SAndroid Build Coastguard Worker	movb	%cl, (%rdi)
68*8d67ca89SAndroid Build Coastguard WorkerL(return):
69*8d67ca89SAndroid Build Coastguard Worker	ret
70*8d67ca89SAndroid Build Coastguard Worker
71*8d67ca89SAndroid Build Coastguard WorkerL(8_15bytes):
72*8d67ca89SAndroid Build Coastguard Worker	movq	%rcx, (%rdi)
73*8d67ca89SAndroid Build Coastguard Worker	movq	%rcx, -8(%rdi, %rdx)
74*8d67ca89SAndroid Build Coastguard Worker	ret
75*8d67ca89SAndroid Build Coastguard Worker
76*8d67ca89SAndroid Build Coastguard WorkerL(4_7bytes):
77*8d67ca89SAndroid Build Coastguard Worker	movl	%ecx, (%rdi)
78*8d67ca89SAndroid Build Coastguard Worker	movl	%ecx, -4(%rdi, %rdx)
79*8d67ca89SAndroid Build Coastguard Worker	ret
80*8d67ca89SAndroid Build Coastguard Worker
81*8d67ca89SAndroid Build Coastguard WorkerL(2_3bytes):
82*8d67ca89SAndroid Build Coastguard Worker	movw	%cx, (%rdi)
83*8d67ca89SAndroid Build Coastguard Worker	movw	%cx, -2(%rdi, %rdx)
84*8d67ca89SAndroid Build Coastguard Worker	ret
85*8d67ca89SAndroid Build Coastguard Worker
86*8d67ca89SAndroid Build Coastguard Worker	ALIGN (4)
87*8d67ca89SAndroid Build Coastguard WorkerL(16bytesormore):
88*8d67ca89SAndroid Build Coastguard Worker	movd	%rcx, %xmm0
89*8d67ca89SAndroid Build Coastguard Worker	pshufd	$0, %xmm0, %xmm0
90*8d67ca89SAndroid Build Coastguard Worker	movdqu	%xmm0, (%rdi)
91*8d67ca89SAndroid Build Coastguard Worker	movdqu	%xmm0, -16(%rdi, %rdx)
92*8d67ca89SAndroid Build Coastguard Worker	cmpq	$32, %rdx
93*8d67ca89SAndroid Build Coastguard Worker	jbe	L(32bytesless)
94*8d67ca89SAndroid Build Coastguard Worker	movdqu	%xmm0, 16(%rdi)
95*8d67ca89SAndroid Build Coastguard Worker	movdqu	%xmm0, -32(%rdi, %rdx)
96*8d67ca89SAndroid Build Coastguard Worker	cmpq	$64, %rdx
97*8d67ca89SAndroid Build Coastguard Worker	jbe	L(64bytesless)
98*8d67ca89SAndroid Build Coastguard Worker	movdqu	%xmm0, 32(%rdi)
99*8d67ca89SAndroid Build Coastguard Worker	movdqu	%xmm0, 48(%rdi)
100*8d67ca89SAndroid Build Coastguard Worker	movdqu	%xmm0, -64(%rdi, %rdx)
101*8d67ca89SAndroid Build Coastguard Worker	movdqu	%xmm0, -48(%rdi, %rdx)
102*8d67ca89SAndroid Build Coastguard Worker	cmpq	$128, %rdx
103*8d67ca89SAndroid Build Coastguard Worker	ja	L(128bytesmore)
104*8d67ca89SAndroid Build Coastguard WorkerL(32bytesless):
105*8d67ca89SAndroid Build Coastguard WorkerL(64bytesless):
106*8d67ca89SAndroid Build Coastguard Worker	ret
107*8d67ca89SAndroid Build Coastguard Worker
108*8d67ca89SAndroid Build Coastguard Worker	ALIGN (4)
109*8d67ca89SAndroid Build Coastguard WorkerL(128bytesmore):
110*8d67ca89SAndroid Build Coastguard Worker	leaq	64(%rdi), %rcx
111*8d67ca89SAndroid Build Coastguard Worker	andq	$-64, %rcx
112*8d67ca89SAndroid Build Coastguard Worker	movq	%rdx, %r8
113*8d67ca89SAndroid Build Coastguard Worker	addq	%rdi, %rdx
114*8d67ca89SAndroid Build Coastguard Worker	andq	$-64, %rdx
115*8d67ca89SAndroid Build Coastguard Worker	cmpq	%rcx, %rdx
116*8d67ca89SAndroid Build Coastguard Worker	je	L(return)
117*8d67ca89SAndroid Build Coastguard Worker
118*8d67ca89SAndroid Build Coastguard Worker	cmp	__x86_shared_cache_size(%rip), %r8
119*8d67ca89SAndroid Build Coastguard Worker
120*8d67ca89SAndroid Build Coastguard Worker	ja	L(128bytesmore_nt)
121*8d67ca89SAndroid Build Coastguard Worker
122*8d67ca89SAndroid Build Coastguard Worker	ALIGN (4)
123*8d67ca89SAndroid Build Coastguard WorkerL(128bytesmore_normal):
124*8d67ca89SAndroid Build Coastguard Worker	movdqa	%xmm0, (%rcx)
125*8d67ca89SAndroid Build Coastguard Worker	movaps	%xmm0, 0x10(%rcx)
126*8d67ca89SAndroid Build Coastguard Worker	movaps	%xmm0, 0x20(%rcx)
127*8d67ca89SAndroid Build Coastguard Worker	movaps	%xmm0, 0x30(%rcx)
128*8d67ca89SAndroid Build Coastguard Worker	addq	$64, %rcx
129*8d67ca89SAndroid Build Coastguard Worker	cmpq	%rcx, %rdx
130*8d67ca89SAndroid Build Coastguard Worker	jne	L(128bytesmore_normal)
131*8d67ca89SAndroid Build Coastguard Worker	ret
132*8d67ca89SAndroid Build Coastguard Worker
133*8d67ca89SAndroid Build Coastguard Worker	ALIGN (4)
134*8d67ca89SAndroid Build Coastguard WorkerL(128bytesmore_nt):
135*8d67ca89SAndroid Build Coastguard Worker	movntdq	%xmm0, (%rcx)
136*8d67ca89SAndroid Build Coastguard Worker	movntdq	%xmm0, 0x10(%rcx)
137*8d67ca89SAndroid Build Coastguard Worker	movntdq	%xmm0, 0x20(%rcx)
138*8d67ca89SAndroid Build Coastguard Worker	movntdq	%xmm0, 0x30(%rcx)
139*8d67ca89SAndroid Build Coastguard Worker	leaq	64(%rcx), %rcx
140*8d67ca89SAndroid Build Coastguard Worker	cmpq	%rcx, %rdx
141*8d67ca89SAndroid Build Coastguard Worker	jne	L(128bytesmore_nt)
142*8d67ca89SAndroid Build Coastguard Worker	sfence
143*8d67ca89SAndroid Build Coastguard Worker	ret
144*8d67ca89SAndroid Build Coastguard Worker
145*8d67ca89SAndroid Build Coastguard WorkerEND(memset_generic)
146