IEMAllAImpl.asm revision 35152c0e300b1e102f75b55467cc3592ec219fec
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; IEM - Instruction Implementation in Assembly.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Copyright (C) 2011-2012 Oracle Corporation
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
9019681d4e9b8399b951793a9dd92b63c195e0eevboxsync; available from http://www.virtualbox.org. This file is free software;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; you can redistribute it and/or modify it under the terms of the GNU
92a27575521748a392dcd1b996fce55b87411a00vboxsync; General Public License (GPL) as published by the Free Software
92a27575521748a392dcd1b996fce55b87411a00vboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
92a27575521748a392dcd1b996fce55b87411a00vboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
92a27575521748a392dcd1b996fce55b87411a00vboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
92a27575521748a392dcd1b996fce55b87411a00vboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Header Files ;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10cdf5733351fdcd857d439ca32189e812f18682vboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10cdf5733351fdcd857d439ca32189e812f18682vboxsync; Defined Constants And Macros ;
10cdf5733351fdcd857d439ca32189e812f18682vboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10cdf5733351fdcd857d439ca32189e812f18682vboxsync; RET XX / RET wrapper for fastcall.
10cdf5733351fdcd857d439ca32189e812f18682vboxsync%macro RET_FASTCALL 1
10cdf5733351fdcd857d439ca32189e812f18682vboxsync%ifdef RT_ARCH_X86
10cdf5733351fdcd857d439ca32189e812f18682vboxsync %ifdef RT_OS_WINDOWS
10cdf5733351fdcd857d439ca32189e812f18682vboxsync; NAME for fastcall functions.
10cdf5733351fdcd857d439ca32189e812f18682vboxsync;; @todo 'global @fastcall@12' is still broken in yasm and requires dollar
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; escaping (or whatever the dollar is good for here). Thus the ugly
10cdf5733351fdcd857d439ca32189e812f18682vboxsync; prefix argument.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%define NAME_FASTCALL(a_Name, a_cbArgs, a_Prefix) NAME(a_Name)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%ifdef RT_ARCH_X86
10cdf5733351fdcd857d439ca32189e812f18682vboxsync %ifdef RT_OS_WINDOWS
10cdf5733351fdcd857d439ca32189e812f18682vboxsync %undef NAME_FASTCALL
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define NAME_FASTCALL(a_Name, a_cbArgs, a_Prefix) a_Prefix %+ a_Name %+ @ %+ a_cbArgs
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; BEGINPROC for fastcall functions.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 1 The function name (C).
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 2 The argument size on x86.
10cdf5733351fdcd857d439ca32189e812f18682vboxsync%macro BEGINPROC_FASTCALL 2
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef ASM_FORMAT_PE
10cdf5733351fdcd857d439ca32189e812f18682vboxsync export %1=NAME_FASTCALL(%1,%2,$@)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef __NASM__
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef ASM_FORMAT_OMF
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync export NAME(%1) NAME_FASTCALL(%1,%2,$@)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifndef ASM_FORMAT_BIN
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync global NAME_FASTCALL(%1,%2,$@)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncNAME_FASTCALL(%1,%2,@):
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync; We employ some macro assembly here to hid the calling convention differences.
4a429a59b1a82ce092626ea5f7512466c18f2015vboxsync%ifdef RT_ARCH_AMD64
4a429a59b1a82ce092626ea5f7512466c18f2015vboxsync %macro PROLOGUE_1_ARGS 0
4a429a59b1a82ce092626ea5f7512466c18f2015vboxsync %macro EPILOGUE_1_ARGS 0
4a429a59b1a82ce092626ea5f7512466c18f2015vboxsync %macro EPILOGUE_1_ARGS_EX 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_2_ARGS 0
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %macro EPILOGUE_2_ARGS 0
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %macro EPILOGUE_2_ARGS_EX 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_3_ARGS 0
86abc60770f825f8c2ed4257675b50a08743b687vboxsync %macro EPILOGUE_3_ARGS 0
86abc60770f825f8c2ed4257675b50a08743b687vboxsync %macro EPILOGUE_3_ARGS_EX 1
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %macro PROLOGUE_4_ARGS 0
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %macro EPILOGUE_4_ARGS 0
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %macro EPILOGUE_4_ARGS_EX 1
360c39d88dfa26b17181b57ebafdb24c2a113c63vboxsync %ifdef ASM_CALL64_GCC
360c39d88dfa26b17181b57ebafdb24c2a113c63vboxsync %define A0 rdi
360c39d88dfa26b17181b57ebafdb24c2a113c63vboxsync %define A0_32 edi
360c39d88dfa26b17181b57ebafdb24c2a113c63vboxsync %define A0_16 di
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %define A0_8 dil
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %define A1 rsi
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %define A1_32 esi
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %define A1_16 si
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %define A1_8 sil
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %define A2 rdx
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %define A2_32 edx
6967517de4be849f55b0141d6089add0eff2aa7bvboxsync %define A2_16 dx
6967517de4be849f55b0141d6089add0eff2aa7bvboxsync %define A2_8 dl
86abc60770f825f8c2ed4257675b50a08743b687vboxsync %define A3 rcx
7b213bb002950f9fcf809f605cc584fa543481advboxsync %define A3_32 ecx
7b213bb002950f9fcf809f605cc584fa543481advboxsync %define A3_16 cx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef ASM_CALL64_MSC
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A0 rcx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A0_32 ecx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A0_16 cx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A0_8 cl
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A1 rdx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A1_32 edx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A1_16 dx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A1_8 dl
9019681d4e9b8399b951793a9dd92b63c195e0eevboxsync %define A2 r8
9019681d4e9b8399b951793a9dd92b63c195e0eevboxsync %define A2_32 r8d
9019681d4e9b8399b951793a9dd92b63c195e0eevboxsync %define A2_16 r8w
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A2_8 r8b
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A3 r9
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A3_32 r9d
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A3_16 r9w
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0 rax
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0_32 eax
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %define T0_16 ax
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %define T0_8 al
b49952fd6cae765238f4760c700c5ef797a56092vboxsync %define T1 r11
b49952fd6cae765238f4760c700c5ef797a56092vboxsync %define T1_32 r11d
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T1_16 r11w
cd9e4940318086a06a68bf301960563dcb72b939vboxsync %define T1_8 r11b
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_1_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro EPILOGUE_1_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro EPILOGUE_1_ARGS_EX 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_2_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro EPILOGUE_2_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro EPILOGUE_2_ARGS_EX 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_3_ARGS 0
c7a92d481aced08517570d43bf75e2a9f3a8aaeavboxsync mov ebx, [esp + 4 + 4]
c7a92d481aced08517570d43bf75e2a9f3a8aaeavboxsync %macro EPILOGUE_3_ARGS_EX 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %if (%1) < 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %error "With three args, at least 4 bytes must be remove from the stack upon return (32-bit)."
c7a92d481aced08517570d43bf75e2a9f3a8aaeavboxsync %macro EPILOGUE_3_ARGS 0
541ba632c438350cc8044d7ce2c8623dca446546vboxsync EPILOGUE_3_ARGS_EX 4
08a80484275b5172ce23729ecccc934c6a92d201vboxsync %macro PROLOGUE_4_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov ebx, [esp + 12 + 4 + 0]
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsync mov esi, [esp + 12 + 4 + 4]
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsync %macro EPILOGUE_4_ARGS_EX 1
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsync %if (%1) < 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %error "With four args, at least 8 bytes must be remove from the stack upon return (32-bit)."
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync %macro EPILOGUE_4_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_4_ARGS_EX 8
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A0 ecx
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A0_32 ecx
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A0_16 cx
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A0_8 cl
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A1 edx
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A1_32 edx
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A1_16 dx
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A1_8 dl
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A2 ebx
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A2_32 ebx
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A2_16 bx
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A2_8 bl
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A3 esi
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A3_32 esi
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define A3_16 si
6ae816ec04eb72d5d7e5db31def91f4198c278d6vboxsync %define T0 eax
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0_32 eax
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0_16 ax
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0_8 al
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T1 edi
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define T1_32 edi
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %define T1_16 di
59e30364f54880dd846c263711a2506d1182b1b5vboxsync; Load the relevant flags from [%1] if there are undefined flags (%3).
3acaac88e9a4c925226db26f0d374f9f4876b74fvboxsync; @remarks Clobbers T0, stack. Changes EFLAGS.
cc8517c11be66037a9873fa03f280e7742efed6dvboxsync; @param A2 The register pointing to the flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 1 The parameter (A0..A3) pointing to the eflags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 2 The set of modified flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 3 The set of undefined flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%macro IEM_MAYBE_LOAD_FLAGS 3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync ;%if (%3) != 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync pushf ; store current flags
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_32, [%1] ; load the guest flags
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync and dword [xSP], ~(%2 | %3) ; mask out the modified and undefined flags
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync and T0_32, (%2 | %3) ; select the modified and undefined flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync or [xSP], T0 ; merge guest flags with host flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync popf ; load the mixed flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Update the flag.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @remarks Clobbers T0, T1, stack.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 1 The register pointing to the EFLAGS.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 2 The mask of modified flags to save.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 3 The mask of undefined flags to (maybe) save.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%macro IEM_SAVE_FLAGS 3
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %if (%2 | %3) != 0
541ba632c438350cc8044d7ce2c8623dca446546vboxsync mov T0_32, [%1] ; flags
08a56d5836eceeb24642b61eaa52a4edb0a7b482vboxsync and T0_32, ~(%2 | %3) ; clear the modified & undefined flags.
08a56d5836eceeb24642b61eaa52a4edb0a7b482vboxsync and T1_32, (%2 | %3) ; select the modified and undefined flags.
08a56d5836eceeb24642b61eaa52a4edb0a7b482vboxsync or T0_32, T1_32 ; combine the flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [%1], T0_32 ; save the flags.
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsync; Macro for implementing a binary operator.
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsync; This will generate code for the 8, 16, 32 and 64 bit accesses with locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; variants, except on 32-bit system where the 64-bit accesses requires hand
3196a540aa11c41264b0e79857b879e4ab566f4bvboxsync; All the functions takes a pointer to the destination memory operand in A0,
3196a540aa11c41264b0e79857b879e4ab566f4bvboxsync; the source register operand in A1 and a pointer to eflags in A2.
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync; @param 1 The instruction mnemonic.
3196a540aa11c41264b0e79857b879e4ab566f4bvboxsync; @param 2 Non-zero if there should be a locked version.
3196a540aa11c41264b0e79857b879e4ab566f4bvboxsync; @param 3 The modified flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 4 The undefined flags.
16aeb8f83239d4a4a10ecac1fb46fe24a8bdbb66vboxsync%macro IEMIMPL_BIN_OP 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
2705a216ac12110a0813d671e230797c886b4788vboxsync %1 byte [A0], A1_8
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync IEM_SAVE_FLAGS A2, %3, %4
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync EPILOGUE_3_ARGS
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync PROLOGUE_3_ARGS
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %1 word [A0], A1_16
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync IEM_SAVE_FLAGS A2, %3, %4
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync EPILOGUE_3_ARGS
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync PROLOGUE_3_ARGS
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync %1 dword [A0], A1_32
24b88f881835a6c392e72177f74f1d5e4544ba1evboxsync IEM_SAVE_FLAGS A2, %3, %4
f8244da4b4e02d8d4ce0669eeb4093e31c301888vboxsync EPILOGUE_3_ARGS
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %ifdef RT_ARCH_AMD64
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync PROLOGUE_3_ARGS
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %1 qword [A0], A1
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_SAVE_FLAGS A2, %3, %4
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync EPILOGUE_3_ARGS_EX 8
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync %else ; stub it for now - later, replace with hand coded stuff.
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync %endif ; !RT_ARCH_AMD64
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %if %2 != 0 ; locked versions requested?
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8_locked, 12
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync PROLOGUE_3_ARGS
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync lock %1 byte [A0], A1_8
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_SAVE_FLAGS A2, %3, %4
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync EPILOGUE_3_ARGS
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8_locked
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 12
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync PROLOGUE_3_ARGS
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync lock %1 word [A0], A1_16
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync IEM_SAVE_FLAGS A2, %3, %4
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync EPILOGUE_3_ARGS
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 12
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync PROLOGUE_3_ARGS
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync lock %1 dword [A0], A1_32
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync IEM_SAVE_FLAGS A2, %3, %4
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync EPILOGUE_3_ARGS
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32_locked
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %ifdef RT_ARCH_AMD64
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
2c6100f232de7432cd9f59eb3a6a3272fadeaf5avboxsync PROLOGUE_3_ARGS
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync lock %1 qword [A0], A1
2c6100f232de7432cd9f59eb3a6a3272fadeaf5avboxsync IEM_SAVE_FLAGS A2, %3, %4
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync EPILOGUE_3_ARGS_EX 8
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync %else ; stub it for now - later, replace with hand coded stuff.
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync %endif ; !RT_ARCH_AMD64
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync %endif ; locked
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync; instr,lock,modified-flags.
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncIEMIMPL_BIN_OP add, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncIEMIMPL_BIN_OP adc, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncIEMIMPL_BIN_OP sub, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncIEMIMPL_BIN_OP sbb, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncIEMIMPL_BIN_OP or, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncIEMIMPL_BIN_OP xor, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncIEMIMPL_BIN_OP and, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncIEMIMPL_BIN_OP cmp, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncIEMIMPL_BIN_OP test, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync; Macro for implementing a bit operator.
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync; This will generate code for the 16, 32 and 64 bit accesses with locked
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync; variants, except on 32-bit system where the 64-bit accesses requires hand
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync; All the functions takes a pointer to the destination memory operand in A0,
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync; the source register operand in A1 and a pointer to eflags in A2.
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync; @param 1 The instruction mnemonic.
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync; @param 2 Non-zero if there should be a locked version.
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync; @param 3 The modified flags.
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync; @param 4 The undefined flags.
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsync%macro IEMIMPL_BIT_OP 4
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync PROLOGUE_3_ARGS
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %1 word [A0], A1_16
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_SAVE_FLAGS A2, %3, %4
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync EPILOGUE_3_ARGS
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync PROLOGUE_3_ARGS
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %1 dword [A0], A1_32
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_SAVE_FLAGS A2, %3, %4
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync EPILOGUE_3_ARGS
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %ifdef RT_ARCH_AMD64
8d466f9285d86e81f927c2bf053a2eb7ec325746vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync PROLOGUE_3_ARGS
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %1 qword [A0], A1
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync IEM_SAVE_FLAGS A2, %3, %4
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync EPILOGUE_3_ARGS_EX 8
1cc3bd5463294790ba54c78fde5313264185e50cvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
1cc3bd5463294790ba54c78fde5313264185e50cvboxsync %else ; stub it for now - later, replace with hand coded stuff.
efda5c4c4db213abd0692df0ea34a26f6230d59avboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
2705a216ac12110a0813d671e230797c886b4788vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %endif ; !RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %if %2 != 0 ; locked versions requested?
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
c7a92d481aced08517570d43bf75e2a9f3a8aaeavboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
541ba632c438350cc8044d7ce2c8623dca446546vboxsync lock %1 word [A0], A1_16
42d36464aee6c81b4f206b6c02035587501ff67cvboxsync IEM_SAVE_FLAGS A2, %3, %4
c3e38cccf650831700227918a021e6c4097ace82vboxsync EPILOGUE_3_ARGS
42d36464aee6c81b4f206b6c02035587501ff67cvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 12
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync PROLOGUE_3_ARGS
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock %1 dword [A0], A1_32
3b3bc8a9383a065307e540b83fc3a3d6c548a082vboxsync IEM_SAVE_FLAGS A2, %3, %4
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsync EPILOGUE_3_ARGS
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32_locked
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsync %ifdef RT_ARCH_AMD64
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsync PROLOGUE_3_ARGS
48f33dfd8f615d457106bf76ae2d09b8b9167c1avboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock %1 qword [A0], A1
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync IEM_SAVE_FLAGS A2, %3, %4
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync EPILOGUE_3_ARGS_EX 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync %else ; stub it for now - later, replace with hand coded stuff.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %endif ; !RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %endif ; locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncIEMIMPL_BIT_OP bt, 0, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncIEMIMPL_BIT_OP btc, 1, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncIEMIMPL_BIT_OP bts, 1, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsyncIEMIMPL_BIT_OP btr, 1, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync; Macro for implementing a bit search operator.
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync; This will generate code for the 16, 32 and 64 bit accesses, except on 32-bit
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync; system where the 64-bit accesses requires hand coding.
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync; All the functions takes a pointer to the destination memory operand in A0,
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync; the source register operand in A1 and a pointer to eflags in A2.
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync; @param 1 The instruction mnemonic.
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync; @param 2 The modified flags.
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsync; @param 3 The undefined flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%macro IEMIMPL_BIT_OP 3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
848a18b9fc15877bba27eaf2ca17146a24e7d77avboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 T0_16, A1_16
cd9e4940318086a06a68bf301960563dcb72b939vboxsync jz .unchanged_dst
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A0], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync.unchanged_dst:
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync IEM_SAVE_FLAGS A2, %2, %3
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsync EPILOGUE_3_ARGS
e0b91e4f93fb43371374df4aeb636dffea336056vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
2705a216ac12110a0813d671e230797c886b4788vboxsync %1 T0_32, A1_32
2705a216ac12110a0813d671e230797c886b4788vboxsync jz .unchanged_dst
2705a216ac12110a0813d671e230797c886b4788vboxsync mov [A0], T0_32
bcc95fabf162c0f743d7eaafb0d21f7ef967e9f4vboxsync.unchanged_dst:
2705a216ac12110a0813d671e230797c886b4788vboxsync IEM_SAVE_FLAGS A2, %2, %3
2705a216ac12110a0813d671e230797c886b4788vboxsync EPILOGUE_3_ARGS
2705a216ac12110a0813d671e230797c886b4788vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
2705a216ac12110a0813d671e230797c886b4788vboxsync %ifdef RT_ARCH_AMD64
2705a216ac12110a0813d671e230797c886b4788vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
2705a216ac12110a0813d671e230797c886b4788vboxsync PROLOGUE_3_ARGS
2705a216ac12110a0813d671e230797c886b4788vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync jz .unchanged_dst
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync mov [A0], T0
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync.unchanged_dst:
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync IEM_SAVE_FLAGS A2, %2, %3
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync EPILOGUE_3_ARGS_EX 8
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync %else ; stub it for now - later, replace with hand coded stuff.
95d42763b8808d795c23148d7dbc00a3b7b40d6fvboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
2705a216ac12110a0813d671e230797c886b4788vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
2705a216ac12110a0813d671e230797c886b4788vboxsync %endif ; !RT_ARCH_AMD64
2705a216ac12110a0813d671e230797c886b4788vboxsyncIEMIMPL_BIT_OP bsf, (X86_EFL_ZF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
2705a216ac12110a0813d671e230797c886b4788vboxsyncIEMIMPL_BIT_OP bsr, (X86_EFL_ZF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
2705a216ac12110a0813d671e230797c886b4788vboxsync; IMUL is also a similar but yet different case (no lock, no mem dst).
f9e9ec581188b7f7645e3dea5bafa77cfcec31efvboxsync; The rDX:rAX variant of imul is handled together with mul further down.
f9e9ec581188b7f7645e3dea5bafa77cfcec31efvboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u16, 12
f9e9ec581188b7f7645e3dea5bafa77cfcec31efvboxsync PROLOGUE_3_ARGS
f9e9ec581188b7f7645e3dea5bafa77cfcec31efvboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync imul A1_16, word [A0]
f9e9ec581188b7f7645e3dea5bafa77cfcec31efvboxsync mov [A0], A1_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_imul_two_u16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u32, 12
5c571d69a0355bedb9a401ce4de992a2b0ef3515vboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync imul A1_32, dword [A0]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A0], A1_32
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
f9e9ec581188b7f7645e3dea5bafa77cfcec31efvboxsync EPILOGUE_3_ARGS
f9e9ec581188b7f7645e3dea5bafa77cfcec31efvboxsyncENDPROC iemAImpl_imul_two_u32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u64, 16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%ifdef RT_ARCH_AMD64
b49952fd6cae765238f4760c700c5ef797a56092vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync imul A1, qword [A0]
17aee8484f9e8699c2515d450552c622aea0889evboxsync mov [A0], A1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_CF), (X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync int3 ;; @todo implement me
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS_EX 8
17aee8484f9e8699c2515d450552c622aea0889evboxsyncENDPROC iemAImpl_imul_two_u64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; XCHG for memory operands. This implies locking. No flag changes.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Each function takes two arguments, first the pointer to the memory,
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; then the pointer to the register. They all return void.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u8, 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_2_ARGS
17aee8484f9e8699c2515d450552c622aea0889evboxsync mov T0_8, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync xchg [A0], T0_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_2_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xchg_u8
17aee8484f9e8699c2515d450552c622aea0889evboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u16, 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_2_ARGS
41beaec6d563ed06201d5e42a0e8cf32c06b3388vboxsync mov T0_16, [A1]
94408dd19e056812083ef9b5501c649096953cdbvboxsync xchg [A0], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_2_ARGS
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsyncENDPROC iemAImpl_xchg_u16
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u32, 8
ee6495ebe54829fea21ffbb6f1275315e72d4506vboxsync PROLOGUE_2_ARGS
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsync mov T0_32, [A1]
98bfcb808aa93fe8b532eb38da1f15a795a85f6dvboxsync xchg [A0], T0_32
98bfcb808aa93fe8b532eb38da1f15a795a85f6dvboxsync mov [A1], T0_32
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsync EPILOGUE_2_ARGS
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsyncENDPROC iemAImpl_xchg_u32
e0b91e4f93fb43371374df4aeb636dffea336056vboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u64, 8
17aee8484f9e8699c2515d450552c622aea0889evboxsync%ifdef RT_ARCH_AMD64
e0b91e4f93fb43371374df4aeb636dffea336056vboxsync PROLOGUE_2_ARGS
e0b91e4f93fb43371374df4aeb636dffea336056vboxsync mov T0, [A1]
e0b91e4f93fb43371374df4aeb636dffea336056vboxsync xchg [A0], T0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_2_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xchg_u64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; XADD for memory operands.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Each function takes three arguments, first the pointer to the
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; memory/register, then the pointer to the register, and finally a pointer to
17aee8484f9e8699c2515d450552c622aea0889evboxsync; eflags. They all return void.
17aee8484f9e8699c2515d450552c622aea0889evboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u8, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_8, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync xadd [A0], T0_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
17aee8484f9e8699c2515d450552c622aea0889evboxsync EPILOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xadd_u8
cd9e4940318086a06a68bf301960563dcb72b939vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u16, 12
cd9e4940318086a06a68bf301960563dcb72b939vboxsync PROLOGUE_3_ARGS
cd9e4940318086a06a68bf301960563dcb72b939vboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_16, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync xadd [A0], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xadd_u16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u32, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_32, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync xadd [A0], T0_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS
17aee8484f9e8699c2515d450552c622aea0889evboxsyncENDPROC iemAImpl_xadd_u32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u64, 12
cd9e4940318086a06a68bf301960563dcb72b939vboxsync%ifdef RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
964ccfcb520a9c19ba1b8dd21693234508339e4evboxsync mov T0, [A1]
964ccfcb520a9c19ba1b8dd21693234508339e4evboxsync xadd [A0], T0
964ccfcb520a9c19ba1b8dd21693234508339e4evboxsync mov [A1], T0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS
964ccfcb520a9c19ba1b8dd21693234508339e4evboxsyncENDPROC iemAImpl_xadd_u64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u8_locked, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_8, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock xadd [A0], T0_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xadd_u8_locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u16_locked, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_16, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock xadd [A0], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xadd_u16_locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u32_locked, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_32, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock xadd [A0], T0_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xadd_u32_locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u64_locked, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%ifdef RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock xadd [A0], T0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0
9300c669f18e40bb3bd8bb6a0f7efaeb2bbd790fvboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
964ccfcb520a9c19ba1b8dd21693234508339e4evboxsync EPILOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xadd_u64_locked
9019681d4e9b8399b951793a9dd92b63c195e0eevboxsync; CMPXCHG8B.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; These are tricky register wise, so the code is duplicated for each calling
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; convention.
3196a540aa11c41264b0e79857b879e4ab566f4bvboxsync; WARNING! This code make ASSUMPTIONS about which registers T1 and T0 are mapped to!
3196a540aa11c41264b0e79857b879e4ab566f4bvboxsync; IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg8b,(uint64_t *pu64Dst, PRTUINT64U pu64EaxEdx, PRTUINT64U pu64EbxEcx,
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; uint32_t *pEFlags));
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_cmpxchg8b, 16
17aee8484f9e8699c2515d450552c622aea0889evboxsync%ifdef RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef ASM_CALL64_MSC
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov r11, rdx ; pu64EaxEdx (is also T1)
17aee8484f9e8699c2515d450552c622aea0889evboxsync mov r10, rcx ; pu64Dst
98bfcb808aa93fe8b532eb38da1f15a795a85f6dvboxsync mov ebx, [r8]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov ecx, [r8 + 4]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS r9, (X86_EFL_ZF), 0 ; clobbers T0 (eax)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov eax, [r11]
772269936494ffaddd0750ba9e28e805ba81398cvboxsync mov edx, [r11 + 4]
; IEM_DECL_IMPL_DEF(void, iemAImpl_cmpxchg,(uintX_t *puXDst, uintX_t puEax, uintX_t uReg, uint32_t *pEFlags));
IEM_MAYBE_LOAD_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0 (eax)
IEM_SAVE_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0+T1 (eax, r11/edi)
IEM_MAYBE_LOAD_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0 (eax)
IEM_SAVE_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0+T1 (eax, r11/edi)
IEM_MAYBE_LOAD_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0 (eax)
IEM_SAVE_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0+T1 (eax, r11/edi)
IEM_MAYBE_LOAD_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0 (eax)
IEM_SAVE_FLAGS A3, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0+T1 (eax, r11/edi)
IEM_MAYBE_LOAD_FLAGS ebp, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0 (eax)
IEM_SAVE_FLAGS ebp, (X86_EFL_ZF | X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_SF | X86_EFL_OF), 0 ; clobbers T0+T1 (eax, edi)
IEMIMPL_UNARY_OP neg, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
IEMIMPL_SHIFT_OP shl, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
IEMIMPL_SHIFT_OP shr, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
IEMIMPL_SHIFT_OP sar, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
; A1, the shift count in A2 and a pointer to the eflags variable/register in A3.
IEMIMPL_SHIFT_DBL_OP shld, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
IEMIMPL_SHIFT_DBL_OP shrd, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
; The functions all return 0 so the caller can be used for div/idiv as well as
; for the mul/imul implementation.
%ifdef RT_ARCH_AMD64 ; The 32-bit host version lives in IEMAllAImplC.cpp.
%ifdef RT_ARCH_AMD64 ; The 32-bit host version lives in IEMAllAImplC.cpp.
IEMIMPL_DIV_OP div, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
IEMIMPL_DIV_OP idiv, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 1
; (input/output). They all return void.
movzx T0, word [%1 + X86FXSTATE.FCW]
mov [xSP + X86FSTENV32P.FCW], T0_16
movzx T1, word [%1 + X86FXSTATE.FSW]
movzx T0, word [xSP + X86FSTENV32P.FSW]
mov [xSP + X86FSTENV32P.FSW], T0_16
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULT.FSW]
fstp tword [A1 + IEMFPURESULT.r80Result]
fnstsw word [A1 + IEMFPURESULTTWO.FSW]
fstp tword [A1 + IEMFPURESULTTWO.r80Result2]
fstp tword [A1 + IEMFPURESULTTWO.r80Result1]
; @param A1 Pointer to the first media register size operand (input/output).
; @param A1 Pointer to the first full sized media register operand (input/output).
; @param A1 Pointer to the first full sized media register operand (input/output).