import less(1)
[unleashed/tickless.git] / usr / src / lib / libc / i386 / gen / _mul64.s
blob871ce516c7af839fad125166ec60aae2880708d2
1 /*
2 * CDDL HEADER START
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]
19 * CDDL HEADER END
22 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 .file "_mul64.s"
29 / function __mul64(A,B:Longint):Longint;
30 / {Overflow is not checked}
32 / We essentially do multiply by longhand, using base 2**32 digits.
33 / a b parameter A
34 / x c d parameter B
35 / ---------
36 / ad bd
37 / ac bc
38 / -----------------
39 / ac ad+bc bd
41 / We can ignore ac and top 32 bits of ad+bc: if <> 0, overflow happened.
44 #include "SYS.h"
46 ENTRY(__mul64)
47 push %ebp
48 mov %esp,%ebp
49 pushl %esi
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
60 movl %esi,%edx
61 xchg %eax,%edx
62 popl %esi
63 movl %ebp,%esp
64 popl %ebp
65 ret $16
66 SET_SIZE(__mul64)