1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22/* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 .ident "%Z%%M% %I% %E% SMI" 28 29 .file "%M%" 30 31/ 32/ function __mul64(A,B:Longint):Longint; 33/ {Overflow is not checked} 34/ 35/ We essentially do multiply by longhand, using base 2**32 digits. 36/ a b parameter A 37/ x c d parameter B 38/ --------- 39/ ad bd 40/ ac bc 41/ ----------------- 42/ ac ad+bc bd 43/ 44/ We can ignore ac and top 32 bits of ad+bc: if <> 0, overflow happened. 45/ 46 47#include "SYS.h" 48 49 ENTRY(__mul64) 50 push %ebp 51 mov %esp,%ebp 52 pushl %esi 53 mov 12(%ebp),%eax / A.hi (a) 54 mull 16(%ebp) / Multiply A.hi by B.lo (produces ad) 55 xchg %ecx,%eax / ecx = bottom half of ad. 56 movl 8(%ebp),%eax / A.Lo (b) 57 movl %eax,%esi / Save A.lo for later 58 mull 16(%ebp) / Multiply A.Lo by B.LO (dx:ax = bd.) 59 addl %edx,%ecx / cx is ad 60 xchg %eax,%esi / esi is bd, eax = A.lo (d) 61 mull 20(%ebp) / Multiply A.lo * B.hi (producing bc) 62 addl %ecx,%eax / Produce ad+bc 63 movl %esi,%edx 64 xchg %eax,%edx 65 popl %esi 66 movl %ebp,%esp 67 popl %ebp 68 ret $16 69 SET_SIZE(__mul64) 70