1dnl  x86 mpn_rshift -- mpn right shift.
2
3dnl  Copyright 1992, 1994, 1996, 1999-2002 Free Software Foundation, Inc.
4
5dnl  This file is part of the GNU MP Library.
6dnl
7dnl  The GNU MP Library is free software; you can redistribute it and/or modify
8dnl  it under the terms of either:
9dnl
10dnl    * the GNU Lesser General Public License as published by the Free
11dnl      Software Foundation; either version 3 of the License, or (at your
12dnl      option) any later version.
13dnl
14dnl  or
15dnl
16dnl    * the GNU General Public License as published by the Free Software
17dnl      Foundation; either version 2 of the License, or (at your option) any
18dnl      later version.
19dnl
20dnl  or both in parallel, as here.
21dnl
22dnl  The GNU MP Library is distributed in the hope that it will be useful, but
23dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
25dnl  for more details.
26dnl
27dnl  You should have received copies of the GNU General Public License and the
28dnl  GNU Lesser General Public License along with the GNU MP Library.  If not,
29dnl  see https://www.gnu.org/licenses/.
30
31include(`../config.m4')
32
33
34C     cycles/limb
35C P54	 7.5
36C P55	 7.0
37C P6	 2.5
38C K6	 4.5
39C K7	 5.0
40C P4	16.5
41
42
43C mp_limb_t mpn_rshift (mp_ptr dst, mp_srcptr src, mp_size_t size,
44C                       unsigned shift);
45
46defframe(PARAM_SHIFT,16)
47defframe(PARAM_SIZE, 12)
48defframe(PARAM_SRC,  8)
49defframe(PARAM_DST,  4)
50
51	TEXT
52	ALIGN(8)
53PROLOGUE(mpn_rshift)
54
55	pushl	%edi
56	pushl	%esi
57	pushl	%ebx
58deflit(`FRAME',12)
59
60	movl	PARAM_DST,%edi
61	movl	PARAM_SRC,%esi
62	movl	PARAM_SIZE,%edx
63	movl	PARAM_SHIFT,%ecx
64
65	leal	-4(%edi,%edx,4),%edi
66	leal	(%esi,%edx,4),%esi
67	negl	%edx
68
69	movl	(%esi,%edx,4),%ebx	C read least significant limb
70	xorl	%eax,%eax
71	shrdl(	%cl, %ebx, %eax)	C compute carry limb
72	incl	%edx
73	jz	L(end)
74	pushl	%eax			C push carry limb onto stack
75	testb	$1,%dl
76	jnz	L(1)			C enter loop in the middle
77	movl	%ebx,%eax
78
79	ALIGN(8)
80L(oop):	movl	(%esi,%edx,4),%ebx	C load next higher limb
81	shrdl(	%cl, %ebx, %eax)	C compute result limb
82	movl	%eax,(%edi,%edx,4)	C store it
83	incl	%edx
84L(1):	movl	(%esi,%edx,4),%eax
85	shrdl(	%cl, %eax, %ebx)
86	movl	%ebx,(%edi,%edx,4)
87	incl	%edx
88	jnz	L(oop)
89
90	shrl	%cl,%eax		C compute most significant limb
91	movl	%eax,(%edi)		C store it
92
93	popl	%eax			C pop carry limb
94
95	popl	%ebx
96	popl	%esi
97	popl	%edi
98	ret
99
100L(end):	shrl	%cl,%ebx		C compute most significant limb
101	movl	%ebx,(%edi)		C store it
102
103	popl	%ebx
104	popl	%esi
105	popl	%edi
106	ret
107
108EPILOGUE()
109