IEMAllAImpl.asm revision bf9b125dff66b86d319a4f4254e2288110675679
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; $Id$
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;; @file
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; IEM - Instruction Implementation in Assembly.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Copyright (C) 2011 Oracle Corporation
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; available from http://www.virtualbox.org. This file is free software;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; you can redistribute it and/or modify it under the terms of the GNU
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; General Public License (GPL) as published by the Free Software
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Header Files ;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%include "VBox/asmdefs.mac"
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%include "VBox/err.mac"
2d97f8baccdd684bc0a8a15eb86bbe9ff2b85374vboxsync%include "iprt/x86.mac"
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Defined Constants And Macros ;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync;;
032703cba22135d6032705fc2d67dd1294a6491avboxsync; RET XX / RET wrapper for fastcall.
032703cba22135d6032705fc2d67dd1294a6491avboxsync;
032703cba22135d6032705fc2d67dd1294a6491avboxsync%macro RET_FASTCALL 1
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync%ifdef RT_ARCH_X86
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %ifdef RT_OS_WINDOWS
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret %1
032703cba22135d6032705fc2d67dd1294a6491avboxsync %else
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync%else
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
032703cba22135d6032705fc2d67dd1294a6491avboxsync%endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync%endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync;;
032703cba22135d6032705fc2d67dd1294a6491avboxsync; NAME for fastcall functions.
032703cba22135d6032705fc2d67dd1294a6491avboxsync;
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync;; @todo 'global @fastcall@12' is still broken in yasm and requires dollar
032703cba22135d6032705fc2d67dd1294a6491avboxsync; escaping (or whatever the dollar is good for here). Thus the ugly
032703cba22135d6032705fc2d67dd1294a6491avboxsync; prefix argument.
032703cba22135d6032705fc2d67dd1294a6491avboxsync;
032703cba22135d6032705fc2d67dd1294a6491avboxsync%define NAME_FASTCALL(a_Name, a_cbArgs, a_Dollar) NAME(a_Name)
032703cba22135d6032705fc2d67dd1294a6491avboxsync%ifdef RT_ARCH_X86
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %ifdef RT_OS_WINDOWS
032703cba22135d6032705fc2d67dd1294a6491avboxsync %undef NAME_FASTCALL
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define NAME_FASTCALL(a_Name, a_cbArgs, a_Prefix) a_Prefix %+ a_Name %+ @ %+ a_cbArgs
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync%endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync;;
032703cba22135d6032705fc2d67dd1294a6491avboxsync; BEGINPROC for fastcall functions.
032703cba22135d6032705fc2d67dd1294a6491avboxsync;
032703cba22135d6032705fc2d67dd1294a6491avboxsync; @param 1 The function name (C).
032703cba22135d6032705fc2d67dd1294a6491avboxsync; @param 2 The argument size on x86.
032703cba22135d6032705fc2d67dd1294a6491avboxsync;
032703cba22135d6032705fc2d67dd1294a6491avboxsync%macro BEGINPROC_FASTCALL 2
032703cba22135d6032705fc2d67dd1294a6491avboxsync %ifdef ASM_FORMAT_PE
032703cba22135d6032705fc2d67dd1294a6491avboxsync export %1=NAME_FASTCALL(%1,%2,$@)
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync %ifdef __NASM__
032703cba22135d6032705fc2d67dd1294a6491avboxsync %ifdef ASM_FORMAT_OMF
032703cba22135d6032705fc2d67dd1294a6491avboxsync export NAME(%1) NAME_FASTCALL(%1,%2,$@)
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync %ifndef ASM_FORMAT_BIN
032703cba22135d6032705fc2d67dd1294a6491avboxsync global NAME_FASTCALL(%1,%2,$@)
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endif
032703cba22135d6032705fc2d67dd1294a6491avboxsyncNAME_FASTCALL(%1,%2,@):
032703cba22135d6032705fc2d67dd1294a6491avboxsync%endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; We employ some macro assembly here to hid the calling convention differences.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%ifdef RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_1_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %macro EPILOGUE_1_ARGS 1
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %macro EPILOGUE_2_ARGS 1
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_3_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %macro EPILOGUE_3_ARGS 1
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_4_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %macro EPILOGUE_4_ARGS 1
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0 rdi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0_32 edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0_16 di
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0_8 dil
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1 rsi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1_32 esi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1_16 si
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1_8 sil
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2 rdx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2_32 edx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2_16 dx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2_8 dl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3 rcx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3_32 ecx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3_16 cx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_MSC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0 rcx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0_32 ecx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0_16 cx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0_8 cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1 rdx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1_32 edx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1_16 dx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1_8 dl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2 r8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2_32 r8d
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2_16 r8w
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2_8 r8b
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3 r9
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3_32 r9d
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3_16 r9w
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0 rax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0_32 eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0_16 ax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0_8 al
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1 r11
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1_32 r11d
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1_16 r11w
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1_8 r11b
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ; x86
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_1_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro EPILOGUE_1_ARGS 1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop edi
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync ret %1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro EPILOGUE_2_ARGS 1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop edi
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync ret %1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_3_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push ebx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov ebx, [esp + 4 + 4]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro EPILOGUE_3_ARGS 1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop ebx
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync ret %1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_4_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push ebx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push esi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov ebx, [esp + 12 + 4 + 0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov esi, [esp + 12 + 4 + 4]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro EPILOGUE_4_ARGS 1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop esi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop ebx
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync ret %1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0 ecx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0_32 ecx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0_16 cx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A0_8 cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1 edx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1_32 edx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1_16 dx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A1_8 dl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2 ebx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2_32 ebx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2_16 bx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A2_8 bl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3 esi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3_32 esi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3_16 si
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0 eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0_32 eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0_16 ax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0_8 al
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1 edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1_32 edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1_16 di
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Load the relevant flags from [%1] if there are undefined flags (%3).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @remarks Clobbers T0, stack. Changes EFLAGS.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param A2 The register pointing to the flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 1 The parameter (A0..A3) pointing to the eflags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 2 The set of modified flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 3 The set of undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEM_MAYBE_LOAD_FLAGS 3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ;%if (%3) != 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pushf ; store current flags
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T0_32, [%1] ; load the guest flags
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync and dword [xSP], ~(%2 | %3) ; mask out the modified and undefined flags
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync and T0_32, (%2 | %3) ; select the modified and undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync or [xSP], T0 ; merge guest flags with host flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync popf ; load the mixed flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ;%endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Update the flag.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @remarks Clobbers T0, T1, stack.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 1 The register pointing to the EFLAGS.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 2 The mask of modified flags to save.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 3 The mask of undefined flags to (maybe) save.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEM_SAVE_FLAGS 3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %if (%2 | %3) != 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pushf
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop T1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T0_32, [%1] ; flags
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync and T0_32, ~(%2 | %3) ; clear the modified & undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync and T1_32, (%2 | %3) ; select the modified and undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync or T0_32, T1_32 ; combine the flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [%1], T0_32 ; save the flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Macro for implementing a binary operator.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; This will generate code for the 8, 16, 32 and 64 bit accesses with locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; variants, except on 32-bit system where the 64-bit accesses requires hand
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; coding.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; All the functions takes a pointer to the destination memory operand in A0,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; the source register operand in A1 and a pointer to eflags in A2.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 1 The instruction mnemonic.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 2 Non-zero if there should be a locked version.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; @param 3 The modified flags.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; @param 4 The undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEMIMPL_BIN_OP 4
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 byte [A0], A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 word [A0], A1_16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 dword [A0], A1_32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 qword [A0], A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else ; stub it for now - later, replace with hand coded stuff.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; !RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %if %2 != 0 ; locked versions requested?
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8_locked, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 byte [A0], A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 word [A0], A1_16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 dword [A0], A1_32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 qword [A0], A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else ; stub it for now - later, replace with hand coded stuff.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; !RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; instr,lock,modified-flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_BIN_OP add, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_BIN_OP adc, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_BIN_OP sub, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_BIN_OP sbb, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIN_OP or, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIN_OP xor, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIN_OP and, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_BIN_OP cmp, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIN_OP test, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; Macro for implementing a bit operator.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; This will generate code for the 16, 32 and 64 bit accesses with locked
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; variants, except on 32-bit system where the 64-bit accesses requires hand
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; coding.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; All the functions takes a pointer to the destination memory operand in A0,
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; the source register operand in A1 and a pointer to eflags in A2.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; @param 1 The instruction mnemonic.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; @param 2 Non-zero if there should be a locked version.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; @param 3 The modified flags.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; @param 4 The undefined flags.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync%macro IEMIMPL_BIT_OP 4
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %1 word [A0], A1_16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %1 dword [A0], A1_32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %1 qword [A0], A1
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 8
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %else ; stub it for now - later, replace with hand coded stuff.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 8
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %endif ; !RT_ARCH_AMD64
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %if %2 != 0 ; locked versions requested?
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 12
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
b64efece437bfca8872b81be9d0568ba90389d91vboxsync lock %1 word [A0], A1_16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 12
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
b64efece437bfca8872b81be9d0568ba90389d91vboxsync lock %1 dword [A0], A1_32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32_locked
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
b64efece437bfca8872b81be9d0568ba90389d91vboxsync lock %1 qword [A0], A1
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 8
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %else ; stub it for now - later, replace with hand coded stuff.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 8
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %endif ; !RT_ARCH_AMD64
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %endif ; locked
b64efece437bfca8872b81be9d0568ba90389d91vboxsync%endmacro
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIT_OP bt, 0, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIT_OP btc, 1, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIT_OP bts, 1, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIT_OP btr, 1, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; Macro for implementing a bit search operator.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; This will generate code for the 16, 32 and 64 bit accesses, except on 32-bit
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; system where the 64-bit accesses requires hand coding.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; All the functions takes a pointer to the destination memory operand in A0,
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; the source register operand in A1 and a pointer to eflags in A2.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; @param 1 The instruction mnemonic.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; @param 2 The modified flags.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; @param 3 The undefined flags.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync%macro IEMIMPL_BIT_OP 3
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %1 T0_16, A1_16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync mov [A0], T0_16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %1 T0_32, A1_32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync mov [A0], T0_32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %1 T0, A1
b64efece437bfca8872b81be9d0568ba90389d91vboxsync mov [A0], T0
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 8
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %else ; stub it for now - later, replace with hand coded stuff.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 8
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %endif ; !RT_ARCH_AMD64
b64efece437bfca8872b81be9d0568ba90389d91vboxsync%endmacro
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIT_OP bsf, (X86_EFL_ZF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncIEMIMPL_BIT_OP bsr, (X86_EFL_ZF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; IMUL is also a similar but yet different case (no lock, no mem dst).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; The rDX:rAX variant of imul is handled together with mul further down.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u16, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync imul A1_16, word [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], A1_16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_imul_two_u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u32, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync imul A1_32, dword [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], A1_32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_imul_two_u32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u64, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%ifdef RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync imul A1, qword [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3 ;; @todo implement me
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_imul_two_u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync; XCHG for memory operands. This implies locking. No flag changes.
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync; Each function takes two arguments, first the pointer to the memory,
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync; then the pointer to the register. They all return void.
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync;
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u8, 8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync PROLOGUE_2_ARGS
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov T0_8, [A1]
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync xchg [A0], T0_8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov [A1], T0_8
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncENDPROC iemAImpl_xchg_u8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u16, 8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync PROLOGUE_2_ARGS
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov T0_16, [A1]
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync xchg [A0], T0_16
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov [A1], T0_16
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncENDPROC iemAImpl_xchg_u16
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u32, 8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync PROLOGUE_2_ARGS
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov T0_32, [A1]
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync xchg [A0], T0_32
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov [A1], T0_32
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncENDPROC iemAImpl_xchg_u32
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u64, 8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync%ifdef RT_ARCH_AMD64
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync PROLOGUE_2_ARGS
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov T0, [A1]
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync xchg [A0], T0
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov [A1], T0
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync%else
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 0
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync%endif
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncENDPROC iemAImpl_xchg_u64
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync; XADD for memory operands.
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync; Each function takes three arguments, first the pointer to the
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync; memory/register, then the pointer to the register, and finally a pointer to
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync; eflags. They all return void.
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u8, 12
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync PROLOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov T0_8, [A1]
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync xadd [A0], T0_8
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov [A1], T0_8
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u8
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u16, 12
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync PROLOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov T0_16, [A1]
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync xadd [A0], T0_16
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov [A1], T0_16
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u16
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u32, 12
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync PROLOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov T0_32, [A1]
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync xadd [A0], T0_32
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov [A1], T0_32
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u32
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u64, 12
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync%ifdef RT_ARCH_AMD64
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync PROLOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov T0, [A1]
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync xadd [A0], T0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov [A1], T0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync%else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync%endif
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u64
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u8_locked, 12
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync PROLOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov T0_8, [A1]
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync lock xadd [A0], T0_8
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov [A1], T0_8
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u8_locked
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u16_locked, 12
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync PROLOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov T0_16, [A1]
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync lock xadd [A0], T0_16
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov [A1], T0_16
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u16_locked
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u32_locked, 12
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync PROLOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov T0_32, [A1]
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync lock xadd [A0], T0_32
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov [A1], T0_32
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u32_locked
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u64_locked, 12
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync%ifdef RT_ARCH_AMD64
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync PROLOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov T0, [A1]
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync lock xadd [A0], T0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync mov [A1], T0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync%else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 4
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync%endif
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u64_locked
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Macro for implementing a unary operator.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; This will generate code for the 8, 16, 32 and 64 bit accesses with locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; variants, except on 32-bit system where the 64-bit accesses requires hand
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; coding.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; All the functions takes a pointer to the destination memory operand in A0,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; the source register operand in A1 and a pointer to eflags in A2.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 1 The instruction mnemonic.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 2 The modified flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 3 The undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEMIMPL_UNARY_OP 3
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 byte [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 byte [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 word [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 word [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 dword [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 dword [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 qword [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 qword [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ; stub them for now.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_UNARY_OP inc, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_UNARY_OP dec, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_UNARY_OP neg, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_UNARY_OP not, 0, 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Macro for implementing a shift operation.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; This will generate code for the 8, 16, 32 and 64 bit accesses, except on
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; 32-bit system where the 64-bit accesses requires hand coding.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; All the functions takes a pointer to the destination memory operand in A0,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; the shift count in A1 and a pointer to eflags in A2.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 1 The instruction mnemonic.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 2 The modified flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 3 The undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Makes ASSUMPTIONS about A0, A1 and A2 assignments.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEMIMPL_SHIFT_OP 3
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov cl, A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 byte [A0], cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xchg A1, A0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 byte [A1], cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov cl, A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 word [A0], cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xchg A1, A0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 word [A1], cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov cl, A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 dword [A0], cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xchg A1, A0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 dword [A1], cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov cl, A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 qword [A0], cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xchg A1, A0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 qword [A1], cl
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else ; stub it for now - later, replace with hand coded stuff.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; !RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_SHIFT_OP rol, (X86_EFL_OF | X86_EFL_CF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_SHIFT_OP ror, (X86_EFL_OF | X86_EFL_CF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_SHIFT_OP rcl, (X86_EFL_OF | X86_EFL_CF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_SHIFT_OP rcr, (X86_EFL_OF | X86_EFL_CF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_SHIFT_OP shl, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_SHIFT_OP shr, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_SHIFT_OP sar, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync; Macro for implementing a double precision shift operation.
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; This will generate code for the 16, 32 and 64 bit accesses, except on
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; 32-bit system where the 64-bit accesses requires hand coding.
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; The functions takes the destination operand (r/m) in A0, the source (reg) in
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; A1, the shift count in A2 and a pointer to the eflags variable/register in A3.
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; @param 1 The instruction mnemonic.
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; @param 2 The modified flags.
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; @param 3 The undefined flags.
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; Makes ASSUMPTIONS about A0, A1, A2 and A3 assignments.
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync%macro IEMIMPL_SHIFT_DBL_OP 3
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 16
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync PROLOGUE_4_ARGS
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %ifdef ASM_CALL64_GCC
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync xchg A3, A2
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %1 [A0], A1_16, cl
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync xchg A3, A2
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %else
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync xchg A0, A2
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %1 [A2], A1_16, cl
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %endif
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_SAVE_FLAGS A3, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_4_ARGS 8
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 16
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync PROLOGUE_4_ARGS
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %ifdef ASM_CALL64_GCC
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync xchg A3, A2
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %1 [A0], A1_32, cl
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync xchg A3, A2
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %else
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync xchg A0, A2
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %1 [A2], A1_32, cl
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %endif
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_SAVE_FLAGS A3, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_4_ARGS 8
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync PROLOGUE_4_ARGS
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %ifdef ASM_CALL64_GCC
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync xchg A3, A2
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %1 [A0], A1, cl
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync xchg A3, A2
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %else
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync xchg A0, A2
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %1 [A2], A1, cl
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %endif
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_SAVE_FLAGS A3, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_4_ARGS 12
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %else ; stub it for now - later, replace with hand coded stuff.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 12
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync %endif ; !RT_ARCH_AMD64
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync%endmacro
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncIEMIMPL_SHIFT_DBL_OP shld, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncIEMIMPL_SHIFT_DBL_OP shrd, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync;;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; Macro for implementing a multiplication operations.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; This will generate code for the 8, 16, 32 and 64 bit accesses, except on
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; 32-bit system where the 64-bit accesses requires hand coding.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; The 8-bit function only operates on AX, so it takes no DX pointer. The other
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; functions takes a pointer to rAX in A0, rDX in A1, the operand in A2 and a
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; pointer to eflags in A3.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; The functions all return 0 so the caller can be used for div/idiv as well as
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; for the mul/imul implementation.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 1 The instruction mnemonic.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 2 The modified flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 3 The undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Makes ASSUMPTIONS about A0, A1, A2, A3, T0 and T1 assignments.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEMIMPL_MUL_OP 3
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov al, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], ax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov ax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A2_16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], ax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A1], dx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A2_16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], ax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [T1], dx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_4_ARGS 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A2_32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A1], edx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A2_32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [T1], edx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_4_ARGS 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov rax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A2
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], rax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A1], rdx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A2
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], rax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [T1], rdx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_4_ARGS 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else ; stub it for now - later, replace with hand coded stuff.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; !RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_MUL_OP mul, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_MUL_OP imul, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync; Macro for implementing a division operations.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; This will generate code for the 8, 16, 32 and 64 bit accesses, except on
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; 32-bit system where the 64-bit accesses requires hand coding.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; The 8-bit function only operates on AX, so it takes no DX pointer. The other
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; functions takes a pointer to rAX in A0, rDX in A1, the operand in A2 and a
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; pointer to eflags in A3.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; The functions all return 0 on success and -1 if a divide error should be
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; raised by the caller.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 1 The instruction mnemonic.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 2 The modified flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 3 The undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Makes ASSUMPTIONS about A0, A1, A2, A3, T0 and T1 assignments.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEMIMPL_DIV_OP 3
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsyncBEGINCODE
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync test A1_8, A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jz .div_zero
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ;; @todo test for overflow
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov ax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], ax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.return:
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_3_ARGS 4
032703cba22135d6032705fc2d67dd1294a6491avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.div_zero:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, -1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jmp .return
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync test A1_16, A1_16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jz .div_zero
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ;; @todo test for overflow
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A2
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov ax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov dx, [A1]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 T1_16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], ax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A1], dx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov ax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov dx, [T1]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A2_16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], ax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [T1], dx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.return:
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_4_ARGS 8
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.div_zero:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, -1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jmp .return
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync test A1_32, A1_32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jz .div_zero
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ;; @todo test for overflow
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A2
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov edx, [A1]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 T1_32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A1], edx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov edx, [T1]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A2_32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [T1], edx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.return:
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_4_ARGS 8
032703cba22135d6032705fc2d67dd1294a6491avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.div_zero:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, -1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jmp .return
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync test A1, A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jz .div_zero
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ;; @todo test for overflow
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov rax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A2
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov rax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov rdx, [A1]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 T1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], rax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A1], rdx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov rax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov rdx, [T1]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 A2
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [A0], rax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov [T1], rdx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.return:
032703cba22135d6032705fc2d67dd1294a6491avboxsync EPILOGUE_4_ARGS 12
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.div_zero:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, -1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jmp .return
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else ; stub it for now - later, replace with hand coded stuff.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; !RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_DIV_OP div, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_DIV_OP idiv, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync;
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync; BSWAP. No flag changes.
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync;
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync; Each function takes one argument, pointer to the value to bswap
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync; (input/output). They all return void.
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync;
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncBEGINPROC_FASTCALL iemAImpl_bswap_u16, 4
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync PROLOGUE_1_ARGS
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov T0_32, [A0] ; just in case any of the upper bits are used.
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync db 66h
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync bswap T0_32
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov [A0], T0_32
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync EPILOGUE_1_ARGS 0
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncENDPROC iemAImpl_bswap_u16
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncBEGINPROC_FASTCALL iemAImpl_bswap_u32, 4
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync PROLOGUE_1_ARGS
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov T0_32, [A0]
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync bswap T0_32
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov [A0], T0_32
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync EPILOGUE_1_ARGS 0
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncENDPROC iemAImpl_bswap_u32
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncBEGINPROC_FASTCALL iemAImpl_bswap_u64, 4
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync%ifdef RT_ARCH_AMD64
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync PROLOGUE_1_ARGS
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov T0, [A0]
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync bswap T0
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov [A0], T0
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync EPILOGUE_1_ARGS 0
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync%else
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync PROLOGUE_1_ARGS
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov T0, [A0]
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov T1, [A0 + 4]
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync bswap T0
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync bswap T1
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov [A0 + 4], T0
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov [A0], T1
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync EPILOGUE_1_ARGS 0
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync%endif
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncENDPROC iemAImpl_bswap_u64
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
bf9b125dff66b86d319a4f4254e2288110675679vboxsync
bf9b125dff66b86d319a4f4254e2288110675679vboxsync;;
bf9b125dff66b86d319a4f4254e2288110675679vboxsync; The state saved by FXSAVE.
bf9b125dff66b86d319a4f4254e2288110675679vboxsync; @todo move to x86.mac.
bf9b125dff66b86d319a4f4254e2288110675679vboxsync;
bf9b125dff66b86d319a4f4254e2288110675679vboxsyncstruc X86FXSTATE
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .FCW resw 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .FSW resw 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .FTW resw 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .FOP resw 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .FPUIP resd 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .CS resw 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .Rsrvd1 resw 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .FPUDP resd 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .DS resw 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .Rsrvd2 resw 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .MXCSR resd 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .MXCSR_MASK resd 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .r0 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .r1 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .r2 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .r3 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .r4 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .r5 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .r6 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .r7 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm0 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm1 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm2 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm3 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm4 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm5 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm6 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm7 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm8 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm9 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm10 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm11 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm12 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm13 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm14 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .xmm15 resd 4
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .au32RsrvdRest resd 24
bf9b125dff66b86d319a4f4254e2288110675679vboxsyncendstruc
bf9b125dff66b86d319a4f4254e2288110675679vboxsync
bf9b125dff66b86d319a4f4254e2288110675679vboxsync%macro FPU_SAFE_INIT 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsync fninit
bf9b125dff66b86d319a4f4254e2288110675679vboxsync movzx T0, word [%1 + X86FXSTATE.FCW]
bf9b125dff66b86d319a4f4254e2288110675679vboxsync or T0, X86_FCW_MASK_ALL
bf9b125dff66b86d319a4f4254e2288110675679vboxsync mov [xSP], T0
bf9b125dff66b86d319a4f4254e2288110675679vboxsync fldcw [xSP]
bf9b125dff66b86d319a4f4254e2288110675679vboxsync%endmacro
bf9b125dff66b86d319a4f4254e2288110675679vboxsync
bf9b125dff66b86d319a4f4254e2288110675679vboxsync;;
bf9b125dff66b86d319a4f4254e2288110675679vboxsync; Need to move this as well somewhere better?
bf9b125dff66b86d319a4f4254e2288110675679vboxsync;
bf9b125dff66b86d319a4f4254e2288110675679vboxsyncstruc IEMFPURESULT
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .r80Result resw 5
bf9b125dff66b86d319a4f4254e2288110675679vboxsync .FSW resw 1
bf9b125dff66b86d319a4f4254e2288110675679vboxsyncendstruc
bf9b125dff66b86d319a4f4254e2288110675679vboxsync
bf9b125dff66b86d319a4f4254e2288110675679vboxsync
bf9b125dff66b86d319a4f4254e2288110675679vboxsync;;
bf9b125dff66b86d319a4f4254e2288110675679vboxsync; Converts a 32-bit floating point value to a 80-bit one (fpu register).
bf9b125dff66b86d319a4f4254e2288110675679vboxsync;
bf9b125dff66b86d319a4f4254e2288110675679vboxsync; @param A0 FPU context (fxsave).
bf9b125dff66b86d319a4f4254e2288110675679vboxsync; @param A1 Pointer to a IEMFPURESULT for the output.
bf9b125dff66b86d319a4f4254e2288110675679vboxsync; @param A2 The 32-bit floating point value to convert.
bf9b125dff66b86d319a4f4254e2288110675679vboxsync;
bf9b125dff66b86d319a4f4254e2288110675679vboxsyncBEGINPROC_FASTCALL iemAImpl_fpu_r32_to_r80, 12
bf9b125dff66b86d319a4f4254e2288110675679vboxsync PROLOGUE_3_ARGS
bf9b125dff66b86d319a4f4254e2288110675679vboxsync sub xSP, 20h
bf9b125dff66b86d319a4f4254e2288110675679vboxsync
bf9b125dff66b86d319a4f4254e2288110675679vboxsync FPU_SAFE_INIT A0
bf9b125dff66b86d319a4f4254e2288110675679vboxsync mov [xSP], A2
bf9b125dff66b86d319a4f4254e2288110675679vboxsync fld dword [xSP]
bf9b125dff66b86d319a4f4254e2288110675679vboxsync
bf9b125dff66b86d319a4f4254e2288110675679vboxsync fnstsw word [A1 + IEMFPURESULT.FSW]
bf9b125dff66b86d319a4f4254e2288110675679vboxsync fstp tword [A1 + IEMFPURESULT.r80Result]
bf9b125dff66b86d319a4f4254e2288110675679vboxsync
bf9b125dff66b86d319a4f4254e2288110675679vboxsync add xSP, 20h
bf9b125dff66b86d319a4f4254e2288110675679vboxsync EPILOGUE_3_ARGS 0
bf9b125dff66b86d319a4f4254e2288110675679vboxsyncENDPROC iemAImpl_fpu_r32_to_r80
bf9b125dff66b86d319a4f4254e2288110675679vboxsync