beta-0.89.2
[luatex.git] / source / libs / gmp / gmp-src / mpn / x86 / rshift.asm
bloba60dcaa4b23a3adfbd42c6b68ee96a2f1319d2cc
1 dnl x86 mpn_rshift -- mpn right shift.
3 dnl Copyright 1992, 1994, 1996, 1999-2002 Free Software Foundation, Inc.
5 dnl This file is part of the GNU MP Library.
6 dnl
7 dnl The GNU MP Library is free software; you can redistribute it and/or modify
8 dnl it under the terms of either:
9 dnl
10 dnl * the GNU Lesser General Public License as published by the Free
11 dnl Software Foundation; either version 3 of the License, or (at your
12 dnl option) any later version.
13 dnl
14 dnl or
15 dnl
16 dnl * the GNU General Public License as published by the Free Software
17 dnl Foundation; either version 2 of the License, or (at your option) any
18 dnl later version.
19 dnl
20 dnl or both in parallel, as here.
21 dnl
22 dnl The GNU MP Library is distributed in the hope that it will be useful, but
23 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 dnl for more details.
26 dnl
27 dnl You should have received copies of the GNU General Public License and the
28 dnl GNU Lesser General Public License along with the GNU MP Library. If not,
29 dnl see https://www.gnu.org/licenses/.
31 include(`../config.m4')
34 C cycles/limb
35 C P54 7.5
36 C P55 7.0
37 C P6 2.5
38 C K6 4.5
39 C K7 5.0
40 C P4 16.5
43 C mp_limb_t mpn_rshift (mp_ptr dst, mp_srcptr src, mp_size_t size,
44 C unsigned shift);
46 defframe(PARAM_SHIFT,16)
47 defframe(PARAM_SIZE, 12)
48 defframe(PARAM_SRC, 8)
49 defframe(PARAM_DST, 4)
51 TEXT
52 ALIGN(8)
53 PROLOGUE(mpn_rshift)
55 pushl %edi
56 pushl %esi
57 pushl %ebx
58 deflit(`FRAME',12)
60 movl PARAM_DST,%edi
61 movl PARAM_SRC,%esi
62 movl PARAM_SIZE,%edx
63 movl PARAM_SHIFT,%ecx
65 leal -4(%edi,%edx,4),%edi
66 leal (%esi,%edx,4),%esi
67 negl %edx
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
79 ALIGN(8)
80 L(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
84 L(1): movl (%esi,%edx,4),%eax
85 shrdl( %cl, %eax, %ebx)
86 movl %ebx,(%edi,%edx,4)
87 incl %edx
88 jnz L(oop)
90 shrl %cl,%eax C compute most significant limb
91 movl %eax,(%edi) C store it
93 popl %eax C pop carry limb
95 popl %ebx
96 popl %esi
97 popl %edi
98 ret
100 L(end): shrl %cl,%ebx C compute most significant limb
101 movl %ebx,(%edi) C store it
103 popl %ebx
104 popl %esi
105 popl %edi
108 EPILOGUE()