Committer: Michael Beasley <mike@snafu.setup>
[mikesnafu-overlay.git] / arch / x86 / math-emu / mul_Xsig.S
blob717785a53eb401034f87429c2cfd4763ed42459f
1 /*---------------------------------------------------------------------------+
2  |  mul_Xsig.S                                                               |
3  |                                                                           |
4  | Multiply a 12 byte fixed point number by another fixed point number.      |
5  |                                                                           |
6  | Copyright (C) 1992,1994,1995                                              |
7  |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
8  |                       Australia.  E-mail billm@jacobi.maths.monash.edu.au |
9  |                                                                           |
10  | Call from C as:                                                           |
11  |   void mul32_Xsig(Xsig *x, unsigned b)                                    |
12  |                                                                           |
13  |   void mul64_Xsig(Xsig *x, unsigned long long *b)                         |
14  |                                                                           |
15  |   void mul_Xsig_Xsig(Xsig *x, unsigned *b)                                |
16  |                                                                           |
17  | The result is neither rounded nor normalized, and the ls bit or so may    |
18  | be wrong.                                                                 |
19  |                                                                           |
20  +---------------------------------------------------------------------------*/
21         .file   "mul_Xsig.S"
24 #include "fpu_emu.h"
26 .text
27 ENTRY(mul32_Xsig)
28         pushl %ebp
29         movl %esp,%ebp
30         subl $16,%esp
31         pushl %esi
33         movl PARAM1,%esi
34         movl PARAM2,%ecx
36         xor %eax,%eax
37         movl %eax,-4(%ebp)
38         movl %eax,-8(%ebp)
40         movl (%esi),%eax        /* lsl of Xsig */
41         mull %ecx               /* msl of b */
42         movl %edx,-12(%ebp)
44         movl 4(%esi),%eax       /* midl of Xsig */
45         mull %ecx               /* msl of b */
46         addl %eax,-12(%ebp)
47         adcl %edx,-8(%ebp)
48         adcl $0,-4(%ebp)
50         movl 8(%esi),%eax       /* msl of Xsig */
51         mull %ecx               /* msl of b */
52         addl %eax,-8(%ebp)
53         adcl %edx,-4(%ebp)
55         movl -12(%ebp),%eax
56         movl %eax,(%esi)
57         movl -8(%ebp),%eax
58         movl %eax,4(%esi)
59         movl -4(%ebp),%eax
60         movl %eax,8(%esi)
62         popl %esi
63         leave
64         ret
67 ENTRY(mul64_Xsig)
68         pushl %ebp
69         movl %esp,%ebp
70         subl $16,%esp
71         pushl %esi
73         movl PARAM1,%esi
74         movl PARAM2,%ecx
76         xor %eax,%eax
77         movl %eax,-4(%ebp)
78         movl %eax,-8(%ebp)
80         movl (%esi),%eax        /* lsl of Xsig */
81         mull 4(%ecx)            /* msl of b */
82         movl %edx,-12(%ebp)
84         movl 4(%esi),%eax       /* midl of Xsig */
85         mull (%ecx)             /* lsl of b */
86         addl %edx,-12(%ebp)
87         adcl $0,-8(%ebp)
88         adcl $0,-4(%ebp)
90         movl 4(%esi),%eax       /* midl of Xsig */
91         mull 4(%ecx)            /* msl of b */
92         addl %eax,-12(%ebp)
93         adcl %edx,-8(%ebp)
94         adcl $0,-4(%ebp)
96         movl 8(%esi),%eax       /* msl of Xsig */
97         mull (%ecx)             /* lsl of b */
98         addl %eax,-12(%ebp)
99         adcl %edx,-8(%ebp)
100         adcl $0,-4(%ebp)
102         movl 8(%esi),%eax       /* msl of Xsig */
103         mull 4(%ecx)            /* msl of b */
104         addl %eax,-8(%ebp)
105         adcl %edx,-4(%ebp)
107         movl -12(%ebp),%eax
108         movl %eax,(%esi)
109         movl -8(%ebp),%eax
110         movl %eax,4(%esi)
111         movl -4(%ebp),%eax
112         movl %eax,8(%esi)
114         popl %esi
115         leave
116         ret
120 ENTRY(mul_Xsig_Xsig)
121         pushl %ebp
122         movl %esp,%ebp
123         subl $16,%esp
124         pushl %esi
126         movl PARAM1,%esi
127         movl PARAM2,%ecx
129         xor %eax,%eax
130         movl %eax,-4(%ebp)
131         movl %eax,-8(%ebp)
133         movl (%esi),%eax        /* lsl of Xsig */
134         mull 8(%ecx)            /* msl of b */
135         movl %edx,-12(%ebp)
137         movl 4(%esi),%eax       /* midl of Xsig */
138         mull 4(%ecx)            /* midl of b */
139         addl %edx,-12(%ebp)
140         adcl $0,-8(%ebp)
141         adcl $0,-4(%ebp)
143         movl 8(%esi),%eax       /* msl of Xsig */
144         mull (%ecx)             /* lsl of b */
145         addl %edx,-12(%ebp)
146         adcl $0,-8(%ebp)
147         adcl $0,-4(%ebp)
149         movl 4(%esi),%eax       /* midl of Xsig */
150         mull 8(%ecx)            /* msl of b */
151         addl %eax,-12(%ebp)
152         adcl %edx,-8(%ebp)
153         adcl $0,-4(%ebp)
155         movl 8(%esi),%eax       /* msl of Xsig */
156         mull 4(%ecx)            /* midl of b */
157         addl %eax,-12(%ebp)
158         adcl %edx,-8(%ebp)
159         adcl $0,-4(%ebp)
161         movl 8(%esi),%eax       /* msl of Xsig */
162         mull 8(%ecx)            /* msl of b */
163         addl %eax,-8(%ebp)
164         adcl %edx,-4(%ebp)
166         movl -12(%ebp),%edx
167         movl %edx,(%esi)
168         movl -8(%ebp),%edx
169         movl %edx,4(%esi)
170         movl -4(%ebp),%edx
171         movl %edx,8(%esi)
173         popl %esi
174         leave
175         ret