Initial import from FreeBSD RELENG_4:
[games.git] / contrib / libgmp / mpn / x86 / 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., 59 Temple Place - Suite 330, Boston,
20 MA 02111-1307, USA. */
21
22 /*
23   INPUT PARAMETERS
24   res_ptr       (sp + 4)
25   s_ptr         (sp + 8)
26   size          (sp + 12)
27   cnt           (sp + 16)
28 */
29
30 #include "sysdep.h"
31 #include "asm-syntax.h"
32
33 .text
34         ALIGN (3)
35         .globl C_SYMBOL_NAME(__mpn_rshift)
36 C_SYMBOL_NAME(__mpn_rshift:)
37         pushl   %edi
38         pushl   %esi
39         pushl   %ebx
40
41         movl    16(%esp),%edi           /* res_ptr */
42         movl    20(%esp),%esi           /* s_ptr */
43         movl    24(%esp),%edx           /* size */
44         movl    28(%esp),%ecx           /* cnt */
45
46         leal    -4(%edi,%edx,4),%edi
47         leal    (%esi,%edx,4),%esi
48         negl    %edx
49
50         movl    (%esi,%edx,4),%ebx      /* read least significant limb */
51         xorl    %eax,%eax
52         shrdl   %cl,%ebx,%eax           /* compute carry limb */
53         incl    %edx
54         jz      Lend
55         pushl   %eax                    /* push carry limb onto stack */
56         testb   $1,%edx
57         jnz     L1                      /* enter loop in the middle */
58         movl    %ebx,%eax
59
60         ALIGN (3)
61 Loop:   movl    (%esi,%edx,4),%ebx      /* load next higher limb */
62         shrdl   %cl,%ebx,%eax           /* compute result limb */
63         movl    %eax,(%edi,%edx,4)      /* store it */
64         incl    %edx
65 L1:     movl    (%esi,%edx,4),%eax
66         shrdl   %cl,%eax,%ebx
67         movl    %ebx,(%edi,%edx,4)
68         incl    %edx
69         jnz     Loop
70
71         shrl    %cl,%eax                /* compute most significant limb */
72         movl    %eax,(%edi)             /* store it */
73
74         popl    %eax                    /* pop carry limb */
75
76         popl    %ebx
77         popl    %esi
78         popl    %edi
79         ret
80
81 Lend:   shrl    %cl,%ebx                /* compute most significant limb */
82         movl    %ebx,(%edi)             /* store it */
83
84         popl    %ebx
85         popl    %esi
86         popl    %edi
87         ret