ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; $Id$
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;; @file
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; tstX86-FpuSaveRestore - Experimenting with saving and restoring FPU, assembly bits.
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; Copyright (C) 2013 Oracle Corporation
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; available from http://www.virtualbox.org. This file is free software;
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; you can redistribute it and/or modify it under the terms of the GNU
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; General Public License (GPL) as published by the Free Software
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;*******************************************************************************
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;* Header Files *
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;*******************************************************************************
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%include "iprt/asmdefs.mac"
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%include "iprt/x86.mac"
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;*******************************************************************************
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;* Global Variables *
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;*******************************************************************************
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncBEGINCODE
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncg_r80_Zero: dt 0.0
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncg_r80_One: dt 1.0
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncBEGINCODE
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;; Prepares a FPU exception.
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncBEGINPROC MyFpuPrepXcpt
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fld tword [g_r80_One xWrtRIP]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fld tword [g_r80_Zero xWrtRIP]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fdiv st0
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync ret
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncENDPROC MyFpuPrepXcpt
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync;; Same as above, just different address.
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncBEGINPROC MyFpuPrepXcpt2
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fld tword [g_r80_One xWrtRIP]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fld tword [g_r80_Zero xWrtRIP]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fdiv st0
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync ret
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncENDPROC MyFpuPrepXcpt2
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncBEGINPROC MyFpuSave
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%ifdef ASM_CALL64_MSC
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync o64 fxsave [rcx]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%elifdef ASM_CALL64_GCC
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync o64 fxsave [rdi]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%elifdef RT_ARCH_X86
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync mov ecx, [esp + 4]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fxsave [ecx]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%else
4640654b0690ba9f81a678ae655f7fb49a513f30vboxsync %error "Unsupported architecture."
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync bad arch
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%endif
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync ret
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncENDPROC MyFpuSave
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncBEGINPROC MyFpuStoreEnv
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%ifdef ASM_CALL64_MSC
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fstenv [rcx]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%elifdef ASM_CALL64_GCC
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fstenv [rdi]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%elifdef RT_ARCH_X86
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync mov ecx, [esp + 4]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fstenv [ecx]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%else
4640654b0690ba9f81a678ae655f7fb49a513f30vboxsync %error "Unsupported architecture."
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync bad arch
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%endif
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync ret
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncENDPROC MyFpuStoreEnv
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncBEGINPROC MyFpuRestore
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%ifdef ASM_CALL64_MSC
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync o64 fxrstor [rcx]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%elifdef ASM_CALL64_GCC
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync o64 fxrstor [rdi]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%elifdef RT_ARCH_X86
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync mov ecx, [esp + 4]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fxrstor [ecx]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%else
4640654b0690ba9f81a678ae655f7fb49a513f30vboxsync %error "Unsupported architecture."
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync bad arch
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%endif
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync ret
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncENDPROC MyFpuRestore
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncBEGINPROC MyFpuLoadEnv
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%ifdef ASM_CALL64_MSC
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fldenv [rcx]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%elifdef ASM_CALL64_GCC
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fldenv [rdi]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%elifdef RT_ARCH_X86
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync mov ecx, [esp + 4]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync fldenv [ecx]
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%else
4640654b0690ba9f81a678ae655f7fb49a513f30vboxsync %error "Unsupported architecture."
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync bad arch
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync%endif
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync ret
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsyncENDPROC MyFpuLoadEnv
ed882ec1ed01b0a5469d2acd28d0bf52e38c2103vboxsync