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 34ENTRY(memcmp) 35 cmpq $16,%rdx 36 jae 5f 371: 38 testq %rdx,%rdx 39 je 3f 40 xorl %ecx,%ecx 412: 42 movzbl (%rdi,%rcx,1),%eax 43 movzbl (%rsi,%rcx,1),%r8d 44 cmpb %r8b,%al 45 jne 4f 46 addq $1,%rcx 47 cmpq %rcx,%rdx 48 jz 3f 49 movzbl (%rdi,%rcx,1),%eax 50 movzbl (%rsi,%rcx,1),%r8d 51 cmpb %r8b,%al 52 jne 4f 53 addq $1,%rcx 54 cmpq %rcx,%rdx 55 jz 3f 56 movzbl (%rdi,%rcx,1),%eax 57 movzbl (%rsi,%rcx,1),%r8d 58 cmpb %r8b,%al 59 jne 4f 60 addq $1,%rcx 61 cmpq %rcx,%rdx 62 jz 3f 63 movzbl (%rdi,%rcx,1),%eax 64 movzbl (%rsi,%rcx,1),%r8d 65 cmpb %r8b,%al 66 jne 4f 67 addq $1,%rcx 68 cmpq %rcx,%rdx 69 jne 2b 703: 71 xorl %eax,%eax 72 ret 734: 74 subl %r8d,%eax 75 ret 765: 77 cmpq $32,%rdx 78 jae 7f 796: 80 /* 81 * 8 bytes 82 */ 83 movq (%rdi),%r8 84 movq (%rsi),%r9 85 cmpq %r8,%r9 86 jne 1b 87 leaq 8(%rdi),%rdi 88 leaq 8(%rsi),%rsi 89 subq $8,%rdx 90 cmpq $8,%rdx 91 jae 6b 92 jl 1b 93 jmp 3b 947: 95 /* 96 * 32 bytes 97 */ 98 movq (%rsi),%r8 99 movq 8(%rsi),%r9 100 subq (%rdi),%r8 101 subq 8(%rdi),%r9 102 or %r8,%r9 103 jnz 1b 104 105 movq 16(%rsi),%r8 106 movq 24(%rsi),%r9 107 subq 16(%rdi),%r8 108 subq 24(%rdi),%r9 109 or %r8,%r9 110 jnz 1b 111 112 leaq 32(%rdi),%rdi 113 leaq 32(%rsi),%rsi 114 subq $32,%rdx 115 cmpq $32,%rdx 116 jae 7b 117 jnz 1b 118 jmp 3b 119END(memcmp) 120 121 .section .note.GNU-stack,"",%progbits 122