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 (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 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. 12 * 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] 18 * 19 * CDDL HEADER END 20 */ 21/* 22 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 .file "_mul64.s" 27 28/ 29/ function __mul64(A,B:Longint):Longint; 30/ {Overflow is not checked} 31/ 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 40/ 41/ We can ignore ac and top 32 bits of ad+bc: if <> 0, overflow happened. 42/ 43 44#include "SYS.h" 45 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) 67