IEMAllAImpl.asm revision 7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddb
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
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
92a27575521748a392dcd1b996fce55b87411a00vboxsync; Header Files ;
92a27575521748a392dcd1b996fce55b87411a00vboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Defined Constants And Macros ;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; RET XX / RET wrapper for fastcall.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%macro RET_FASTCALL 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%ifdef RT_ARCH_X86
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef RT_OS_WINDOWS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; NAME for fastcall functions.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync;; @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
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; prefix argument.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%define NAME_FASTCALL(a_Name, a_cbArgs, a_Dollar) NAME(a_Name)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%ifdef RT_ARCH_X86
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef RT_OS_WINDOWS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %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.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%macro BEGINPROC_FASTCALL 2
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef ASM_FORMAT_PE
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync export %1=NAME_FASTCALL(%1,%2,$@)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef __NASM__
86abc60770f825f8c2ed4257675b50a08743b687vboxsync %ifdef ASM_FORMAT_OMF
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync export NAME(%1) NAME_FASTCALL(%1,%2,$@)
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %ifndef ASM_FORMAT_BIN
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync global NAME_FASTCALL(%1,%2,$@)
23ee8310386e73ba6760fa30831a7964713d34b6vboxsyncNAME_FASTCALL(%1,%2,@):
4a429a59b1a82ce092626ea5f7512466c18f2015vboxsync; 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 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_2_ARGS 0
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %macro EPILOGUE_2_ARGS 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_3_ARGS 0
86abc60770f825f8c2ed4257675b50a08743b687vboxsync %macro EPILOGUE_3_ARGS 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_4_ARGS 0
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %macro EPILOGUE_4_ARGS 1
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %ifdef ASM_CALL64_GCC
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %define A0 rdi
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %define A0_32 edi
23ee8310386e73ba6760fa30831a7964713d34b6vboxsync %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
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A2 r8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A2_32 r8d
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %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
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0_16 ax
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0_8 al
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T1 r11
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T1_32 r11d
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T1_16 r11w
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T1_8 r11b
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_1_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro EPILOGUE_1_ARGS 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_2_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro EPILOGUE_2_ARGS 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro PROLOGUE_3_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov ebx, [esp + 4 + 4]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro EPILOGUE_3_ARGS 1
86abc60770f825f8c2ed4257675b50a08743b687vboxsync %macro PROLOGUE_4_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov ebx, [esp + 12 + 4 + 0]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov esi, [esp + 12 + 4 + 4]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %macro EPILOGUE_4_ARGS 1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A0 ecx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A0_32 ecx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A0_16 cx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A0_8 cl
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A1 edx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A1_32 edx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A1_16 dx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A1_8 dl
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A2 ebx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A2_32 ebx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A2_16 bx
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A2_8 bl
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A3 esi
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define A3_32 esi
86abc60770f825f8c2ed4257675b50a08743b687vboxsync %define A3_16 si
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0 eax
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0_32 eax
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0_16 ax
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T0_8 al
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T1 edi
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T1_32 edi
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %define T1_16 di
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Load the relevant flags from [%1] if there are undefined flags (%3).
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @remarks Clobbers T0, stack. Changes EFLAGS.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @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.
86abc60770f825f8c2ed4257675b50a08743b687vboxsync or [xSP], T0 ; merge guest flags with host flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync popf ; load the mixed flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Update the flag.
7b213bb002950f9fcf809f605cc584fa543481advboxsync; @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
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %if (%2 | %3) != 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_32, [%1] ; flags
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync and T0_32, ~(%2 | %3) ; clear the modified & undefined flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync and T1_32, (%2 | %3) ; select the modified and undefined flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync or T0_32, T1_32 ; combine the flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [%1], T0_32 ; save the flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Macro for implementing a binary operator.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; 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
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; All the functions takes a pointer to the destination memory operand in A0,
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; the source register operand in A1 and a pointer to eflags in A2.
7b213bb002950f9fcf809f605cc584fa543481advboxsync; @param 1 The instruction mnemonic.
7b213bb002950f9fcf809f605cc584fa543481advboxsync; @param 2 Non-zero if there should be a locked version.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 3 The modified flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 4 The undefined flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%macro IEMIMPL_BIN_OP 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 byte [A0], A1_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 word [A0], A1_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 dword [A0], A1_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 qword [A0], A1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %else ; stub it for now - later, replace with hand coded stuff.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %endif ; !RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %if %2 != 0 ; locked versions requested?
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8_locked, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock %1 byte [A0], A1_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8_locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock %1 word [A0], A1_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock %1 dword [A0], A1_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32_locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock %1 qword [A0], A1
8ab58711374a80e59aca3bcf93d367361aaa992evboxsync IEM_SAVE_FLAGS A2, %3, %4
8ab58711374a80e59aca3bcf93d367361aaa992evboxsync EPILOGUE_3_ARGS 8
8ab58711374a80e59aca3bcf93d367361aaa992evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
c1ca21ba335f4d6a24c34cb6fa07fa8e5ac55cc7vboxsync %else ; stub it for now - later, replace with hand coded stuff.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync %endif ; !RT_ARCH_AMD64
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync %endif ; locked
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync; instr,lock,modified-flags.
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncIEMIMPL_BIN_OP add, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncIEMIMPL_BIN_OP adc, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
de86a09bf42f7e7d80a0a5acf1e8e99d445be1d3vboxsyncIEMIMPL_BIN_OP sub, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
de86a09bf42f7e7d80a0a5acf1e8e99d445be1d3vboxsyncIEMIMPL_BIN_OP sbb, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncIEMIMPL_BIN_OP or, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncIEMIMPL_BIN_OP xor, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncIEMIMPL_BIN_OP and, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncIEMIMPL_BIN_OP cmp, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncIEMIMPL_BIN_OP test, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync; Macro for implementing a bit operator.
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync; This will generate code for the 16, 32 and 64 bit accesses with locked
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync; variants, except on 32-bit system where the 64-bit accesses requires hand
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync; All the functions takes a pointer to the destination memory operand in A0,
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; the source register operand in A1 and a pointer to eflags in A2.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 1 The instruction mnemonic.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 2 Non-zero if there should be a locked version.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 3 The modified flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 4 The undefined flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%macro IEMIMPL_BIT_OP 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 word [A0], A1_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 dword [A0], A1_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef RT_ARCH_AMD64
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 qword [A0], A1
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %else ; stub it for now - later, replace with hand coded stuff.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC 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
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock %1 word [A0], A1_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync lock %1 dword [A0], A1_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %3, %4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32_locked
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsync PROLOGUE_3_ARGS
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsync lock %1 qword [A0], A1
ee6495ebe54829fea21ffbb6f1275315e72d4506vboxsync IEM_SAVE_FLAGS A2, %3, %4
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsync EPILOGUE_3_ARGS 8
98bfcb808aa93fe8b532eb38da1f15a795a85f6dvboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
98bfcb808aa93fe8b532eb38da1f15a795a85f6dvboxsync %else ; stub it for now - later, replace with hand coded stuff.
42dc09ee69e746b8641cfa190931a15ecfd7295cvboxsyncBEGINPROC_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)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncIEMIMPL_BIT_OP btr, 1, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; Macro for implementing a bit search operator.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; This will generate code for the 16, 32 and 64 bit accesses, except on 32-bit
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; system where the 64-bit accesses requires hand coding.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; All the functions takes a pointer to the destination memory operand in A0,
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; the source register operand in A1 and a pointer to eflags in A2.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 1 The instruction mnemonic.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 2 The modified flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; @param 3 The undefined flags.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%macro IEMIMPL_BIT_OP 3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 T0_16, A1_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A0], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %2, %3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %1 T0_32, A1_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A0], T0_32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %2, %3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %ifdef RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A0], T0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync IEM_SAVE_FLAGS A2, %2, %3
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_3_ARGS 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %else ; stub it for now - later, replace with hand coded stuff.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync %endif ; !RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncIEMIMPL_BIT_OP bsf, (X86_EFL_ZF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncIEMIMPL_BIT_OP bsr, (X86_EFL_ZF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; IMUL is also a similar but yet different case (no lock, no mem dst).
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; The rDX:rAX variant of imul is handled together with mul further down.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u16, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync 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_16, word [A0]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync 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 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_imul_two_u16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u32, 12
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync 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
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 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_imul_two_u32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u64, 16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_3_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%ifdef RT_ARCH_AMD64
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, qword [A0]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync 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 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC 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
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_8, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync xchg [A0], T0_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_2_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xchg_u8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u16, 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_2_ARGS
98bfcb808aa93fe8b532eb38da1f15a795a85f6dvboxsync mov T0_16, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync xchg [A0], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0_16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_2_ARGS 0
98bfcb808aa93fe8b532eb38da1f15a795a85f6dvboxsyncENDPROC iemAImpl_xchg_u16
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u32, 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_2_ARGS
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov T0_32, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync xchg [A0], T0_32
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync mov [A1], T0_32
c0da96af18c7b40ac5cfd7e7ea398a398540f224vboxsync EPILOGUE_2_ARGS 0
8ab58711374a80e59aca3bcf93d367361aaa992evboxsyncENDPROC iemAImpl_xchg_u32
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u64, 8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync%ifdef RT_ARCH_AMD64
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync PROLOGUE_2_ARGS
c1ca21ba335f4d6a24c34cb6fa07fa8e5ac55cc7vboxsync mov T0, [A1]
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync xchg [A0], T0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync mov [A1], T0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync EPILOGUE_2_ARGS 0
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xchg_u64
4d9c5e290e1bd3dc77e1aa678903a82fcb1f70aevboxsync; 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
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsync; eflags. They all return void.
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u8, 12
9adf0edc408b0873b9650dd230f577e8977035e8vboxsync 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
de86a09bf42f7e7d80a0a5acf1e8e99d445be1d3vboxsync mov [A1], T0_8
4d9c5e290e1bd3dc77e1aa678903a82fcb1f70aevboxsync 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 4
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncENDPROC iemAImpl_xadd_u8
db3dbd0ed7eb69f804a8921fa23a1267ea01f46evboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u16, 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]
IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
IEM_MAYBE_LOAD_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
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.
IEMIMPL_DIV_OP div, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
IEMIMPL_DIV_OP idiv, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
; (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 + IEMFPURESULTTWO.FSW]
fstp tword [A1 + IEMFPURESULTTWO.r80Result2]
fstp tword [A1 + IEMFPURESULTTWO.r80Result1]