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