Blame sysdeps/i386/i586/lshift.S

Packit Service 82fcde
/* Pentium optimized __mpn_lshift --
Packit Service 82fcde
   Copyright (C) 1992-2018 Free Software Foundation, Inc.
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
#include "asm-syntax.h"
Packit Service 82fcde
Packit Service 82fcde
#define PARMS	4+16		/* space for 4 saved regs */
Packit Service 82fcde
#define RES	PARMS
Packit Service 82fcde
#define S	RES+4
Packit Service 82fcde
#define SIZE	S+4
Packit Service 82fcde
#define CNT	SIZE+4
Packit Service 82fcde
Packit Service 82fcde
	.text
Packit Service 82fcde
ENTRY (__mpn_lshift)
Packit Service 82fcde
Packit Service 82fcde
	pushl	%edi
Packit Service 82fcde
	cfi_adjust_cfa_offset (4)
Packit Service 82fcde
	pushl	%esi
Packit Service 82fcde
	cfi_adjust_cfa_offset (4)
Packit Service 82fcde
	pushl	%ebp
Packit Service 82fcde
	cfi_adjust_cfa_offset (4)
Packit Service 82fcde
	cfi_rel_offset (ebp, 0)
Packit Service 82fcde
	pushl	%ebx
Packit Service 82fcde
	cfi_adjust_cfa_offset (4)
Packit Service 82fcde
Packit Service 82fcde
	movl	RES(%esp),%edi
Packit Service 82fcde
	cfi_rel_offset (edi, 12)
Packit Service 82fcde
	movl	S(%esp),%esi
Packit Service 82fcde
	cfi_rel_offset (esi, 8)
Packit Service 82fcde
	movl	SIZE(%esp),%ebx
Packit Service 82fcde
	cfi_rel_offset (ebx, 0)
Packit Service 82fcde
	movl	CNT(%esp),%ecx
Packit Service 82fcde
Packit Service 82fcde
/* We can use faster code for shift-by-1 under certain conditions.  */
Packit Service 82fcde
	cmp	$1,%ecx
Packit Service 82fcde
	jne	L(normal)
Packit Service 82fcde
	leal	4(%esi),%eax
Packit Service 82fcde
	cmpl	%edi,%eax
Packit Service 82fcde
	jnc	L(special)		/* jump if s_ptr + 1 >= res_ptr */
Packit Service 82fcde
	leal	(%esi,%ebx,4),%eax
Packit Service 82fcde
	cmpl	%eax,%edi
Packit Service 82fcde
	jnc	L(special)		/* jump if res_ptr >= s_ptr + size */
Packit Service 82fcde
Packit Service 82fcde
L(normal):
Packit Service 82fcde
	leal	-4(%edi,%ebx,4),%edi
Packit Service 82fcde
	leal	-4(%esi,%ebx,4),%esi
Packit Service 82fcde
Packit Service 82fcde
	movl	(%esi),%edx
Packit Service 82fcde
	subl	$4,%esi
Packit Service 82fcde
	xorl	%eax,%eax
Packit Service 82fcde
	shldl	%cl,%edx,%eax		/* compute carry limb */
Packit Service 82fcde
	pushl	%eax			/* push carry limb onto stack */
Packit Service 82fcde
	cfi_adjust_cfa_offset (4)
Packit Service 82fcde
Packit Service 82fcde
	decl	%ebx
Packit Service 82fcde
	pushl	%ebx
Packit Service 82fcde
	cfi_adjust_cfa_offset (4)
Packit Service 82fcde
	shrl	$3,%ebx
Packit Service 82fcde
	jz	L(end)
Packit Service 82fcde
Packit Service 82fcde
	movl	(%edi),%eax		/* fetch destination cache line */
Packit Service 82fcde
Packit Service 82fcde
	ALIGN	(2)
Packit Service 82fcde
L(oop):	movl	-28(%edi),%eax		/* fetch destination cache line */
Packit Service 82fcde
	movl	%edx,%ebp
Packit Service 82fcde
Packit Service 82fcde
	movl	(%esi),%eax
Packit Service 82fcde
	movl	-4(%esi),%edx
Packit Service 82fcde
	shldl	%cl,%eax,%ebp
Packit Service 82fcde
	shldl	%cl,%edx,%eax
Packit Service 82fcde
	movl	%ebp,(%edi)
Packit Service 82fcde
	movl	%eax,-4(%edi)
Packit Service 82fcde
Packit Service 82fcde
	movl	-8(%esi),%ebp
Packit Service 82fcde
	movl	-12(%esi),%eax
Packit Service 82fcde
	shldl	%cl,%ebp,%edx
Packit Service 82fcde
	shldl	%cl,%eax,%ebp
Packit Service 82fcde
	movl	%edx,-8(%edi)
Packit Service 82fcde
	movl	%ebp,-12(%edi)
Packit Service 82fcde
Packit Service 82fcde
	movl	-16(%esi),%edx
Packit Service 82fcde
	movl	-20(%esi),%ebp
Packit Service 82fcde
	shldl	%cl,%edx,%eax
Packit Service 82fcde
	shldl	%cl,%ebp,%edx
Packit Service 82fcde
	movl	%eax,-16(%edi)
Packit Service 82fcde
	movl	%edx,-20(%edi)
Packit Service 82fcde
Packit Service 82fcde
	movl	-24(%esi),%eax
Packit Service 82fcde
	movl	-28(%esi),%edx
Packit Service 82fcde
	shldl	%cl,%eax,%ebp
Packit Service 82fcde
	shldl	%cl,%edx,%eax
Packit Service 82fcde
	movl	%ebp,-24(%edi)
Packit Service 82fcde
	movl	%eax,-28(%edi)
Packit Service 82fcde
Packit Service 82fcde
	subl	$32,%esi
Packit Service 82fcde
	subl	$32,%edi
Packit Service 82fcde
	decl	%ebx
Packit Service 82fcde
	jnz	L(oop)
Packit Service 82fcde
Packit Service 82fcde
L(end):	popl	%ebx
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	andl	$7,%ebx
Packit Service 82fcde
	jz	L(end2)
Packit Service 82fcde
L(oop2):
Packit Service 82fcde
	movl	(%esi),%eax
Packit Service 82fcde
	shldl	%cl,%eax,%edx
Packit Service 82fcde
	movl	%edx,(%edi)
Packit Service 82fcde
	movl	%eax,%edx
Packit Service 82fcde
	subl	$4,%esi
Packit Service 82fcde
	subl	$4,%edi
Packit Service 82fcde
	decl	%ebx
Packit Service 82fcde
	jnz	L(oop2)
Packit Service 82fcde
Packit Service 82fcde
L(end2):
Packit Service 82fcde
	shll	%cl,%edx		/* compute least significant limb */
Packit Service 82fcde
	movl	%edx,(%edi)		/* store it */
Packit Service 82fcde
Packit Service 82fcde
	popl	%eax			/* pop carry limb */
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
Packit Service 82fcde
	popl	%ebx
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	cfi_restore (ebx)
Packit Service 82fcde
	popl	%ebp
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	cfi_restore (ebp)
Packit Service 82fcde
	popl	%esi
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	cfi_restore (esi)
Packit Service 82fcde
	popl	%edi
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	cfi_restore (edi)
Packit Service 82fcde
Packit Service 82fcde
	ret
Packit Service 82fcde
Packit Service 82fcde
/* We loop from least significant end of the arrays, which is only
Packit Service 82fcde
   permissible if the source and destination don't overlap, since the
Packit Service 82fcde
   function is documented to work for overlapping source and destination.
Packit Service 82fcde
*/
Packit Service 82fcde
Packit Service 82fcde
	cfi_adjust_cfa_offset (16)
Packit Service 82fcde
	cfi_rel_offset (edi, 12)
Packit Service 82fcde
	cfi_rel_offset (esi, 8)
Packit Service 82fcde
	cfi_rel_offset (ebp, 4)
Packit Service 82fcde
	cfi_rel_offset (ebx, 0)
Packit Service 82fcde
L(special):
Packit Service 82fcde
	movl	(%esi),%edx
Packit Service 82fcde
	addl	$4,%esi
Packit Service 82fcde
Packit Service 82fcde
	decl	%ebx
Packit Service 82fcde
	pushl	%ebx
Packit Service 82fcde
	cfi_adjust_cfa_offset (4)
Packit Service 82fcde
	shrl	$3,%ebx
Packit Service 82fcde
Packit Service 82fcde
	addl	%edx,%edx
Packit Service 82fcde
	incl	%ebx
Packit Service 82fcde
	decl	%ebx
Packit Service 82fcde
	jz	L(Lend)
Packit Service 82fcde
Packit Service 82fcde
	movl	(%edi),%eax		/* fetch destination cache line */
Packit Service 82fcde
Packit Service 82fcde
	ALIGN	(2)
Packit Service 82fcde
L(Loop):
Packit Service 82fcde
	movl	28(%edi),%eax		/* fetch destination cache line */
Packit Service 82fcde
	movl	%edx,%ebp
Packit Service 82fcde
Packit Service 82fcde
	movl	(%esi),%eax
Packit Service 82fcde
	movl	4(%esi),%edx
Packit Service 82fcde
	adcl	%eax,%eax
Packit Service 82fcde
	movl	%ebp,(%edi)
Packit Service 82fcde
	adcl	%edx,%edx
Packit Service 82fcde
	movl	%eax,4(%edi)
Packit Service 82fcde
Packit Service 82fcde
	movl	8(%esi),%ebp
Packit Service 82fcde
	movl	12(%esi),%eax
Packit Service 82fcde
	adcl	%ebp,%ebp
Packit Service 82fcde
	movl	%edx,8(%edi)
Packit Service 82fcde
	adcl	%eax,%eax
Packit Service 82fcde
	movl	%ebp,12(%edi)
Packit Service 82fcde
Packit Service 82fcde
	movl	16(%esi),%edx
Packit Service 82fcde
	movl	20(%esi),%ebp
Packit Service 82fcde
	adcl	%edx,%edx
Packit Service 82fcde
	movl	%eax,16(%edi)
Packit Service 82fcde
	adcl	%ebp,%ebp
Packit Service 82fcde
	movl	%edx,20(%edi)
Packit Service 82fcde
Packit Service 82fcde
	movl	24(%esi),%eax
Packit Service 82fcde
	movl	28(%esi),%edx
Packit Service 82fcde
	adcl	%eax,%eax
Packit Service 82fcde
	movl	%ebp,24(%edi)
Packit Service 82fcde
	adcl	%edx,%edx
Packit Service 82fcde
	movl	%eax,28(%edi)
Packit Service 82fcde
Packit Service 82fcde
	leal	32(%esi),%esi		/* use leal not to clobber carry */
Packit Service 82fcde
	leal	32(%edi),%edi
Packit Service 82fcde
	decl	%ebx
Packit Service 82fcde
	jnz	L(Loop)
Packit Service 82fcde
Packit Service 82fcde
L(Lend):
Packit Service 82fcde
	popl	%ebx
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	sbbl	%eax,%eax		/* save carry in %eax */
Packit Service 82fcde
	andl	$7,%ebx
Packit Service 82fcde
	jz	L(Lend2)
Packit Service 82fcde
	addl	%eax,%eax		/* restore carry from eax */
Packit Service 82fcde
L(Loop2):
Packit Service 82fcde
	movl	%edx,%ebp
Packit Service 82fcde
	movl	(%esi),%edx
Packit Service 82fcde
	adcl	%edx,%edx
Packit Service 82fcde
	movl	%ebp,(%edi)
Packit Service 82fcde
Packit Service 82fcde
	leal	4(%esi),%esi		/* use leal not to clobber carry */
Packit Service 82fcde
	leal	4(%edi),%edi
Packit Service 82fcde
	decl	%ebx
Packit Service 82fcde
	jnz	L(Loop2)
Packit Service 82fcde
Packit Service 82fcde
	jmp	L(L1)
Packit Service 82fcde
L(Lend2):
Packit Service 82fcde
	addl	%eax,%eax		/* restore carry from eax */
Packit Service 82fcde
L(L1):	movl	%edx,(%edi)		/* store last limb */
Packit Service 82fcde
Packit Service 82fcde
	sbbl	%eax,%eax
Packit Service 82fcde
	negl	%eax
Packit Service 82fcde
Packit Service 82fcde
	popl	%ebx
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	cfi_restore (ebx)
Packit Service 82fcde
	popl	%ebp
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	cfi_restore (ebp)
Packit Service 82fcde
	popl	%esi
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	cfi_restore (esi)
Packit Service 82fcde
	popl	%edi
Packit Service 82fcde
	cfi_adjust_cfa_offset (-4)
Packit Service 82fcde
	cfi_restore (edi)
Packit Service 82fcde
Packit Service 82fcde
	ret
Packit Service 82fcde
END (__mpn_lshift)