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 49103200: 50 movq %r10,(%rdi) 51 movq %r10,8(%rdi) 52 movq %r10,16(%rdi) 53 movq %r10,24(%rdi) 54 leaq 32(%rdi),%rdi 55 subq $32,%rcx 56 cmpq $32,%rcx 57 ja 103200b 58 cmpb $16,%cl 59 ja 201632f 60 movq %r10,-16(%rdi,%rcx) 61 movq %r10,-8(%rdi,%rcx) 62 ret 63 ALIGN_TEXT 64101632: 65 cmpb $16,%cl 66 jl 100816f 67201632: 68 movq %r10,(%rdi) 69 movq %r10,8(%rdi) 70 movq %r10,-16(%rdi,%rcx) 71 movq %r10,-8(%rdi,%rcx) 72 ret 73 ALIGN_TEXT 74100816: 75 cmpb $8,%cl 76 jl 100408f 77 movq %r10,(%rdi) 78 movq %r10,-8(%rdi,%rcx) 79 ret 80 ALIGN_TEXT 81100408: 82 cmpb $4,%cl 83 jl 100204f 84 movl %r10d,(%rdi) 85 movl %r10d,-4(%rdi,%rcx) 86 ret 87 ALIGN_TEXT 88100204: 89 cmpb $2,%cl 90 jl 100001f 91 movw %r10w,(%rdi) 92 movw %r10w,-2(%rdi,%rcx) 93 ret 94 ALIGN_TEXT 95100001: 96 cmpb $0,%cl 97 je 100000f 98 movb %r10b,(%rdi) 99100000: 100 ret 101 ALIGN_TEXT 1021256: 103 movq %rdi,%r9 104 movq %r10,%rax 105 testl $15,%edi 106 jnz 3f 1071: 108.if \erms == 1 109 rep 110 stosb 111 movq %r9,%rax 112.else 113 movq %rcx,%rdx 114 shrq $3,%rcx 115 rep 116 stosq 117 movq %r9,%rax 118 andl $7,%edx 119 jnz 2f 120 ret 1212: 122 movq %r10,-8(%rdi,%rdx) 123.endif 124 ret 125 ALIGN_TEXT 1263: 127 movq %r10,(%rdi) 128 movq %r10,8(%rdi) 129 movq %rdi,%r8 130 andq $15,%r8 131 leaq -16(%rcx,%r8),%rcx 132 neg %r8 133 leaq 16(%rdi,%r8),%rdi 134 jmp 1b 135.endm 136 137 138ENTRY(memset) 139 MEMSET erms=0 140END(memset) 141 142 .section .note.GNU-stack,"",%progbits 143