IEMAllAImpl.asm revision 8711dee9434977389d8fc4f6ee54ecc2a6958393
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; $Id$
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;; @file
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; IEM - Instruction Implementation in Assembly.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync; 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; We employ some macro assembly here to hid the calling convention differences.
032703cba22135d6032705fc2d67dd1294a6491avboxsync;
032703cba22135d6032705fc2d67dd1294a6491avboxsync%ifdef RT_ARCH_AMD64
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %macro PROLOGUE_1_ARGS 0
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro EPILOGUE_1_ARGS 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro PROLOGUE_2_ARGS 0
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro EPILOGUE_2_ARGS 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro PROLOGUE_3_ARGS 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro EPILOGUE_3_ARGS 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync %macro PROLOGUE_4_ARGS 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endmacro
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %macro EPILOGUE_4_ARGS 0
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync %ifdef ASM_CALL64_GCC
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A0 rdi
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A0_32 edi
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %define A0_16 di
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A0_8 dil
032703cba22135d6032705fc2d67dd1294a6491avboxsync
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %define A1 rsi
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A1_32 esi
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A1_16 si
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A1_8 sil
032703cba22135d6032705fc2d67dd1294a6491avboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A2 rdx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A2_32 edx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A2_16 dx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A2_8 dl
032703cba22135d6032705fc2d67dd1294a6491avboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A3 rcx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A3_32 ecx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A3_16 cx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync %ifdef ASM_CALL64_MSC
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A0 rcx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A0_32 ecx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A0_16 cx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A0_8 cl
032703cba22135d6032705fc2d67dd1294a6491avboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A1 rdx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A1_32 edx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define A1_16 dx
032703cba22135d6032705fc2d67dd1294a6491avboxsync %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
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %define A3 r9
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %define A3_32 r9d
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define A3_16 r9w
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0 rax
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %define T0_32 eax
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %define T0_16 ax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T0_8 al
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1 r11
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1_32 r11d
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %define T1_16 r11w
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %define T1_8 r11b
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync%else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ; x86
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_1_ARGS 0
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync push edi
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro EPILOGUE_1_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro EPILOGUE_2_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro PROLOGUE_3_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push ebx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov ebx, [esp + 4 + 4]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync push edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro EPILOGUE_3_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop ebx
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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %macro EPILOGUE_4_ARGS 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop esi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pop ebx
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
032703cba22135d6032705fc2d67dd1294a6491avboxsync %define T1_32 edi
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define T1_16 di
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync%endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; NAME for fastcall functions.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;; @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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; prefix argument.
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%define NAME_FASTCALL(a_Name, a_cbArgs, a_Dollar) NAME(a_Name)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%ifdef RT_ARCH_X86
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_OS_WINDOWS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %undef NAME_FASTCALL
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %define NAME_FASTCALL(a_Name, a_cbArgs, a_Prefix) a_Prefix %+ a_Name %+ @ %+ a_cbArgs
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endif
032703cba22135d6032705fc2d67dd1294a6491avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; BEGINPROC for fastcall functions.
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 1 The function name (C).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 2 The argument size on x86.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro BEGINPROC_FASTCALL 2
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_FORMAT_PE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync export %1=NAME_FASTCALL(%1,%2,$@)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef __NASM__
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_FORMAT_OMF
032703cba22135d6032705fc2d67dd1294a6491avboxsync export NAME(%1) NAME_FASTCALL(%1,%2,$@)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifndef ASM_FORMAT_BIN
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync global NAME_FASTCALL(%1,%2,$@)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncNAME_FASTCALL(%1,%2,@):
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
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.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 3 The modified flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 4 The undefined flags.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEMIMPL_BIN_OP 4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINCODE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 dword [A0], A1_32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %3, %4
b64efece437bfca8872b81be9d0568ba90389d91vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %ifdef RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 qword [A0], A1
032703cba22135d6032705fc2d67dd1294a6491avboxsync IEM_SAVE_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else ; stub it for now - later, replace with hand coded stuff.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
032703cba22135d6032705fc2d67dd1294a6491avboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; !RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %if %2 != 0 ; locked versions requested?
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8_locked, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync lock %1 byte [A0], A1_8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
032703cba22135d6032705fc2d67dd1294a6491avboxsync lock %1 word [A0], A1_16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_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
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_ARCH_AMD64
032703cba22135d6032705fc2d67dd1294a6491avboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync lock %1 qword [A0], A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A2, %3, %4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
032703cba22135d6032705fc2d67dd1294a6491avboxsync %else ; stub it for now - later, replace with hand coded stuff.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; !RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
032703cba22135d6032705fc2d67dd1294a6491avboxsync
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
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncIEMIMPL_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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_BIN_OP or, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_BIN_OP xor, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_BIN_OP and, 1, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
032703cba22135d6032705fc2d67dd1294a6491avboxsyncIEMIMPL_BIN_OP cmp, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_BIN_OP test, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), X86_EFL_AF,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
032703cba22135d6032705fc2d67dd1294a6491avboxsync; Macro for implementing a bit operator.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; This will generate code for the 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.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEMIMPL_BIT_OP 4
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINCODE
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_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
b64efece437bfca8872b81be9d0568ba90389d91vboxsync EPILOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_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
b64efece437bfca8872b81be9d0568ba90389d91vboxsync EPILOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync %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
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %else ; stub it for now - later, replace with hand coded stuff.
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync int3
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
032703cba22135d6032705fc2d67dd1294a6491avboxsync %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
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 12
032703cba22135d6032705fc2d67dd1294a6491avboxsync 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
b64efece437bfca8872b81be9d0568ba90389d91vboxsync EPILOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32_locked
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %ifdef RT_ARCH_AMD64
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync IEM_MAYBE_LOAD_FLAGS A2, %3, %4
b64efece437bfca8872b81be9d0568ba90389d91vboxsync lock %1 qword [A0], A1
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %3, %4
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync EPILOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %else ; stub it for now - later, replace with hand coded stuff.
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 16
032703cba22135d6032705fc2d67dd1294a6491avboxsync int3
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %endif ; !RT_ARCH_AMD64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %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)
032703cba22135d6032705fc2d67dd1294a6491avboxsyncIEMIMPL_BIT_OP btr, 1, (X86_EFL_CF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;;
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync; Macro for implementing a bit search operator.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
032703cba22135d6032705fc2d67dd1294a6491avboxsync; 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
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINCODE
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_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
b64efece437bfca8872b81be9d0568ba90389d91vboxsync EPILOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %1 T0_32, A1_32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync mov [A0], T0_32
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_SAVE_FLAGS A2, %2, %3
b64efece437bfca8872b81be9d0568ba90389d91vboxsync EPILOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
032703cba22135d6032705fc2d67dd1294a6491avboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %ifdef RT_ARCH_AMD64
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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
b64efece437bfca8872b81be9d0568ba90389d91vboxsync EPILOGUE_3_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
b64efece437bfca8872b81be9d0568ba90389d91vboxsync %else ; stub it for now - later, replace with hand coded stuff.
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync int3
b64efece437bfca8872b81be9d0568ba90389d91vboxsync ret
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)
032703cba22135d6032705fc2d67dd1294a6491avboxsyncIEMIMPL_BIT_OP bsr, (X86_EFL_ZF), (X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync; IMUL is also a similar but yet different case (no lock, no mem dst).
032703cba22135d6032705fc2d67dd1294a6491avboxsync; The rDX:rAX variant of imul is handled together with mul further down.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync;
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINCODE
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncBEGINPROC_FASTCALL iemAImpl_imul_two_u16, 12
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PROLOGUE_3_ARGS
b64efece437bfca8872b81be9d0568ba90389d91vboxsync 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)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_imul_two_u16
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync
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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_imul_two_u32
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_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]
032703cba22135d6032705fc2d67dd1294a6491avboxsync 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
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync int3 ;; @todo implement me
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_imul_two_u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; XCHG for memory operands. This implies locking. No flag changes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
032703cba22135d6032705fc2d67dd1294a6491avboxsync; Each function takes two arguments, first the pointer to the memory,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; then the pointer to the register. They all return void.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINCODE
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u8, 8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync PROLOGUE_2_ARGS
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov T0_8, [A1]
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync xchg [A0], T0_8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov [A1], T0_8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync EPILOGUE_2_ARGS
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync ret
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncENDPROC iemAImpl_xchg_u8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u16, 8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync PROLOGUE_2_ARGS
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov T0_16, [A1]
032703cba22135d6032705fc2d67dd1294a6491avboxsync xchg [A0], T0_16
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov [A1], T0_16
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync EPILOGUE_2_ARGS
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync ret
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncENDPROC iemAImpl_xchg_u16
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u32, 8
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync PROLOGUE_2_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync mov T0_32, [A1]
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync xchg [A0], T0_32
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov [A1], T0_32
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync EPILOGUE_2_ARGS
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync ret
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncENDPROC iemAImpl_xchg_u32
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncBEGINPROC_FASTCALL iemAImpl_xchg_u64, 8
032703cba22135d6032705fc2d67dd1294a6491avboxsync%ifdef RT_ARCH_AMD64
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync PROLOGUE_2_ARGS
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov T0, [A1]
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync xchg [A0], T0
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync mov [A1], T0
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync EPILOGUE_2_ARGS
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync ret
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync%else
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync%endif
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncENDPROC iemAImpl_xchg_u64
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync; XADD for memory operands.
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync; 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
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncBEGINPROC_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]
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync EPILOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync ret
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u8
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsyncBEGINPROC_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
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync EPILOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync ret
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u16
032703cba22135d6032705fc2d67dd1294a6491avboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u32, 12
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync PROLOGUE_3_ARGS
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync EPILOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync ret
032703cba22135d6032705fc2d67dd1294a6491avboxsyncENDPROC iemAImpl_xadd_u32
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u64, 12
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync%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
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync EPILOGUE_3_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync%else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync int3
032703cba22135d6032705fc2d67dd1294a6491avboxsync%endif
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u64
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncBEGINPROC_FASTCALL iemAImpl_xadd_u8_locked, 12
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync EPILOGUE_3_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
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
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync ret
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u16_locked
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncBEGINPROC_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
032703cba22135d6032705fc2d67dd1294a6491avboxsync IEM_SAVE_FLAGS A2, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync EPILOGUE_3_ARGS
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync ret
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncENDPROC iemAImpl_xadd_u32_locked
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncBEGINPROC_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
032703cba22135d6032705fc2d67dd1294a6491avboxsync 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
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync EPILOGUE_3_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync%else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync int3
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync%endif
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncENDPROC iemAImpl_xadd_u64_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
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.
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync;
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync%macro IEMIMPL_UNARY_OP 3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINCODE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync %1 byte [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_2_ARGS
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 byte [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync EPILOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 8
032703cba22135d6032705fc2d67dd1294a6491avboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 word [A0]
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync IEM_SAVE_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync lock %1 word [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16_locked
032703cba22135d6032705fc2d67dd1294a6491avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 dword [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
032703cba22135d6032705fc2d67dd1294a6491avboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 dword [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_2_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
032703cba22135d6032705fc2d67dd1294a6491avboxsyncENDPROC 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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_2_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync IEM_MAYBE_LOAD_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync lock %1 qword [A0]
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync IEM_SAVE_FLAGS A1, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_2_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64_locked
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ; stub them for now.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64_locked, 8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
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;
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync; All the functions takes a pointer to the destination memory operand in A0,
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync; 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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINCODE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
032703cba22135d6032705fc2d67dd1294a6491avboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
032703cba22135d6032705fc2d67dd1294a6491avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
032703cba22135d6032705fc2d67dd1294a6491avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync PROLOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MAYBE_LOAD_FLAGS A2, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync %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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else ; stub it for now - later, replace with hand coded stuff.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %endif ; !RT_ARCH_AMD64
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync%endmacro
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncIEMIMPL_SHIFT_OP rol, (X86_EFL_OF | X86_EFL_CF), 0
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncIEMIMPL_SHIFT_OP ror, (X86_EFL_OF | X86_EFL_CF), 0
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncIEMIMPL_SHIFT_OP rcl, (X86_EFL_OF | X86_EFL_CF), 0
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncIEMIMPL_SHIFT_OP rcr, (X86_EFL_OF | X86_EFL_CF), 0
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncIEMIMPL_SHIFT_OP shl, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncIEMIMPL_SHIFT_OP shr, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncIEMIMPL_SHIFT_OP sar, (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 double precision shift operation.
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync;
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync; 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;
032703cba22135d6032705fc2d67dd1294a6491avboxsync%macro IEMIMPL_SHIFT_DBL_OP 3
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncBEGINCODE
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 16
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync EPILOGUE_4_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 16
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync EPILOGUE_4_ARGS
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %ifdef RT_ARCH_AMD64
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
032703cba22135d6032705fc2d67dd1294a6491avboxsync 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
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync EPILOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else ; stub it for now - later, replace with hand coded stuff.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif ; !RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%endmacro
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_SHIFT_DBL_OP shld, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncIEMIMPL_SHIFT_DBL_OP shrd, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF), (X86_EFL_AF)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Macro for implementing a multiplication operations.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync; This will generate code for the 8, 16, 32 and 64 bit accesses, except on
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync; 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.
032703cba22135d6032705fc2d67dd1294a6491avboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 1 The instruction mnemonic.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; @param 2 The modified flags.
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync; @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
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINCODE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_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 EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
032703cba22135d6032705fc2d67dd1294a6491avboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 16
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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 EPILOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 16
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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 EPILOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
032703cba22135d6032705fc2d67dd1294a6491avboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync %ifdef RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
032703cba22135d6032705fc2d67dd1294a6491avboxsync 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
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync mov [T1], rdx
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_SAVE_FLAGS A3, %2, %3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync xor eax, eax
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %else ; stub it for now - later, replace with hand coded stuff.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync int3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
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
ab37cc785e1bcbaaad50b8fb791bfecba6f4b4d5vboxsync
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync;;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; 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.
032703cba22135d6032705fc2d67dd1294a6491avboxsync; @param 3 The undefined flags.
032703cba22135d6032705fc2d67dd1294a6491avboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync; Makes ASSUMPTIONS about A0, A1, A2, A3, T0 and T1 assignments.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync%macro IEMIMPL_DIV_OP 3
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINCODE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_3_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.div_zero:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, -1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jmp .return
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u8
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_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
032703cba22135d6032705fc2d67dd1294a6491avboxsync
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync 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
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.div_zero:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, -1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jmp .return
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u16
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_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
032703cba22135d6032705fc2d67dd1294a6491avboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
032703cba22135d6032705fc2d67dd1294a6491avboxsync 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
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync EPILOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ret
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync.div_zero:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov eax, -1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jmp .return
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u32
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef RT_ARCH_AMD64
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PROLOGUE_4_ARGS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync test A1, A1
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync jz .div_zero
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ;; @todo test for overflow
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
032703cba22135d6032705fc2d67dd1294a6491avboxsync IEM_MAYBE_LOAD_FLAGS A3, %2, %3
315f68b04971772d94ba6c4408eaa19559a77cedvboxsync mov rax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %ifdef ASM_CALL64_GCC
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov T1, A2
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov rax, [A0]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync mov rdx, [A1]
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync %1 T1
3755e2bacafa2dd718108ad1a18661dcd9566bd8vboxsync 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
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync xor eax, eax
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync.return:
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync EPILOGUE_4_ARGS
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync ret
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync.div_zero:
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync mov eax, -1
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync jmp .return
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync %else ; stub it for now - later, replace with hand coded stuff.
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncBEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 20
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync int3
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync ret
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncENDPROC iemAImpl_ %+ %1 %+ _u64
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync %endif ; !RT_ARCH_AMD64
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync%endmacro
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncIEMIMPL_DIV_OP div, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncIEMIMPL_DIV_OP idiv, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync