Initial import from FreeBSD RELENG_4:
[games.git] / contrib / libgmp / mpn / x86 / lshift.S
1 /* i80386 __mpn_lshift -- 
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_lshift)
36 C_SYMBOL_NAME(__mpn_lshift:)
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         subl    $4,%esi                 /* adjust s_ptr */
47
48         movl    (%esi,%edx,4),%ebx      /* read most significant limb */
49         xorl    %eax,%eax
50         shldl   %cl,%ebx,%eax           /* compute carry limb */
51         decl    %edx
52         jz      Lend
53         pushl   %eax                    /* push carry limb onto stack */
54         testb   $1,%edx
55         jnz     L1                      /* enter loop in the middle */
56         movl    %ebx,%eax
57
58         ALIGN (3)
59 Loop:   movl    (%esi,%edx,4),%ebx      /* load next lower limb */
60         shldl   %cl,%ebx,%eax           /* compute result limb */
61         movl    %eax,(%edi,%edx,4)      /* store it */
62         decl    %edx
63 L1:     movl    (%esi,%edx,4),%eax
64         shldl   %cl,%eax,%ebx
65         movl    %ebx,(%edi,%edx,4)
66         decl    %edx
67         jnz     Loop
68
69         shll    %cl,%eax                /* compute least significant limb */
70         movl    %eax,(%edi)             /* store it */
71
72         popl    %eax                    /* pop carry limb */
73
74         popl    %ebx
75         popl    %esi
76         popl    %edi
77         ret
78
79 Lend:   shll    %cl,%ebx                /* compute least significant limb */
80         movl    %ebx,(%edi)             /* store it */
81
82         popl    %ebx
83         popl    %esi
84         popl    %edi
85         ret