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