xref: /dragonfly/lib/libc/x86_64/string/memset.S (revision 73b5ca6b)
1/*
2 * Copyright (c) 2018 The DragonFly Project.  All rights reserved.
3 *
4 * This code is derived from software contributed to The DragonFly Project
5 * by Matthew Dillon <dillon@backplane.com>
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 *
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in
15 *    the documentation and/or other materials provided with the
16 *    distribution.
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 *    contributors may be used to endorse or promote products derived
19 *    from this software without specific, prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34#include <machine/asm.h>
35
36/*
37 * %rdi:ptr %rsi:data %rdx:bytes
38 */
39ENTRY(memset)
40	movq	%rdi,%r8	/* Save base pointer for return */
41	movq    %rdx,%rcx	/* Setup count in %rcx */
42	movq	%rsi,%rax	/* Setup data in %rax for byte store */
43	cld
44	cmpq	$15,%rdx	/* trivial case */
45	jle	2f
46	testq	%rax,%rax	/* trivial case (0) */
47	jz	1f
48
49	andq	$0xFF,%rax	/* shift 0:7 to all bytes in %rax */
50	movq	%rax,%rsi
51	salq	$8,%rax
52	orq	%rsi,%rax
53	orq	%rax,%rsi
54	salq	$16,%rsi
55	orq	%rsi,%rax
56	orq	%rax,%rsi
57	salq	$32,%rsi
58	orq	%rsi,%rax
591:
60	shrq    $3,%rcx
61	rep
62	stosq
63	movq    %rdx,%rcx
64	andq    $7,%rcx
65	jnz     2f
66	movq	%r8,%rax
67	ret
682:      rep
69	stosb
70	movq	%r8,%rax
71	ret
72END(memset)
73
74	.section .note.GNU-stack,"",%progbits
75