FIX BUILD (with GHC 6.2.x): System.Directory.Internals is no more
[ghc-hetmet.git] / rts / gmp / mpn / x86 / mul_1.asm
1 dnl  x86 mpn_mul_1 (for 386, 486, and Pentium Pro) -- Multiply a limb vector
2 dnl  with a limb and store the result in a second limb vector.
3 dnl 
4 dnl      cycles/limb
5 dnl  P6:     5.5
6 dnl
7 dnl  The following CPUs have their own optimized code, but for reference the
8 dnl  code here runs as follows.
9 dnl
10 dnl      cycles/limb
11 dnl  P5:    12.5
12 dnl  K6:    10.5
13 dnl  K7:     4.5
14
15
16 dnl  Copyright (C) 1992, 1994, 1997, 1998, 1999, 2000 Free Software
17 dnl  Foundation, Inc.
18 dnl 
19 dnl  This file is part of the GNU MP Library.
20 dnl 
21 dnl  The GNU MP Library is free software; you can redistribute it and/or
22 dnl  modify it under the terms of the GNU Lesser General Public License as
23 dnl  published by the Free Software Foundation; either version 2.1 of the
24 dnl  License, or (at your option) any later version.
25 dnl 
26 dnl  The GNU MP Library is distributed in the hope that it will be useful,
27 dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
28 dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
29 dnl  Lesser General Public License for more details.
30 dnl 
31 dnl  You should have received a copy of the GNU Lesser General Public
32 dnl  License along with the GNU MP Library; see the file COPYING.LIB.  If
33 dnl  not, write to the Free Software Foundation, Inc., 59 Temple Place -
34 dnl  Suite 330, Boston, MA 02111-1307, USA.
35
36
37 include(`../config.m4')
38
39
40 C mp_limb_t mpn_mul_1 (mp_ptr dst, mp_srcptr src, mp_size_t size,
41 C                      mp_limb_t multiplier);
42
43 defframe(PARAM_MULTIPLIER,16)
44 defframe(PARAM_SIZE,      12)
45 defframe(PARAM_SRC,       8)
46 defframe(PARAM_DST,       4)
47
48         TEXT
49         ALIGN(8)
50 PROLOGUE(mpn_mul_1)
51 deflit(`FRAME',0)
52
53         pushl   %edi
54         pushl   %esi
55         pushl   %ebx
56         pushl   %ebp
57 deflit(`FRAME',16)
58
59         movl    PARAM_DST,%edi
60         movl    PARAM_SRC,%esi
61         movl    PARAM_SIZE,%ecx
62
63         xorl    %ebx,%ebx
64         andl    $3,%ecx
65         jz      L(end0)
66
67 L(oop0):
68         movl    (%esi),%eax
69         mull    PARAM_MULTIPLIER
70         leal    4(%esi),%esi
71         addl    %ebx,%eax
72         movl    $0,%ebx
73         adcl    %ebx,%edx
74         movl    %eax,(%edi)
75         movl    %edx,%ebx       C propagate carry into cylimb
76
77         leal    4(%edi),%edi
78         decl    %ecx
79         jnz     L(oop0)
80
81 L(end0):
82         movl    PARAM_SIZE,%ecx
83         shrl    $2,%ecx
84         jz      L(end)
85
86
87         ALIGN(8)
88 L(oop): movl    (%esi),%eax
89         mull    PARAM_MULTIPLIER
90         addl    %eax,%ebx
91         movl    $0,%ebp
92         adcl    %edx,%ebp
93
94         movl    4(%esi),%eax
95         mull    PARAM_MULTIPLIER
96         movl    %ebx,(%edi)
97         addl    %eax,%ebp       C new lo + cylimb
98         movl    $0,%ebx
99         adcl    %edx,%ebx
100
101         movl    8(%esi),%eax
102         mull    PARAM_MULTIPLIER
103         movl    %ebp,4(%edi)
104         addl    %eax,%ebx       C new lo + cylimb
105         movl    $0,%ebp
106         adcl    %edx,%ebp
107
108         movl    12(%esi),%eax
109         mull    PARAM_MULTIPLIER
110         movl    %ebx,8(%edi)
111         addl    %eax,%ebp       C new lo + cylimb
112         movl    $0,%ebx
113         adcl    %edx,%ebx
114
115         movl    %ebp,12(%edi)
116
117         leal    16(%esi),%esi
118         leal    16(%edi),%edi
119         decl    %ecx
120         jnz     L(oop)
121
122 L(end): movl    %ebx,%eax
123
124         popl    %ebp
125         popl    %ebx
126         popl    %esi
127         popl    %edi
128         ret
129
130 EPILOGUE()