remove empty dir
[ghc-hetmet.git] / rts / gmp / mpn / x86 / rshift.asm
1 dnl  x86 mpn_rshift -- mpn right shift.
2
3 dnl  Copyright (C) 1992, 1994, 1996, 1999, 2000 Free Software Foundation,
4 dnl  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 2.1 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
19 dnl  License along with the GNU MP Library; see the file COPYING.LIB.  If
20 dnl  not, write to the Free Software Foundation, Inc., 59 Temple Place -
21 dnl  Suite 330, Boston, MA 02111-1307, USA.
22
23
24 include(`../config.m4')
25
26
27 C mp_limb_t mpn_rshift (mp_ptr dst, mp_srcptr src, mp_size_t size,
28 C                       unsigned shift);
29
30 defframe(PARAM_SHIFT,16)
31 defframe(PARAM_SIZE, 12)
32 defframe(PARAM_SRC,  8)
33 defframe(PARAM_DST,  4)
34
35         .text
36         ALIGN(8)
37 PROLOGUE(mpn_rshift)
38
39         pushl   %edi
40         pushl   %esi
41         pushl   %ebx
42 deflit(`FRAME',12)
43
44         movl    PARAM_DST,%edi
45         movl    PARAM_SRC,%esi
46         movl    PARAM_SIZE,%edx
47         movl    PARAM_SHIFT,%ecx
48
49         leal    -4(%edi,%edx,4),%edi
50         leal    (%esi,%edx,4),%esi
51         negl    %edx
52
53         movl    (%esi,%edx,4),%ebx      C read least significant limb
54         xorl    %eax,%eax
55         shrdl(  %cl, %ebx, %eax)        C compute carry limb
56         incl    %edx
57         jz      L(end)
58         pushl   %eax                    C push carry limb onto stack
59         testb   $1,%dl
60         jnz     L(1)                    C enter loop in the middle
61         movl    %ebx,%eax
62
63         ALIGN(8)
64 L(oop): movl    (%esi,%edx,4),%ebx      C load next higher limb
65         shrdl(  %cl, %ebx, %eax)        C compute result limb
66         movl    %eax,(%edi,%edx,4)      C store it
67         incl    %edx
68 L(1):   movl    (%esi,%edx,4),%eax
69         shrdl(  %cl, %eax, %ebx)
70         movl    %ebx,(%edi,%edx,4)
71         incl    %edx
72         jnz     L(oop)
73
74         shrl    %cl,%eax                C compute most significant limb
75         movl    %eax,(%edi)             C store it
76
77         popl    %eax                    C pop carry limb
78
79         popl    %ebx
80         popl    %esi
81         popl    %edi
82         ret
83
84 L(end): shrl    %cl,%ebx                C compute most significant limb
85         movl    %ebx,(%edi)             C store it
86
87         popl    %ebx
88         popl    %esi
89         popl    %edi
90         ret
91
92 EPILOGUE()