1/*- 2 * Copyright (c) 2018 The FreeBSD Foundation 3 * 4 * This software was developed by Mateusz Guzik <[email protected]> 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 49 ALIGN_TEXT 50103200: 51 movq %r10,(%rdi) 52 movq %r10,8(%rdi) 53 movq %r10,16(%rdi) 54 movq %r10,24(%rdi) 55 leaq 32(%rdi),%rdi 56 subq $32,%rcx 57 cmpq $32,%rcx 58 ja 103200b 59 cmpb $16,%cl 60 ja 201632f 61 movq %r10,-16(%rdi,%rcx) 62 movq %r10,-8(%rdi,%rcx) 63 ret 64 ALIGN_TEXT 65101632: 66 cmpb $16,%cl 67 jl 100816f 68201632: 69 movq %r10,(%rdi) 70 movq %r10,8(%rdi) 71 movq %r10,-16(%rdi,%rcx) 72 movq %r10,-8(%rdi,%rcx) 73 ret 74 ALIGN_TEXT 75100816: 76 cmpb $8,%cl 77 jl 100408f 78 movq %r10,(%rdi) 79 movq %r10,-8(%rdi,%rcx) 80 ret 81 ALIGN_TEXT 82100408: 83 cmpb $4,%cl 84 jl 100204f 85 movl %r10d,(%rdi) 86 movl %r10d,-4(%rdi,%rcx) 87 ret 88 ALIGN_TEXT 89100204: 90 cmpb $2,%cl 91 jl 100001f 92 movw %r10w,(%rdi) 93 movw %r10w,-2(%rdi,%rcx) 94 ret 95 ALIGN_TEXT 96100001: 97 cmpb $0,%cl 98 je 100000f 99 movb %r10b,(%rdi) 100100000: 101 ret 102 ALIGN_TEXT 1031256: 104 movq %rdi,%r9 105 movq %r10,%rax 106 testl $15,%edi 107 jnz 3f 1081: 109.if \erms == 1 110 rep 111 stosb 112 movq %r9,%rax 113.else 114 movq %rcx,%rdx 115 shrq $3,%rcx 116 rep 117 stosq 118 movq %r9,%rax 119 andl $7,%edx 120 jnz 2f 121 ret 1222: 123 movq %r10,-8(%rdi,%rdx) 124.endif 125 ret 126 ALIGN_TEXT 1273: 128 movq %r10,(%rdi) 129 movq %r10,8(%rdi) 130 movq %rdi,%r8 131 andq $15,%r8 132 leaq -16(%rcx,%r8),%rcx 133 neg %r8 134 leaq 16(%rdi,%r8),%rdi 135 jmp 1b 136.endm 137 138 139ENTRY(memset) 140 MEMSET erms=0 141END(memset) 142 143 .section .note.GNU-stack,"",%progbits 144