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