Blame sysdeps/x86_64/lshift.S

Packit Service 82fcde
/* x86-64 __mpn_lshift --
Packit Service 82fcde
   Copyright (C) 2007-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU MP Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU MP Library is free software; you can redistribute it and/or modify
Packit Service 82fcde
   it under the terms of the GNU Lesser General Public License as published by
Packit Service 82fcde
   the Free Software Foundation; either version 2.1 of the License, or (at your
Packit Service 82fcde
   option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU MP Library is distributed in the hope that it will be useful, but
Packit Service 82fcde
   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit Service 82fcde
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
Packit Service 82fcde
   License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public License
Packit Service 82fcde
   along with the GNU MP Library; see the file COPYING.LIB.  If not,
Packit Service 82fcde
   see <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include "sysdep.h"
Packit Service 82fcde
#include "asm-syntax.h"
Packit Service 82fcde
Packit Service 82fcde
#define rp	%rdi
Packit Service 82fcde
#define up	%rsi
Packit Service 82fcde
#define n	%rdx
Packit Service 82fcde
#define cnt	%cl
Packit Service 82fcde
Packit Service 82fcde
	.text
Packit Service 82fcde
ENTRY (__mpn_lshift)
Packit Service 82fcde
	lea	-8(rp,n,8), rp
Packit Service 82fcde
	lea	-8(up,n,8), up
Packit Service 82fcde
Packit Service 82fcde
	mov	%edx, %eax
Packit Service 82fcde
	and	$3, %eax
Packit Service 82fcde
	jne	L(nb00)
Packit Service 82fcde
L(b00):	/* n = 4, 8, 12, ... */
Packit Service 82fcde
	mov	(up), %r10
Packit Service 82fcde
	mov	-8(up), %r11
Packit Service 82fcde
	xor	%eax, %eax
Packit Service 82fcde
	shld	%cl, %r10, %rax
Packit Service 82fcde
	mov	-16(up), %r8
Packit Service 82fcde
	lea	24(rp), rp
Packit Service 82fcde
	sub	$4, n
Packit Service 82fcde
	jmp	L(00)
Packit Service 82fcde
Packit Service 82fcde
L(nb00):/* n = 1, 5, 9, ... */
Packit Service 82fcde
	cmp	$2, %eax
Packit Service 82fcde
	jae	L(nb01)
Packit Service 82fcde
L(b01):	mov	(up), %r9
Packit Service 82fcde
	xor	%eax, %eax
Packit Service 82fcde
	shld	%cl, %r9, %rax
Packit Service 82fcde
	sub	$2, n
Packit Service 82fcde
	jb	L(le1)
Packit Service 82fcde
	mov	-8(up), %r10
Packit Service 82fcde
	mov	-16(up), %r11
Packit Service 82fcde
	lea	-8(up), up
Packit Service 82fcde
	lea	16(rp), rp
Packit Service 82fcde
	jmp	L(01)
Packit Service 82fcde
L(le1):	shl	%cl, %r9
Packit Service 82fcde
	mov	%r9, (rp)
Packit Service 82fcde
	ret
Packit Service 82fcde
Packit Service 82fcde
L(nb01):/* n = 2, 6, 10, ... */
Packit Service 82fcde
	jne	L(b11)
Packit Service 82fcde
L(b10):	mov	(up), %r8
Packit Service 82fcde
	mov	-8(up), %r9
Packit Service 82fcde
	xor	%eax, %eax
Packit Service 82fcde
	shld	%cl, %r8, %rax
Packit Service 82fcde
	sub	$3, n
Packit Service 82fcde
	jb	L(le2)
Packit Service 82fcde
	mov	-16(up), %r10
Packit Service 82fcde
	lea	-16(up), up
Packit Service 82fcde
	lea	8(rp), rp
Packit Service 82fcde
	jmp	L(10)
Packit Service 82fcde
L(le2):	shld	%cl, %r9, %r8
Packit Service 82fcde
	mov	%r8, (rp)
Packit Service 82fcde
	shl	%cl, %r9
Packit Service 82fcde
	mov	%r9, -8(rp)
Packit Service 82fcde
	ret
Packit Service 82fcde
Packit Service 82fcde
	.p2align 4		/* performance critical! */
Packit Service 82fcde
L(b11):	/* n = 3, 7, 11, ... */
Packit Service 82fcde
	mov	(up), %r11
Packit Service 82fcde
	mov	-8(up), %r8
Packit Service 82fcde
	xor	%eax, %eax
Packit Service 82fcde
	shld	%cl, %r11, %rax
Packit Service 82fcde
	mov	-16(up), %r9
Packit Service 82fcde
	lea	-24(up), up
Packit Service 82fcde
	sub	$4, n
Packit Service 82fcde
	jb	L(end)
Packit Service 82fcde
Packit Service 82fcde
	.p2align 4
Packit Service 82fcde
L(top):	shld	%cl, %r8, %r11
Packit Service 82fcde
	mov	(up), %r10
Packit Service 82fcde
	mov	%r11, (rp)
Packit Service 82fcde
L(10):	shld	%cl, %r9, %r8
Packit Service 82fcde
	mov	-8(up), %r11
Packit Service 82fcde
	mov	%r8, -8(rp)
Packit Service 82fcde
L(01):	shld	%cl, %r10, %r9
Packit Service 82fcde
	mov	-16(up), %r8
Packit Service 82fcde
	mov	%r9, -16(rp)
Packit Service 82fcde
L(00):	shld	%cl, %r11, %r10
Packit Service 82fcde
	mov	-24(up), %r9
Packit Service 82fcde
	mov	%r10, -24(rp)
Packit Service 82fcde
	add	$-32, up
Packit Service 82fcde
	lea	-32(rp), rp
Packit Service 82fcde
	sub	$4, n
Packit Service 82fcde
	jnc	L(top)
Packit Service 82fcde
Packit Service 82fcde
L(end):	shld	%cl, %r8, %r11
Packit Service 82fcde
	mov	%r11, (rp)
Packit Service 82fcde
	shld	%cl, %r9, %r8
Packit Service 82fcde
	mov	%r8, -8(rp)
Packit Service 82fcde
	shl	%cl, %r9
Packit Service 82fcde
	mov	%r9, -16(rp)
Packit Service 82fcde
	ret
Packit Service 82fcde
END (__mpn_lshift)