blob: 6ee6153cc28ee02d4a89ade70f77c66d68f3dc0b [file] [log] [blame]
Austin Schuhbb1338c2024-06-15 19:31:16 -07001dnl 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()