Imported from gmp-1.900
[kopensolaris-gnu/glibc.git] / sysdeps / i386 / rshift.S
1 /* i80386 __mpn_rshift -- 
2
3 Copyright (C) 1992, 1994 Free Software Foundation, Inc.
4
5 This file is part of the GNU MP Library.
6
7 The GNU MP Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Library General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or (at your
10 option) any later version.
11
12 The GNU MP Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
15 License for more details.
16
17 You should have received a copy of the GNU Library General Public License
18 along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
19 the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21 /*
22   INPUT PARAMETERS
23   res_ptr       (sp + 4)
24   s_ptr         (sp + 8)
25   size          (sp + 12)
26   cnt           (sp + 16)
27 */
28
29 #include "sysdep.h"
30 #include "asm-syntax.h"
31
32 .text
33         ALIGN (3)
34         .globl C_SYMBOL_NAME(__mpn_rshift)
35 C_SYMBOL_NAME(__mpn_rshift:)
36         pushl   %edi
37         pushl   %esi
38         pushl   %ebx
39
40         movl    16(%esp),%edi           /* res_ptr */
41         movl    20(%esp),%esi           /* s_ptr */
42         movl    24(%esp),%edx           /* size */
43         movl    28(%esp),%ecx           /* cnt */
44
45         leal    -4(%edi,%edx,4),%edi
46         leal    (%esi,%edx,4),%esi
47         negl    %edx
48
49         movl    (%esi,%edx,4),%ebx      /* read least significant limb */
50         xorl    %eax,%eax
51         shrdl   %cl,%ebx,%eax           /* compute carry limb */
52         incl    %edx
53         jz      Lend
54         pushl   %eax                    /* push carry limb onto stack */
55         testb   $1,%edx
56         jnz     L1                      /* enter loop in the middle */
57         movl    %ebx,%eax
58
59         ALIGN (3)
60 Loop:   movl    (%esi,%edx,4),%ebx      /* load next higher limb */
61         shrdl   %cl,%ebx,%eax           /* compute result limb */
62         movl    %eax,(%edi,%edx,4)      /* store it */
63         incl    %edx
64 L1:     movl    (%esi,%edx,4),%eax
65         shrdl   %cl,%eax,%ebx
66         movl    %ebx,(%edi,%edx,4)
67         incl    %edx
68         jnz     Loop
69
70         shrl    %cl,%eax                /* compute most significant limb */
71         movl    %eax,(%edi)             /* store it */
72
73         popl    %eax                    /* pop carry limb */
74
75         popl    %ebx
76         popl    %esi
77         popl    %edi
78         ret
79
80 Lend:   shrl    %cl,%ebx                /* compute most significant limb */
81         movl    %ebx,(%edi)             /* store it */
82
83         popl    %ebx
84         popl    %esi
85         popl    %edi
86         ret