Blame sysdeps/x86_64/memcmp.S

Packit Service 82fcde
/* memcmp with SSE2
Packit Service 82fcde
   Copyright (C) 2009-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   Contributed by Intel Corporation.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
Packit Service 82fcde
	.text
Packit Service 82fcde
ENTRY (memcmp)
Packit Service 82fcde
	test	%rdx, %rdx
Packit Service 82fcde
	jz	L(finz)
Packit Service 82fcde
	cmpq	$1, %rdx
Packit Service 82fcde
	jle	L(finr1b)
Packit Service 82fcde
	subq	%rdi, %rsi
Packit Service 82fcde
	movq	%rdx, %r10
Packit Service 82fcde
	cmpq	$32, %r10
Packit Service 82fcde
	jge	L(gt32)
Packit Service 82fcde
	/* Handle small chunks and last block of less than 32 bytes.  */
Packit Service 82fcde
L(small):
Packit Service 82fcde
	testq	$1, %r10
Packit Service 82fcde
	jz	L(s2b)
Packit Service 82fcde
	movzbl	(%rdi),	%eax
Packit Service 82fcde
	movzbl	(%rdi, %rsi), %edx
Packit Service 82fcde
	subq    $1, %r10
Packit Service 82fcde
	je	L(finz1)
Packit Service 82fcde
	addq	$1, %rdi
Packit Service 82fcde
	subl	%edx, %eax
Packit Service 82fcde
	jnz	L(exit)
Packit Service 82fcde
L(s2b):
Packit Service 82fcde
	testq	$2, %r10
Packit Service 82fcde
	jz	L(s4b)
Packit Service 82fcde
	movzwl	(%rdi),	%eax
Packit Service 82fcde
	movzwl	(%rdi, %rsi), %edx
Packit Service 82fcde
	subq    $2, %r10
Packit Service 82fcde
	je	L(fin2_7)
Packit Service 82fcde
	addq	$2, %rdi
Packit Service 82fcde
	cmpl	%edx, %eax
Packit Service 82fcde
	jnz	L(fin2_7)
Packit Service 82fcde
L(s4b):
Packit Service 82fcde
	testq	$4, %r10
Packit Service 82fcde
	jz	L(s8b)
Packit Service 82fcde
	movl	(%rdi),	%eax
Packit Service 82fcde
	movl	(%rdi, %rsi), %edx
Packit Service 82fcde
	subq    $4, %r10
Packit Service 82fcde
	je	L(fin2_7)
Packit Service 82fcde
	addq	$4, %rdi
Packit Service 82fcde
	cmpl	%edx, %eax
Packit Service 82fcde
	jnz	L(fin2_7)
Packit Service 82fcde
L(s8b):
Packit Service 82fcde
	testq	$8, %r10
Packit Service 82fcde
	jz	L(s16b)
Packit Service 82fcde
	movq	(%rdi),	%rax
Packit Service 82fcde
	movq	(%rdi, %rsi), %rdx
Packit Service 82fcde
	subq    $8, %r10
Packit Service 82fcde
	je	L(fin2_7)
Packit Service 82fcde
	addq	$8, %rdi
Packit Service 82fcde
	cmpq	%rdx, %rax
Packit Service 82fcde
	jnz	L(fin2_7)
Packit Service 82fcde
L(s16b):
Packit Service 82fcde
	movdqu    (%rdi), %xmm1
Packit Service 82fcde
	movdqu    (%rdi, %rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   %xmm0, %xmm1
Packit Service 82fcde
	pmovmskb  %xmm1, %edx
Packit Service 82fcde
	xorl	  %eax, %eax
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jz	  L(finz)
Packit Service 82fcde
	bsfl      %edx, %ecx
Packit Service 82fcde
	leaq	 (%rdi, %rcx), %rcx
Packit Service 82fcde
	movzbl	 (%rcx), %eax
Packit Service 82fcde
	movzbl	 (%rsi, %rcx), %edx
Packit Service 82fcde
	jmp	 L(finz1)
Packit Service 82fcde
Packit Service 82fcde
	.p2align 4,, 4
Packit Service 82fcde
L(finr1b):
Packit Service 82fcde
	movzbl	(%rdi), %eax
Packit Service 82fcde
	movzbl  (%rsi), %edx
Packit Service 82fcde
L(finz1):
Packit Service 82fcde
	subl	%edx, %eax
Packit Service 82fcde
L(exit):
Packit Service 82fcde
	ret
Packit Service 82fcde
Packit Service 82fcde
	.p2align 4,, 4
Packit Service 82fcde
L(fin2_7):
Packit Service 82fcde
	cmpq	%rdx, %rax
Packit Service 82fcde
	jz	L(finz)
Packit Service 82fcde
	movq	%rax, %r11
Packit Service 82fcde
	subq	%rdx, %r11
Packit Service 82fcde
	bsfq	%r11, %rcx
Packit Service 82fcde
	sarq	$3, %rcx
Packit Service 82fcde
	salq	$3, %rcx
Packit Service 82fcde
	sarq	%cl, %rax
Packit Service 82fcde
	movzbl  %al, %eax
Packit Service 82fcde
	sarq	%cl, %rdx
Packit Service 82fcde
	movzbl  %dl, %edx
Packit Service 82fcde
	subl	%edx, %eax
Packit Service 82fcde
	ret
Packit Service 82fcde
Packit Service 82fcde
	.p2align 4,, 4
Packit Service 82fcde
L(finz):
Packit Service 82fcde
	xorl	%eax, %eax
Packit Service 82fcde
	ret
Packit Service 82fcde
Packit Service 82fcde
	/* For blocks bigger than 32 bytes
Packit Service 82fcde
	   1. Advance one of the addr pointer to be 16B aligned.
Packit Service 82fcde
	   2. Treat the case of both addr pointers aligned to 16B
Packit Service 82fcde
	      separately to avoid movdqu.
Packit Service 82fcde
	   3. Handle any blocks of greater than 64 consecutive bytes with
Packit Service 82fcde
	      unrolling to reduce branches.
Packit Service 82fcde
	   4. At least one addr pointer is 16B aligned, use memory version
Packit Service 82fcde
	      of pcmbeqb.
Packit Service 82fcde
	*/
Packit Service 82fcde
	.p2align 4,, 4
Packit Service 82fcde
L(gt32):
Packit Service 82fcde
	movq	%rdx, %r11
Packit Service 82fcde
	addq	%rdi, %r11
Packit Service 82fcde
	movq	%rdi, %r8
Packit Service 82fcde
Packit Service 82fcde
	andq	$15, %r8
Packit Service 82fcde
	jz	L(16am)
Packit Service 82fcde
	/* Both pointers may be misaligned.  */
Packit Service 82fcde
	movdqu	(%rdi),	%xmm1
Packit Service 82fcde
	movdqu	(%rdi, %rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   %xmm0, %xmm1
Packit Service 82fcde
	pmovmskb  %xmm1, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	neg	 %r8
Packit Service 82fcde
	leaq    16(%rdi, %r8), %rdi
Packit Service 82fcde
L(16am):
Packit Service 82fcde
	/* Handle two 16B aligned pointers separately.  */
Packit Service 82fcde
	testq   $15, %rsi
Packit Service 82fcde
	jz      L(ATR)
Packit Service 82fcde
	testq	$16, %rdi
Packit Service 82fcde
	jz	L(A32)
Packit Service 82fcde
	movdqu	(%rdi, %rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq	$16, %rdi
Packit Service 82fcde
L(A32):
Packit Service 82fcde
	movq	%r11, %r10
Packit Service 82fcde
	andq	$-32, %r10
Packit Service 82fcde
	cmpq	%r10, %rdi
Packit Service 82fcde
        jge	L(mt16)
Packit Service 82fcde
	/* Pre-unroll to be ready for unrolled 64B loop.  */
Packit Service 82fcde
	testq	$32, %rdi
Packit Service 82fcde
	jz	L(A64)
Packit Service 82fcde
	movdqu    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqu    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb  (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
L(A64):
Packit Service 82fcde
	movq	%r11, %r10
Packit Service 82fcde
	andq	$-64, %r10
Packit Service 82fcde
	cmpq	%r10, %rdi
Packit Service 82fcde
        jge	L(mt32)
Packit Service 82fcde
Packit Service 82fcde
L(A64main):
Packit Service 82fcde
	movdqu    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqu    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqu    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqu    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb  (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	cmpq       %rdi, %r10
Packit Service 82fcde
	jne       L(A64main)
Packit Service 82fcde
Packit Service 82fcde
L(mt32):
Packit Service 82fcde
	movq	%r11, %r10
Packit Service 82fcde
	andq	$-32, %r10
Packit Service 82fcde
	cmpq	%r10, %rdi
Packit Service 82fcde
        jge	L(mt16)
Packit Service 82fcde
Packit Service 82fcde
L(A32main):
Packit Service 82fcde
	movdqu    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqu    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb  (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	cmpq       %rdi, %r10
Packit Service 82fcde
	jne       L(A32main)
Packit Service 82fcde
L(mt16):
Packit Service 82fcde
	subq       %rdi, %r11
Packit Service 82fcde
	je	  L(finz)
Packit Service 82fcde
	movq	  %r11, %r10
Packit Service 82fcde
	jmp	  L(small)
Packit Service 82fcde
Packit Service 82fcde
	.p2align 4,, 4
Packit Service 82fcde
L(neq):
Packit Service 82fcde
	bsfl      %edx, %ecx
Packit Service 82fcde
	movzbl	 (%rdi, %rcx), %eax
Packit Service 82fcde
	addq	 %rdi, %rsi
Packit Service 82fcde
	movzbl	 (%rsi,%rcx), %edx
Packit Service 82fcde
	jmp	 L(finz1)
Packit Service 82fcde
Packit Service 82fcde
	.p2align 4,, 4
Packit Service 82fcde
L(ATR):
Packit Service 82fcde
	movq	%r11, %r10
Packit Service 82fcde
	andq	$-32, %r10
Packit Service 82fcde
	cmpq	%r10, %rdi
Packit Service 82fcde
        jge	L(mt16)
Packit Service 82fcde
	testq	$16, %rdi
Packit Service 82fcde
	jz	L(ATR32)
Packit Service 82fcde
Packit Service 82fcde
	movdqa    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
	cmpq       %rdi, %r10
Packit Service 82fcde
	je       L(mt16)
Packit Service 82fcde
Packit Service 82fcde
L(ATR32):
Packit Service 82fcde
	movq	%r11, %r10
Packit Service 82fcde
	andq	$-64, %r10
Packit Service 82fcde
	testq	$32, %rdi
Packit Service 82fcde
	jz	L(ATR64)
Packit Service 82fcde
Packit Service 82fcde
	movdqa    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqa    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
L(ATR64):
Packit Service 82fcde
	cmpq       %rdi, %r10
Packit Service 82fcde
	je	   L(mt32)
Packit Service 82fcde
Packit Service 82fcde
L(ATR64main):
Packit Service 82fcde
	movdqa    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqa    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqa    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqa    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
	cmpq       %rdi, %r10
Packit Service 82fcde
	jne       L(ATR64main)
Packit Service 82fcde
Packit Service 82fcde
	movq	%r11, %r10
Packit Service 82fcde
	andq	$-32, %r10
Packit Service 82fcde
	cmpq	%r10, %rdi
Packit Service 82fcde
        jge	L(mt16)
Packit Service 82fcde
Packit Service 82fcde
L(ATR32res):
Packit Service 82fcde
	movdqa    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	movdqa    (%rdi,%rsi), %xmm0
Packit Service 82fcde
	pcmpeqb   (%rdi), %xmm0
Packit Service 82fcde
	pmovmskb  %xmm0, %edx
Packit Service 82fcde
	subl      $0xffff, %edx
Packit Service 82fcde
	jnz       L(neq)
Packit Service 82fcde
	addq       $16, %rdi
Packit Service 82fcde
Packit Service 82fcde
	cmpq	  %r10, %rdi
Packit Service 82fcde
	jne       L(ATR32res)
Packit Service 82fcde
Packit Service 82fcde
	subq       %rdi, %r11
Packit Service 82fcde
	je	  L(finz)
Packit Service 82fcde
	movq	  %r11, %r10
Packit Service 82fcde
	jmp	  L(small)
Packit Service 82fcde
	/* Align to 16byte to improve instruction fetch.  */
Packit Service 82fcde
	.p2align 4,, 4
Packit Service 82fcde
END(memcmp)
Packit Service 82fcde
Packit Service 82fcde
#undef bcmp
Packit Service 82fcde
weak_alias (memcmp, bcmp)
Packit Service 82fcde
libc_hidden_builtin_def (memcmp)