VirtualBox

source: vbox/trunk/src/VBox/Runtime/common/asm/ASMMultU64ByU32DivByU32.asm@ 8256

Last change on this file since 8256 was 8256, checked in by vboxsync, 17 years ago

rebranding, eol

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.9 KB
Line 
1; $Id: ASMMultU64ByU32DivByU32.asm 8256 2008-04-21 20:53:28Z vboxsync $
2;; @file
3; IPRT - Assembly Functions, ASMMultU64ByU32DivByU32.
4;
5
6;
7; Copyright (C) 2006-2007 Sun Microsystems, Inc.
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26; Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27; Clara, CA 95054 USA or visit http://www.sun.com if you need
28; additional information or have any questions.
29;
30
31%include "iprt/asmdefs.mac"
32
33
34;;
35; Multiple a 64-bit by a 32-bit integer and divide the result by a 32-bit integer
36; using a 96 bit intermediate result.
37;
38; @returns (u64A * u32B) / u32C.
39; @param u64A/rcx/rdi The 64-bit value.
40; @param u32B/edx/esi The 32-bit value to multiple by A.
41; @param u32C/r8d/edx The 32-bit value to divide A*B by.
42;
43; @cproto DECLASM(uint64_t) ASMMultU64ByU32DivByU32(uint64_t u64A, uint32_t u32B, uint32_t u32C);
44;
45BEGINPROC_EXPORTED ASMMultU64ByU32DivByU32
46%ifdef RT_ARCH_AMD64
47
48 %ifdef ASM_CALL64_MSC
49 mov rax, rcx ; rax = u64A
50 mov r9d, edx ; should check the specs wrt to the high bits one day...
51 mov r8d, r8d ; be paranoid for the time being.
52 %else
53 mov rax, rdi ; rax = u64A
54 mov r9d, esi ; r9d = u32B
55 mov r8d, edx ; r8d = u32C
56 %endif
57 mul r9
58 div r8
59
60%else ; X86
61 ;
62 ; This implementation is convered from the GCC inline
63 ; version of the code. Nothing additional has been done
64 ; performance wise.
65 ;
66 push esi
67 push edi
68
69%define u64A_Lo [esp + 04h + 08h]
70%define u64A_Hi [esp + 08h + 08h]
71%define u32B [esp + 0ch + 08h]
72%define u32C [esp + 10h + 08h]
73
74 ; Load parameters into registers.
75 mov eax, u64A_Lo
76 mov esi, u64A_Hi
77 mov ecx, u32B
78 mov edi, u32C
79
80 ; The body, just like the in
81 mul ecx ; eax = u64Lo.lo = (u64A.lo * u32B).lo
82 ; edx = u64Lo.hi = (u64A.lo * u32B).hi
83 xchg eax, esi ; esi = u64Lo.lo
84 ; eax = u64A.hi
85 xchg edx, edi ; edi = u64Low.hi
86 ; edx = u32C
87 xchg edx, ecx ; ecx = u32C
88 ; edx = u32B
89 mul edx ; eax = u64Hi.lo = (u64A.hi * u32B).lo
90 ; edx = u64Hi.hi = (u64A.hi * u32B).hi
91 add eax, edi ; u64Hi.lo += u64Lo.hi
92 adc edx, 0 ; u64Hi.hi += carry
93 div ecx ; eax = u64Hi / u32C
94 ; edx = u64Hi % u32C
95 mov edi, eax ; edi = u64Result.hi = u64Hi / u32C
96 mov eax, esi ; eax = u64Lo.lo
97 div ecx ; u64Result.lo
98 mov edx, edi ; u64Result.hi
99
100 ; epilogue
101 pop edi
102 pop esi
103%endif
104 ret
105ENDPROC ASMMultU64ByU32DivByU32
106
107
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette