4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
29 / function __mul64
(A,B:Longint
):Longint;
30 / {Overflow is
not checked
}
32 / We essentially do multiply by longhand
, using base
2**32 digits.
41 / We can ignore ac
and top
32 bits of ad+
bc: if
<> 0, overflow happened.
50 mov
12(%ebp
),%eax
/ A.hi
(a)
51 mull
16(%ebp
) / Multiply
A.hi by B.lo
(produces ad
)
52 xchg
%ecx
,%eax
/ ecx
= bottom half of ad.
53 movl
8(%ebp
),%eax
/ A.Lo
(b)
54 movl
%eax
,%esi
/ Save
A.lo for later
55 mull
16(%ebp
) / Multiply
A.Lo by B.LO
(dx
:ax
= bd.
)
56 addl
%edx
,%ecx
/ cx is ad
57 xchg
%eax
,%esi
/ esi is bd
, eax
= A.lo
(d
)
58 mull
20(%ebp
) / Multiply
A.lo
* B.hi
(producing
bc)
59 addl
%ecx
,%eax
/ Produce ad+
bc