1dnl  x86 mpn_lshift -- mpn left 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	14.5
41
42
43C mp_limb_t mpn_lshift (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_lshift)
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	subl	$4,%esi			C adjust src
66
67	movl	(%esi,%edx,4),%ebx	C read most significant limb
68	xorl	%eax,%eax
69	shldl(	%cl, %ebx, %eax)	C compute carry limb
70	decl	%edx
71	jz	L(end)
72	pushl	%eax			C push carry limb onto stack
73	testb	$1,%dl
74	jnz	L(1)			C enter loop in the middle
75	movl	%ebx,%eax
76
77	ALIGN(8)
78L(oop):	movl	(%esi,%edx,4),%ebx	C load next lower limb
79	shldl(	%cl, %ebx, %eax)	C compute result limb
80	movl	%eax,(%edi,%edx,4)	C store it
81	decl	%edx
82L(1):	movl	(%esi,%edx,4),%eax
83	shldl(	%cl, %eax, %ebx)
84	movl	%ebx,(%edi,%edx,4)
85	decl	%edx
86	jnz	L(oop)
87
88	shll	%cl,%eax		C compute least significant limb
89	movl	%eax,(%edi)		C store it
90
91	popl	%eax			C pop carry limb
92
93	popl	%ebx
94	popl	%esi
95	popl	%edi
96	ret
97
98L(end):	shll	%cl,%ebx		C compute least significant limb
99	movl	%ebx,(%edi)		C store it
100
101	popl	%ebx
102	popl	%esi
103	popl	%edi
104	ret
105
106EPILOGUE()
107