remove empty dir
[ghc-hetmet.git] / rts / gmp / mpn / x86 / lshift.asm
1 dnl  x86 mpn_lshift -- mpn left 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_lshift (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_lshift)
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         subl    $4,%esi                 C adjust src
50
51         movl    (%esi,%edx,4),%ebx      C read most significant limb
52         xorl    %eax,%eax
53         shldl(  %cl, %ebx, %eax)        C compute carry limb
54         decl    %edx
55         jz      L(end)
56         pushl   %eax                    C push carry limb onto stack
57         testb   $1,%dl
58         jnz     L(1)                    C enter loop in the middle
59         movl    %ebx,%eax
60
61         ALIGN(8)
62 L(oop): movl    (%esi,%edx,4),%ebx      C load next lower limb
63         shldl(  %cl, %ebx, %eax)        C compute result limb
64         movl    %eax,(%edi,%edx,4)      C store it
65         decl    %edx
66 L(1):   movl    (%esi,%edx,4),%eax
67         shldl(  %cl, %eax, %ebx)
68         movl    %ebx,(%edi,%edx,4)
69         decl    %edx
70         jnz     L(oop)
71
72         shll    %cl,%eax                C compute least significant limb
73         movl    %eax,(%edi)             C store it
74
75         popl    %eax                    C pop carry limb
76
77         popl    %ebx
78         popl    %esi
79         popl    %edi
80         ret
81
82 L(end): shll    %cl,%ebx                C compute least significant limb
83         movl    %ebx,(%edi)             C store it
84
85         popl    %ebx
86         popl    %esi
87         popl    %edi
88         ret
89
90 EPILOGUE()