Index: trunk/include/iprt/asm.h
===================================================================
--- trunk/include/iprt/asm.h	(revision 5489)
+++ trunk/include/iprt/asm.h	(revision 5490)
@@ -2945,5 +2945,5 @@
  * @param   u32C    The 32-bit value to divide A*B by.
  */
-#if RT_INLINE_ASM_EXTERNAL
+#if RT_INLINE_ASM_EXTERNAL || !defined(__GNUC__)
 DECLASM(uint64_t) ASMMultU64ByU32DivByU32(uint64_t u64A, uint32_t u32B, uint32_t u32C);
 #else
Index: trunk/src/VBox/Runtime/Makefile.kmk
===================================================================
--- trunk/src/VBox/Runtime/Makefile.kmk	(revision 5489)
+++ trunk/src/VBox/Runtime/Makefile.kmk	(revision 5490)
@@ -103,5 +103,11 @@
 	win/amd64/ASMGetDR6.asm \
 	win/amd64/ASMGetDR7.asm \
-	win/amd64/ASMMultU64ByU32DivByU32.asm \
+	common/asm/ASMMultU64ByU32DivByU32.asm
+
+#
+# Win32 assembly sources.
+#
+RuntimeWin32ASM_SOURCES = \
+	common/asm/ASMMultU64ByU32DivByU32.asm
 
 #
@@ -269,6 +275,6 @@
 	win/RTErrConvertFromWin32.cpp
 
-RuntimeR3_SOURCES.win.amd64 = \
-	$(RuntimeWin64ASM_SOURCES)
+RuntimeR3_SOURCES.win.amd64 = $(RuntimeWin64ASM_SOURCES)
+RuntimeR3_SOURCES.win.x86   = $(RuntimeWin32ASM_SOURCES)
 
 RuntimeR3_SOURCES.linux = \
@@ -534,4 +540,5 @@
 VBoxRT_SOURCES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH) = $(RuntimeR3_SOURCES.$(BUILD_TARGET).$(BUILD_TARGET_ARCH))
 VBoxRT_SOURCES.win            += r3/win/dllmain-win.cpp
+VBoxRT_SOURCES.win.x86        += r3/win/VBoxRT-win32.def
 VBoxRT_SOURCES.win.amd64      += r3/win/VBoxRT-win64.def
 VBoxRT_INCS                    = $(RuntimeR3_INCS)
@@ -687,4 +694,5 @@
 
 RuntimeR0_SOURCES.win.amd64 = $(RuntimeWin64ASM_SOURCES)
+RuntimeR0_SOURCES.win.x86   = $(RuntimeWin32ASM_SOURCES)
 
 RuntimeR0_SOURCES.os2 = \
@@ -803,6 +811,6 @@
 ## @todo timer-r0drv-nt.cpp and assert-r0drv-nt.cpp
 
-RuntimeR0Drv_SOURCES.win.amd64 = \
-	$(RuntimeWin64ASM_SOURCES)
+RuntimeR0Drv_SOURCES.win.amd64 = $(RuntimeWin64ASM_SOURCES)
+RuntimeR0Drv_SOURCES.win.x86   = $(RuntimeWin32ASM_SOURCES)
 
 RuntimeR0Drv_SOURCES.darwin = \
@@ -1016,4 +1024,6 @@
 #endif
 
+RuntimeGC_SOURCES.win.x86 = $(RuntimeWin32ASM_SOURCES)
+
 ifeq ($(VBOX_LDR_FMT32),lx)
  RuntimeGC_SOURCES += os2/sys0.asm
Index: trunk/src/VBox/Runtime/common/asm/ASMMultU64ByU32DivByU32.asm
===================================================================
--- trunk/src/VBox/Runtime/common/asm/ASMMultU64ByU32DivByU32.asm	(revision 5490)
+++ trunk/src/VBox/Runtime/common/asm/ASMMultU64ByU32DivByU32.asm	(revision 5490)
@@ -0,0 +1,95 @@
+; $Id$
+;; @file
+; innotek Portable Runtime - Assembly Functions, ASMMultU64ByU32DivByU32.
+;
+
+;
+; Copyright (C) 2006-2007 InnoTek Systemberatung GmbH
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License as published by the Free Software Foundation,
+; in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
+; distribution. VirtualBox OSE is distributed in the hope that it will
+; be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+;
+
+%include "iprt/asmdefs.mac"
+
+
+;;
+; Multiple a 64-bit by a 32-bit integer and divide the result by a 32-bit integer
+; using a 96 bit intermediate result.
+;
+; @returns (u64A * u32B) / u32C.
+; @param   u64A/rcx/rdi     The 64-bit value.
+; @param   u32B/edx/esi     The 32-bit value to multiple by A.
+; @param   u32C/r8d/edx     The 32-bit value to divide A*B by.
+;
+; @cproto  DECLASM(uint64_t) ASMMultU64ByU32DivByU32(uint64_t u64A, uint32_t u32B, uint32_t u32C);
+;
+BEGINPROC_EXPORTED ASMMultU64ByU32DivByU32
+%ifdef RT_ARCH_AMD64
+
+ %ifdef ASM_CALL64_MSC
+    mov     rax, rcx                    ; rax = u64A
+    mov     r9d, edx                    ; should check the specs wrt to the high bits one day...
+    mov     r8d, r8d                    ; be paranoid for the time being.
+ %else
+    mov     rax, rdi                    ; rax = u64A
+    mov     r9d, esi                    ; r9d = u32B
+    mov     r8d, edx                    ; r8d = u32C
+ %endif
+    mul     r9
+    div     r8
+
+%else ; X86
+    ;
+    ; This implementation is convered from the GCC inline
+    ; version of the code. Nothing additional has been done
+    ; performance wise.
+    ;
+    push    esi
+    push    edi
+
+%define u64A_Lo     [esp + 04h + 08h]
+%define u64A_Hi     [esp + 08h + 08h]
+%define u32B        [esp + 0ch + 08h]
+%define u32C        [esp + 10h + 08h]
+
+    ; Load parameters into registers.
+    mov     eax, u64A_Lo
+    mov     esi, u64A_Hi
+    mov     ecx, u32B
+    mov     edi, u32C
+
+    ; The body, just like the in
+    mul     ecx                         ; eax = u64Lo.lo = (u64A.lo * u32B).lo
+                                        ; edx = u64Lo.hi = (u64A.lo * u32B).hi
+    xchg    eax, esi                    ; esi = u64Lo.lo
+                                        ; eax = u64A.hi
+    xchg    edx, edi                    ; edi = u64Low.hi
+                                        ; edx = u32C
+    xchg    edx, ecx                    ; ecx = u32C
+                                        ; edx = u32B
+    mul     edx                         ; eax = u64Hi.lo = (u64A.hi * u32B).lo
+                                        ; edx = u64Hi.hi = (u64A.hi * u32B).hi
+    add     eax, edi                    ; u64Hi.lo += u64Lo.hi
+    adc     edx, 0                      ; u64Hi.hi += carry
+    div     ecx                         ; eax = u64Hi / u32C
+                                        ; edx = u64Hi % u32C
+    mov     edi, eax                    ; edi = u64Result.hi = u64Hi / u32C
+    mov     eax, esi                    ; eax = u64Lo.lo
+    div     ecx                         ; u64Result.lo
+    mov     edx, edi                    ; u64Result.hi
+
+    ; epilogue
+    pop     edi
+    pop     esi
+%endif
+    ret
+ENDPROC ASMMultU64ByU32DivByU32
+
+
Index: trunk/src/VBox/Runtime/r3/win/VBoxRT-win32.def
===================================================================
--- trunk/src/VBox/Runtime/r3/win/VBoxRT-win32.def	(revision 5490)
+++ trunk/src/VBox/Runtime/r3/win/VBoxRT-win32.def	(revision 5490)
@@ -0,0 +1,25 @@
+; $Id: $
+;; @file
+; innotek Portable Runtime - Win32 ASM exports.
+;
+
+;
+;  Copyright (C) 2006-2007 innotek GmbH
+;
+;  This file is part of VirtualBox Open Source Edition (OSE), as
+;  available from http://www.virtualbox.org. This file is free software;
+;  you can redistribute it and/or modify it under the terms of the GNU
+;  General Public License as published by the Free Software Foundation,
+;  in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
+;  distribution. VirtualBox OSE is distributed in the hope that it will
+;  be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+
+EXPORTS
+    ASMMultU64ByU32DivByU32
+
+    RTTimeNanoTSLegacySync
+    RTTimeNanoTSLegacyAsync
+    RTTimeNanoTSLFenceSync
+    RTTimeNanoTSLFenceAsync
+
Index: trunk/src/VBox/Runtime/r3/win/VBoxRT-win64.def
===================================================================
--- trunk/src/VBox/Runtime/r3/win/VBoxRT-win64.def	(revision 5489)
+++ trunk/src/VBox/Runtime/r3/win/VBoxRT-win64.def	(revision 5490)
@@ -1,8 +1,10 @@
+; $Id: $
 ;; @file
-; Innotek Portable Runtime - Win64 ASM exports.
+; innotek Portable Runtime - Win64 ASM exports.
 ;
 
+;
 ;  Copyright (C) 2006-2007 innotek GmbH
-; 
+;
 ;  This file is part of VirtualBox Open Source Edition (OSE), as
 ;  available from http://www.virtualbox.org. This file is free software;
@@ -12,4 +14,5 @@
 ;  distribution. VirtualBox OSE is distributed in the hope that it will
 ;  be useful, but WITHOUT ANY WARRANTY of any kind.
+;
 
 EXPORTS
@@ -27,2 +30,7 @@
     ASMMultU64ByU32DivByU32
 
+    RTTimeNanoTSLegacySync
+    RTTimeNanoTSLegacyAsync
+    RTTimeNanoTSLFenceSync
+    RTTimeNanoTSLFenceAsync
+
Index: trunk/src/VBox/Runtime/win/amd64/ASMMultU64ByU32DivByU32.asm
===================================================================
--- trunk/src/VBox/Runtime/win/amd64/ASMMultU64ByU32DivByU32.asm	(revision 5489)
+++ 	(revision )
@@ -1,41 +1,0 @@
-;; @file
-; innotek Portable Runtime - ASMMultU64ByU32DivByU32().
-;
-
-;
-;  Copyright (C) 2006-2007 innotek GmbH
-; 
-;  This file is part of VirtualBox Open Source Edition (OSE), as
-;  available from http://www.virtualbox.org. This file is free software;
-;  you can redistribute it and/or modify it under the terms of the GNU
-;  General Public License as published by the Free Software Foundation,
-;  in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
-;  distribution. VirtualBox OSE is distributed in the hope that it will
-;  be useful, but WITHOUT ANY WARRANTY of any kind.
-
-;*******************************************************************************
-;* Header Files                                                                *
-;*******************************************************************************
-%include "iprt/asmdefs.mac"
-
-BEGINCODE
-
-;;
-; Multiple a 64-bit by a 32-bit integer and divide the result by a 32-bit integer
-; using a 96 bit intermediate result.
-; 
-; @returns (u64A * u32B) / u32C. (rax)
-; @param   u64A    rcx      The 64-bit value.
-; @param   u32B    edx      The 32-bit value to multiple by A.
-; @param   u32C    r8d      The 32-bit value to divide A*B by.
-; 
-BEGINPROC_EXPORTED ASMMultU64ByU32DivByU32
-        mov     r9d, edx                        ; r9  = B
-        mov     rax, rcx                        ; rax = A
-        xor     edx, edx                        ; rdx = 0
-        mul     r9                              ; rax:rdx = A*B
-        mov     ecx, r8d                        ; rcx = C (overly careful)
-        div     rcx                             ; rax = A*B/C (rdx=reminder)
-        ret
-ENDPROC ASMMultU64ByU32DivByU32
-
