xref: /freebsd/lib/libc/amd64/string/memset.S (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
17e02ad07SMateusz Guzik/*-
27e02ad07SMateusz Guzik * Copyright (c) 2018 The FreeBSD Foundation
37e02ad07SMateusz Guzik *
47e02ad07SMateusz Guzik * This software was developed by Mateusz Guzik <mjg@FreeBSD.org>
57e02ad07SMateusz Guzik * under sponsorship from the FreeBSD Foundation.
67e02ad07SMateusz Guzik *
77e02ad07SMateusz Guzik * Redistribution and use in source and binary forms, with or without
87e02ad07SMateusz Guzik * modification, are permitted provided that the following conditions
97e02ad07SMateusz Guzik * are met:
107e02ad07SMateusz Guzik * 1. Redistributions of source code must retain the above copyright
117e02ad07SMateusz Guzik *    notice, this list of conditions and the following disclaimer.
127e02ad07SMateusz Guzik * 2. Redistributions in binary form must reproduce the above copyright
137e02ad07SMateusz Guzik *    notice, this list of conditions and the following disclaimer in the
147e02ad07SMateusz Guzik *    documentation and/or other materials provided with the distribution.
157e02ad07SMateusz Guzik *
167e02ad07SMateusz Guzik * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
177e02ad07SMateusz Guzik * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
187e02ad07SMateusz Guzik * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
197e02ad07SMateusz Guzik * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
207e02ad07SMateusz Guzik * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
217e02ad07SMateusz Guzik * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
227e02ad07SMateusz Guzik * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
237e02ad07SMateusz Guzik * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
247e02ad07SMateusz Guzik * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
257e02ad07SMateusz Guzik * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267e02ad07SMateusz Guzik * SUCH DAMAGE.
2791c09a38SAlan Cox */
2891c09a38SAlan Cox
2991c09a38SAlan Cox#include <machine/asm.h>
30*0db6aef4SMateusz Guzik/*
31*0db6aef4SMateusz Guzik * Note: this routine was written with kernel use in mind (read: no simd),
32*0db6aef4SMateusz Guzik * it is only present in userspace as a temporary measure until something
33*0db6aef4SMateusz Guzik * better gets imported.
34*0db6aef4SMateusz Guzik */
35*0db6aef4SMateusz Guzik
36ad2ff705SMateusz Guzik#define ALIGN_TEXT      .p2align 4,0x90 /* 16-byte alignment, nop filled */
37ad2ff705SMateusz Guzik
386fff6344SMateusz Guzik.macro MEMSET erms
39ad2ff705SMateusz Guzik	movq	%rdi,%rax
4091c09a38SAlan Cox	movq	%rdx,%rcx
417e02ad07SMateusz Guzik	movzbq	%sil,%r8
42ad2ff705SMateusz Guzik	movabs	$0x0101010101010101,%r10
43ad2ff705SMateusz Guzik	imulq	%r8,%r10
44167374a1SMateusz Guzik
45167374a1SMateusz Guzik	cmpq	$32,%rcx
46088ac3efSMateusz Guzik	jbe	101632f
47167374a1SMateusz Guzik
48167374a1SMateusz Guzik	cmpq	$256,%rcx
49167374a1SMateusz Guzik	ja	1256f
50167374a1SMateusz Guzik
51164c3b81SMateusz Guzik	ALIGN_TEXT
52088ac3efSMateusz Guzik103200:
53ad2ff705SMateusz Guzik	movq	%r10,(%rdi)
54ad2ff705SMateusz Guzik	movq	%r10,8(%rdi)
55ad2ff705SMateusz Guzik	movq	%r10,16(%rdi)
56ad2ff705SMateusz Guzik	movq	%r10,24(%rdi)
57167374a1SMateusz Guzik	leaq	32(%rdi),%rdi
58167374a1SMateusz Guzik	subq	$32,%rcx
59167374a1SMateusz Guzik	cmpq	$32,%rcx
60088ac3efSMateusz Guzik	ja	103200b
61167374a1SMateusz Guzik	cmpb	$16,%cl
62088ac3efSMateusz Guzik	ja	201632f
63088ac3efSMateusz Guzik	movq	%r10,-16(%rdi,%rcx)
64088ac3efSMateusz Guzik	movq	%r10,-8(%rdi,%rcx)
65088ac3efSMateusz Guzik	ret
66088ac3efSMateusz Guzik	ALIGN_TEXT
67088ac3efSMateusz Guzik101632:
68088ac3efSMateusz Guzik	cmpb	$16,%cl
69088ac3efSMateusz Guzik	jl	100816f
70088ac3efSMateusz Guzik201632:
71ad2ff705SMateusz Guzik	movq	%r10,(%rdi)
72ad2ff705SMateusz Guzik	movq	%r10,8(%rdi)
73088ac3efSMateusz Guzik	movq	%r10,-16(%rdi,%rcx)
74088ac3efSMateusz Guzik	movq	%r10,-8(%rdi,%rcx)
75088ac3efSMateusz Guzik	ret
76088ac3efSMateusz Guzik	ALIGN_TEXT
77088ac3efSMateusz Guzik100816:
78167374a1SMateusz Guzik	cmpb	$8,%cl
79088ac3efSMateusz Guzik	jl	100408f
80ad2ff705SMateusz Guzik	movq	%r10,(%rdi)
81088ac3efSMateusz Guzik	movq	%r10,-8(%rdi,%rcx)
82088ac3efSMateusz Guzik	ret
83088ac3efSMateusz Guzik	ALIGN_TEXT
84088ac3efSMateusz Guzik100408:
85167374a1SMateusz Guzik	cmpb	$4,%cl
86088ac3efSMateusz Guzik	jl	100204f
87ad2ff705SMateusz Guzik	movl	%r10d,(%rdi)
88088ac3efSMateusz Guzik	movl	%r10d,-4(%rdi,%rcx)
89088ac3efSMateusz Guzik	ret
90088ac3efSMateusz Guzik	ALIGN_TEXT
91088ac3efSMateusz Guzik100204:
92167374a1SMateusz Guzik	cmpb	$2,%cl
93088ac3efSMateusz Guzik	jl	100001f
94ad2ff705SMateusz Guzik	movw	%r10w,(%rdi)
95088ac3efSMateusz Guzik	movw	%r10w,-2(%rdi,%rcx)
96088ac3efSMateusz Guzik	ret
97088ac3efSMateusz Guzik	ALIGN_TEXT
98088ac3efSMateusz Guzik100001:
99088ac3efSMateusz Guzik	cmpb	$0,%cl
100088ac3efSMateusz Guzik	je	100000f
101ad2ff705SMateusz Guzik	movb	%r10b,(%rdi)
102088ac3efSMateusz Guzik100000:
10391c09a38SAlan Cox	ret
104ad2ff705SMateusz Guzik	ALIGN_TEXT
105167374a1SMateusz Guzik1256:
106ad2ff705SMateusz Guzik	movq	%rdi,%r9
107ad2ff705SMateusz Guzik	movq	%r10,%rax
108ad2ff705SMateusz Guzik	testl	$15,%edi
109ad2ff705SMateusz Guzik	jnz	3f
110ad2ff705SMateusz Guzik1:
111167374a1SMateusz Guzik.if \erms == 1
1127e02ad07SMateusz Guzik	rep
1137e02ad07SMateusz Guzik	stosb
114ad2ff705SMateusz Guzik	movq	%r9,%rax
115167374a1SMateusz Guzik.else
116ad2ff705SMateusz Guzik	movq	%rcx,%rdx
117167374a1SMateusz Guzik	shrq	$3,%rcx
118167374a1SMateusz Guzik	rep
119167374a1SMateusz Guzik	stosq
1207e02ad07SMateusz Guzik	movq	%r9,%rax
121ad2ff705SMateusz Guzik	andl	$7,%edx
122ad2ff705SMateusz Guzik	jnz	2f
1237e02ad07SMateusz Guzik	ret
124ad2ff705SMateusz Guzik2:
125ad2ff705SMateusz Guzik	movq	%r10,-8(%rdi,%rdx)
126ad2ff705SMateusz Guzik.endif
127ad2ff705SMateusz Guzik	ret
128ad2ff705SMateusz Guzik	ALIGN_TEXT
129ad2ff705SMateusz Guzik3:
130ad2ff705SMateusz Guzik	movq	%r10,(%rdi)
131ad2ff705SMateusz Guzik	movq	%r10,8(%rdi)
132ad2ff705SMateusz Guzik	movq	%rdi,%r8
133ad2ff705SMateusz Guzik	andq	$15,%r8
134ad2ff705SMateusz Guzik	leaq	-16(%rcx,%r8),%rcx
135ad2ff705SMateusz Guzik	neg	%r8
136ad2ff705SMateusz Guzik	leaq	16(%rdi,%r8),%rdi
137ad2ff705SMateusz Guzik	jmp	1b
1387e02ad07SMateusz Guzik.endm
1397e02ad07SMateusz Guzik
140088ac3efSMateusz Guzik
1417e02ad07SMateusz GuzikENTRY(memset)
1426fff6344SMateusz Guzik	MEMSET erms=0
1435d053f46SPeter WemmEND(memset)
14493ab7586SKonstantin Belousov
14593ab7586SKonstantin Belousov	.section .note.GNU-stack,"",%progbits
146