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