blob: a60dcaa4b23a3adfbd42c6b68ee96a2f1319d2cc [file] [log] [blame]
Austin Schuhdace2a62020-08-18 10:56:48 -07001dnl 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()