65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/* $Id$ */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** @file
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * IEM - Instruction Decoding and Emulation.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/*
00c8e54610ab969c89f03354ce73f4084ffa51cdvboxsync * Copyright (C) 2011-2013 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
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync/*******************************************************************************
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync* Global Variables *
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync*******************************************************************************/
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsyncextern const PFNIEMOP g_apfnOneByteMap[256]; /* not static since we need to forward declare it. */
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common worker for instructions like ADD, AND, OR, ++ with a byte
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * memory/register as the destination.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param pImpl Pointer to the instruction implementation (assembly).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpHlpBinaryOperator_rm_r8, PCIEMOPBINSIZES, pImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, u8Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're accessing memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Note! We're putting the eflags on the stack here so we can commit them
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * after the memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint32_t const fAccess = pImpl->pfnLockedU8 ? IEM_ACCESS_DATA_RW : IEM_ACCESS_DATA_R; /* CMP,TEST */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, u8Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu8Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common worker for word/dword/qword instructions like ADD, AND, OR, ++ with
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * memory/register as the destination.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param pImpl Pointer to the instruction implementation (assembly).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpHlpBinaryOperator_rm_rv, PCIEMOPBINSIZES, pImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3e289133c2cd4a14140904eb6009390fc2de8836vboxsync if (pImpl != &g_iemAImpl_test)
3e289133c2cd4a14140904eb6009390fc2de8836vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're accessing memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Note! We're putting the eflags on the stack here so we can commit them
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * after the memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint32_t const fAccess = pImpl->pfnLockedU8 ? IEM_ACCESS_DATA_RW : IEM_ACCESS_DATA_R /* CMP,TEST */;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu16Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu32Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu64Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common worker for byte instructions like ADD, AND, OR, ++ with a register as
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * the destination.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param pImpl Pointer to the instruction implementation (assembly).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpHlpBinaryOperator_r8_rm, PCIEMOPBINSIZES, pImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, u8Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(u8Src, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're accessing memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, u8Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U8(u8Src, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common worker for word/dword/qword instructions like ADD, AND, OR, ++ with a
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * register as the destination.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param pImpl Pointer to the instruction implementation (assembly).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpHlpBinaryOperator_rv_rm, PCIEMOPBINSIZES, pImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Src, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Src, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Src, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're accessing memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(u16Src, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U32(u32Src, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U64(u64Src, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common worker for instructions like ADD, AND, OR, ++ with working on AL with
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * a byte immediate.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param pImpl Pointer to the instruction implementation (assembly).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpHlpBinaryOperator_AL_Ib, PCIEMOPBINSIZES, pImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, u8Src,/*=*/ u8Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common worker for instructions like ADD, AND, OR, ++ with working on
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * AX/EAX/RAX with a word/dword immediate.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param pImpl Pointer to the instruction implementation (assembly).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpHlpBinaryOperator_rAX_Iz, PCIEMOPBINSIZES, pImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint16_t, u16Src,/*=*/ u16Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint32_t, u32Src,/*=*/ u32Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
3e289133c2cd4a14140904eb6009390fc2de8836vboxsync if (pImpl != &g_iemAImpl_test)
3e289133c2cd4a14140904eb6009390fc2de8836vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint64_t, u64Src,/*=*/ u64Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcodes 0xf1, 0xd6. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Invalid)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("Invalid");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** @name ..... opcodes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** @} */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** @name Two byte opcodes (first byte 0x0f).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x00 /0. */
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsyncFNIEMOP_DEF_1(iemOp_Grp6_sldt, uint8_t, bRm)
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync{
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_MNEMONIC("sldt Rv/Mw");
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_HLP_NO_REAL_OR_V86_MODE();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync {
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync switch (pIemCpu->enmEffOpSize)
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync {
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync case IEMMODE_16BIT:
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_BEGIN(0, 1);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(uint16_t, u16Ldtr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_FETCH_LDTR_U16(u16Ldtr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Ldtr);
fa44e511e191cd52e45e91e03b728aa97b201653vboxsync IEM_MC_ADVANCE_RIP();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_END();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync break;
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync case IEMMODE_32BIT:
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_BEGIN(0, 1);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(uint32_t, u32Ldtr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_FETCH_LDTR_U32(u32Ldtr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Ldtr);
fa44e511e191cd52e45e91e03b728aa97b201653vboxsync IEM_MC_ADVANCE_RIP();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_END();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync break;
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync case IEMMODE_64BIT:
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_BEGIN(0, 1);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(uint64_t, u64Ldtr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_FETCH_LDTR_U64(u64Ldtr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Ldtr);
fa44e511e191cd52e45e91e03b728aa97b201653vboxsync IEM_MC_ADVANCE_RIP();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_END();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync break;
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync }
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync }
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync else
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync {
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_BEGIN(0, 2);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(uint16_t, u16Ldtr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_FETCH_LDTR_U16(u16Ldtr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Ldtr);
fa44e511e191cd52e45e91e03b728aa97b201653vboxsync IEM_MC_ADVANCE_RIP();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_END();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync }
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync return VINF_SUCCESS;
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x00 /1. */
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsyncFNIEMOP_DEF_1(iemOp_Grp6_str, uint8_t, bRm)
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync{
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_MNEMONIC("str Rv/Mw");
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_HLP_NO_REAL_OR_V86_MODE();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync {
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync switch (pIemCpu->enmEffOpSize)
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync {
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync case IEMMODE_16BIT:
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_BEGIN(0, 1);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(uint16_t, u16Tr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_FETCH_TR_U16(u16Tr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Tr);
fa44e511e191cd52e45e91e03b728aa97b201653vboxsync IEM_MC_ADVANCE_RIP();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_END();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync break;
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync case IEMMODE_32BIT:
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_BEGIN(0, 1);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(uint32_t, u32Tr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_FETCH_TR_U32(u32Tr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Tr);
fa44e511e191cd52e45e91e03b728aa97b201653vboxsync IEM_MC_ADVANCE_RIP();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_END();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync break;
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync case IEMMODE_64BIT:
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_BEGIN(0, 1);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(uint64_t, u64Tr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_FETCH_TR_U64(u64Tr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Tr);
fa44e511e191cd52e45e91e03b728aa97b201653vboxsync IEM_MC_ADVANCE_RIP();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_END();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync break;
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync }
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync }
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync else
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync {
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_BEGIN(0, 2);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(uint16_t, u16Tr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_FETCH_TR_U16(u16Tr);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Tr);
fa44e511e191cd52e45e91e03b728aa97b201653vboxsync IEM_MC_ADVANCE_RIP();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEM_MC_END();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync }
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync return VINF_SUCCESS;
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x00 /2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp6_lldt, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_MNEMONIC("lldt Ew");
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_HLP_NO_REAL_OR_V86_MODE();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_HLP_DECODED_NL_1(OP_LLDT, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(1, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ARG(uint16_t, u16Sel, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_lldt, u16Sel);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync else
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(1, 1);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ARG(uint16_t, u16Sel, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_HLP_DECODED_NL_1(OP_LLDT, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO(); /** @todo test order */
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_lldt, u16Sel);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x00 /3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp6_ltr, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_MNEMONIC("ltr Ew");
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_HLP_NO_REAL_OR_V86_MODE();
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(1, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ARG(uint16_t, u16Sel, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_ltr, u16Sel);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync else
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(1, 1);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ARG(uint16_t, u16Sel, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO(); /** @todo test ordre */
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_ltr, u16Sel);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync/** Opcode 0x0f 0x00 /3. */
f097c4c4f73a10ba243257b42fab463350f1c9d8vboxsyncFNIEMOP_DEF_2(iemOpCommonGrp6VerX, uint8_t, bRm, bool, fWrite)
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync{
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEMOP_HLP_NO_REAL_OR_V86_MODE();
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync {
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEMOP_HLP_DECODED_NL_1(fWrite ? OP_VERW : OP_VERR, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_BEGIN(2, 0);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_ARG(uint16_t, u16Sel, 0);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_ARG_CONST(bool, fWriteArg, fWrite, 1);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_CALL_CIMPL_2(iemCImpl_VerX, u16Sel, fWriteArg);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_END();
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync }
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync else
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync {
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_BEGIN(2, 1);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_ARG(uint16_t, u16Sel, 0);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_ARG_CONST(bool, fWriteArg, fWrite, 1);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEMOP_HLP_DECODED_NL_1(fWrite ? OP_VERW : OP_VERR, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_CALL_CIMPL_2(iemCImpl_VerX, u16Sel, fWriteArg);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEM_MC_END();
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync }
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync return VINF_SUCCESS;
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync}
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x00 /4. */
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsyncFNIEMOP_DEF_1(iemOp_Grp6_verr, uint8_t, bRm)
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync{
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEMOP_MNEMONIC("verr Ew");
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync return FNIEMOP_CALL_2(iemOpCommonGrp6VerX, bRm, false);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x00 /5. */
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsyncFNIEMOP_DEF_1(iemOp_Grp6_verw, uint8_t, bRm)
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync{
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync IEMOP_MNEMONIC("verr Ew");
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync return FNIEMOP_CALL_2(iemOpCommonGrp6VerX, bRm, true);
a88129a0e882be801166f7aecbc3b39195ef63fdvboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x00. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp6)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp6_sldt, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: return FNIEMOP_CALL_1(iemOp_Grp6_str, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2: return FNIEMOP_CALL_1(iemOp_Grp6_lldt, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3: return FNIEMOP_CALL_1(iemOp_Grp6_ltr, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 4: return FNIEMOP_CALL_1(iemOp_Grp6_verr, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5: return FNIEMOP_CALL_1(iemOp_Grp6_verw, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7: return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp7_sgdt, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_MNEMONIC("sgdt Ms");
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEMOP_HLP_64BIT_OP_SIZE();
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_BEGIN(3, 1);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 0);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 1);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_sgdt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_END();
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_vmcall)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEMOP_BITCH_ABOUT_STUB();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_vmlaunch)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEMOP_BITCH_ABOUT_STUB();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_vmresume)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEMOP_BITCH_ABOUT_STUB();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_vmxoff)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEMOP_BITCH_ABOUT_STUB();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp7_sidt, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
acebf0f8a1553ee17c6669acc236dc77e15b57a4vboxsync IEMOP_MNEMONIC("sidt Ms");
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEMOP_HLP_64BIT_OP_SIZE();
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_BEGIN(3, 1);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 0);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 1);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_sidt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_END();
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_monitor)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
1f99e2fdf4c3c62af970234bef6de703148f3bfcvboxsync IEMOP_MNEMONIC("monitor");
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo Verify that monitor is allergic to lock prefixes. */
1f99e2fdf4c3c62af970234bef6de703148f3bfcvboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_monitor, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_mwait)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync IEMOP_MNEMONIC("mwait"); /** @todo Verify that mwait is allergic to lock prefixes. */
1f99e2fdf4c3c62af970234bef6de703148f3bfcvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1f99e2fdf4c3c62af970234bef6de703148f3bfcvboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_mwait);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp7_lgdt, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync IEMOP_MNEMONIC("lgdt");
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEMOP_HLP_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 0);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 1);
cc8fc24b48b6dcfb5b11e66d68d08ac3ae46b401vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_lgdt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
53b2cc239d6598a070c89f35be14772f71f81777vboxsync/** Opcode 0x0f 0x01 0xd0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_xgetbv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
53b2cc239d6598a070c89f35be14772f71f81777vboxsync IEMOP_MNEMONIC("xgetbv");
53b2cc239d6598a070c89f35be14772f71f81777vboxsync if (IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fXSaveRstor)
53b2cc239d6598a070c89f35be14772f71f81777vboxsync {
53b2cc239d6598a070c89f35be14772f71f81777vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
53b2cc239d6598a070c89f35be14772f71f81777vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_xgetbv);
53b2cc239d6598a070c89f35be14772f71f81777vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
53b2cc239d6598a070c89f35be14772f71f81777vboxsync/** Opcode 0x0f 0x01 0xd1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_xsetbv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
53b2cc239d6598a070c89f35be14772f71f81777vboxsync IEMOP_MNEMONIC("xsetbv");
53b2cc239d6598a070c89f35be14772f71f81777vboxsync if (IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fXSaveRstor)
53b2cc239d6598a070c89f35be14772f71f81777vboxsync {
53b2cc239d6598a070c89f35be14772f71f81777vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
53b2cc239d6598a070c89f35be14772f71f81777vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_xsetbv);
53b2cc239d6598a070c89f35be14772f71f81777vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp7_lidt, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMMODE enmEffOpSize = pIemCpu->enmCpuMode == IEMMODE_64BIT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ? IEMMODE_64BIT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync : pIemCpu->enmEffOpSize;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSizeArg,/*=*/enmEffOpSize, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_lidt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x01 0xd8. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmrun);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x01 0xd9. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmmcall);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x01 0xda. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmload);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x01 0xdb. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmsave);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x01 0xdc. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_Grp7_Amd_stgi);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x01 0xdd. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_Grp7_Amd_clgi);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x01 0xde. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_Grp7_Amd_skinit);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x01 0xdf. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_Grp7_Amd_invlpga);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /4. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp7_smsw, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync IEMOP_MNEMONIC("smsw");
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync {
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync switch (pIemCpu->enmEffOpSize)
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync {
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync case IEMMODE_16BIT:
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_BEGIN(0, 1);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_FETCH_CR0_U16(u16Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_ADVANCE_RIP();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_END();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync return VINF_SUCCESS;
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync case IEMMODE_32BIT:
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_BEGIN(0, 1);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_FETCH_CR0_U32(u32Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_ADVANCE_RIP();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_END();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync return VINF_SUCCESS;
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync case IEMMODE_64BIT:
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_BEGIN(0, 1);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_FETCH_CR0_U64(u64Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_ADVANCE_RIP();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_END();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync return VINF_SUCCESS;
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync }
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync }
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync else
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync {
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync /* Ignore operand size here, memory refs are always 16-bit. */
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_BEGIN(0, 2);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_FETCH_CR0_U16(u16Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_ADVANCE_RIP();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_END();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync return VINF_SUCCESS;
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /6. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp7_lmsw, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync /* The operand size is effectively ignored, all is 16-bit and only the
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync lower 3-bits are used. */
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync IEMOP_MNEMONIC("lmsw");
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync {
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_BEGIN(1, 0);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_ARG(uint16_t, u16Tmp, 0);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_lmsw, u16Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_END();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync }
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync else
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync {
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_BEGIN(1, 1);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_ARG(uint16_t, u16Tmp, 0);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_lmsw, u16Tmp);
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync IEM_MC_END();
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync }
374f0b5fc4e70777b3f9ad8586ad7aa2551f37ccvboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp7_invlpg, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync IEMOP_MNEMONIC("invlpg");
a8c0cd113e4c194efbc13ef339c7f79137d6dd3bvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
a8c0cd113e4c194efbc13ef339c7f79137d6dd3bvboxsync IEM_MC_BEGIN(1, 1);
a8c0cd113e4c194efbc13ef339c7f79137d6dd3bvboxsync IEM_MC_ARG(RTGCPTR, GCPtrEffDst, 0);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
a8c0cd113e4c194efbc13ef339c7f79137d6dd3bvboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_invlpg, GCPtrEffDst);
a8c0cd113e4c194efbc13ef339c7f79137d6dd3bvboxsync IEM_MC_END();
a8c0cd113e4c194efbc13ef339c7f79137d6dd3bvboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_swapgs)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync IEMOP_MNEMONIC("swapgs");
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync IEMOP_HLP_ONLY_64BIT();
63f2e9195f4ae05b9d0571bfdf34d4aa0c719ab1vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_swapgs);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01 /7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7_rdtscp)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
2afbe132eb7931e0125141eabe3a48e08f1ffab5vboxsync NOREF(pIemCpu);
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync IEMOP_BITCH_ABOUT_STUB();
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync return VERR_IEM_INSTR_NOT_IMPLEMENTED;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x01. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp7)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp7_sgdt, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (bRm & X86_MODRM_RM_MASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: return FNIEMOP_CALL(iemOp_Grp7_vmcall);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2: return FNIEMOP_CALL(iemOp_Grp7_vmlaunch);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3: return FNIEMOP_CALL(iemOp_Grp7_vmresume);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 4: return FNIEMOP_CALL(iemOp_Grp7_vmxoff);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp7_sidt, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (bRm & X86_MODRM_RM_MASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: return FNIEMOP_CALL(iemOp_Grp7_monitor);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: return FNIEMOP_CALL(iemOp_Grp7_mwait);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp7_lgdt, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (bRm & X86_MODRM_RM_MASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: return FNIEMOP_CALL(iemOp_Grp7_xgetbv);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: return FNIEMOP_CALL(iemOp_Grp7_xsetbv);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp7_lidt, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (bRm & X86_MODRM_RM_MASK)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmrun);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 1: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmmcall);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 2: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmload);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 3: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmsave);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 4: return FNIEMOP_CALL(iemOp_Grp7_Amd_stgi);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 5: return FNIEMOP_CALL(iemOp_Grp7_Amd_clgi);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 6: return FNIEMOP_CALL(iemOp_Grp7_Amd_skinit);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 7: return FNIEMOP_CALL(iemOp_Grp7_Amd_invlpga);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 4:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp7_smsw, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 6:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp7_lmsw, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp7_invlpg, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (bRm & X86_MODRM_RM_MASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: return FNIEMOP_CALL(iemOp_Grp7_swapgs);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: return FNIEMOP_CALL(iemOp_Grp7_rdtscp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync/** Opcode 0x0f 0x00 /3. */
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsyncFNIEMOP_DEF_1(iemOpCommonLarLsl_Gv_Ew, bool, fIsLar)
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync{
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_HLP_NO_REAL_OR_V86_MODE();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_HLP_DECODED_NL_2(fIsLar ? OP_LAR : OP_LSL, IEMOPFORM_RM_REG, OP_PARM_Gv, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync switch (pIemCpu->enmEffOpSize)
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync case IEMMODE_16BIT:
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_BEGIN(4, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t, u16Sel, 1);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG_CONST(bool, fIsLarArg, fIsLar, 3);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_EFLAGS(pEFlags);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_CALL_CIMPL_4(iemCImpl_LarLsl_u16, pu16Dst, u16Sel, pEFlags, fIsLarArg);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_END();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync return VINF_SUCCESS;
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync case IEMMODE_32BIT:
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync case IEMMODE_64BIT:
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_BEGIN(4, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t, u16Sel, 1);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG_CONST(bool, fIsLarArg, fIsLar, 3);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_EFLAGS(pEFlags);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_CALL_CIMPL_4(iemCImpl_LarLsl_u64, pu64Dst, u16Sel, pEFlags, fIsLarArg);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_END();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync return VINF_SUCCESS;
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync else
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync switch (pIemCpu->enmEffOpSize)
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync case IEMMODE_16BIT:
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_BEGIN(4, 1);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t, u16Sel, 1);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG_CONST(bool, fIsLarArg, fIsLar, 3);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_HLP_DECODED_NL_2(fIsLar ? OP_LAR : OP_LSL, IEMOPFORM_RM_MEM, OP_PARM_Gv, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_EFLAGS(pEFlags);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_CALL_CIMPL_4(iemCImpl_LarLsl_u16, pu16Dst, u16Sel, pEFlags, fIsLarArg);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_END();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync return VINF_SUCCESS;
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync case IEMMODE_32BIT:
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync case IEMMODE_64BIT:
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_BEGIN(4, 1);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t, u16Sel, 1);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG_CONST(bool, fIsLarArg, fIsLar, 3);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_HLP_DECODED_NL_2(fIsLar ? OP_LAR : OP_LSL, IEMOPFORM_RM_MEM, OP_PARM_Gv, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
d1bb48754376874c3cc6b1091a6abec549663c0cvboxsync/** @todo testcase: make sure it's a 16-bit read. */
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_EFLAGS(pEFlags);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_CALL_CIMPL_4(iemCImpl_LarLsl_u64, pu64Dst, u16Sel, pEFlags, fIsLarArg);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_END();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync return VINF_SUCCESS;
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync}
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x02. */
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsyncFNIEMOP_DEF(iemOp_lar_Gv_Ew)
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync{
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_MNEMONIC("lar Gv,Ew");
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync return FNIEMOP_CALL_1(iemOpCommonLarLsl_Gv_Ew, true);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync}
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x03. */
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsyncFNIEMOP_DEF(iemOp_lsl_Gv_Ew)
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync{
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_MNEMONIC("lsl Gv,Ew");
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync return FNIEMOP_CALL_1(iemOpCommonLarLsl_Gv_Ew, false);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync}
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x04. */
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsyncFNIEMOP_DEF(iemOp_syscall)
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync{
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync IEMOP_MNEMONIC("syscall");
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_syscall);
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync}
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x05. */
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsyncFNIEMOP_DEF(iemOp_clts)
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync{
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync IEMOP_MNEMONIC("clts");
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_clts);
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync}
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x06. */
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsyncFNIEMOP_DEF(iemOp_sysret)
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync{
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync IEMOP_MNEMONIC("sysret");
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_sysret);
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync}
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync
b13cc41acae6f187cb749eb8df5dbc7a007a8ee1vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x08. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_invd);
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x09. */
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsyncFNIEMOP_DEF(iemOp_wbinvd)
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync{
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync IEMOP_MNEMONIC("wbinvd");
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync IEM_MC_BEGIN(0, 0);
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO();
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync IEM_MC_ADVANCE_RIP();
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync IEM_MC_END();
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync return VINF_SUCCESS; /* ignore for now */
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync}
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync
f04eda3b79919a8fdfe041be77aafd118102f0acvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x0b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_ud2);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x0d. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsyncFNIEMOP_DEF(iemOp_nop_Ev_GrpP)
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync{
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync /* AMD prefetch group, Intel implements this as NOP Ev (and so do we). */
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->f3DNowPrefetch)
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync {
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEMOP_MNEMONIC("GrpP");
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync return IEMOP_RAISE_INVALID_OPCODE();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync }
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync {
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEMOP_MNEMONIC("GrpP");
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync return IEMOP_RAISE_INVALID_OPCODE();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync }
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync {
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 2: /* Aliased to /0 for the time being. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 4: /* Aliased to /0 for the time being. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 5: /* Aliased to /0 for the time being. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 6: /* Aliased to /0 for the time being. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 7: /* Aliased to /0 for the time being. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 0: IEMOP_MNEMONIC("prefetch"); break;
5eba4a901abbab7bba14d8679fd1ffcda0dba19bvboxsync case 1: IEMOP_MNEMONIC("prefetchw"); break;
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 3: IEMOP_MNEMONIC("prefetchw"); break;
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync }
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_BEGIN(0, 1);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync /* Currently a NOP. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_ADVANCE_RIP();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_END();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync return VINF_SUCCESS;
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync}
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x0e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_femms);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x0c. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pi2fw_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x0d. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pi2fd_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x1c. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pf2fw_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x1d. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pf2fd_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x8a. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfnacc_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x8e. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfpnacc_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x90. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfcmpge_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x94. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfmin_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x96. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfrcp_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x97. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfrsqrt_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x9a. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfsub_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0x9e. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfadd_PQ_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xa0. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfcmpgt_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xa4. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfmax_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xa6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfrcpit1_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xa7. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfrsqit1_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xaa. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfsubr_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xae. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfacc_PQ_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xb0. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfcmpeq_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xb4. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfmul_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xb6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pfrcpit2_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xb7. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pmulhrw_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xbb. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pswapd_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x0f 0xbf. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB(iemOp_3Dnow_pavgusb_PQ_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x0f. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_DEF(iemOp_3Dnow)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync{
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->f3DNow)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync IEMOP_MNEMONIC("3Dnow");
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* This is pretty sparse, use switch instead of table. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (b)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x0c: return FNIEMOP_CALL(iemOp_3Dnow_pi2fw_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x0d: return FNIEMOP_CALL(iemOp_3Dnow_pi2fd_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x1c: return FNIEMOP_CALL(iemOp_3Dnow_pf2fw_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x1d: return FNIEMOP_CALL(iemOp_3Dnow_pf2fd_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x8a: return FNIEMOP_CALL(iemOp_3Dnow_pfnacc_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x8e: return FNIEMOP_CALL(iemOp_3Dnow_pfpnacc_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x90: return FNIEMOP_CALL(iemOp_3Dnow_pfcmpge_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x94: return FNIEMOP_CALL(iemOp_3Dnow_pfmin_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x96: return FNIEMOP_CALL(iemOp_3Dnow_pfrcp_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x97: return FNIEMOP_CALL(iemOp_3Dnow_pfrsqrt_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x9a: return FNIEMOP_CALL(iemOp_3Dnow_pfsub_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0x9e: return FNIEMOP_CALL(iemOp_3Dnow_pfadd_PQ_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xa0: return FNIEMOP_CALL(iemOp_3Dnow_pfcmpgt_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xa4: return FNIEMOP_CALL(iemOp_3Dnow_pfmax_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xa6: return FNIEMOP_CALL(iemOp_3Dnow_pfrcpit1_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xa7: return FNIEMOP_CALL(iemOp_3Dnow_pfrsqit1_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xaa: return FNIEMOP_CALL(iemOp_3Dnow_pfsubr_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xae: return FNIEMOP_CALL(iemOp_3Dnow_pfacc_PQ_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xb0: return FNIEMOP_CALL(iemOp_3Dnow_pfcmpeq_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xb4: return FNIEMOP_CALL(iemOp_3Dnow_pfmul_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xb6: return FNIEMOP_CALL(iemOp_3Dnow_pfrcpit2_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xb7: return FNIEMOP_CALL(iemOp_3Dnow_pmulhrw_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xbb: return FNIEMOP_CALL(iemOp_3Dnow_pswapd_Pq_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0xbf: return FNIEMOP_CALL(iemOp_3Dnow_pavgusb_PQ_Qq);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync}
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x10. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_movups_Vps_Wps__movupd_Vpd_Wpd__movss_Vss_Wss__movsd_Vsd_Wsd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x11. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_movups_Wps_Vps__movupd_Wpd_Vpd__movss_Wss_Vss__movsd_Vsd_Wsd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x12. */
d11f52e82b90c0601e191193ef1fa2449b68ce32vboxsyncFNIEMOP_STUB(iemOp_movlps_Vq_Mq__movhlps_Vq_Uq__movlpd_Vq_Mq__movsldup_Vq_Wq__movddup_Vq_Wq); //NEXT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x13. */
d11f52e82b90c0601e191193ef1fa2449b68ce32vboxsyncFNIEMOP_STUB(iemOp_movlps_Mq_Vq__movlpd_Mq_Vq); //NEXT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x14. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_unpckhlps_Vps_Wq__unpcklpd_Vpd_Wq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x15. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_unpckhps_Vps_Wq__unpckhpd_Vpd_Wq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x16. */
d11f52e82b90c0601e191193ef1fa2449b68ce32vboxsyncFNIEMOP_STUB(iemOp_movhps_Vq_Mq__movlhps_Vq_Uq__movhpd_Vq_Mq__movshdup_Vq_Wq); //NEXT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x17. */
d11f52e82b90c0601e191193ef1fa2449b68ce32vboxsyncFNIEMOP_STUB(iemOp_movhps_Mq_Vq__movhpd_Mq_Vq); //NEXT
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x18. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsyncFNIEMOP_DEF(iemOp_prefetch_Grp16)
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync{
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync {
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync {
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 4: /* Aliased to /0 for the time being according to AMD. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 5: /* Aliased to /0 for the time being according to AMD. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 6: /* Aliased to /0 for the time being according to AMD. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 7: /* Aliased to /0 for the time being according to AMD. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 0: IEMOP_MNEMONIC("prefetchNTA m8"); break;
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 1: IEMOP_MNEMONIC("prefetchT0 m8"); break;
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 2: IEMOP_MNEMONIC("prefetchT1 m8"); break;
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync case 3: IEMOP_MNEMONIC("prefetchT2 m8"); break;
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync }
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_BEGIN(0, 1);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync /* Currently a NOP. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_ADVANCE_RIP();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_END();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync return VINF_SUCCESS;
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync }
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync return IEMOP_RAISE_INVALID_OPCODE();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync}
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync/** Opcode 0x0f 0x19..0x1f. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsyncFNIEMOP_DEF(iemOp_nop_Ev)
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync{
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync {
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_BEGIN(0, 0);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_ADVANCE_RIP();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_END();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync }
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync else
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync {
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_BEGIN(0, 1);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync /* Currently a NOP. */
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_ADVANCE_RIP();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync IEM_MC_END();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync }
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync return VINF_SUCCESS;
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x20. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Rd_Cd)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* mod is ignored, as is operand size overrides. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Rd,Cd");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_64BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_32BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint8_t iCrReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMovCr8In32Bit)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return IEMOP_RAISE_INVALID_OPCODE(); /* #UD takes precedence over #GP(), see test. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iCrReg |= 8;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (iCrReg)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: case 2: case 3: case 4: case 8:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync default:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync IEMOP_HLP_DONE_DECODING();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Rd_Cd, (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB, iCrReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x21. */
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsyncFNIEMOP_DEF(iemOp_mov_Rd_Dd)
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync{
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync IEMOP_MNEMONIC("mov Rd,Dd");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REX_R)
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEMOP_RAISE_INVALID_OPCODE();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Rd_Dd,
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB,
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK));
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x22. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Cd_Rd)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* mod is ignored, as is operand size overrides. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Cd,Rd");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_64BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_32BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint8_t iCrReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMovCr8In32Bit)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return IEMOP_RAISE_INVALID_OPCODE(); /* #UD takes precedence over #GP(), see test. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iCrReg |= 8;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (iCrReg)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: case 2: case 3: case 4: case 8:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync default:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync IEMOP_HLP_DONE_DECODING();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Cd_Rd, iCrReg, (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x23. */
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsyncFNIEMOP_DEF(iemOp_mov_Dd_Rd)
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync{
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync IEMOP_MNEMONIC("mov Dd,Rd");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REX_R)
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEMOP_RAISE_INVALID_OPCODE();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Dd_Rd,
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK),
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB);
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync}
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x24. */
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsyncFNIEMOP_DEF(iemOp_mov_Rd_Td)
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync{
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync IEMOP_MNEMONIC("mov Rd,Td");
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync /* The RM byte is not considered, see testcase. */
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEMOP_RAISE_INVALID_OPCODE();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync}
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x26. */
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsyncFNIEMOP_DEF(iemOp_mov_Td_Rd)
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync{
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync IEMOP_MNEMONIC("mov Td,Rd");
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync /* The RM byte is not considered, see testcase. */
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEMOP_RAISE_INVALID_OPCODE();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync}
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x28. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x29. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x2a. */
dd1df622e4ff31fe53231fc93ef0d4d38dfa3204vboxsyncFNIEMOP_STUB(iemOp_cvtpi2ps_Vps_Qpi__cvtpi2pd_Vpd_Qpi__cvtsi2ss_Vss_Ey__cvtsi2sd_Vsd_Ey); //NEXT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x2b. */
07af2710544be54d6d50a952fd3f1e19b8fe59a8vboxsyncFNIEMOP_STUB(iemOp_movntps_Mps_Vps__movntpd_Mpd_Vpd); //NEXT:XP
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x2c. */
dd1df622e4ff31fe53231fc93ef0d4d38dfa3204vboxsyncFNIEMOP_STUB(iemOp_cvttps2pi_Ppi_Wps__cvttpd2pi_Ppi_Wpd__cvttss2si_Gy_Wss__cvttsd2si_Yu_Wsd); //NEXT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x2d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_cvtps2pi_Ppi_Wps__cvtpd2pi_QpiWpd__cvtss2si_Gy_Wss__cvtsd2si_Gy_Wsd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x2e. */
dd1df622e4ff31fe53231fc93ef0d4d38dfa3204vboxsyncFNIEMOP_STUB(iemOp_ucomiss_Vss_Wss__ucomisd_Vsd_Wsd); //NEXT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x2f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_comiss_Vss_Wss__comisd_Vsd_Wsd);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x30. */
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsyncFNIEMOP_DEF(iemOp_wrmsr)
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync{
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEMOP_MNEMONIC("wrmsr");
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_wrmsr);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync}
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x31. */
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsyncFNIEMOP_DEF(iemOp_rdtsc)
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync{
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync IEMOP_MNEMONIC("rdtsc");
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rdtsc);
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync}
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x33. */
b7640e1373d7f1eeaf6e0efd5ec8690432048342vboxsyncFNIEMOP_DEF(iemOp_rdmsr)
b7640e1373d7f1eeaf6e0efd5ec8690432048342vboxsync{
b7640e1373d7f1eeaf6e0efd5ec8690432048342vboxsync IEMOP_MNEMONIC("rdmsr");
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
b7640e1373d7f1eeaf6e0efd5ec8690432048342vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rdmsr);
b7640e1373d7f1eeaf6e0efd5ec8690432048342vboxsync}
b7640e1373d7f1eeaf6e0efd5ec8690432048342vboxsync
b7640e1373d7f1eeaf6e0efd5ec8690432048342vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x34. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_rdpmc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x34. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_sysenter);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x35. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_sysexit);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x37. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_getsec);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x38. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_3byte_Esc_A4); /* Here there be dragons... */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x3a. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_3byte_Esc_A5); /* Here there be dragons... */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x3c (?). */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_movnti_Gv_Ev);
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync/**
a13bd47f22085c82960265c150f10f2195369630vboxsync * Implements a conditional move.
a13bd47f22085c82960265c150f10f2195369630vboxsync *
a13bd47f22085c82960265c150f10f2195369630vboxsync * Wish there was an obvious way to do this where we could share and reduce
a13bd47f22085c82960265c150f10f2195369630vboxsync * code bloat.
a13bd47f22085c82960265c150f10f2195369630vboxsync *
a13bd47f22085c82960265c150f10f2195369630vboxsync * @param a_Cnd The conditional "microcode" operation.
a13bd47f22085c82960265c150f10f2195369630vboxsync */
a13bd47f22085c82960265c150f10f2195369630vboxsync#define CMOV_X(a_Cnd) \
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
a13bd47f22085c82960265c150f10f2195369630vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) \
a13bd47f22085c82960265c150f10f2195369630vboxsync { \
a13bd47f22085c82960265c150f10f2195369630vboxsync switch (pIemCpu->enmEffOpSize) \
a13bd47f22085c82960265c150f10f2195369630vboxsync { \
a13bd47f22085c82960265c150f10f2195369630vboxsync case IEMMODE_16BIT: \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_BEGIN(0, 1); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp); \
a13bd47f22085c82960265c150f10f2195369630vboxsync a_Cnd { \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } IEM_MC_ENDIF(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ADVANCE_RIP(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_END(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync return VINF_SUCCESS; \
a13bd47f22085c82960265c150f10f2195369630vboxsync \
a13bd47f22085c82960265c150f10f2195369630vboxsync case IEMMODE_32BIT: \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_BEGIN(0, 1); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp); \
a13bd47f22085c82960265c150f10f2195369630vboxsync a_Cnd { \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } IEM_MC_ELSE() { \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_CLEAR_HIGH_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } IEM_MC_ENDIF(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ADVANCE_RIP(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_END(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync return VINF_SUCCESS; \
a13bd47f22085c82960265c150f10f2195369630vboxsync \
a13bd47f22085c82960265c150f10f2195369630vboxsync case IEMMODE_64BIT: \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_BEGIN(0, 1); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp); \
a13bd47f22085c82960265c150f10f2195369630vboxsync a_Cnd { \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } IEM_MC_ENDIF(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ADVANCE_RIP(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_END(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync return VINF_SUCCESS; \
a13bd47f22085c82960265c150f10f2195369630vboxsync \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } \
a13bd47f22085c82960265c150f10f2195369630vboxsync } \
a13bd47f22085c82960265c150f10f2195369630vboxsync else \
a13bd47f22085c82960265c150f10f2195369630vboxsync { \
a13bd47f22085c82960265c150f10f2195369630vboxsync switch (pIemCpu->enmEffOpSize) \
a13bd47f22085c82960265c150f10f2195369630vboxsync { \
a13bd47f22085c82960265c150f10f2195369630vboxsync case IEMMODE_16BIT: \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_BEGIN(0, 2); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp); \
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrEffSrc); \
a13bd47f22085c82960265c150f10f2195369630vboxsync a_Cnd { \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } IEM_MC_ENDIF(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ADVANCE_RIP(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_END(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync return VINF_SUCCESS; \
a13bd47f22085c82960265c150f10f2195369630vboxsync \
a13bd47f22085c82960265c150f10f2195369630vboxsync case IEMMODE_32BIT: \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_BEGIN(0, 2); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp); \
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffSrc); \
a13bd47f22085c82960265c150f10f2195369630vboxsync a_Cnd { \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } IEM_MC_ELSE() { \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_CLEAR_HIGH_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } IEM_MC_ENDIF(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ADVANCE_RIP(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_END(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync return VINF_SUCCESS; \
a13bd47f22085c82960265c150f10f2195369630vboxsync \
a13bd47f22085c82960265c150f10f2195369630vboxsync case IEMMODE_64BIT: \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_BEGIN(0, 2); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp); \
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffSrc); \
a13bd47f22085c82960265c150f10f2195369630vboxsync a_Cnd { \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } IEM_MC_ENDIF(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ADVANCE_RIP(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_END(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync return VINF_SUCCESS; \
a13bd47f22085c82960265c150f10f2195369630vboxsync \
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
a13bd47f22085c82960265c150f10f2195369630vboxsync } \
a13bd47f22085c82960265c150f10f2195369630vboxsync } do {} while (0)
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x40. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovo_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovo Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x41. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovno_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovno Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_OF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x42. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovc_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovc Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x43. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovnc_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovnc Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_CF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x44. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmove_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmove Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x45. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovne_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovne Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_ZF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x46. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovbe_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovbe Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x47. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovnbe_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovnbe Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_NO_BITS_SET(X86_EFL_CF | X86_EFL_ZF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x48. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovs_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovs Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x49. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovns_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovns Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_SF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x4a. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovp_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovp Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x4b. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovnp_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovnp Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_PF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x4c. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovl_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovl Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x4d. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovnl_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovnl Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BITS_EQ(X86_EFL_SF, X86_EFL_OF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x4e. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovle_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovle Gv,Ev");
a13bd47f22085c82960265c150f10f2195369630vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x4f. */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF(iemOp_cmovnle_Gv_Ev)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
a13bd47f22085c82960265c150f10f2195369630vboxsync IEMOP_MNEMONIC("cmovnle Gv,Ev");
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync CMOV_X(IEM_MC_IF_EFL_BIT_NOT_SET_AND_BITS_EQ(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF));
a13bd47f22085c82960265c150f10f2195369630vboxsync}
a13bd47f22085c82960265c150f10f2195369630vboxsync
a13bd47f22085c82960265c150f10f2195369630vboxsync#undef CMOV_X
a13bd47f22085c82960265c150f10f2195369630vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x50. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_movmskps_Gy_Ups__movmskpd_Gy_Upd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x51. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_sqrtps_Wps_Vps__sqrtpd_Wpd_Vpd__sqrtss_Vss_Wss__sqrtsd_Vsd_Wsd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x52. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_rsqrtps_Wps_Vps__rsqrtss_Vss_Wss);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x53. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_rcpps_Wps_Vps__rcpss_Vs_Wss);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x54. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_andps_Vps_Wps__andpd_Wpd_Vpd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x55. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_andnps_Vps_Wps__andnpd_Wpd_Vpd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x56. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_orps_Wpd_Vpd__orpd_Wpd_Vpd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x57. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_xorps_Vps_Wps__xorpd_Wpd_Vpd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x58. */
dd1df622e4ff31fe53231fc93ef0d4d38dfa3204vboxsyncFNIEMOP_STUB(iemOp_addps_Vps_Wps__addpd_Vpd_Wpd__addss_Vss_Wss__addsd_Vsd_Wsd); //NEXT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x59. */
dd1df622e4ff31fe53231fc93ef0d4d38dfa3204vboxsyncFNIEMOP_STUB(iemOp_mulps_Vps_Wps__mulpd_Vpd_Wpd__mulss_Vss__Wss__mulsd_Vsd_Wsd);//NEXT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x5a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_cvtps2pd_Vpd_Wps__cvtpd2ps_Vps_Wpd__cvtss2sd_Vsd_Wss__cvtsd2ss_Vss_Wsd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x5b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_cvtdq2ps_Vps_Wdq__cvtps2dq_Vdq_Wps__cvtps2dq_Vdq_Wps);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x5c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_subps_Vps_Wps__subpd_Vps_Wdp__subss_Vss_Wss__subsd_Vsd_Wsd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x5d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_minps_Vps_Wps__minpd_Vpd_Wpd__minss_Vss_Wss__minsd_Vsd_Wsd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x5e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_divps_Vps_Wps__divpd_Vpd_Wpd__divss_Vss_Wss__divsd_Vsd_Wsd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x5f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_maxps_Vps_Wps__maxpd_Vpd_Wpd__maxss_Vss_Wss__maxsd_Vsd_Wsd);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync/**
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Common worker for SSE2 and MMX instructions on the forms:
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * pxxxx xmm1, xmm2/mem128
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * pxxxx mm1, mm2/mem32
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync *
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * The 2nd operand is the first half of a register, which in the memory case
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * means a 32-bit memory access for MMX and 128-bit aligned 64-bit or 128-bit
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * memory accessed for MMX.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync *
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Exceptions type 4.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF_1(iemOpCommonMmxSse_LowLow_To_Full, PCIEMOPMEDIAF1L1, pImpl)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync case IEM_OP_PRF_SIZE_OP: /* SSE */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /*
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Register, register.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_BEGIN(2, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint128_t *, pDst, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint64_t const *, pSrc, 1);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_XREG_U64_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ADVANCE_RIP();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_END();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync else
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /*
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Register, memory.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_BEGIN(2, 2);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint128_t *, pDst, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_LOCAL(uint64_t, uSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG_LOCAL_REF(uint64_t const *, pSrc, uSrc, 1);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_FETCH_MEM_U64_ALIGN_U128(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ADVANCE_RIP();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_END();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return VINF_SUCCESS;
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync case 0: /* MMX */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync if (!pImpl->pfnU64)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return IEMOP_RAISE_INVALID_OPCODE();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /*
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Register, register.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_BEGIN(2, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint32_t const *, pSrc, 1);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_MREG_U32_CONST(pSrc, bRm & X86_MODRM_RM_MASK);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ADVANCE_RIP();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_END();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync else
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /*
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Register, memory.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_BEGIN(2, 2);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_LOCAL(uint32_t, uSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG_LOCAL_REF(uint32_t const *, pSrc, uSrc, 1);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_FETCH_MEM_U32(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ADVANCE_RIP();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_END();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return VINF_SUCCESS;
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync default:
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return IEMOP_RAISE_INVALID_OPCODE();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x60. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF(iemOp_punpcklbw_Pq_Qd__punpcklbw_Vdq_Wdq)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_MNEMONIC("punpcklbw");
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse_LowLow_To_Full, &g_iemAImpl_punpcklbw);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x61. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF(iemOp_punpcklwd_Pq_Qd__punpcklwd_Vdq_Wdq)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEMOP_MNEMONIC("punpcklwd"); /** @todo AMD mark the MMX version as 3DNow!. Intel says MMX CPUID req. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse_LowLow_To_Full, &g_iemAImpl_punpcklwd);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x62. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF(iemOp_punpckldq_Pq_Qd__punpckldq_Vdq_Wdq)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_MNEMONIC("punpckldq");
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse_LowLow_To_Full, &g_iemAImpl_punpckldq);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x63. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_packsswb_Pq_Qq__packsswb_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x64. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pcmpgtb_Pq_Qq__pcmpgtb_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x65. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pcmpgtw_Pq_Qq__pcmpgtw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x66. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pcmpgtd_Pq_Qq__pcmpgtd_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x67. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_packuswb_Pq_Qq__packuswb_Vdq_Wdq);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync/**
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Common worker for SSE2 and MMX instructions on the forms:
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * pxxxx xmm1, xmm2/mem128
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * pxxxx mm1, mm2/mem64
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync *
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * The 2nd operand is the second half of a register, which in the memory case
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * means a 64-bit memory access for MMX, and for MMX a 128-bit aligned access
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * where it may read the full 128 bits or only the upper 64 bits.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync *
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Exceptions type 4.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF_1(iemOpCommonMmxSse_HighHigh_To_Full, PCIEMOPMEDIAF1H1, pImpl)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync case IEM_OP_PRF_SIZE_OP: /* SSE */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /*
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Register, register.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_BEGIN(2, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint128_t *, pDst, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint128_t const *, pSrc, 1);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ADVANCE_RIP();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_END();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync else
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /*
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Register, memory.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_BEGIN(2, 2);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint128_t *, pDst, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_LOCAL(uint128_t, uSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG_LOCAL_REF(uint128_t const *, pSrc, uSrc, 1);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc); /* Most CPUs probably only right high qword */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ADVANCE_RIP();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_END();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return VINF_SUCCESS;
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync case 0: /* MMX */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync if (!pImpl->pfnU64)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return IEMOP_RAISE_INVALID_OPCODE();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /*
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Register, register.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_BEGIN(2, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint64_t const *, pSrc, 1);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ADVANCE_RIP();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_END();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync else
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync /*
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync * Register, memory.
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_BEGIN(2, 2);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_LOCAL(uint64_t, uSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ARG_LOCAL_REF(uint64_t const *, pSrc, uSrc, 1);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_FETCH_MEM_U64(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_ADVANCE_RIP();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_END();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return VINF_SUCCESS;
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync default:
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return IEMOP_RAISE_INVALID_OPCODE();
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync }
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x68. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF(iemOp_punpckhbw_Pq_Qq__punpckhbw_Vdq_Wdq)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_MNEMONIC("punpckhbw");
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse_HighHigh_To_Full, &g_iemAImpl_punpckhbw);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x69. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF(iemOp_punpckhwd_Pq_Qd__punpckhwd_Vdq_Wdq)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_MNEMONIC("punpckhwd");
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse_HighHigh_To_Full, &g_iemAImpl_punpckhwd);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x6a. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF(iemOp_punpckhdq_Pq_Qd__punpckhdq_Vdq_Wdq)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_MNEMONIC("punpckhdq");
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse_HighHigh_To_Full, &g_iemAImpl_punpckhdq);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x6b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_packssdw_Pq_Qd__packssdq_Vdq_Wdq);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x6c. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF(iemOp_punpcklqdq_Vdq_Wdq)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_MNEMONIC("punpcklqdq");
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse_LowLow_To_Full, &g_iemAImpl_punpcklqdq);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x6d. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF(iemOp_punpckhqdq_Vdq_Wdq)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_MNEMONIC("punpckhqdq");
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse_HighHigh_To_Full, &g_iemAImpl_punpckhqdq);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x6e. */
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsyncFNIEMOP_DEF(iemOp_movd_q_Pd_Ey__movd_q_Vy_Ey)
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync {
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync case IEM_OP_PRF_SIZE_OP: /* SSE */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_MNEMONIC("movd/q Wd/q,Ed/q");
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync /* XMM, greg*/
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_BEGIN(0, 1);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_XREG_U32_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_ADVANCE_RIP();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_END();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync }
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync else
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync /* XMM, [mem] */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_BEGIN(0, 2);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_XREG_U32_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_ADVANCE_RIP();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_END();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync return VINF_SUCCESS;
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync case 0: /* MMX */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_MNEMONIC("movq/d Pd/q,Ed/q");
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync /* MMX, greg */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_BEGIN(0, 1);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_GREG_U32_ZX_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_ADVANCE_RIP();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_END();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync }
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync else
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync /* MMX, [mem] */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_BEGIN(0, 2);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_MREG_U32_ZX_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_ADVANCE_RIP();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_END();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync return VINF_SUCCESS;
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync default:
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync return IEMOP_RAISE_INVALID_OPCODE();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync}
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x6f. */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsyncFNIEMOP_DEF(iemOp_movq_Pq_Qq__movdqa_Vdq_Wdq__movdqu_Vdq_Wdq)
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync{
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync bool fAligned = false;
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync case IEM_OP_PRF_SIZE_OP: /* SSE aligned */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync fAligned = true;
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync case IEM_OP_PRF_REPZ: /* SSE unaligned */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync if (fAligned)
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_MNEMONIC("movdqa Vdq,Wdq");
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync else
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_MNEMONIC("movdqu Vdq,Wdq");
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /*
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync * Register, register.
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_BEGIN(0, 1);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(uint128_t, u128Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_FETCH_XREG_U128(u128Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u128Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_ADVANCE_RIP();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_END();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync else
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /*
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync * Register, memory.
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_BEGIN(0, 2);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(uint128_t, u128Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync if (fAligned)
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_FETCH_MEM_U128_ALIGN_SSE(u128Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync else
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_FETCH_MEM_U128(u128Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u128Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_ADVANCE_RIP();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_END();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync return VINF_SUCCESS;
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync case 0: /* MMX */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_MNEMONIC("movq Pq,Qq");
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /*
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync * Register, register.
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_BEGIN(0, 1);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_FETCH_MREG_U64(u64Tmp, bRm & X86_MODRM_RM_MASK);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u64Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_ADVANCE_RIP();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_END();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync else
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /*
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync * Register, memory.
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_BEGIN(0, 2);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u64Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_ADVANCE_RIP();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_END();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync return VINF_SUCCESS;
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync default:
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync return IEMOP_RAISE_INVALID_OPCODE();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync}
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync/** Opcode 0x0f 0x70. The immediate here is evil! */
3861ee0eadb3980263ba12134f6d6130f3d411davboxsyncFNIEMOP_DEF(iemOp_pshufw_Pq_Qq_Ib__pshufd_Vdq_Wdq_Ib__pshufhw_Vdq_Wdq_Ib__pshuflq_Vdq_Wdq_Ib)
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync{
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync {
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync case IEM_OP_PRF_SIZE_OP: /* SSE */
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync case IEM_OP_PRF_REPNZ: /* SSE */
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync case IEM_OP_PRF_REPZ: /* SSE */
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync {
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync PFNIEMAIMPLMEDIAPSHUF pfnAImpl;
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync {
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync case IEM_OP_PRF_SIZE_OP:
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEMOP_MNEMONIC("pshufd Vdq,Wdq,Ib");
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync pfnAImpl = iemAImpl_pshufd;
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync break;
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync case IEM_OP_PRF_REPNZ:
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEMOP_MNEMONIC("pshuflw Vdq,Wdq,Ib");
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync pfnAImpl = iemAImpl_pshuflw;
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync break;
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync case IEM_OP_PRF_REPZ:
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEMOP_MNEMONIC("pshufhw Vdq,Wdq,Ib");
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync pfnAImpl = iemAImpl_pshufhw;
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync break;
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync }
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync {
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync /*
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync * Register, register.
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync */
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_BEGIN(3, 0);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG(uint128_t *, pDst, 0);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG(uint128_t const *, pSrc, 1);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG_CONST(uint8_t, bEvilArg, /*=*/ bEvil, 2);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_CALL_SSE_AIMPL_3(pfnAImpl, pDst, pSrc, bEvilArg);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ADVANCE_RIP();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_END();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync }
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync else
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync {
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync /*
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync * Register, memory.
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync */
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_BEGIN(3, 2);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG(uint128_t *, pDst, 0);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_LOCAL(uint128_t, uSrc);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG_LOCAL_REF(uint128_t const *, pSrc, uSrc, 1);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG_CONST(uint8_t, bEvilArg, /*=*/ bEvil, 2);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_CALL_SSE_AIMPL_3(pfnAImpl, pDst, pSrc, bEvilArg);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ADVANCE_RIP();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_END();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync }
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync return VINF_SUCCESS;
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync }
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync case 0: /* MMX Extension */
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEMOP_MNEMONIC("pshufw Pq,Qq,Ib");
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync {
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync /*
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync * Register, register.
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync */
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_BEGIN(3, 0);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG(uint64_t const *, pSrc, 1);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG_CONST(uint8_t, bEvilArg, /*=*/ bEvil, 2);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_CALL_MMX_AIMPL_3(iemAImpl_pshufw, pDst, pSrc, bEvilArg);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ADVANCE_RIP();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_END();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync }
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync else
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync {
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync /*
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync * Register, memory.
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync */
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_BEGIN(3, 2);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_LOCAL(uint64_t, uSrc);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG_LOCAL_REF(uint64_t const *, pSrc, uSrc, 1);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ARG_CONST(uint8_t, bEvilArg, /*=*/ bEvil, 2);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_FETCH_MEM_U64(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_CALL_MMX_AIMPL_3(iemAImpl_pshufw, pDst, pSrc, bEvilArg);
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_ADVANCE_RIP();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync IEM_MC_END();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync }
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync return VINF_SUCCESS;
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync default:
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync return IEMOP_RAISE_INVALID_OPCODE();
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync }
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync}
3861ee0eadb3980263ba12134f6d6130f3d411davboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x71 11/2. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp12_psrlw_Nq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x71 11/2. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp12_psrlw_Udq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x71 11/4. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp12_psraw_Nq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x71 11/4. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp12_psraw_Udq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x71 11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp12_psllw_Nq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x71 11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp12_psllw_Udq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x71. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_DEF(iemOp_Grp12)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync{
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: case 1: case 3: case 5: case 7:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 2:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp12_psrlw_Nq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp12_psrlw_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 4:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp12_psraw_Nq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp12_psraw_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 6:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp12_psllw_Nq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp12_psllw_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync}
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x72 11/2. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp13_psrld_Nq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x72 11/2. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp13_psrld_Udq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x72 11/4. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp13_psrad_Nq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x72 11/4. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp13_psrad_Udq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x72 11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp13_pslld_Nq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x72 11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp13_pslld_Udq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x72. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_DEF(iemOp_Grp13)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync{
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: case 1: case 3: case 5: case 7:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 2:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp13_psrld_Nq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp13_psrld_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 4:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp13_psrad_Nq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp13_psrad_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 6:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp13_pslld_Nq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp13_pslld_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync}
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x73 11/2. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp14_psrlq_Nq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x73 11/2. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp14_psrlq_Udq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x73 11/3. */
d11f52e82b90c0601e191193ef1fa2449b68ce32vboxsyncFNIEMOP_STUB_1(iemOp_Grp14_psrldq_Udq_Ib, uint8_t, bRm); //NEXT
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0x73 11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp14_psllq_Nq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x73 11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_STUB_1(iemOp_Grp14_psllq_Udq_Ib, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0x73 11/7. */
d11f52e82b90c0601e191193ef1fa2449b68ce32vboxsyncFNIEMOP_STUB_1(iemOp_Grp14_pslldq_Udq_Ib, uint8_t, bRm); //NEXT
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x73. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_DEF(iemOp_Grp14)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync{
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: case 1: case 4: case 5:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 2:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp14_psrlq_Nq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp14_psrlq_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 3:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp14_psrldq_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 6:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp14_psllq_Nq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp14_psllq_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 7:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP: return FNIEMOP_CALL_1(iemOp_Grp14_pslldq_Udq_Ib, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default: return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync}
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync/**
2644c92b5d75e229016b31d4ed549550073a51acvboxsync * Common worker for SSE2 and MMX instructions on the forms:
2644c92b5d75e229016b31d4ed549550073a51acvboxsync * pxxx mm1, mm2/mem64
2644c92b5d75e229016b31d4ed549550073a51acvboxsync * pxxx xmm1, xmm2/mem128
2644c92b5d75e229016b31d4ed549550073a51acvboxsync *
2644c92b5d75e229016b31d4ed549550073a51acvboxsync * Proper alignment of the 128-bit operand is enforced.
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync * Exceptions type 4. SSE2 and MMX cpuid checks.
2644c92b5d75e229016b31d4ed549550073a51acvboxsync */
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsyncFNIEMOP_DEF_1(iemOpCommonMmxSse2_FullFull_To_Full, PCIEMOPMEDIAF2, pImpl)
2644c92b5d75e229016b31d4ed549550073a51acvboxsync{
2644c92b5d75e229016b31d4ed549550073a51acvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
2644c92b5d75e229016b31d4ed549550073a51acvboxsync {
2644c92b5d75e229016b31d4ed549550073a51acvboxsync case IEM_OP_PRF_SIZE_OP: /* SSE */
2644c92b5d75e229016b31d4ed549550073a51acvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
2644c92b5d75e229016b31d4ed549550073a51acvboxsync {
2644c92b5d75e229016b31d4ed549550073a51acvboxsync /*
2644c92b5d75e229016b31d4ed549550073a51acvboxsync * Register, register.
2644c92b5d75e229016b31d4ed549550073a51acvboxsync */
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_BEGIN(2, 0);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ARG(uint128_t *, pDst, 0);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ARG(uint128_t const *, pSrc, 1);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ADVANCE_RIP();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_END();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync }
2644c92b5d75e229016b31d4ed549550073a51acvboxsync else
2644c92b5d75e229016b31d4ed549550073a51acvboxsync {
2644c92b5d75e229016b31d4ed549550073a51acvboxsync /*
2644c92b5d75e229016b31d4ed549550073a51acvboxsync * Register, memory.
2644c92b5d75e229016b31d4ed549550073a51acvboxsync */
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_BEGIN(2, 2);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ARG(uint128_t *, pDst, 0);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_LOCAL(uint128_t, uSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ARG_LOCAL_REF(uint128_t const *, pSrc, uSrc, 1);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ADVANCE_RIP();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_END();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync }
2644c92b5d75e229016b31d4ed549550073a51acvboxsync return VINF_SUCCESS;
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync case 0: /* MMX */
2644c92b5d75e229016b31d4ed549550073a51acvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
2644c92b5d75e229016b31d4ed549550073a51acvboxsync {
2644c92b5d75e229016b31d4ed549550073a51acvboxsync /*
2644c92b5d75e229016b31d4ed549550073a51acvboxsync * Register, register.
2644c92b5d75e229016b31d4ed549550073a51acvboxsync */
2644c92b5d75e229016b31d4ed549550073a51acvboxsync /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */
2644c92b5d75e229016b31d4ed549550073a51acvboxsync /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_BEGIN(2, 0);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ARG(uint64_t const *, pSrc, 1);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ADVANCE_RIP();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_END();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync }
2644c92b5d75e229016b31d4ed549550073a51acvboxsync else
2644c92b5d75e229016b31d4ed549550073a51acvboxsync {
2644c92b5d75e229016b31d4ed549550073a51acvboxsync /*
2644c92b5d75e229016b31d4ed549550073a51acvboxsync * Register, memory.
2644c92b5d75e229016b31d4ed549550073a51acvboxsync */
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_BEGIN(2, 2);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_LOCAL(uint64_t, uSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ARG_LOCAL_REF(uint64_t const *, pSrc, uSrc, 1);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_FETCH_MEM_U64(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_ADVANCE_RIP();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_END();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync }
2644c92b5d75e229016b31d4ed549550073a51acvboxsync return VINF_SUCCESS;
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync default:
2644c92b5d75e229016b31d4ed549550073a51acvboxsync return IEMOP_RAISE_INVALID_OPCODE();
2644c92b5d75e229016b31d4ed549550073a51acvboxsync }
2644c92b5d75e229016b31d4ed549550073a51acvboxsync}
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x74. */
2644c92b5d75e229016b31d4ed549550073a51acvboxsyncFNIEMOP_DEF(iemOp_pcmpeqb_Pq_Qq__pcmpeqb_Vdq_Wdq)
2644c92b5d75e229016b31d4ed549550073a51acvboxsync{
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEMOP_MNEMONIC("pcmpeqb");
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse2_FullFull_To_Full, &g_iemAImpl_pcmpeqb);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync}
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x75. */
2644c92b5d75e229016b31d4ed549550073a51acvboxsyncFNIEMOP_DEF(iemOp_pcmpeqw_Pq_Qq__pcmpeqw_Vdq_Wdq)
2644c92b5d75e229016b31d4ed549550073a51acvboxsync{
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEMOP_MNEMONIC("pcmpeqw");
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse2_FullFull_To_Full, &g_iemAImpl_pcmpeqw);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync}
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x76. */
2644c92b5d75e229016b31d4ed549550073a51acvboxsyncFNIEMOP_DEF(iemOp_pcmped_Pq_Qq__pcmpeqd_Vdq_Wdq)
2644c92b5d75e229016b31d4ed549550073a51acvboxsync{
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEMOP_MNEMONIC("pcmpeqd");
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse2_FullFull_To_Full, &g_iemAImpl_pcmpeqd);
2644c92b5d75e229016b31d4ed549550073a51acvboxsync}
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
2644c92b5d75e229016b31d4ed549550073a51acvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x77. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_emms);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x78. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_vmread_AmdGrp17);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x79. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB(iemOp_vmwrite);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x7c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_haddpd_Vdp_Wpd__haddps_Vps_Wps);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x7d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_hsubpd_Vpd_Wpd__hsubps_Vps_Wps);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x7e. */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsyncFNIEMOP_DEF(iemOp_movd_q_Ey_Pd__movd_q_Ey_Vy__movq_Vq_Wq)
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync{
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync case IEM_OP_PRF_SIZE_OP: /* SSE */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_MNEMONIC("movd/q Ed/q,Wd/q");
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync /* greg, XMM */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_BEGIN(0, 1);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_XREG_U64(u64Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_XREG_U32(u32Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_ADVANCE_RIP();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_END();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync /* [mem], XMM */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_BEGIN(0, 2);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_XREG_U64(u64Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffSrc, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_XREG_U32(u32Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrEffSrc, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_ADVANCE_RIP();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_END();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync return VINF_SUCCESS;
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync case 0: /* MMX */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_MNEMONIC("movq/d Ed/q,Pd/q");
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync /* greg, MMX */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_BEGIN(0, 1);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_MREG_U64(u64Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_MREG_U32(u32Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_ADVANCE_RIP();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_END();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync /* [mem], MMX */
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_BEGIN(0, 2);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_MREG_U64(u64Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffSrc, u64Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync else
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync {
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_FETCH_MREG_U32(u32Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrEffSrc, u32Tmp);
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_ADVANCE_RIP();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync IEM_MC_END();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync return VINF_SUCCESS;
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync default:
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync return IEMOP_RAISE_INVALID_OPCODE();
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync }
77167ce20ab608cb649671f93c8238ee90fa7066vboxsync}
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x7f. */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsyncFNIEMOP_DEF(iemOp_movq_Qq_Pq__movq_movdqa_Wdq_Vdq__movdqu_Wdq_Vdq)
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync{
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync bool fAligned = false;
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync case IEM_OP_PRF_SIZE_OP: /* SSE aligned */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync fAligned = true;
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync case IEM_OP_PRF_REPZ: /* SSE unaligned */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync if (fAligned)
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_MNEMONIC("movdqa Wdq,Vdq");
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync else
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_MNEMONIC("movdqu Wdq,Vdq");
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /*
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync * Register, register.
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_BEGIN(0, 1);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(uint128_t, u128Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_FETCH_XREG_U128(u128Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_STORE_XREG_U128((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u128Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_ADVANCE_RIP();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_END();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync else
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /*
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync * Register, memory.
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_BEGIN(0, 2);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(uint128_t, u128Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_FETCH_XREG_U128(u128Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync if (fAligned)
2644c92b5d75e229016b31d4ed549550073a51acvboxsync IEM_MC_STORE_MEM_U128_ALIGN_SSE(pIemCpu->iEffSeg, GCPtrEffSrc, u128Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync else
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_STORE_MEM_U128(pIemCpu->iEffSeg, GCPtrEffSrc, u128Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_ADVANCE_RIP();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_END();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync return VINF_SUCCESS;
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync case 0: /* MMX */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_MNEMONIC("movq Qq,Pq");
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /*
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync * Register, register.
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_BEGIN(0, 1);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_FETCH_MREG_U64(u64Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_STORE_MREG_U64(bRm & X86_MODRM_RM_MASK, u64Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_ADVANCE_RIP();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_END();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync else
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync {
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync /*
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync * Register, memory.
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync */
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_BEGIN(0, 2);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_FETCH_MREG_U64(u64Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffSrc, u64Tmp);
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_ADVANCE_RIP();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync IEM_MC_END();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync return VINF_SUCCESS;
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync default:
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync return IEMOP_RAISE_INVALID_OPCODE();
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync }
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync}
03db7c02ab1e6f8c499b6b304c72cead82d39042vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x80. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jo_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jo Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x81. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jno_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jno Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x82. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jc_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jc/jb/jnae Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x83. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnc_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jnc/jnb/jae Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x84. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_je_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("je/jz Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x85. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jne_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jne/jnz Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x86. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jbe_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jbe/jna Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x87. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnbe_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jnbe/ja Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x88. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_js_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("js Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x89. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jns_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jns Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x8a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jp_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jp Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x8b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnp_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jo Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x8c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jl_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jl/jnge Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x8d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnl_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jnl/jge Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x8e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jle_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jle/jng Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x8f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnle_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jnle/jg Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x90. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_seto_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("seto Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x91. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setno_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setno Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x92. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setc_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setc Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x93. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setnc_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setnc Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x94. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_sete_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("sete Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x95. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setne_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setne Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x96. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setbe_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setbe Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x97. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setnbe_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setnbe Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x98. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_sets_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("sets Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x99. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setns_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setns Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x9a. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setp_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setnp Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x9b. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setnp_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setnp Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x9c. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setl_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setl Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x9d. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setnl_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setnl Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x9e. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setle_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setle Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0x9f. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_setnle_Eb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("setnle Eb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /** @todo Encoding test: Check if the 'reg' field is ignored or decoded in
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * any way. AMD says it's "unused", whatever that means. We're
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * ignoring for now. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* register target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync else
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /* memory target */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(0, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() {
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync/**
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync * Common 'push segment-register' helper.
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync */
064e87232010cd1a6a7e554428a5ba8053e96612vboxsyncFNIEMOP_DEF_1(iemOpCommonPushSReg, uint8_t, iReg)
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync{
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync if (iReg < X86_SREG_FS)
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEMOP_HLP_NO_64BIT();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync switch (pIemCpu->enmEffOpSize)
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync {
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync case IEMMODE_16BIT:
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_BEGIN(0, 1);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_FETCH_SREG_U16(u16Value, iReg);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_PUSH_U16(u16Value);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_ADVANCE_RIP();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_END();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync break;
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync case IEMMODE_32BIT:
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_BEGIN(0, 1);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_LOCAL(uint32_t, u32Value);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_FETCH_SREG_ZX_U32(u32Value, iReg);
27d3663c744b4b04c94056ab332e4d22d4ecdb95vboxsync IEM_MC_PUSH_U32_SREG(u32Value);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_ADVANCE_RIP();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_END();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync break;
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync case IEMMODE_64BIT:
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_BEGIN(0, 1);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_LOCAL(uint64_t, u64Value);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_FETCH_SREG_ZX_U64(u64Value, iReg);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_PUSH_U64(u64Value);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_ADVANCE_RIP();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEM_MC_END();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync break;
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync }
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync return VINF_SUCCESS;
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync}
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xa0. */
064e87232010cd1a6a7e554428a5ba8053e96612vboxsyncFNIEMOP_DEF(iemOp_push_fs)
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync{
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync IEMOP_MNEMONIC("push fs");
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_FS);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync}
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xa1. */
064e87232010cd1a6a7e554428a5ba8053e96612vboxsyncFNIEMOP_DEF(iemOp_pop_fs)
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync{
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync IEMOP_MNEMONIC("pop fs");
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_FS, pIemCpu->enmEffOpSize);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync}
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xa2. */
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsyncFNIEMOP_DEF(iemOp_cpuid)
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync{
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync IEMOP_MNEMONIC("cpuid");
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_cpuid);
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync}
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync/**
b64efece437bfca8872b81be9d0568ba90389d91vboxsync * Common worker for iemOp_bt_Ev_Gv, iemOp_btc_Ev_Gv, iemOp_btr_Ev_Gv and
b64efece437bfca8872b81be9d0568ba90389d91vboxsync * iemOp_bts_Ev_Gv.
b64efece437bfca8872b81be9d0568ba90389d91vboxsync */
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncFNIEMOP_DEF_1(iemOpCommonBit_Ev_Gv, PCIEMOPBINSIZES, pImpl)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync /* register destination. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync switch (pIemCpu->enmEffOpSize)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_16BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_AND_LOCAL_U16(u16Src, 0xf);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_EFLAGS(pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_32BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_AND_LOCAL_U32(u32Src, 0x1f);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_EFLAGS(pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_64BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_AND_LOCAL_U64(u64Src, 0x3f);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_EFLAGS(pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync /* memory destination. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync uint32_t fAccess;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if (pImpl->pfnLockedU16)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync fAccess = IEM_ACCESS_DATA_RW;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else /* BT */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync fAccess = IEM_ACCESS_DATA_R;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b022a7f716a3f871266149b7580a7b017da54d9dvboxsync NOREF(fAccess);
b022a7f716a3f871266149b7580a7b017da54d9dvboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync /** @todo test negative bit offsets! */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync switch (pIemCpu->enmEffOpSize)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_16BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_LOCAL(int16_t, i16AddrAdj);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ASSIGN(i16AddrAdj, u16Src);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_AND_ARG_U16(u16Src, 0x0f);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_SAR_LOCAL_S16(i16AddrAdj, 4);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_SAR_LOCAL_S16(i16AddrAdj, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADD_LOCAL_S16_TO_EFF_ADDR(GCPtrEffDst, i16AddrAdj);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU16, pu16Dst, u16Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_32BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_LOCAL(int32_t, i32AddrAdj);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ASSIGN(i32AddrAdj, u32Src);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_AND_ARG_U32(u32Src, 0x1f);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_SAR_LOCAL_S32(i32AddrAdj, 5);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_SHL_LOCAL_S32(i32AddrAdj, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADD_LOCAL_S32_TO_EFF_ADDR(GCPtrEffDst, i32AddrAdj);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU32, pu32Dst, u32Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_64BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_LOCAL(int64_t, i64AddrAdj);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ASSIGN(i64AddrAdj, u64Src);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_AND_ARG_U64(u64Src, 0x3f);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_SAR_LOCAL_S64(i64AddrAdj, 6);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_SHL_LOCAL_S64(i64AddrAdj, 3);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADD_LOCAL_S64_TO_EFF_ADDR(GCPtrEffDst, i64AddrAdj);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU64, pu64Dst, u64Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync}
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xa3. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncFNIEMOP_DEF(iemOp_bt_Ev_Gv)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync{
e932b007e9ab36ff35e211d50d1278e859df80b3vboxsync IEMOP_MNEMONIC("bt Gv,Gv");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return FNIEMOP_CALL_1(iemOpCommonBit_Ev_Gv, &g_iemAImpl_bt);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync}
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync/**
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync * Common worker for iemOp_shrd_Ev_Gv_Ib and iemOp_shld_Ev_Gv_Ib.
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync */
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncFNIEMOP_DEF_1(iemOpCommonShldShrd_Ib, PCIEMOPSHIFTDBLSIZES, pImpl)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF | X86_EFL_OF);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync switch (pIemCpu->enmEffOpSize)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync {
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_16BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg, /*=*/cShift, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_EFLAGS(pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU16, pu16Dst, u16Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_32BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg, /*=*/cShift, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_EFLAGS(pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU32, pu32Dst, u32Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_64BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg, /*=*/cShift, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_EFLAGS(pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU64, pu64Dst, u64Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync }
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync }
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync else
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync {
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync switch (pIemCpu->enmEffOpSize)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync {
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_16BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ASSIGN(cShiftArg, cShift);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU16, pu16Dst, u16Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_32BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ASSIGN(cShiftArg, cShift);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU32, pu32Dst, u32Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_64BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ASSIGN(cShiftArg, cShift);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU64, pu64Dst, u64Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync }
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync }
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync}
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync/**
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync * Common worker for iemOp_shrd_Ev_Gv_CL and iemOp_shld_Ev_Gv_CL.
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync */
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncFNIEMOP_DEF_1(iemOpCommonShldShrd_CL, PCIEMOPSHIFTDBLSIZES, pImpl)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF | X86_EFL_OF);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync {
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync switch (pIemCpu->enmEffOpSize)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync {
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_16BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_EFLAGS(pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU16, pu16Dst, u16Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_32BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_EFLAGS(pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU32, pu32Dst, u32Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_64BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_REF_EFLAGS(pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU64, pu64Dst, u64Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync }
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync }
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync else
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync {
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync switch (pIemCpu->enmEffOpSize)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync {
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_16BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU16, pu16Dst, u16Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_32BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU32, pu32Dst, u32Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync case IEMMODE_64BIT:
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_BEGIN(4, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 2);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU64, pu64Dst, u64Src, cShiftArg, pEFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_ADVANCE_RIP();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_MC_END();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return VINF_SUCCESS;
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync }
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync }
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync}
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xa4. */
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncFNIEMOP_DEF(iemOp_shld_Ev_Gv_Ib)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync{
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_MNEMONIC("shld Ev,Gv,Ib");
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return FNIEMOP_CALL_1(iemOpCommonShldShrd_Ib, &g_iemAImpl_shld);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync}
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xa7. */
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncFNIEMOP_DEF(iemOp_shld_Ev_Gv_CL)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync{
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_MNEMONIC("shld Ev,Gv,CL");
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return FNIEMOP_CALL_1(iemOpCommonShldShrd_CL, &g_iemAImpl_shld);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync}
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xa8. */
064e87232010cd1a6a7e554428a5ba8053e96612vboxsyncFNIEMOP_DEF(iemOp_push_gs)
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync{
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync IEMOP_MNEMONIC("push gs");
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_GS);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync}
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xa9. */
064e87232010cd1a6a7e554428a5ba8053e96612vboxsyncFNIEMOP_DEF(iemOp_pop_gs)
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync{
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync IEMOP_MNEMONIC("pop gs");
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_GS, pIemCpu->enmEffOpSize);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync}
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xaa. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_rsm);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xab. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncFNIEMOP_DEF(iemOp_bts_Ev_Gv)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync{
e932b007e9ab36ff35e211d50d1278e859df80b3vboxsync IEMOP_MNEMONIC("bts Ev,Gv");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return FNIEMOP_CALL_1(iemOpCommonBit_Ev_Gv, &g_iemAImpl_bts);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync}
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xac. */
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncFNIEMOP_DEF(iemOp_shrd_Ev_Gv_Ib)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync{
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_MNEMONIC("shrd Ev,Gv,Ib");
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return FNIEMOP_CALL_1(iemOpCommonShldShrd_Ib, &g_iemAImpl_shrd);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync}
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xad. */
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsyncFNIEMOP_DEF(iemOp_shrd_Ev_Gv_CL)
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync{
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync IEMOP_MNEMONIC("shrd Ev,Gv,CL");
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync return FNIEMOP_CALL_1(iemOpCommonShldShrd_CL, &g_iemAImpl_shrd);
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync}
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae mem/0. */
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsyncFNIEMOP_DEF_1(iemOp_Grp15_fxsave, uint8_t, bRm)
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync{
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync IEMOP_MNEMONIC("fxsave m512");
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fFxSaveRstor)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return IEMOP_RAISE_INVALID_OPCODE();
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync
0a95afbe3fe6dc98bfb031c8b7a45606752c7d22vboxsync IEM_MC_BEGIN(3, 1);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 0);
0a95afbe3fe6dc98bfb031c8b7a45606752c7d22vboxsync IEM_MC_ARG(RTGCPTR, GCPtrEff, 1);
0a95afbe3fe6dc98bfb031c8b7a45606752c7d22vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
0a95afbe3fe6dc98bfb031c8b7a45606752c7d22vboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_fxsave, iEffSeg, GCPtrEff, enmEffOpSize);
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync IEM_MC_END();
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync return VINF_SUCCESS;
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync}
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae mem/1. */
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsyncFNIEMOP_DEF_1(iemOp_Grp15_fxrstor, uint8_t, bRm)
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync{
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync IEMOP_MNEMONIC("fxrstor m512");
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fFxSaveRstor)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return IEMOP_RAISE_INVALID_OPCODE();
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync
0a95afbe3fe6dc98bfb031c8b7a45606752c7d22vboxsync IEM_MC_BEGIN(3, 1);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 0);
0a95afbe3fe6dc98bfb031c8b7a45606752c7d22vboxsync IEM_MC_ARG(RTGCPTR, GCPtrEff, 1);
0a95afbe3fe6dc98bfb031c8b7a45606752c7d22vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
0a95afbe3fe6dc98bfb031c8b7a45606752c7d22vboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_fxrstor, iEffSeg, GCPtrEff, enmEffOpSize);
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync IEM_MC_END();
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync return VINF_SUCCESS;
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync}
ca82e9e77743b3e6caae138a83a4c2ca942294e4vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae mem/2. */
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsyncFNIEMOP_STUB_1(iemOp_Grp15_ldmxcsr, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae mem/3. */
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsyncFNIEMOP_STUB_1(iemOp_Grp15_stmxcsr, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae mem/4. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp15_xsave, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae mem/5. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp15_xrstor, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae mem/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp15_xsaveopt, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae mem/7. */
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsyncFNIEMOP_STUB_1(iemOp_Grp15_clflush, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae 11b/5. */
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsyncFNIEMOP_DEF_1(iemOp_Grp15_lfence, uint8_t, bRm)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync{
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEMOP_MNEMONIC("lfence");
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return IEMOP_RAISE_INVALID_OPCODE();
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_BEGIN(0, 0);
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (IEM_GET_HOST_CPU_FEATURES(pIemCpu)->fSse2)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_lfence);
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync else
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_alt_mem_fence);
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_ADVANCE_RIP();
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_END();
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return VINF_SUCCESS;
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync}
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae 11b/6. */
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsyncFNIEMOP_DEF_1(iemOp_Grp15_mfence, uint8_t, bRm)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync{
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEMOP_MNEMONIC("mfence");
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return IEMOP_RAISE_INVALID_OPCODE();
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_BEGIN(0, 0);
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (IEM_GET_HOST_CPU_FEATURES(pIemCpu)->fSse2)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_mfence);
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync else
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_alt_mem_fence);
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_ADVANCE_RIP();
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_END();
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return VINF_SUCCESS;
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync}
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0x0f 0xae 11b/7. */
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsyncFNIEMOP_DEF_1(iemOp_Grp15_sfence, uint8_t, bRm)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync{
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEMOP_MNEMONIC("sfence");
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return IEMOP_RAISE_INVALID_OPCODE();
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_BEGIN(0, 0);
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync if (IEM_GET_HOST_CPU_FEATURES(pIemCpu)->fSse2)
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_sfence);
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync else
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_alt_mem_fence);
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_ADVANCE_RIP();
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync IEM_MC_END();
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return VINF_SUCCESS;
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync}
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0xf3 0x0f 0xae 11b/0. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp15_rdfsbase, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0xf3 0x0f 0xae 11b/1. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp15_rdgsbase, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0xf3 0x0f 0xae 11b/2. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp15_wrfsbase, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync/** Opcode 0xf3 0x0f 0xae 11b/3. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp15_wrgsbase, uint8_t, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
2a69254c6b802ee414e54fe0c1202d67dac90ce8vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xae. */
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsyncFNIEMOP_DEF(iemOp_Grp15)
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync{
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync {
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync {
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp15_fxsave, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 1: return FNIEMOP_CALL_1(iemOp_Grp15_fxrstor, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 2: return FNIEMOP_CALL_1(iemOp_Grp15_ldmxcsr, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 3: return FNIEMOP_CALL_1(iemOp_Grp15_stmxcsr, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 4: return FNIEMOP_CALL_1(iemOp_Grp15_xsave, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 5: return FNIEMOP_CALL_1(iemOp_Grp15_xrstor, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 6: return FNIEMOP_CALL_1(iemOp_Grp15_xsaveopt,bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 7: return FNIEMOP_CALL_1(iemOp_Grp15_clflush, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync }
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync }
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync else
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync {
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_LOCK))
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync {
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 0:
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync {
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 0: return IEMOP_RAISE_INVALID_OPCODE();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 1: return IEMOP_RAISE_INVALID_OPCODE();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 2: return IEMOP_RAISE_INVALID_OPCODE();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 3: return IEMOP_RAISE_INVALID_OPCODE();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 4: return IEMOP_RAISE_INVALID_OPCODE();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 5: return FNIEMOP_CALL_1(iemOp_Grp15_lfence, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 6: return FNIEMOP_CALL_1(iemOp_Grp15_mfence, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 7: return FNIEMOP_CALL_1(iemOp_Grp15_sfence, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync }
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync break;
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync case IEM_OP_PRF_REPZ:
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync {
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 0: return FNIEMOP_CALL_1(iemOp_Grp15_rdfsbase, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 1: return FNIEMOP_CALL_1(iemOp_Grp15_rdgsbase, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 2: return FNIEMOP_CALL_1(iemOp_Grp15_wrfsbase, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 3: return FNIEMOP_CALL_1(iemOp_Grp15_wrgsbase, bRm);
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 4: return IEMOP_RAISE_INVALID_OPCODE();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 5: return IEMOP_RAISE_INVALID_OPCODE();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync case 7: return IEMOP_RAISE_INVALID_OPCODE();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync }
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync break;
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync
5b14ea747085486dbf2abdf7d9c01b7f754063e3vboxsync default:
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync return IEMOP_RAISE_INVALID_OPCODE();
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync }
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync }
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync}
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xaf. */
064e87232010cd1a6a7e554428a5ba8053e96612vboxsyncFNIEMOP_DEF(iemOp_imul_Gv_Ev)
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync{
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEMOP_MNEMONIC("imul Gv,Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_imul_two);
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync}
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb0. */
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsyncFNIEMOP_DEF(iemOp_cmpxchg_Eb_Gb)
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync{
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEMOP_MNEMONIC("cmpxchg Eb,Gb");
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync {
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEMOP_HLP_DONE_DECODING();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_BEGIN(4, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint8_t *, pu8Al, 1);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint8_t, u8Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U8(pu8Al, X86_GREG_xAX);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_EFLAGS(pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u8, pu8Dst, pu8Al, u8Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u8_locked, pu8Dst, pu8Al, u8Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ADVANCE_RIP();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_END();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync }
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync {
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_BEGIN(4, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint8_t *, pu8Al, 1);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint8_t, u8Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_LOCAL(uint8_t, u8Al);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEMOP_HLP_DONE_DECODING();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U8(u8Al, X86_GREG_xAX);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_EFLAGS(EFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_LOCAL(pu8Al, u8Al);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u8, pu8Dst, pu8Al, u8Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u8_locked, pu8Dst, pu8Al, u8Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Al);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ADVANCE_RIP();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_END();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync }
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync return VINF_SUCCESS;
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync}
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb1. */
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsyncFNIEMOP_DEF(iemOp_cmpxchg_Ev_Gv)
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync{
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEMOP_MNEMONIC("cmpxchg Ev,Gv");
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync {
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEMOP_HLP_DONE_DECODING();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync switch (pIemCpu->enmEffOpSize)
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync {
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync case IEMMODE_16BIT:
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_BEGIN(4, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint16_t *, pu16Ax, 1);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint16_t, u16Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U16(pu16Ax, X86_GREG_xAX);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_EFLAGS(pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u16, pu16Dst, pu16Ax, u16Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u16_locked, pu16Dst, pu16Ax, u16Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ADVANCE_RIP();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_END();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync return VINF_SUCCESS;
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync case IEMMODE_32BIT:
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_BEGIN(4, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t *, pu32Eax, 1);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t, u32Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U32(pu32Eax, X86_GREG_xAX);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_EFLAGS(pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u32, pu32Dst, pu32Eax, u32Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u32_locked, pu32Dst, pu32Eax, u32Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Eax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ADVANCE_RIP();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_END();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync return VINF_SUCCESS;
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync case IEMMODE_64BIT:
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_BEGIN(4, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint64_t *, pu64Rax, 1);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#ifdef RT_ARCH_X86
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint64_t *, pu64Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint64_t, u64Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#endif
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U64(pu64Rax, X86_GREG_xAX);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_EFLAGS(pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#ifdef RT_ARCH_X86
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U64(pu64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, pu64Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64_locked, pu64Dst, pu64Rax, pu64Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, u64Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64_locked, pu64Dst, pu64Rax, u64Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#endif
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ADVANCE_RIP();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_END();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync return VINF_SUCCESS;
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync }
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync }
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync {
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync switch (pIemCpu->enmEffOpSize)
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync {
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync case IEMMODE_16BIT:
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_BEGIN(4, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint16_t *, pu16Ax, 1);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint16_t, u16Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_LOCAL(uint16_t, u16Ax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEMOP_HLP_DONE_DECODING();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U16(u16Ax, X86_GREG_xAX);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_EFLAGS(EFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_LOCAL(pu16Ax, u16Ax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u16, pu16Dst, pu16Ax, u16Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u16_locked, pu16Dst, pu16Ax, u16Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_STORE_GREG_U16(X86_GREG_xAX, u16Ax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ADVANCE_RIP();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_END();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync return VINF_SUCCESS;
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync case IEMMODE_32BIT:
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_BEGIN(4, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t *, pu32Eax, 1);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint32_t, u32Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_LOCAL(uint32_t, u32Eax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEMOP_HLP_DONE_DECODING();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U32(u32Eax, X86_GREG_xAX);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_EFLAGS(EFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_LOCAL(pu32Eax, u32Eax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u32, pu32Dst, pu32Eax, u32Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u32_locked, pu32Dst, pu32Eax, u32Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_STORE_GREG_U32(X86_GREG_xAX, u32Eax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ADVANCE_RIP();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_END();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync return VINF_SUCCESS;
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync case IEMMODE_64BIT:
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_BEGIN(4, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint64_t *, pu64Rax, 1);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#ifdef RT_ARCH_X86
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint64_t *, pu64Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG(uint64_t, u64Src, 2);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#endif
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 3);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_LOCAL(uint64_t, u64Rax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEMOP_HLP_DONE_DECODING();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U64(u64Rax, X86_GREG_xAX);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_EFLAGS(EFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_LOCAL(pu64Rax, u64Rax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#ifdef RT_ARCH_X86
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_REF_GREG_U64(pu64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, pu64Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64_locked, pu64Dst, pu64Rax, pu64Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, u64Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync else
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64_locked, pu64Dst, pu64Rax, u64Src, pEFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync#endif
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_STORE_GREG_U64(X86_GREG_xAX, u64Rax);
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_ADVANCE_RIP();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_MC_END();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync return VINF_SUCCESS;
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync }
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync }
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsyncFNIEMOP_DEF_2(iemOpCommonLoadSRegAndGreg, uint8_t, iSegReg, uint8_t, bRm)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync Assert((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)); /* Caller checks this */
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync uint8_t const iGReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffOpSize)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_BEGIN(5, 1);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG(uint16_t, uSel, 0);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG(uint16_t, offSeg, 1);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG_CONST(uint8_t, iSegRegArg,/*=*/iSegReg, 2);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG_CONST(uint8_t, iGRegArg, /*=*/iGReg, 3);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 4);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEff);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_FETCH_MEM_U16(offSeg, pIemCpu->iEffSeg, GCPtrEff);
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_FETCH_MEM_U16_DISP(uSel, pIemCpu->iEffSeg, GCPtrEff, 2);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_CALL_CIMPL_5(iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_END();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync return VINF_SUCCESS;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_BEGIN(5, 1);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG(uint16_t, uSel, 0);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG(uint32_t, offSeg, 1);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG_CONST(uint8_t, iSegRegArg,/*=*/iSegReg, 2);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG_CONST(uint8_t, iGRegArg, /*=*/iGReg, 3);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 4);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEff);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_FETCH_MEM_U32(offSeg, pIemCpu->iEffSeg, GCPtrEff);
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_FETCH_MEM_U16_DISP(uSel, pIemCpu->iEffSeg, GCPtrEff, 4);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_CALL_CIMPL_5(iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_END();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync return VINF_SUCCESS;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_BEGIN(5, 1);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG(uint16_t, uSel, 0);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG(uint64_t, offSeg, 1);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG_CONST(uint8_t, iSegRegArg,/*=*/iSegReg, 2);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG_CONST(uint8_t, iGRegArg, /*=*/iGReg, 3);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 4);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEff);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync if (IEM_IS_GUEST_CPU_AMD(pIemCpu)) /** @todo testcase: rev 3.15 of the amd manuals claims it only loads a 32-bit greg. */
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEM_MC_FETCH_MEM_U32_SX_U64(offSeg, pIemCpu->iEffSeg, GCPtrEff);
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync else
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEM_MC_FETCH_MEM_U64(offSeg, pIemCpu->iEffSeg, GCPtrEff);
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_FETCH_MEM_U16_DISP(uSel, pIemCpu->iEffSeg, GCPtrEff, 8);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_CALL_CIMPL_5(iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_END();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync return VINF_SUCCESS;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb2. */
e41f0459369a6d814aa36bf4def225482fc56026vboxsyncFNIEMOP_DEF(iemOp_lss_Gv_Mp)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync{
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("lss Gv,Mp");
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync return IEMOP_RAISE_INVALID_OPCODE();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_SS, bRm);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb3. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncFNIEMOP_DEF(iemOp_btr_Ev_Gv)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync{
e932b007e9ab36ff35e211d50d1278e859df80b3vboxsync IEMOP_MNEMONIC("btr Ev,Gv");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return FNIEMOP_CALL_1(iemOpCommonBit_Ev_Gv, &g_iemAImpl_btr);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb4. */
e41f0459369a6d814aa36bf4def225482fc56026vboxsyncFNIEMOP_DEF(iemOp_lfs_Gv_Mp)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync{
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("lfs Gv,Mp");
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync return IEMOP_RAISE_INVALID_OPCODE();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_FS, bRm);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb5. */
e41f0459369a6d814aa36bf4def225482fc56026vboxsyncFNIEMOP_DEF(iemOp_lgs_Gv_Mp)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync{
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("lgs Gv,Mp");
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync return IEMOP_RAISE_INVALID_OPCODE();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_GS, bRm);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync}
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb6. */
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsyncFNIEMOP_DEF(iemOp_movzx_Gv_Eb)
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync{
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEMOP_MNEMONIC("movzx Gv,Eb");
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync /*
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync * If rm is denoting a register, no more instruction bytes.
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync */
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync {
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync switch (pIemCpu->enmEffOpSize)
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync {
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync case IEMMODE_16BIT:
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_BEGIN(0, 1);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_FETCH_GREG_U8_ZX_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_ADVANCE_RIP();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_END();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync return VINF_SUCCESS;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync case IEMMODE_32BIT:
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_BEGIN(0, 1);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_LOCAL(uint32_t, u32Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_FETCH_GREG_U8_ZX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_ADVANCE_RIP();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_END();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync return VINF_SUCCESS;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync case IEMMODE_64BIT:
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_BEGIN(0, 1);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_LOCAL(uint64_t, u64Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_FETCH_GREG_U8_ZX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_ADVANCE_RIP();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_END();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync return VINF_SUCCESS;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync }
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync }
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync else
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync {
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync /*
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync * We're loading a register from memory.
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync */
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync switch (pIemCpu->enmEffOpSize)
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync {
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync case IEMMODE_16BIT:
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_BEGIN(0, 2);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_FETCH_MEM_U8_ZX_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_ADVANCE_RIP();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_END();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync return VINF_SUCCESS;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync case IEMMODE_32BIT:
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_BEGIN(0, 2);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_LOCAL(uint32_t, u32Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_FETCH_MEM_U8_ZX_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_ADVANCE_RIP();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_END();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync return VINF_SUCCESS;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync case IEMMODE_64BIT:
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_BEGIN(0, 2);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_LOCAL(uint64_t, u64Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_FETCH_MEM_U8_ZX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_ADVANCE_RIP();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_END();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync return VINF_SUCCESS;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync }
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync }
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync}
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb7. */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncFNIEMOP_DEF(iemOp_movzx_Gv_Ew)
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync{
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEMOP_MNEMONIC("movzx Gv,Ew");
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync /** @todo Not entirely sure how the operand size prefix is handled here,
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync * assuming that it will be ignored. Would be nice to have a few
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync * test for this. */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync /*
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync * If rm is denoting a register, no more instruction bytes.
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(0, 1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint32_t, u32Value);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U16_ZX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync else
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(0, 1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint64_t, u64Value);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U16_ZX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync else
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync /*
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync * We're loading a register from memory.
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(0, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint32_t, u32Value);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_MEM_U16_ZX_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync else
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(0, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint64_t, u64Value);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_MEM_U16_ZX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync}
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb8. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_popcnt_Gv_Ev_jmpe);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xb9. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_DEF(iemOp_Grp10)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync{
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync Log(("iemOp_Grp10 -> #UD\n"));
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync}
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xba. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncFNIEMOP_DEF(iemOp_Grp8)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync PCIEMOPBINSIZES pImpl;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case 0: case 1: case 2: case 3:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return IEMOP_RAISE_INVALID_OPCODE();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case 4: pImpl = &g_iemAImpl_bt; IEMOP_MNEMONIC("bt Ev,Ib"); break;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case 5: pImpl = &g_iemAImpl_bts; IEMOP_MNEMONIC("bts Ev,Ib"); break;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case 6: pImpl = &g_iemAImpl_btr; IEMOP_MNEMONIC("btr Ev,Ib"); break;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case 7: pImpl = &g_iemAImpl_btc; IEMOP_MNEMONIC("btc Ev,Ib"); break;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync /* register destination. */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Bit; IEM_OPCODE_GET_NEXT_U8(&u8Bit);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync switch (pIemCpu->enmEffOpSize)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_16BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG_CONST(uint16_t, u16Src, /*=*/ u8Bit & 0x0f, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_EFLAGS(pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_32BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG_CONST(uint32_t, u32Src, /*=*/ u8Bit & 0x1f, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_EFLAGS(pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_64BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ u8Bit & 0x3f, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_REF_EFLAGS(pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync /* memory destination. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync uint32_t fAccess;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if (pImpl->pfnLockedU16)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync fAccess = IEM_ACCESS_DATA_RW;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else /* BT */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync fAccess = IEM_ACCESS_DATA_R;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync /** @todo test negative bit offsets! */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync switch (pIemCpu->enmEffOpSize)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync {
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_16BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Bit; IEM_OPCODE_GET_NEXT_U8(&u8Bit);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ASSIGN(u16Src, u8Bit & 0x0f);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
00e1abd799e9f92aee80d89aaca09d23c107b47bvboxsync IEM_MC_MEM_MAP(pu16Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU16, pu16Dst, u16Src, pEFlags);
00e1abd799e9f92aee80d89aaca09d23c107b47bvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, fAccess);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_32BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Bit; IEM_OPCODE_GET_NEXT_U8(&u8Bit);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ASSIGN(u32Src, u8Bit & 0x1f);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
00e1abd799e9f92aee80d89aaca09d23c107b47bvboxsync IEM_MC_MEM_MAP(pu32Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU32, pu32Dst, u32Src, pEFlags);
00e1abd799e9f92aee80d89aaca09d23c107b47bvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, fAccess);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync case IEMMODE_64BIT:
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_BEGIN(3, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Bit; IEM_OPCODE_GET_NEXT_U8(&u8Bit);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ASSIGN(u64Src, u8Bit & 0x3f);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
00e1abd799e9f92aee80d89aaca09d23c107b47bvboxsync IEM_MC_MEM_MAP(pu64Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync else
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU64, pu64Dst, u64Src, pEFlags);
00e1abd799e9f92aee80d89aaca09d23c107b47bvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, fAccess);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_ADVANCE_RIP();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_MC_END();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return VINF_SUCCESS;
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync}
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xbb. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncFNIEMOP_DEF(iemOp_btc_Ev_Gv)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync{
e932b007e9ab36ff35e211d50d1278e859df80b3vboxsync IEMOP_MNEMONIC("btc Ev,Gv");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return FNIEMOP_CALL_1(iemOpCommonBit_Ev_Gv, &g_iemAImpl_btc);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync}
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xbc. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncFNIEMOP_DEF(iemOp_bsf_Gv_Ev)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync{
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_MNEMONIC("bsf Gv,Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_bsf);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync}
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xbd. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncFNIEMOP_DEF(iemOp_bsr_Gv_Ev)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync{
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_MNEMONIC("bsr Gv,Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_bsr);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync}
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xbe. */
d4a8f6749f70bad88edc04de808643d372faa35avboxsyncFNIEMOP_DEF(iemOp_movsx_Gv_Eb)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync{
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEMOP_MNEMONIC("movsx Gv,Eb");
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync /*
d4a8f6749f70bad88edc04de808643d372faa35avboxsync * If rm is denoting a register, no more instruction bytes.
d4a8f6749f70bad88edc04de808643d372faa35avboxsync */
d4a8f6749f70bad88edc04de808643d372faa35avboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync switch (pIemCpu->enmEffOpSize)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync case IEMMODE_16BIT:
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 1);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint16_t, u16Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_GREG_U8_SX_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync case IEMMODE_32BIT:
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 1);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint32_t, u32Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_GREG_U8_SX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync case IEMMODE_64BIT:
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 1);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint64_t, u64Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_GREG_U8_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync else
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync /*
d4a8f6749f70bad88edc04de808643d372faa35avboxsync * We're loading a register from memory.
d4a8f6749f70bad88edc04de808643d372faa35avboxsync */
d4a8f6749f70bad88edc04de808643d372faa35avboxsync switch (pIemCpu->enmEffOpSize)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync case IEMMODE_16BIT:
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 2);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint16_t, u16Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_MEM_U8_SX_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync case IEMMODE_32BIT:
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 2);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint32_t, u32Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_MEM_U8_SX_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync case IEMMODE_64BIT:
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 2);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint64_t, u64Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_MEM_U8_SX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync}
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xbf. */
d4a8f6749f70bad88edc04de808643d372faa35avboxsyncFNIEMOP_DEF(iemOp_movsx_Gv_Ew)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync{
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEMOP_MNEMONIC("movsx Gv,Ew");
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync /** @todo Not entirely sure how the operand size prefix is handled here,
d4a8f6749f70bad88edc04de808643d372faa35avboxsync * assuming that it will be ignored. Would be nice to have a few
d4a8f6749f70bad88edc04de808643d372faa35avboxsync * test for this. */
d4a8f6749f70bad88edc04de808643d372faa35avboxsync /*
d4a8f6749f70bad88edc04de808643d372faa35avboxsync * If rm is denoting a register, no more instruction bytes.
d4a8f6749f70bad88edc04de808643d372faa35avboxsync */
d4a8f6749f70bad88edc04de808643d372faa35avboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 1);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint32_t, u32Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_GREG_U16_SX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync else
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 1);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint64_t, u64Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_GREG_U16_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync else
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync /*
d4a8f6749f70bad88edc04de808643d372faa35avboxsync * We're loading a register from memory.
d4a8f6749f70bad88edc04de808643d372faa35avboxsync */
d4a8f6749f70bad88edc04de808643d372faa35avboxsync if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 2);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint32_t, u32Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_MEM_U16_SX_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync else
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 2);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint64_t, u64Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_MEM_U16_SX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
d4a8f6749f70bad88edc04de808643d372faa35avboxsync}
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc0. */
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncFNIEMOP_DEF(iemOp_xadd_Eb_Gb)
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync{
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEMOP_MNEMONIC("xadd Eb,Gb");
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync /*
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync * If rm is denoting a register, no more instruction bytes.
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync */
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync {
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_BEGIN(3, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint8_t *, pu8Reg, 1);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_REF_GREG_U8(pu8Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_REF_EFLAGS(pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u8, pu8Dst, pu8Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ADVANCE_RIP();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_END();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync }
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync {
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync /*
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync * We're accessing memory.
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync */
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_BEGIN(3, 3);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint8_t *, pu8Reg, 1);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_LOCAL(uint8_t, u8RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_FETCH_GREG_U8(u8RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_REF_LOCAL(pu8Reg, u8RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u8, pu8Dst, pu8Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u8_locked, pu8Dst, pu8Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u8RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ADVANCE_RIP();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_END();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync return VINF_SUCCESS;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync }
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync return VINF_SUCCESS;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync}
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc1. */
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsyncFNIEMOP_DEF(iemOp_xadd_Ev_Gv)
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync{
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEMOP_MNEMONIC("xadd Ev,Gv");
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync /*
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync * If rm is denoting a register, no more instruction bytes.
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync */
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync {
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync switch (pIemCpu->enmEffOpSize)
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync {
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync case IEMMODE_16BIT:
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_BEGIN(3, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint16_t *, pu16Reg, 1);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_REF_GREG_U16(pu16Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_REF_EFLAGS(pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u16, pu16Dst, pu16Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ADVANCE_RIP();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_END();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync return VINF_SUCCESS;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync case IEMMODE_32BIT:
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_BEGIN(3, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint32_t *, pu32Reg, 1);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_REF_GREG_U32(pu32Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_REF_EFLAGS(pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u32, pu32Dst, pu32Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Reg);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ADVANCE_RIP();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_END();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync return VINF_SUCCESS;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync case IEMMODE_64BIT:
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_BEGIN(3, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint64_t *, pu64Reg, 1);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_REF_GREG_U64(pu64Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_REF_EFLAGS(pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u64, pu64Dst, pu64Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ADVANCE_RIP();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_END();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync return VINF_SUCCESS;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync }
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync }
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync {
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync /*
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync * We're accessing memory.
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync */
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync switch (pIemCpu->enmEffOpSize)
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync {
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync case IEMMODE_16BIT:
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_BEGIN(3, 3);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint16_t *, pu16Reg, 1);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_LOCAL(uint16_t, u16RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_FETCH_GREG_U16(u16RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_REF_LOCAL(pu16Reg, u16RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u16, pu16Dst, pu16Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u16_locked, pu16Dst, pu16Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ADVANCE_RIP();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_END();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync return VINF_SUCCESS;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync case IEMMODE_32BIT:
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_BEGIN(3, 3);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint32_t *, pu32Reg, 1);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_LOCAL(uint32_t, u32RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_FETCH_GREG_U32(u32RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_REF_LOCAL(pu32Reg, u32RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u32, pu32Dst, pu32Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u32_locked, pu32Dst, pu32Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ADVANCE_RIP();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_END();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync return VINF_SUCCESS;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync case IEMMODE_64BIT:
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_BEGIN(3, 3);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG(uint64_t *, pu64Reg, 1);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_LOCAL(uint64_t, u64RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_FETCH_GREG_U64(u64RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_REF_LOCAL(pu64Reg, u64RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u64, pu64Dst, pu64Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync else
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u64_locked, pu64Dst, pu64Reg, pEFlags);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
35325cf3fc008a76e3801f31e76a761a17f0bea4vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64RegCopy);
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_ADVANCE_RIP();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_MC_END();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync return VINF_SUCCESS;
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync }
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync }
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync}
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_cmpps_Vps_Wps_Ib__cmppd_Vpd_Wpd_Ib__cmpss_Vss_Wss_Ib__cmpsd_Vsd_Wsd_Ib);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_movnti_My_Gy);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc4. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pinsrw_Pq_Ry_Mw_Ib__pinsrw_Vdq_Ry_Mw_Ib);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc5. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pextrw_Gd_Nq_Ib__pextrw_Gd_Udq_Ib);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc6. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_shufps_Vps_Wps_Ib__shufdp_Vpd_Wpd_Ib);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0xc7 !11/1. */
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsyncFNIEMOP_DEF_1(iemOp_Grp9_cmpxchg8b_Mq, uint8_t, bRm)
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync{
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEMOP_MNEMONIC("cmpxchg8b Mq");
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_BEGIN(4, 3);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_ARG(uint64_t *, pu64MemDst, 0);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_ARG(PRTUINT64U, pu64EaxEdx, 1);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_ARG(PRTUINT64U, pu64EbxEcx, 2);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 3);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_LOCAL(RTUINT64U, u64EaxEdx);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_LOCAL(RTUINT64U, u64EbxEcx);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEMOP_HLP_DONE_DECODING();
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_MEM_MAP(pu64MemDst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_FETCH_GREG_U32(u64EaxEdx.s.Lo, X86_GREG_xAX);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_FETCH_GREG_U32(u64EaxEdx.s.Hi, X86_GREG_xDX);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_REF_LOCAL(pu64EaxEdx, u64EaxEdx);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_FETCH_GREG_U32(u64EbxEcx.s.Lo, X86_GREG_xBX);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_FETCH_GREG_U32(u64EbxEcx.s.Hi, X86_GREG_xCX);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_REF_LOCAL(pu64EbxEcx, u64EbxEcx);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_FETCH_EFLAGS(EFlags);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg8b, pu64MemDst, pu64EaxEdx, pu64EbxEcx, pEFlags);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync else
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg8b_locked, pu64MemDst, pu64EaxEdx, pu64EbxEcx, pEFlags);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64MemDst, IEM_ACCESS_DATA_RW);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_ZF)
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync /** @todo Testcase: Check effect of cmpxchg8b on bits 63:32 in rax and rdx. */
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_STORE_GREG_U32(X86_GREG_xAX, u64EaxEdx.s.Lo);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_STORE_GREG_U32(X86_GREG_xDX, u64EaxEdx.s.Hi);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_ENDIF();
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_ADVANCE_RIP();
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync IEM_MC_END();
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync return VINF_SUCCESS;
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync}
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode REX.W 0x0f 0xc7 !11/1. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp9_cmpxchg16b_Mdq, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0xc7 11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp9_rdrand_Rv, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x0f 0xc7 !11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp9_vmptrld_Mq, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x66 0x0f 0xc7 !11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp9_vmclear_Mq, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0xf3 0x0f 0xc7 !11/6. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp9_vmxon_Mq, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode [0xf3] 0x0f 0xc7 !11/7. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_UD_STUB_1(iemOp_Grp9_vmptrst_Mq, uint8_t, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc7. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_DEF(iemOp_Grp9)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync{
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /** @todo Testcase: Check mixing 0x66 and 0xf3. Check the effect of 0xf2. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0: case 2: case 3: case 4: case 5:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 1:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /** @todo Testcase: Check prefix effects on cmpxchg8b/16b. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync if ( (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync || (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))) /** @todo Testcase: AMD seems to express a different idea here wrt prefixes. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync if (bRm & IEM_OP_PRF_SIZE_REX_W)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return FNIEMOP_CALL_1(iemOp_Grp9_cmpxchg16b_Mdq, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return FNIEMOP_CALL_1(iemOp_Grp9_cmpxchg8b_Mq, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 6:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return FNIEMOP_CALL_1(iemOp_Grp9_rdrand_Rv, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return FNIEMOP_CALL_1(iemOp_Grp9_vmptrld_Mq, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_SIZE_OP:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return FNIEMOP_CALL_1(iemOp_Grp9_vmclear_Mq, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_REPZ:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return FNIEMOP_CALL_1(iemOp_Grp9_vmxon_Mq, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 7:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync {
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case 0:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync case IEM_OP_PRF_REPZ:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return FNIEMOP_CALL_1(iemOp_Grp9_vmptrst_Mq, bRm);
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync default:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync }
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync}
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync/**
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync * Common 'bswap register' helper.
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync */
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncFNIEMOP_DEF_1(iemOpCommonBswapGReg, uint8_t, iReg)
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync{
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync switch (pIemCpu->enmEffOpSize)
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync {
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync case IEMMODE_16BIT:
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_MC_BEGIN(1, 0);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_MC_REF_GREG_U32(pu32Dst, iReg); /* Don't clear the high dword! */
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_MC_CALL_VOID_AIMPL_1(iemAImpl_bswap_u16, pu32Dst);
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_ADVANCE_RIP();
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_END();
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync return VINF_SUCCESS;
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync case IEMMODE_32BIT:
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_MC_BEGIN(1, 0);
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_REF_GREG_U32(pu32Dst, iReg);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_MC_CALL_VOID_AIMPL_1(iemAImpl_bswap_u32, pu32Dst);
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_ADVANCE_RIP();
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_END();
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync return VINF_SUCCESS;
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync case IEMMODE_64BIT:
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_MC_BEGIN(1, 0);
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_REF_GREG_U64(pu64Dst, iReg);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_MC_CALL_VOID_AIMPL_1(iemAImpl_bswap_u64, pu64Dst);
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_ADVANCE_RIP();
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEM_MC_END();
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync return VINF_SUCCESS;
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync }
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync}
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc8. */
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsyncFNIEMOP_DEF(iemOp_bswap_rAX_r8)
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync{
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync IEMOP_MNEMONIC("bswap rAX/r8");
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync /* Note! Intel manuals states that R8-R15 can be accessed by using a REX.X
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync prefix. REX.B is the correct prefix it appears. For a parallel
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync case, see iemOp_mov_AL_Ib and iemOp_mov_eAX_Iv. */
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xAX | pIemCpu->uRexB);
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync}
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xc9. */
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncFNIEMOP_DEF(iemOp_bswap_rCX_r9)
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync{
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEMOP_MNEMONIC("bswap rCX/r9");
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xCX | pIemCpu->uRexB);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync}
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xca. */
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncFNIEMOP_DEF(iemOp_bswap_rDX_r10)
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync{
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEMOP_MNEMONIC("bswap rDX/r9");
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDX | pIemCpu->uRexB);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync}
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xcb. */
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncFNIEMOP_DEF(iemOp_bswap_rBX_r11)
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync{
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEMOP_MNEMONIC("bswap rBX/r9");
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBX | pIemCpu->uRexB);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync}
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xcc. */
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncFNIEMOP_DEF(iemOp_bswap_rSP_r12)
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync{
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEMOP_MNEMONIC("bswap rSP/r12");
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSP | pIemCpu->uRexB);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync}
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xcd. */
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncFNIEMOP_DEF(iemOp_bswap_rBP_r13)
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync{
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEMOP_MNEMONIC("bswap rBP/r13");
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBP | pIemCpu->uRexB);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync}
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xce. */
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncFNIEMOP_DEF(iemOp_bswap_rSI_r14)
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync{
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEMOP_MNEMONIC("bswap rSI/r14");
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSI | pIemCpu->uRexB);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync}
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xcf. */
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsyncFNIEMOP_DEF(iemOp_bswap_rDI_r15)
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync{
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync IEMOP_MNEMONIC("bswap rDI/r15");
387cebd15c4a6502bf013a2c03f864d7d307fbe9vboxsync return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDI | pIemCpu->uRexB);
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync}
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
869b801c85bf466f1f7c9d183e336e60dd5a1da7vboxsync
5d5736ee87bba61ed37c0112a5f89f32b57e775bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_addsubpd_Vpd_Wpd__addsubps_Vps_Wps);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psrlw_Pp_Qp__psrlw_Vdp_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psrld_Pq_Qq__psrld_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psrlq_Pq_Qq__psrlq_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd4. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_paddq_Pq_Qq__paddq_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd5. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pmulq_Pq_Qq__pmullw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd6. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_movq_Wq_Vq__movq2dq_Vdq_Nq__movdq2q_Pq_Uq);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd7. */
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsyncFNIEMOP_DEF(iemOp_pmovmskb_Gd_Nq__pmovmskb_Gd_Udq)
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync{
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync /* Docs says register only. */
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)) /** @todo test that this is registers only. */
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync return IEMOP_RAISE_INVALID_OPCODE();
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync /* Note! Taking the lazy approch here wrt the high 32-bits of the GREG. */
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync /** @todo testcase: Check that the instruction implicitly clears the high
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync * bits in 64-bit mode. The REX.W is first necessary when VLMAX > 256
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync * and opcode modifications are made to work with the whole width (not
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync * just 128). */
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync {
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync case IEM_OP_PRF_SIZE_OP: /* SSE */
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_MNEMONIC("pmovmskb Gd,Nq");
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_SSE | DISOPTYPE_HARMLESS);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_BEGIN(2, 0);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_ARG(uint128_t const *, pSrc, 1);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_REF_GREG_U64(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_pmovmskb_u128, pDst, pSrc);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_ADVANCE_RIP();
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_END();
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync return VINF_SUCCESS;
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync case 0: /* MMX */
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_MNEMONIC("pmovmskb Gd,Udq");
7d6afc2aa5e46a6aaac777182900a9e016998911vboxsync IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_MMX | DISOPTYPE_HARMLESS);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_BEGIN(2, 0);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_ARG(uint64_t *, pDst, 0);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_ARG(uint64_t const *, pSrc, 1);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_REF_GREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_CALL_MMX_AIMPL_2(iemAImpl_pmovmskb_u64, pDst, pSrc);
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_ADVANCE_RIP();
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync IEM_MC_END();
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync return VINF_SUCCESS;
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync default:
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync return IEMOP_RAISE_INVALID_OPCODE();
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync }
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync}
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd8. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psubusb_Pq_Qq__psubusb_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xd9. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psubusw_Pq_Qq__psubusw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xda. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pminub_Pq_Qq__pminub_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xdb. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pand_Pq_Qq__pand_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xdc. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_paddusb_Pq_Qq__paddusb_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xdd. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_paddusw_Pq_Qq__paddusw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xde. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pmaxub_Pq_Qq__pamxub_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xdf. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pandn_Pq_Qq__pandn_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pavgb_Pq_Qq__pavgb_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psraw_Pq_Qq__psraw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psrad_Pq_Qq__psrad_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pavgw_Pq_Qq__pavgw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe4. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pmulhuw_Pq_Qq__pmulhuw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe5. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pmulhw_Pq_Qq__pmulhw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe6. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_cvttpd2dq_Vdq_Wdp__cvtdq2pd_Vdq_Wpd__cvtpd2dq_Vdq_Wpd);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_movntq_Mq_Pq__movntdq_Mdq_Vdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe8. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psubsb_Pq_Qq__psubsb_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xe9. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psubsw_Pq_Qq__psubsw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xea. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pminsw_Pq_Qq__pminsw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xeb. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_por_Pq_Qq__por_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xec. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_paddsb_Pq_Qq__paddsb_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xed. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_paddsw_Pq_Qq__paddsw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xee. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pmaxsw_Pq_Qq__pmaxsw_Vdq_Wdq);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xef. */
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsyncFNIEMOP_DEF(iemOp_pxor_Pq_Qq__pxor_Vdq_Wdq)
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync{
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync IEMOP_MNEMONIC("pxor");
29cfadbc85da0a67ad759da74c8c3c0d8c6f7acevboxsync return FNIEMOP_CALL_1(iemOpCommonMmxSse2_FullFull_To_Full, &g_iemAImpl_pxor);
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync}
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
0dd3b06af746ef6f7f62215cde39f9fc7715e04dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_lddqu_Vdq_Mdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psllw_Pq_Qq__pslw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psld_Pq_Qq__pslld_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psllq_Pq_Qq__pslq_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf4. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pmuludq_Pq_Qq__pmuludq_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf5. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_pmaddwd_Pq_Qq__pmaddwd_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf6. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psadbw_Pq_Qq__psadbw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_maskmovq_Pq_Nq__maskmovdqu_Vdq_Udq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf8. */
d11f52e82b90c0601e191193ef1fa2449b68ce32vboxsyncFNIEMOP_STUB(iemOp_psubb_Pq_Qq_psubb_Vdq_Wdq); //NEXT
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xf9. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psubw_Pq_Qq__psubw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xfa. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psubd_Pq_Qq__psubd_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xfb. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_psubq_Pq_Qq__psbuq_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xfc. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_paddb_Pq_Qq__paddb_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xfd. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_paddw_Pq_Qq__paddw_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f 0xfe. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_paddd_Pq_Qq__paddd_Vdq_Wdq);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncconst PFNIEMOP g_apfnTwoByteMap[256] =
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x00 */ iemOp_Grp6,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x01 */ iemOp_Grp7,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x02 */ iemOp_lar_Gv_Ew,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x03 */ iemOp_lsl_Gv_Ew,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x04 */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x05 */ iemOp_syscall,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x06 */ iemOp_clts,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x07 */ iemOp_sysret,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x08 */ iemOp_invd,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x09 */ iemOp_wbinvd,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x0a */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x0b */ iemOp_ud2,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x0c */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x0d */ iemOp_nop_Ev_GrpP,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x0e */ iemOp_femms,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x0f */ iemOp_3Dnow,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x10 */ iemOp_movups_Vps_Wps__movupd_Vpd_Wpd__movss_Vss_Wss__movsd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x11 */ iemOp_movups_Wps_Vps__movupd_Wpd_Vpd__movss_Wss_Vss__movsd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x12 */ iemOp_movlps_Vq_Mq__movhlps_Vq_Uq__movlpd_Vq_Mq__movsldup_Vq_Wq__movddup_Vq_Wq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x13 */ iemOp_movlps_Mq_Vq__movlpd_Mq_Vq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x14 */ iemOp_unpckhlps_Vps_Wq__unpcklpd_Vpd_Wq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x15 */ iemOp_unpckhps_Vps_Wq__unpckhpd_Vpd_Wq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x16 */ iemOp_movhps_Vq_Mq__movlhps_Vq_Uq__movhpd_Vq_Mq__movshdup_Vq_Wq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x17 */ iemOp_movhps_Mq_Vq__movhpd_Mq_Vq,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x18 */ iemOp_prefetch_Grp16,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x19 */ iemOp_nop_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x1a */ iemOp_nop_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x1b */ iemOp_nop_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x1c */ iemOp_nop_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x1d */ iemOp_nop_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x1e */ iemOp_nop_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x1f */ iemOp_nop_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x20 */ iemOp_mov_Rd_Cd,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x21 */ iemOp_mov_Rd_Dd,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x22 */ iemOp_mov_Cd_Rd,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x23 */ iemOp_mov_Dd_Rd,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x24 */ iemOp_mov_Rd_Td,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x25 */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x26 */ iemOp_mov_Td_Rd,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x27 */ iemOp_Invalid,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x28 */ iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x29 */ iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x2a */ iemOp_cvtpi2ps_Vps_Qpi__cvtpi2pd_Vpd_Qpi__cvtsi2ss_Vss_Ey__cvtsi2sd_Vsd_Ey,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x2b */ iemOp_movntps_Mps_Vps__movntpd_Mpd_Vpd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x2c */ iemOp_cvttps2pi_Ppi_Wps__cvttpd2pi_Ppi_Wpd__cvttss2si_Gy_Wss__cvttsd2si_Yu_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x2d */ iemOp_cvtps2pi_Ppi_Wps__cvtpd2pi_QpiWpd__cvtss2si_Gy_Wss__cvtsd2si_Gy_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x2e */ iemOp_ucomiss_Vss_Wss__ucomisd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x2f */ iemOp_comiss_Vss_Wss__comisd_Vsd_Wsd,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x30 */ iemOp_wrmsr,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x31 */ iemOp_rdtsc,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x32 */ iemOp_rdmsr,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x33 */ iemOp_rdpmc,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x34 */ iemOp_sysenter,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x35 */ iemOp_sysexit,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x36 */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x37 */ iemOp_getsec,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x38 */ iemOp_3byte_Esc_A4,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x39 */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x3a */ iemOp_3byte_Esc_A5,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x3b */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x3c */ iemOp_movnti_Gv_Ev/*??*/,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x3d */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x3e */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x3f */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x40 */ iemOp_cmovo_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x41 */ iemOp_cmovno_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x42 */ iemOp_cmovc_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x43 */ iemOp_cmovnc_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x44 */ iemOp_cmove_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x45 */ iemOp_cmovne_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x46 */ iemOp_cmovbe_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x47 */ iemOp_cmovnbe_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x48 */ iemOp_cmovs_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x49 */ iemOp_cmovns_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x4a */ iemOp_cmovp_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x4b */ iemOp_cmovnp_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x4c */ iemOp_cmovl_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x4d */ iemOp_cmovnl_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x4e */ iemOp_cmovle_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x4f */ iemOp_cmovnle_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x50 */ iemOp_movmskps_Gy_Ups__movmskpd_Gy_Upd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x51 */ iemOp_sqrtps_Wps_Vps__sqrtpd_Wpd_Vpd__sqrtss_Vss_Wss__sqrtsd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x52 */ iemOp_rsqrtps_Wps_Vps__rsqrtss_Vss_Wss,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x53 */ iemOp_rcpps_Wps_Vps__rcpss_Vs_Wss,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x54 */ iemOp_andps_Vps_Wps__andpd_Wpd_Vpd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x55 */ iemOp_andnps_Vps_Wps__andnpd_Wpd_Vpd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x56 */ iemOp_orps_Wpd_Vpd__orpd_Wpd_Vpd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x57 */ iemOp_xorps_Vps_Wps__xorpd_Wpd_Vpd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x58 */ iemOp_addps_Vps_Wps__addpd_Vpd_Wpd__addss_Vss_Wss__addsd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x59 */ iemOp_mulps_Vps_Wps__mulpd_Vpd_Wpd__mulss_Vss__Wss__mulsd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x5a */ iemOp_cvtps2pd_Vpd_Wps__cvtpd2ps_Vps_Wpd__cvtss2sd_Vsd_Wss__cvtsd2ss_Vss_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x5b */ iemOp_cvtdq2ps_Vps_Wdq__cvtps2dq_Vdq_Wps__cvtps2dq_Vdq_Wps,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x5c */ iemOp_subps_Vps_Wps__subpd_Vps_Wdp__subss_Vss_Wss__subsd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x5d */ iemOp_minps_Vps_Wps__minpd_Vpd_Wpd__minss_Vss_Wss__minsd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x5e */ iemOp_divps_Vps_Wps__divpd_Vpd_Wpd__divss_Vss_Wss__divsd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x5f */ iemOp_maxps_Vps_Wps__maxpd_Vpd_Wpd__maxss_Vss_Wss__maxsd_Vsd_Wsd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x60 */ iemOp_punpcklbw_Pq_Qd__punpcklbw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x61 */ iemOp_punpcklwd_Pq_Qd__punpcklwd_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x62 */ iemOp_punpckldq_Pq_Qd__punpckldq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x63 */ iemOp_packsswb_Pq_Qq__packsswb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x64 */ iemOp_pcmpgtb_Pq_Qq__pcmpgtb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x65 */ iemOp_pcmpgtw_Pq_Qq__pcmpgtw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x66 */ iemOp_pcmpgtd_Pq_Qq__pcmpgtd_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x67 */ iemOp_packuswb_Pq_Qq__packuswb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x68 */ iemOp_punpckhbw_Pq_Qq__punpckhbw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x69 */ iemOp_punpckhwd_Pq_Qd__punpckhwd_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x6a */ iemOp_punpckhdq_Pq_Qd__punpckhdq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x6b */ iemOp_packssdw_Pq_Qd__packssdq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x6c */ iemOp_punpcklqdq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x6d */ iemOp_punpckhqdq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x6e */ iemOp_movd_q_Pd_Ey__movd_q_Vy_Ey,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x6f */ iemOp_movq_Pq_Qq__movdqa_Vdq_Wdq__movdqu_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x70 */ iemOp_pshufw_Pq_Qq_Ib__pshufd_Vdq_Wdq_Ib__pshufhw_Vdq_Wdq_Ib__pshuflq_Vdq_Wdq_Ib,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x71 */ iemOp_Grp12,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x72 */ iemOp_Grp13,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x73 */ iemOp_Grp14,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x74 */ iemOp_pcmpeqb_Pq_Qq__pcmpeqb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x75 */ iemOp_pcmpeqw_Pq_Qq__pcmpeqw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x76 */ iemOp_pcmped_Pq_Qq__pcmpeqd_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x77 */ iemOp_emms,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x78 */ iemOp_vmread_AmdGrp17,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x79 */ iemOp_vmwrite,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x7a */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x7b */ iemOp_Invalid,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x7c */ iemOp_haddpd_Vdp_Wpd__haddps_Vps_Wps,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x7d */ iemOp_hsubpd_Vpd_Wpd__hsubps_Vps_Wps,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x7e */ iemOp_movd_q_Ey_Pd__movd_q_Ey_Vy__movq_Vq_Wq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x7f */ iemOp_movq_Qq_Pq__movq_movdqa_Wdq_Vdq__movdqu_Wdq_Vdq,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x80 */ iemOp_jo_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x81 */ iemOp_jno_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x82 */ iemOp_jc_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x83 */ iemOp_jnc_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x84 */ iemOp_je_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x85 */ iemOp_jne_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x86 */ iemOp_jbe_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x87 */ iemOp_jnbe_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x88 */ iemOp_js_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x89 */ iemOp_jns_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x8a */ iemOp_jp_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x8b */ iemOp_jnp_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x8c */ iemOp_jl_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x8d */ iemOp_jnl_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x8e */ iemOp_jle_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x8f */ iemOp_jnle_Jv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x90 */ iemOp_seto_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x91 */ iemOp_setno_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x92 */ iemOp_setc_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x93 */ iemOp_setnc_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x94 */ iemOp_sete_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x95 */ iemOp_setne_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x96 */ iemOp_setbe_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x97 */ iemOp_setnbe_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x98 */ iemOp_sets_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x99 */ iemOp_setns_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x9a */ iemOp_setp_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x9b */ iemOp_setnp_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x9c */ iemOp_setl_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x9d */ iemOp_setnl_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x9e */ iemOp_setle_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x9f */ iemOp_setnle_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa0 */ iemOp_push_fs,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa1 */ iemOp_pop_fs,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa2 */ iemOp_cpuid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa3 */ iemOp_bt_Ev_Gv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa4 */ iemOp_shld_Ev_Gv_Ib,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa5 */ iemOp_shld_Ev_Gv_CL,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa6 */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa7 */ iemOp_Invalid,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa8 */ iemOp_push_gs,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xa9 */ iemOp_pop_gs,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xaa */ iemOp_rsm,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xab */ iemOp_bts_Ev_Gv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xac */ iemOp_shrd_Ev_Gv_Ib,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xad */ iemOp_shrd_Ev_Gv_CL,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xae */ iemOp_Grp15,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xaf */ iemOp_imul_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb0 */ iemOp_cmpxchg_Eb_Gb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb1 */ iemOp_cmpxchg_Ev_Gv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb2 */ iemOp_lss_Gv_Mp,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb3 */ iemOp_btr_Ev_Gv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb4 */ iemOp_lfs_Gv_Mp,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb5 */ iemOp_lgs_Gv_Mp,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb6 */ iemOp_movzx_Gv_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb7 */ iemOp_movzx_Gv_Ew,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb8 */ iemOp_popcnt_Gv_Ev_jmpe,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xb9 */ iemOp_Grp10,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xba */ iemOp_Grp8,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xbd */ iemOp_btc_Ev_Gv,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xbc */ iemOp_bsf_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xbd */ iemOp_bsr_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xbe */ iemOp_movsx_Gv_Eb,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xbf */ iemOp_movsx_Gv_Ew,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc0 */ iemOp_xadd_Eb_Gb,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc1 */ iemOp_xadd_Ev_Gv,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc2 */ iemOp_cmpps_Vps_Wps_Ib__cmppd_Vpd_Wpd_Ib__cmpss_Vss_Wss_Ib__cmpsd_Vsd_Wsd_Ib,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc3 */ iemOp_movnti_My_Gy,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc4 */ iemOp_pinsrw_Pq_Ry_Mw_Ib__pinsrw_Vdq_Ry_Mw_Ib,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc5 */ iemOp_pextrw_Gd_Nq_Ib__pextrw_Gd_Udq_Ib,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc6 */ iemOp_shufps_Vps_Wps_Ib__shufdp_Vpd_Wpd_Ib,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc7 */ iemOp_Grp9,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xc8 */ iemOp_bswap_rAX_r8,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xc9 */ iemOp_bswap_rCX_r9,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xca */ iemOp_bswap_rDX_r10,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xcb */ iemOp_bswap_rBX_r11,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xcc */ iemOp_bswap_rSP_r12,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xcd */ iemOp_bswap_rBP_r13,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xce */ iemOp_bswap_rSI_r14,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0xcf */ iemOp_bswap_rDI_r15,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd0 */ iemOp_addsubpd_Vpd_Wpd__addsubps_Vps_Wps,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd1 */ iemOp_psrlw_Pp_Qp__psrlw_Vdp_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd2 */ iemOp_psrld_Pq_Qq__psrld_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd3 */ iemOp_psrlq_Pq_Qq__psrlq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd4 */ iemOp_paddq_Pq_Qq__paddq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd5 */ iemOp_pmulq_Pq_Qq__pmullw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd6 */ iemOp_movq_Wq_Vq__movq2dq_Vdq_Nq__movdq2q_Pq_Uq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd7 */ iemOp_pmovmskb_Gd_Nq__pmovmskb_Gd_Udq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd8 */ iemOp_psubusb_Pq_Qq__psubusb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd9 */ iemOp_psubusw_Pq_Qq__psubusw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xda */ iemOp_pminub_Pq_Qq__pminub_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xdb */ iemOp_pand_Pq_Qq__pand_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xdc */ iemOp_paddusb_Pq_Qq__paddusb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xdd */ iemOp_paddusw_Pq_Qq__paddusw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xde */ iemOp_pmaxub_Pq_Qq__pamxub_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xdf */ iemOp_pandn_Pq_Qq__pandn_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe0 */ iemOp_pavgb_Pq_Qq__pavgb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe1 */ iemOp_psraw_Pq_Qq__psraw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe2 */ iemOp_psrad_Pq_Qq__psrad_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe3 */ iemOp_pavgw_Pq_Qq__pavgw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe4 */ iemOp_pmulhuw_Pq_Qq__pmulhuw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe5 */ iemOp_pmulhw_Pq_Qq__pmulhw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe6 */ iemOp_cvttpd2dq_Vdq_Wdp__cvtdq2pd_Vdq_Wpd__cvtpd2dq_Vdq_Wpd,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe7 */ iemOp_movntq_Mq_Pq__movntdq_Mdq_Vdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe8 */ iemOp_psubsb_Pq_Qq__psubsb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe9 */ iemOp_psubsw_Pq_Qq__psubsw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xea */ iemOp_pminsw_Pq_Qq__pminsw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xeb */ iemOp_por_Pq_Qq__por_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xec */ iemOp_paddsb_Pq_Qq__paddsb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xed */ iemOp_paddsw_Pq_Qq__paddsw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xee */ iemOp_pmaxsw_Pq_Qq__pmaxsw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xef */ iemOp_pxor_Pq_Qq__pxor_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf0 */ iemOp_lddqu_Vdq_Mdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf1 */ iemOp_psllw_Pq_Qq__pslw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf2 */ iemOp_psld_Pq_Qq__pslld_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf3 */ iemOp_psllq_Pq_Qq__pslq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf4 */ iemOp_pmuludq_Pq_Qq__pmuludq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf5 */ iemOp_pmaddwd_Pq_Qq__pmaddwd_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf6 */ iemOp_psadbw_Pq_Qq__psadbw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf7 */ iemOp_maskmovq_Pq_Nq__maskmovdqu_Vdq_Udq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf8 */ iemOp_psubb_Pq_Qq_psubb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf9 */ iemOp_psubw_Pq_Qq__psubw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xfa */ iemOp_psubd_Pq_Qq__psubd_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xfb */ iemOp_psubq_Pq_Qq__psbuq_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xfc */ iemOp_paddb_Pq_Qq__paddb_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xfd */ iemOp_paddw_Pq_Qq__paddw_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xfe */ iemOp_paddd_Pq_Qq__paddd_Vdq_Wdq,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xff */ iemOp_Invalid
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync};
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** @} */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** @name One byte opcodes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x00. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_add_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("add Eb,Gb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_add);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x01. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_add_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync IEMOP_MNEMONIC("add Ev,Gv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_add);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x02. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_add_Gb_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("add Gb,Eb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_add);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x03. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_add_Gv_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("add Gv,Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_add);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x04. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_add_Al_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("add al,Ib");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_add);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x05. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_add_eAX_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("add rAX,Iz");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_add);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x06. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_ES)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push es");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_ES);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x07. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_ES)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop es");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_64BIT();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_ES, pIemCpu->enmEffOpSize);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x08. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_or_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("or Eb,Gb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_or);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x09. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_or_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("or Ev,Gv ");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_or);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_or_Gb_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("or Gb,Eb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_or);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_or_Gv_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("or Gv,Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_or);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_or_Al_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("or al,Ib");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_or);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_or_eAX_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("or rAX,Iz");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_or);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_CS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push cs");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_CS);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x0f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_2byteEscape)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnTwoByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x10. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_adc_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("adc Eb,Gb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_adc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x11. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_adc_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("adc Ev,Gv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_adc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x12. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_adc_Gb_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("adc Gb,Eb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_adc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x13. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_adc_Gv_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("adc Gv,Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_adc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x14. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_adc_Al_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("adc al,Ib");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_adc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x15. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_adc_eAX_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("adc rAX,Iz");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_adc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x16. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_SS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push ss");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_SS);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x17. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_SS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop ss"); /** @todo implies instruction fusing? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_64BIT();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_SS, pIemCpu->enmEffOpSize);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x18. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sbb_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sbb Eb,Gb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_sbb);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x19. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sbb_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sbb Ev,Gv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_sbb);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x1a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sbb_Gb_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sbb Gb,Eb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_sbb);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x1b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sbb_Gv_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sbb Gv,Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_sbb);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x1c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sbb_Al_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sbb al,Ib");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_sbb);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x1d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sbb_eAX_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sbb rAX,Iz");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_sbb);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x1e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_DS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push ds");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_DS);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x1f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_DS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop ds");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_64BIT();
0bbe08c3ee3c834593be35ccfbe0183116509ae2vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_DS, pIemCpu->enmEffOpSize);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x20. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_and_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("and Eb,Gb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_and);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x21. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_and_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("and Ev,Gv");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_and);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x22. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_and_Gb_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("and Gb,Eb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_and);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x23. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_and_Gv_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("and Gv,Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_and);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x24. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_and_Al_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("and al,Ib");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_and);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x25. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_and_eAX_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("and rAX,Iz");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_and);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x26. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_seg_ES)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg es");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_ES;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->iEffSeg = X86_SREG_ES;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x27. */
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsyncFNIEMOP_DEF(iemOp_daa)
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync{
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_MNEMONIC("daa AL");
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_HLP_NO_64BIT();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_daa);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x28. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sub_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sub Eb,Gb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_sub);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x29. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sub_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sub Ev,Gv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_sub);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x2a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sub_Gb_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sub Gb,Eb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_sub);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x2b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sub_Gv_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sub Gv,Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_sub);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x2c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sub_Al_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sub al,Ib");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_sub);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x2d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sub_eAX_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sub rAX,Iz");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_sub);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x2e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_seg_CS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg cs");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_CS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->iEffSeg = X86_SREG_CS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x2f. */
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsyncFNIEMOP_DEF(iemOp_das)
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync{
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_MNEMONIC("das AL");
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_HLP_NO_64BIT();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_das);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x30. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xor_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xor Eb,Gb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_xor);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x31. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xor_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xor Ev,Gv");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_xor);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x32. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xor_Gb_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xor Gb,Eb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_xor);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x33. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xor_Gv_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xor Gv,Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_xor);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x34. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xor_Al_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xor al,Ib");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_xor);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x35. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xor_eAX_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xor rAX,Iz");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_xor);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x36. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_seg_SS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg ss");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_SS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->iEffSeg = X86_SREG_SS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x37. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_aaa);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x38. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_cmp_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("cmp Eb,Gb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo do we have to decode the whole instruction first? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_cmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x39. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_cmp_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("cmp Ev,Gv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo do we have to decode the whole instruction first? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_cmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x3a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_cmp_Gb_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("cmp Gb,Eb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_cmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x3b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_cmp_Gv_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("cmp Gv,Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_cmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x3c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_cmp_Al_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("cmp al,Ib");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_cmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x3d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_cmp_eAX_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("cmp rAX,Iz");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_cmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x3e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_seg_DS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg ds");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_DS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->iEffSeg = X86_SREG_DS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x3f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_STUB(iemOp_aas);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common 'inc/dec/not/neg register' helper.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_2(iemOpCommonUnaryGReg, PCIEMOPUNARYSIZES, pImpl, uint8_t, iReg)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU16, pu16Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU32, pu32Dst, pEFlags);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU64, pu64Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x40. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_inc_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc eAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x41. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_inc_eCX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.b");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexB = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc eCX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x42. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_inc_eDX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.x");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_X;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexIndex = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc eDX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x43. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_inc_eBX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.bx");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexB = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexIndex = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc eBX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xBX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x44. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_inc_eSP)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.r");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexReg = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc eSP");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xSP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x45. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_inc_eBP)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexReg = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexB = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc eBP");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xBP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x46. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_inc_eSI)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rx");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_X;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexReg = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexIndex = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc eSI");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xSI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x47. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_inc_eDI)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rbx");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexReg = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexB = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexIndex = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc eDI");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xDI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x48. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_dec_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.w");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_SIZE_REX_W;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iemRecalEffOpSize(pIemCpu);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec eAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_dec, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x49. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_dec_eCX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.bw");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B | IEM_OP_PRF_SIZE_REX_W;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexB = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iemRecalEffOpSize(pIemCpu);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec eCX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_dec, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x4a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_dec_eDX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.xw");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexIndex = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iemRecalEffOpSize(pIemCpu);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec eDX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_dec, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x4b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_dec_eBX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.bxw");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexB = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexIndex = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iemRecalEffOpSize(pIemCpu);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec eBX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_dec, X86_GREG_xBX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x4c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_dec_eSP)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rw");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_SIZE_REX_W;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexReg = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iemRecalEffOpSize(pIemCpu);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec eSP");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_dec, X86_GREG_xSP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x4d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_dec_eBP)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rbw");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B | IEM_OP_PRF_SIZE_REX_W;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexReg = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexB = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iemRecalEffOpSize(pIemCpu);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec eBP");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_dec, X86_GREG_xBP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x4e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_dec_eSI)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rxw");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexReg = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexIndex = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iemRecalEffOpSize(pIemCpu);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec eSI");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_dec, X86_GREG_xSI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x4f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_dec_eDI)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This is a REX prefix in 64-bit mode.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rbxw");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexReg = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexB = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->uRexIndex = 1 << 3;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iemRecalEffOpSize(pIemCpu);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec eDI");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_dec, X86_GREG_xDI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common 'push register' helper.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpCommonPushGReg, uint8_t, iReg)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iReg |= pIemCpu->uRexB;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmDefOpSize = IEMMODE_64BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmEffOpSize = !(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Value, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U16(u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Value, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U32(u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Value, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U64(u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x50. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushGReg, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x51. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_eCX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push rCX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushGReg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x52. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_eDX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push rDX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushGReg, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x53. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_eBX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push rBX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushGReg, X86_GREG_xBX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x54. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_eSP)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push rSP");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushGReg, X86_GREG_xSP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x55. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_eBP)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push rBP");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushGReg, X86_GREG_xBP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x56. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_eSI)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push rSI");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushGReg, X86_GREG_xSI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x57. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_eDI)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push rDI");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushGReg, X86_GREG_xDI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common 'pop register' helper.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpCommonPopGReg, uint8_t, iReg)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iReg |= pIemCpu->uRexB;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmDefOpSize = IEMMODE_64BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmEffOpSize = !(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, *pu16Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_POP_U16(pu16Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, *pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_POP_U32(pu32Dst);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst); /** @todo testcase*/
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, *pu64Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_POP_U64(pu64Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x58. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x59. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_eCX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop rCX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x5a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_eDX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop rDX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x5b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_eBX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop rBX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xBX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x5c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_eSP)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop rSP");
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync {
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync if (pIemCpu->uRexB)
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xSP);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync pIemCpu->enmDefOpSize = IEMMODE_64BIT;
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync pIemCpu->enmEffOpSize = !(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync }
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEMOP_HLP_DECODED_NL_1(OP_POP, IEMOPFORM_FIXED, OP_PARM_REG_ESP,
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync DISOPTYPE_HARMLESS | DISOPTYPE_DEFAULT_64_OP_SIZE | DISOPTYPE_REXB_EXTENDS_OPREG);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync /** @todo add testcase for this instruction. */
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync switch (pIemCpu->enmEffOpSize)
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync {
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync case IEMMODE_16BIT:
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_BEGIN(0, 1);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_LOCAL(uint16_t, u16Dst);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_POP_U16(&u16Dst); /** @todo not correct MC, fix later. */
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_STORE_GREG_U16(X86_GREG_xSP, u16Dst);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_ADVANCE_RIP();
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_END();
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync break;
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync case IEMMODE_32BIT:
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_BEGIN(0, 1);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_LOCAL(uint32_t, u32Dst);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_POP_U32(&u32Dst);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_STORE_GREG_U32(X86_GREG_xSP, u32Dst);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_ADVANCE_RIP();
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_END();
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync break;
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync case IEMMODE_64BIT:
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_BEGIN(0, 1);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_LOCAL(uint64_t, u64Dst);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_POP_U64(&u64Dst);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_STORE_GREG_U64(X86_GREG_xSP, u64Dst);
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_ADVANCE_RIP();
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync IEM_MC_END();
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync break;
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync }
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync
3ee592a43b83546a73bb9d6ebe5d28ba2c0db2advboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x5d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_eBP)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop rBP");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xBP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x5e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_eSI)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop rSI");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xSI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x5f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pop_eDI)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pop rDI");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xDI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x60. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pusha)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pusha");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_64BIT();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_pusha_16);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync Assert(pIemCpu->enmEffOpSize == IEMMODE_32BIT);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_pusha_32);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x61. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_popa)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("popa");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_64BIT();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_16);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync Assert(pIemCpu->enmEffOpSize == IEMMODE_32BIT);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_32);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x62. */
b5c8413901ec3070925500c7b7161cad326d8ae1vboxsyncFNIEMOP_STUB(iemOp_bound_Gv_Ma_evex);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync/** Opcode 0x63 - non-64-bit modes. */
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsyncFNIEMOP_DEF(iemOp_arpl_Ew_Gw)
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync{
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_MNEMONIC("arpl Ew,Gw");
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_HLP_NO_REAL_OR_V86_MODE();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync /* Register */
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_HLP_DECODED_NL_2(OP_ARPL, IEMOPFORM_MR_REG, OP_PARM_Ew, OP_PARM_Gw, DISOPTYPE_HARMLESS);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_BEGIN(3, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_FETCH_GREG_U16(u16Src, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK));
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_REF_EFLAGS(pEFlags);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_arpl, pu16Dst, u16Src, pEFlags);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ADVANCE_RIP();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_END();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync else
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync /* Memory */
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_BEGIN(3, 2);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEMOP_HLP_DECODED_NL_2(OP_ARPL, IEMOPFORM_MR_REG, OP_PARM_Ew, OP_PARM_Gw, DISOPTYPE_HARMLESS);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_FETCH_GREG_U16(u16Src, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_arpl, pu16Dst, u16Src, pEFlags);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_ADVANCE_RIP();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync IEM_MC_END();
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync return VINF_SUCCESS;
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync}
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync/** Opcode 0x63.
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync * @note This is a weird one. It works like a regular move instruction if
3f2d81dec06194660db7c7b3bfa8b82ea82ba89evboxsync * REX.W isn't set, at least according to AMD docs (rev 3.15, 2009-11).
3f2d81dec06194660db7c7b3bfa8b82ea82ba89evboxsync * @todo This definitely needs a testcase to verify the odd cases. */
086c6486d88cae6ec735be880561f8dc066a79cbvboxsyncFNIEMOP_DEF(iemOp_movsxd_Gv_Ev)
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync{
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync Assert(pIemCpu->enmEffOpSize == IEMMODE_64BIT); /* Caller branched already . */
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEMOP_MNEMONIC("movsxd Gv,Ev");
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync {
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync /*
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync * Register to register.
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync */
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_BEGIN(0, 1);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_LOCAL(uint64_t, u64Value);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_FETCH_GREG_U32_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_ADVANCE_RIP();
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_END();
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync }
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync else
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync {
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync /*
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync * We're loading a register from memory.
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync */
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_BEGIN(0, 2);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_LOCAL(uint64_t, u64Value);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_FETCH_MEM_U32_SX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_ADVANCE_RIP();
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync IEM_MC_END();
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync }
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync return VINF_SUCCESS;
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x64. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_seg_FS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg fs");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_FS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->iEffSeg = X86_SREG_FS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x65. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_seg_GS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg gs");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_GS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->iEffSeg = X86_SREG_GS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x66. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_op_size)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("op size");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_SIZE_OP;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iemRecalEffOpSize(pIemCpu);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x67. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_addr_size)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("addr size");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_SIZE_ADDR;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmDefAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: pIemCpu->enmEffAddrMode = IEMMODE_32BIT; break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: pIemCpu->enmEffAddrMode = IEMMODE_16BIT; break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: pIemCpu->enmEffAddrMode = IEMMODE_32BIT; break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync default: AssertFailed();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x68. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push Iz");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U16(u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U32(u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U64(u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x69. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_imul_Gv_Ev_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("imul Gv,Ev,Iz"); /* Gv = Ev * Iz; */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register operand */
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint16_t, u16Src,/*=*/ u16Imm,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory operand */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 2);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ASSIGN(u16Src, u16Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register operand */
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint32_t, u32Src,/*=*/ u32Imm,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory operand */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ASSIGN(u32Src, u32Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register operand */
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint64_t, u64Src,/*=*/ u64Imm,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory operand */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ASSIGN(u64Src, u64Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync AssertFailedReturn(VERR_INTERNAL_ERROR_3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x6a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_push_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push Ib");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U16(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U32(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U64(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x6b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_imul_Gv_Ev_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("imul Gv,Ev,Ib"); /* Gv = Ev * Iz; */
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register operand */
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint16_t, u16Src,/*=*/ (int8_t)u8Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory operand */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_S8_SX_U16(&u16Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ASSIGN(u16Src, u16Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register operand */
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint32_t, u32Src,/*=*/ (int8_t)u8Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory operand */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
191753a30242487b4c868db02adda32bb28d4ea6vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_S8_SX_U32(&u32Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ASSIGN(u32Src, u32Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register operand */
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint64_t, u64Src,/*=*/ (int8_t)u8Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory operand */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S8_SX_U64(&u64Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEM_MC_ASSIGN(u64Src, u64Imm);
eefd98087b0d2ffd437b0d535a96d8271963e17dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync AssertFailedReturn(VERR_INTERNAL_ERROR_3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x6c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_insb_Yb_DX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("rep ins Yb,DX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op8_addr16, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op8_addr32, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op8_addr64, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("ins Yb,DX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op8_addr16, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op8_addr32, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op8_addr64, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x6d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_inswd_Yv_DX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("rep ins Yv,DX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op16_addr16, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op16_addr32, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op16_addr64, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op32_addr16, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op32_addr32, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op32_addr64, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("ins Yv,DX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op16_addr16, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op16_addr32, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op16_addr64, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op32_addr16, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op32_addr32, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op32_addr64, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x6e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_outsb_Yb_DX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("rep out DX,Yb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr16, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr32, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr64, pIemCpu->iEffSeg, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("out DX,Yb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr16, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr32, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr64, pIemCpu->iEffSeg, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x6f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_outswd_Yv_DX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("rep outs DX,Yv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr16, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr32, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr64, pIemCpu->iEffSeg, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr16, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr32, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr64, pIemCpu->iEffSeg, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("outs DX,Yv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr16, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr32, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr64, pIemCpu->iEffSeg, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr16, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr32, pIemCpu->iEffSeg, false);
12274be4fe4b4519d0b51d42cc04886459a9f8cfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr64, pIemCpu->iEffSeg, false);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x70. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jo_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jo Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x71. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jno_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jno Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x72. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jc_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jc/jnae Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x73. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnc_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jnc/jnb Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x74. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_je_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("je/jz Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x75. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jne_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jne/jnz Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x76. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jbe_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jbe/jna Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x77. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnbe_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jnbe/ja Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x78. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_js_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("js Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x79. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jns_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jns Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x7a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jp_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jp Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x7b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnp_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jnp Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x7c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jl_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jl/jnge Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x7d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnl_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jnl/jge Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x7e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jle_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jle/jng Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x7f. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jnle_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jnle/jg Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x80. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp1_Eb_Ib_80)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC2("add\0or\0\0adc\0sbb\0and\0sub\0xor\0cmp" + ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)*4, "Eb,Ib");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PCIEMOPBINSIZES pImpl = g_apIemImplGrp1[(bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK];
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register target */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, u8Src, /*=*/ u8Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory target */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint32_t fAccess;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pImpl->pfnLockedU8)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_RW;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync { /* CMP */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_R;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, u8Src, /*=*/ u8Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu8Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x81. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp1_Ev_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC2("add\0or\0\0adc\0sbb\0and\0sub\0xor\0cmp" + ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)*4, "Ev,Iz");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PCIEMOPBINSIZES pImpl = g_apIemImplGrp1[(bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK];
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register target */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint16_t, u16Src, /*=*/ u16Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory target */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint32_t fAccess;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pImpl->pfnLockedU16)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_RW;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync { /* CMP, TEST */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_R;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 2);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u16Src, u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu16Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register target */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint32_t, u32Src, /*=*/ u32Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory target */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint32_t fAccess;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pImpl->pfnLockedU32)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_RW;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync { /* CMP, TEST */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_R;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u32Src, u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu32Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register target */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ u64Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory target */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint32_t fAccess;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pImpl->pfnLockedU64)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_RW;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync { /* CMP */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_R;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u64Src, u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu64Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x82. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_DEF(iemOp_Grp1_Eb_Ib_82)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_64BIT(); /** @todo do we need to decode the whole instruction or is this ok? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(iemOp_Grp1_Eb_Ib_80);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x83. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp1_Ev_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC2("add\0or\0\0adc\0sbb\0and\0sub\0xor\0cmp" + ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)*4, "Ev,Ib");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PCIEMOPBINSIZES pImpl = g_apIemImplGrp1[(bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK];
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Register target
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint16_t, u16Src, /*=*/ (int8_t)u8Imm,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint32_t, u32Src, /*=*/ (int8_t)u8Imm,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ (int8_t)u8Imm,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Memory target.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint32_t fAccess;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pImpl->pfnLockedU16)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_RW;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync { /* CMP */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync fAccess = IEM_ACCESS_DATA_R;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u16Src, (int8_t)u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu16Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u32Src, (int8_t)u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu32Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u64Src, (int8_t)u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu64Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, fAccess);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x84. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_test_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("test Eb,Gb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo do we have to decode the whole instruction first? */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_test);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x85. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_test_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("test Ev,Gv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo do we have to decode the whole instruction first? */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_test);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x86. */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncFNIEMOP_DEF(iemOp_xchg_Eb_Gb)
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEMOP_MNEMONIC("xchg Eb,Gb");
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync /*
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync * If rm is denoting a register, no more instruction bytes.
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(0, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint8_t, uTmp1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint8_t, uTmp2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U8(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U8(uTmp2, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, uTmp1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uTmp2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync else
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync /*
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync * We're accessing memory.
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync */
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync/** @todo the register must be committed separately! */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(2, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint8_t *, pu8Mem, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint8_t *, pu8Reg, 1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_MEM_MAP(pu8Mem, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_REF_GREG_U8(pu8Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u8, pu8Mem, pu8Reg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Mem, IEM_ACCESS_DATA_RW);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync}
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x87. */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsyncFNIEMOP_DEF(iemOp_xchg_Ev_Gv)
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync{
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEMOP_MNEMONIC("xchg Ev,Gv");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync /*
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync * If rm is denoting a register, no more instruction bytes.
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync switch (pIemCpu->enmEffOpSize)
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_16BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(0, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint16_t, uTmp1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint16_t, uTmp2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U16(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U16(uTmp2, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, uTmp1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uTmp2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_32BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(0, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint32_t, uTmp1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint32_t, uTmp2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U32(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U32(uTmp2, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, uTmp1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uTmp2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_64BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(0, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint64_t, uTmp1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(uint64_t, uTmp2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U64(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U64(uTmp2, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, uTmp1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uTmp2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync else
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync /*
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync * We're accessing memory.
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync switch (pIemCpu->enmEffOpSize)
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
1afc174efd532be60bfaaf42a70bc3db4ec1b675vboxsync/** @todo the register must be committed separately! */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_16BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(2, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint16_t *, pu16Mem, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint16_t *, pu16Reg, 1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_MEM_MAP(pu16Mem, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_REF_GREG_U16(pu16Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u16, pu16Mem, pu16Reg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Mem, IEM_ACCESS_DATA_RW);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_32BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(2, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint32_t *, pu32Mem, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint32_t *, pu32Reg, 1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_MEM_MAP(pu32Mem, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_REF_GREG_U32(pu32Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u32, pu32Mem, pu32Reg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Mem, IEM_ACCESS_DATA_RW);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Reg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_64BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(2, 2);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint64_t *, pu64Mem, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint64_t *, pu64Reg, 1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_MEM_MAP(pu64Mem, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_REF_GREG_U64(pu64Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u64, pu64Mem, pu64Reg);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Mem, IEM_ACCESS_DATA_RW);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ADVANCE_RIP();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x88. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Eb_Gb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Eb,Gb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint8_t bRm;
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint8_t, u8Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(u8Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u8Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're writing a register to memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint8_t, u8Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(u8Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrEffDst, u8Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x89. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Ev_Gv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Ev,Gv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're writing a register to memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrEffDst, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffDst, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x8a. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Gb_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Gb,Eb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint8_t, u8Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(u8Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u8Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're loading a register from memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint8_t, u8Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U8(u8Value, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u8Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x8b. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Gv_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Gv,Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're loading a register from memory.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync/** Opcode 0x63. */
086c6486d88cae6ec735be880561f8dc066a79cbvboxsyncFNIEMOP_DEF(iemOp_arpl_Ew_Gw_movsx_Gv_Ev)
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync{
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync if (pIemCpu->enmCpuMode != IEMMODE_64BIT)
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync return FNIEMOP_CALL(iemOp_arpl_Ew_Gw);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync return FNIEMOP_CALL(iemOp_mov_Gv_Ev);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync return FNIEMOP_CALL(iemOp_movsxd_Gv_Ev);
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync}
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync
086c6486d88cae6ec735be880561f8dc066a79cbvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x8c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Ev_Sw)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Ev,Sw");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Check that the destination register exists. The REX.R prefix is ignored.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint8_t const iSegReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ( iSegReg > X86_SREG_GS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * In that case, the operand size is respected and the upper bits are
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * cleared (starting with some pentium).
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_SREG_U16(u16Value, iSegReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_FETCH_SREG_ZX_U32(u32Value, iSegReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Value);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEM_MC_FETCH_SREG_ZX_U64(u64Value, iSegReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're saving the register to memory. The access is word sized
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * regardless of operand size prefixes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#if 0 /* not necessary */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_16BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_SREG_U16(u16Value, iSegReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x8d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_lea_Gv_M)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("lea Gv,M");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync return IEMOP_RAISE_INVALID_OPCODE(); /* no register form */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_BEGIN(0, 2);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_LOCAL(uint16_t, u16Cast);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_ASSIGN_TO_SMALLER(u16Cast, GCPtrEffSrc);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Cast);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_LOCAL(uint32_t, u32Cast);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_ASSIGN_TO_SMALLER(u32Cast, GCPtrEffSrc);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Cast);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, GCPtrEffSrc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync AssertFailedReturn(VERR_INTERNAL_ERROR_5);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x8e. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Sw_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Sw,Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * The practical operand size is 16-bit.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#if 0 /* not necessary */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_16BIT;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Check that the destination register exists and can be used with this
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * instruction. The REX.R prefix is ignored.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint8_t const iSegReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ( iSegReg == X86_SREG_CS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync || iSegReg > X86_SREG_GS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * If rm is denoting a register, no more instruction bytes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, iSRegArg, iSegReg, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Value, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
05216b943fc4c290a399c4b75356ada3e4396fe7vboxsync IEM_MC_CALL_CIMPL_2(iemCImpl_load_SReg, iSRegArg, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * We're loading the register from memory. The access is word sized
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * regardless of operand size prefixes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, iSRegArg, iSegReg, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Value, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
05216b943fc4c290a399c4b75356ada3e4396fe7vboxsync IEM_MC_CALL_CIMPL_2(iemCImpl_load_SReg, iSRegArg, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x8f /0. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_DEF_1(iemOp_pop_Ev, uint8_t, bRm)
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync{
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync /* This bugger is rather annoying as it requires rSP to be updated before
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync doing the effective address calculations. Will eventually require a
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync split between the R/M+SIB decoding and the effective address
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync calculation - which is something that is required for any attempt at
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync reusing this code for a recompiler. It may also be good to have if we
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync need to delay #UD exception caused by invalid lock prefixes.
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync For now, we'll do a mostly safe interpreter-only implementation here. */
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync /** @todo What's the deal with the 'reg' field and pop Ev? Ignorning it for
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync * now until tests show it's checked.. */
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync IEMOP_MNEMONIC("pop Ev");
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync /* Register access is relatively easy and can share code. */
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync return FNIEMOP_CALL_1(iemOpCommonPopGReg, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync /*
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync * Memory target.
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync *
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync * Intel says that RSP is incremented before it's used in any effective
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync * address calcuations. This means some serious extra annoyance here since
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync * we decode and calculate the effective address in one step and like to
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync * delay committing registers till everything is done.
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync *
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync * So, we'll decode and calculate the effective address twice. This will
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync * require some recoding if turned into a recompiler.
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync */
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE(); /* The common code does this differently. */
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#ifndef TST_IEM_CHECK_MC
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync /* Calc effective address with modified ESP. */
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync uint8_t const offOpcodeSaved = pIemCpu->offOpcode;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync RTGCPTR GCPtrEff;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync VBOXSTRICTRC rcStrict;
0516b375df438c19cf1632558bf3924d88999c1cvboxsync rcStrict = iemOpHlpCalcRmEffAddr(pIemCpu, bRm, 0, &GCPtrEff);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync if (rcStrict != VINF_SUCCESS)
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync return rcStrict;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync pIemCpu->offOpcode = offOpcodeSaved;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync uint64_t const RspSaved = pCtx->rsp;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync switch (pIemCpu->enmEffOpSize)
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync {
21d7b4f5a402e7121ab3d3bbbe7ec4e5293f5eecvboxsync case IEMMODE_16BIT: iemRegAddToRsp(pIemCpu, pCtx, 2); break;
21d7b4f5a402e7121ab3d3bbbe7ec4e5293f5eecvboxsync case IEMMODE_32BIT: iemRegAddToRsp(pIemCpu, pCtx, 4); break;
21d7b4f5a402e7121ab3d3bbbe7ec4e5293f5eecvboxsync case IEMMODE_64BIT: iemRegAddToRsp(pIemCpu, pCtx, 8); break;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync }
0516b375df438c19cf1632558bf3924d88999c1cvboxsync rcStrict = iemOpHlpCalcRmEffAddr(pIemCpu, bRm, 0, &GCPtrEff);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync Assert(rcStrict == VINF_SUCCESS);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync pCtx->rsp = RspSaved;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync /* Perform the operation - this should be CImpl. */
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync RTUINT64U TmpRsp;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync TmpRsp.u = pCtx->rsp;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync switch (pIemCpu->enmEffOpSize)
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync {
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync case IEMMODE_16BIT:
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync {
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync uint16_t u16Value;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync rcStrict = iemMemStackPopU16Ex(pIemCpu, &u16Value, &TmpRsp);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync if (rcStrict == VINF_SUCCESS)
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync rcStrict = iemMemStoreDataU16(pIemCpu, pIemCpu->iEffSeg, GCPtrEff, u16Value);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync break;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync }
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync case IEMMODE_32BIT:
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync {
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync uint32_t u32Value;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync rcStrict = iemMemStackPopU32Ex(pIemCpu, &u32Value, &TmpRsp);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync if (rcStrict == VINF_SUCCESS)
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync rcStrict = iemMemStoreDataU32(pIemCpu, pIemCpu->iEffSeg, GCPtrEff, u32Value);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync break;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync }
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync case IEMMODE_64BIT:
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync {
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync uint64_t u64Value;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync rcStrict = iemMemStackPopU64Ex(pIemCpu, &u64Value, &TmpRsp);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync if (rcStrict == VINF_SUCCESS)
79529952d95b78a76f5d65258a7d51321b23a7favboxsync rcStrict = iemMemStoreDataU64(pIemCpu, pIemCpu->iEffSeg, GCPtrEff, u64Value);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync break;
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync }
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync }
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync if (rcStrict == VINF_SUCCESS)
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync {
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync pCtx->rsp = TmpRsp.u;
55a869e5baf4d59cbbed83f6245111778f3095f2vboxsync iemRegUpdateRipAndClearRF(pIemCpu);
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync }
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync return rcStrict;
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#else
a4b800433571901dfbe3fe952d6ddfe1a8be70b2vboxsync return VERR_IEM_IPE_2;
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync#endif
f44d6fa3e2499e24568e13bf478400381a5493b1vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync/** Opcode 0x8f. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsyncFNIEMOP_DEF(iemOp_Grp1A)
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync{
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
b5c8413901ec3070925500c7b7161cad326d8ae1vboxsync if ((bRm & X86_MODRM_REG_MASK) == (0 << X86_MODRM_REG_SHIFT)) /* /0 */
b5c8413901ec3070925500c7b7161cad326d8ae1vboxsync return FNIEMOP_CALL_1(iemOp_pop_Ev, bRm);
b5c8413901ec3070925500c7b7161cad326d8ae1vboxsync
b5c8413901ec3070925500c7b7161cad326d8ae1vboxsync /* AMD has defined /1 thru /7 as XOP prefix (similar to three byte VEX). */
b5c8413901ec3070925500c7b7161cad326d8ae1vboxsync /** @todo XOP decoding. */
b5c8413901ec3070925500c7b7161cad326d8ae1vboxsync IEMOP_MNEMONIC("3-byte-xop");
b5c8413901ec3070925500c7b7161cad326d8ae1vboxsync return IEMOP_RAISE_INVALID_OPCODE();
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync}
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common 'xchg reg,rAX' helper.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpCommonXchgGRegRax, uint8_t, iReg)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync iReg |= pIemCpu->uRexB;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Tmp1, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Tmp2, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(X86_GREG_xAX, u16Tmp1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(iReg, u16Tmp2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Tmp1, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Tmp2, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(X86_GREG_xAX, u32Tmp1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(iReg, u32Tmp2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Tmp1, iReg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Tmp2, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(X86_GREG_xAX, u64Tmp1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(iReg, u64Tmp2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x90. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_nop)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* R8/R8D and RAX/EAX can be exchanged. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REX_B)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xchg r8,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonXchgGRegRax, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("pause");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("nop");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x91. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xchg_eCX_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xchg rCX,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonXchgGRegRax, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x92. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xchg_eDX_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xchg rDX,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonXchgGRegRax, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x93. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xchg_eBX_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xchg rBX,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonXchgGRegRax, X86_GREG_xBX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x94. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xchg_eSP_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xchg rSX,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonXchgGRegRax, X86_GREG_xSP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x95. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xchg_eBP_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xchg rBP,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonXchgGRegRax, X86_GREG_xBP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x96. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xchg_eSI_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xchg rSI,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonXchgGRegRax, X86_GREG_xSI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x97. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_xchg_eDI_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("xchg rDI,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonXchgGRegRax, X86_GREG_xDI);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x98. */
450cd10a4138f0ef40c949455cee0487f53ce26avboxsyncFNIEMOP_DEF(iemOp_cbw)
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync{
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEMOP_HLP_NO_LOCK_PREFIX();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync switch (pIemCpu->enmEffOpSize)
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync {
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync case IEMMODE_16BIT:
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEMOP_MNEMONIC("cbw");
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_BEGIN(0, 1);
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_IF_GREG_BIT_SET(X86_GREG_xAX, 7) {
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_OR_GREG_U16(X86_GREG_xAX, UINT16_C(0xff00));
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync } IEM_MC_ELSE() {
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_AND_GREG_U16(X86_GREG_xAX, UINT16_C(0x00ff));
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync } IEM_MC_ENDIF();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_ADVANCE_RIP();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_END();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync return VINF_SUCCESS;
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync case IEMMODE_32BIT:
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEMOP_MNEMONIC("cwde");
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_BEGIN(0, 1);
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_IF_GREG_BIT_SET(X86_GREG_xAX, 15) {
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_OR_GREG_U32(X86_GREG_xAX, UINT32_C(0xffff0000));
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync } IEM_MC_ELSE() {
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_AND_GREG_U32(X86_GREG_xAX, UINT32_C(0x0000ffff));
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync } IEM_MC_ENDIF();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_ADVANCE_RIP();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_END();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync return VINF_SUCCESS;
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync case IEMMODE_64BIT:
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEMOP_MNEMONIC("cdqe");
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_BEGIN(0, 1);
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_IF_GREG_BIT_SET(X86_GREG_xAX, 31) {
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_OR_GREG_U64(X86_GREG_xAX, UINT64_C(0xffffffff00000000));
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync } IEM_MC_ELSE() {
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_AND_GREG_U64(X86_GREG_xAX, UINT64_C(0x00000000ffffffff));
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync } IEM_MC_ENDIF();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_ADVANCE_RIP();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_MC_END();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync return VINF_SUCCESS;
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync }
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x99. */
e41f0459369a6d814aa36bf4def225482fc56026vboxsyncFNIEMOP_DEF(iemOp_cwd)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync{
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffOpSize)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("cwd");
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_BEGIN(0, 1);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_IF_GREG_BIT_SET(X86_GREG_xAX, 15) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U16_CONST(X86_GREG_xDX, UINT16_C(0xffff));
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U16_CONST(X86_GREG_xDX, 0);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ENDIF();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ADVANCE_RIP();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_END();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync return VINF_SUCCESS;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT:
450cd10a4138f0ef40c949455cee0487f53ce26avboxsync IEMOP_MNEMONIC("cdq");
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_BEGIN(0, 1);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_IF_GREG_BIT_SET(X86_GREG_xAX, 31) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U32_CONST(X86_GREG_xDX, UINT32_C(0xffffffff));
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U32_CONST(X86_GREG_xDX, 0);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ENDIF();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ADVANCE_RIP();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_END();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync return VINF_SUCCESS;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("cqo");
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_BEGIN(0, 1);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_IF_GREG_BIT_SET(X86_GREG_xAX, 63) {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U64_CONST(X86_GREG_xDX, UINT64_C(0xffffffffffffffff));
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ELSE() {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_MC_STORE_GREG_U64_CONST(X86_GREG_xDX, 0);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ENDIF();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ADVANCE_RIP();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_END();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync return VINF_SUCCESS;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x9a. */
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsyncFNIEMOP_DEF(iemOp_call_Ap)
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync{
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync IEMOP_MNEMONIC("call Ap");
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync IEMOP_HLP_NO_64BIT();
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync /* Decode the far pointer address and pass it on to the far call C implementation. */
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync uint32_t offSeg;
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync if (pIemCpu->enmEffOpSize != IEMMODE_16BIT)
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync IEM_OPCODE_GET_NEXT_U32(&offSeg);
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync else
37fd636275891bcf75bd60c624d8fbf3f262c435vboxsync IEM_OPCODE_GET_NEXT_U16_ZX_U32(&offSeg);
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync uint16_t uSel; IEM_OPCODE_GET_NEXT_U16(&uSel);
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_callf, uSel, offSeg, pIemCpu->enmEffOpSize);
7b8020f3bcdad4806ec3c7728d9f688d37fcfdc8vboxsync}
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync/** Opcode 0x9b. (aka fwait) */
d4a8f6749f70bad88edc04de808643d372faa35avboxsyncFNIEMOP_DEF(iemOp_wait)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync{
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEMOP_MNEMONIC("wait");
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEMOP_HLP_NO_LOCK_PREFIX();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 0);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
d4a8f6749f70bad88edc04de808643d372faa35avboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x9c. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_pushf_Fv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_pushf, pIemCpu->enmEffOpSize);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x9d. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_popf_Fv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_popf, pIemCpu->enmEffOpSize);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x9e. */
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsyncFNIEMOP_DEF(iemOp_sahf)
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync{
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEMOP_MNEMONIC("sahf");
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
8b148a9b18f1df43970276614ab624e85d42f156vboxsync if ( pIemCpu->enmCpuMode == IEMMODE_64BIT
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync && !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fLahfSahf)
8b148a9b18f1df43970276614ab624e85d42f156vboxsync return IEMOP_RAISE_INVALID_OPCODE();
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_BEGIN(0, 2);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_LOCAL(uint32_t, u32Flags);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_LOCAL(uint32_t, EFlags);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_FETCH_EFLAGS(EFlags);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_FETCH_GREG_U8_ZX_U32(u32Flags, X86_GREG_xSP/*=AH*/);
8b148a9b18f1df43970276614ab624e85d42f156vboxsync IEM_MC_AND_LOCAL_U32(u32Flags, X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_AND_LOCAL_U32(EFlags, UINT32_C(0xffffff00));
8b148a9b18f1df43970276614ab624e85d42f156vboxsync IEM_MC_OR_LOCAL_U32(u32Flags, X86_EFL_1);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_OR_2LOCS_U32(EFlags, u32Flags);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_ADVANCE_RIP();
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_END();
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync return VINF_SUCCESS;
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync}
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0x9f. */
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsyncFNIEMOP_DEF(iemOp_lahf)
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync{
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEMOP_MNEMONIC("lahf");
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
8b148a9b18f1df43970276614ab624e85d42f156vboxsync if ( pIemCpu->enmCpuMode == IEMMODE_64BIT
d23ef84f5789f32a04282733f27a7d802cfb535fvboxsync && !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fLahfSahf)
8b148a9b18f1df43970276614ab624e85d42f156vboxsync return IEMOP_RAISE_INVALID_OPCODE();
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_BEGIN(0, 1);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_LOCAL(uint8_t, u8Flags);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_FETCH_EFLAGS_U8(u8Flags);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_STORE_GREG_U8(X86_GREG_xSP/*=AH*/, u8Flags);
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_ADVANCE_RIP();
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync IEM_MC_END();
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync return VINF_SUCCESS;
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync}
a503c3ae609c4935aacdecebd3eefcf8e84d306dvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Macro used by iemOp_mov_Al_Ob, iemOp_mov_rAX_Ov, iemOp_mov_Ob_AL and
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * iemOp_mov_Ov_rAX to fetch the moffsXX bit of the opcode and fend of lock
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * prefixes. Will return on failures.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param a_GCPtrMemOff The variable to store the offset in.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#define IEMOP_FETCH_MOFFS_XX(a_GCPtrMemOff) \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync do \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync { \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode) \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync { \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: \
37fd636275891bcf75bd60c624d8fbf3f262c435vboxsync IEM_OPCODE_GET_NEXT_U16_ZX_U64(&(a_GCPtrMemOff)); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break; \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: \
37fd636275891bcf75bd60c624d8fbf3f262c435vboxsync IEM_OPCODE_GET_NEXT_U32_ZX_U64(&(a_GCPtrMemOff)); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break; \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: \
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_OPCODE_GET_NEXT_U64(&(a_GCPtrMemOff)); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break; \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } while (0)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Al_Ob)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Get the offset and fend of lock prefixes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTGCPTR GCPtrMemOff;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_FETCH_MOFFS_XX(GCPtrMemOff);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Fetch AL.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint8_t, u8Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U8(u8Tmp, pIemCpu->iEffSeg, GCPtrMemOff);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_rAX_Ov)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Get the offset and fend of lock prefixes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync IEMOP_MNEMONIC("mov rAX,Ov");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTGCPTR GCPtrMemOff;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_FETCH_MOFFS_XX(GCPtrMemOff);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Fetch rAX.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrMemOff);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(X86_GREG_xAX, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrMemOff);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(X86_GREG_xAX, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrMemOff);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(X86_GREG_xAX, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Ob_AL)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Get the offset and fend of lock prefixes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTGCPTR GCPtrMemOff;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_FETCH_MOFFS_XX(GCPtrMemOff);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Store AL.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint8_t, u8Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(u8Tmp, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrMemOff, u8Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_Ov_rAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Get the offset and fend of lock prefixes.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTGCPTR GCPtrMemOff;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_FETCH_MOFFS_XX(GCPtrMemOff);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Store rAX.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Tmp, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrMemOff, u16Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Tmp, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrMemOff, u32Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Tmp, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrMemOff, u64Tmp);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Macro used by iemOp_movsb_Xb_Yb and iemOp_movswd_Xv_Yv */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#define IEM_MOVS_CASE(ValBits, AddrBits) \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint##ValBits##_t, uValue); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_LOCAL(RTGCPTR, uAddr); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xSI); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U##ValBits(uValue, pIemCpu->iEffSeg, uAddr); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xDI); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U##ValBits(X86_SREG_ES, uAddr, uValue); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_DF) { \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SUB_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SUB_GREG_U##AddrBits(X86_GREG_xSI, ValBits / 8); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() { \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADD_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADD_GREG_U##AddrBits(X86_GREG_xSI, ValBits / 8); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF(); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP(); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa4. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_movsb_Xb_Yb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("rep movsb Xb,Yb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr16, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr32, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr64, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("movsb Xb,Yb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Sharing case implementation with movs[wdq] below.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: IEM_MOVS_CASE(8, 16); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: IEM_MOVS_CASE(8, 32); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: IEM_MOVS_CASE(8, 64); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa5. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_movswd_Xv_Yv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("rep movs Xv,Yv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr16, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr32, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr64, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr16, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr32, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr64, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op64_addr32, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op64_addr64, pIemCpu->iEffSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("movs Xv,Yv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Annoying double switch here.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Using ugly macro for implementing the cases, sharing it with movsb.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: IEM_MOVS_CASE(16, 16); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: IEM_MOVS_CASE(16, 32); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: IEM_MOVS_CASE(16, 64); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: IEM_MOVS_CASE(32, 16); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: IEM_MOVS_CASE(32, 32); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: IEM_MOVS_CASE(32, 64); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_4); /* cannot be encoded */ break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: IEM_MOVS_CASE(64, 32); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: IEM_MOVS_CASE(64, 64); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#undef IEM_MOVS_CASE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync/** Macro used by iemOp_cmpsb_Xb_Yb and iemOp_cmpswd_Xv_Yv */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync#define IEM_CMPS_CASE(ValBits, AddrBits) \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_BEGIN(3, 3); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ARG(uint##ValBits##_t *, puValue1, 0); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ARG(uint##ValBits##_t, uValue2, 1); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_LOCAL(uint##ValBits##_t, uValue1); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_LOCAL(RTGCPTR, uAddr); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xSI); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_FETCH_MEM_U##ValBits(uValue1, pIemCpu->iEffSeg, uAddr); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xDI); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_FETCH_MEM_U##ValBits(uValue2, X86_SREG_ES, uAddr); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_REF_LOCAL(puValue1, uValue1); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_REF_EFLAGS(pEFlags); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cmp_u##ValBits, puValue1, uValue2, pEFlags); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_DF) { \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_SUB_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_SUB_GREG_U##AddrBits(X86_GREG_xSI, ValBits / 8); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() { \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADD_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADD_GREG_U##AddrBits(X86_GREG_xSI, ValBits / 8); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF(); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP(); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END(); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa6. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_cmpsb_Xb_Yb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REPZ)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("repe cmps Xb,Yb");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr16, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr32, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr64, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REPNZ)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("repe cmps Xb,Yb");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr16, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr32, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr64, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("cmps Xb,Yb");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Sharing case implementation with cmps[wdq] below.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: IEM_CMPS_CASE(8, 16); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: IEM_CMPS_CASE(8, 32); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: IEM_CMPS_CASE(8, 64); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa7. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_cmpswd_Xv_Yv)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REPZ)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("repe cmps Xv,Yv");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffOpSize)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr16, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr32, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr64, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr16, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr32, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr64, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_3);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op64_addr32, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op64_addr64, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REPNZ)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("repne cmps Xv,Yv");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffOpSize)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr16, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr32, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr64, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr16, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr32, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr64, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_3);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op64_addr32, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op64_addr64, pIemCpu->iEffSeg);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("cmps Xv,Yv");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Annoying double switch here.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Using ugly macro for implementing the cases, sharing it with cmpsb.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffOpSize)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: IEM_CMPS_CASE(16, 16); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: IEM_CMPS_CASE(16, 32); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: IEM_CMPS_CASE(16, 64); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: IEM_CMPS_CASE(32, 16); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: IEM_CMPS_CASE(32, 32); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: IEM_CMPS_CASE(32, 64); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_4); /* cannot be encoded */ break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: IEM_CMPS_CASE(64, 32); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: IEM_CMPS_CASE(64, 64); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync#undef IEM_CMPS_CASE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa8. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_test_AL_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("test al,Ib");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_test);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xa9. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_test_eAX_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("test rAX,Iz");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_test);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Macro used by iemOp_stosb_Yb_AL and iemOp_stoswd_Yv_eAX */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#define IEM_STOS_CASE(ValBits, AddrBits) \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint##ValBits##_t, uValue); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_LOCAL(RTGCPTR, uAddr); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U##ValBits(uValue, X86_GREG_xAX); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xDI); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U##ValBits(X86_SREG_ES, uAddr, uValue); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_DF) { \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SUB_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() { \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADD_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF(); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP(); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END(); \
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xaa. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_stosb_Yb_AL)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("rep stos Yb,al");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_al_m16);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_al_m32);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_al_m64);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("stos Yb,al");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Sharing case implementation with stos[wdq] below.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: IEM_STOS_CASE(8, 16); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: IEM_STOS_CASE(8, 32); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: IEM_STOS_CASE(8, 64); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xab. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_stoswd_Yv_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("rep stos Yv,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_ax_m16);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_ax_m32);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_ax_m64);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_eax_m16);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_eax_m32);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_eax_m64);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_rax_m32);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_rax_m64);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("stos Yv,rAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Annoying double switch here.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Using ugly macro for implementing the cases, sharing it with stosb.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: IEM_STOS_CASE(16, 16); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: IEM_STOS_CASE(16, 32); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: IEM_STOS_CASE(16, 64); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: IEM_STOS_CASE(32, 16); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: IEM_STOS_CASE(32, 32); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: IEM_STOS_CASE(32, 64); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_4); /* cannot be encoded */ break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT: IEM_STOS_CASE(64, 32); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT: IEM_STOS_CASE(64, 64); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#undef IEM_STOS_CASE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync/** Macro used by iemOp_lodsb_AL_Xb and iemOp_lodswd_eAX_Xv */
e41f0459369a6d814aa36bf4def225482fc56026vboxsync#define IEM_LODS_CASE(ValBits, AddrBits) \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_BEGIN(0, 2); \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_LOCAL(uint##ValBits##_t, uValue); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_LOCAL(RTGCPTR, uAddr); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xSI); \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_FETCH_MEM_U##ValBits(uValue, pIemCpu->iEffSeg, uAddr); \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_STORE_GREG_U##ValBits(X86_GREG_xAX, uValue); \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_DF) { \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_SUB_GREG_U##AddrBits(X86_GREG_xSI, ValBits / 8); \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ELSE() { \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ADD_GREG_U##AddrBits(X86_GREG_xSI, ValBits / 8); \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ENDIF(); \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_ADVANCE_RIP(); \
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_END();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xac. */
e41f0459369a6d814aa36bf4def225482fc56026vboxsyncFNIEMOP_DEF(iemOp_lodsb_AL_Xb)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync{
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
e41f0459369a6d814aa36bf4def225482fc56026vboxsync */
e41f0459369a6d814aa36bf4def225482fc56026vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("rep lodsb al,Xb");
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffAddrMode)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m16, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m32, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m64, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("lodsb al,Xb");
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync /*
e41f0459369a6d814aa36bf4def225482fc56026vboxsync * Sharing case implementation with stos[wdq] below.
e41f0459369a6d814aa36bf4def225482fc56026vboxsync */
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffAddrMode)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT: IEM_LODS_CASE(8, 16); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT: IEM_LODS_CASE(8, 32); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT: IEM_LODS_CASE(8, 64); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync return VINF_SUCCESS;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xad. */
e41f0459369a6d814aa36bf4def225482fc56026vboxsyncFNIEMOP_DEF(iemOp_lodswd_eAX_Xv)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync{
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
e41f0459369a6d814aa36bf4def225482fc56026vboxsync */
e41f0459369a6d814aa36bf4def225482fc56026vboxsync if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("rep lods rAX,Xv");
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffOpSize)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffAddrMode)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m16, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m32, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m64, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffAddrMode)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m16, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m32, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m64, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffAddrMode)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_3);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_rax_m32, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_rax_m64, pIemCpu->iEffSeg);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("lods rAX,Xv");
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync /*
e41f0459369a6d814aa36bf4def225482fc56026vboxsync * Annoying double switch here.
e41f0459369a6d814aa36bf4def225482fc56026vboxsync * Using ugly macro for implementing the cases, sharing it with lodsb.
e41f0459369a6d814aa36bf4def225482fc56026vboxsync */
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffOpSize)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffAddrMode)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT: IEM_LODS_CASE(16, 16); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT: IEM_LODS_CASE(16, 32); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT: IEM_LODS_CASE(16, 64); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffAddrMode)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT: IEM_LODS_CASE(32, 16); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT: IEM_LODS_CASE(32, 32); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT: IEM_LODS_CASE(32, 64); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT:
e41f0459369a6d814aa36bf4def225482fc56026vboxsync switch (pIemCpu->enmEffAddrMode)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_4); /* cannot be encoded */ break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_32BIT: IEM_LODS_CASE(64, 32); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync case IEMMODE_64BIT: IEM_LODS_CASE(64, 64); break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync break;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync return VINF_SUCCESS;
e41f0459369a6d814aa36bf4def225482fc56026vboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync#undef IEM_LODS_CASE
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync/** Macro used by iemOp_scasb_AL_Xb and iemOp_scaswd_eAX_Xv */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync#define IEM_SCAS_CASE(ValBits, AddrBits) \
9a6d39f9b24d868876d8ae540318c4e5496db8bfvboxsync IEM_MC_BEGIN(3, 2); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ARG(uint##ValBits##_t *, puRax, 0); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ARG(uint##ValBits##_t, uValue, 1); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2); \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_LOCAL(RTGCPTR, uAddr); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync \
1eab329ce9690ad59fd3ecbd826c94baf6d7f9fevboxsync IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xDI); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_FETCH_MEM_U##ValBits(uValue, X86_SREG_ES, uAddr); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_REF_GREG_U##ValBits(puRax, X86_GREG_xAX); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_REF_EFLAGS(pEFlags); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cmp_u##ValBits, puRax, uValue, pEFlags); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_DF) { \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_SUB_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ELSE() { \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADD_GREG_U##AddrBits(X86_GREG_xDI, ValBits / 8); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync } IEM_MC_ENDIF(); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_ADVANCE_RIP(); \
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_MC_END();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xae. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_scasb_AL_Xb)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REPZ)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("repe scasb al,Xb");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_al_m16);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_al_m32);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_al_m64);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REPNZ)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("repne scasb al,Xb");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_al_m16);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_al_m32);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_al_m64);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("scasb al,Xb");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Sharing case implementation with stos[wdq] below.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: IEM_SCAS_CASE(8, 16); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: IEM_SCAS_CASE(8, 32); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: IEM_SCAS_CASE(8, 64); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xaf. */
b1e4667c5a9588bd509d569ce252127891b44923vboxsyncFNIEMOP_DEF(iemOp_scaswd_eAX_Xv)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync{
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Use the C implementation if a repeat prefix is encountered.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REPZ)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("repe scas rAX,Xv");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffOpSize)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_ax_m16);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_ax_m32);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_ax_m64);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_eax_m16);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_eax_m32);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_eax_m64);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_3); /** @todo It's this wrong, we can do 16-bit addressing in 64-bit mode, but not 32-bit. right? */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_rax_m32);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_rax_m64);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync if (pIemCpu->fPrefixes & IEM_OP_PRF_REPNZ)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("repne scas rAX,Xv");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffOpSize)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m16);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m32);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m64);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m16);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m32);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m64);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_3);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_rax_m32);
4edc278439db2c83a5a59a104ec85e379d4c07dfvboxsync case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_rax_m64);
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEMOP_MNEMONIC("scas rAX,Xv");
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync /*
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Annoying double switch here.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync * Using ugly macro for implementing the cases, sharing it with scasb.
b1e4667c5a9588bd509d569ce252127891b44923vboxsync */
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffOpSize)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: IEM_SCAS_CASE(16, 16); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: IEM_SCAS_CASE(16, 32); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: IEM_SCAS_CASE(16, 64); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: IEM_SCAS_CASE(32, 16); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: IEM_SCAS_CASE(32, 32); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: IEM_SCAS_CASE(32, 64); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT:
b1e4667c5a9588bd509d569ce252127891b44923vboxsync switch (pIemCpu->enmEffAddrMode)
b1e4667c5a9588bd509d569ce252127891b44923vboxsync {
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_16BIT: AssertFailedReturn(VERR_INTERNAL_ERROR_4); /* cannot be encoded */ break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_32BIT: IEM_SCAS_CASE(64, 32); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync case IEMMODE_64BIT: IEM_SCAS_CASE(64, 64); break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync break;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
b1e4667c5a9588bd509d569ce252127891b44923vboxsync }
b1e4667c5a9588bd509d569ce252127891b44923vboxsync return VINF_SUCCESS;
b1e4667c5a9588bd509d569ce252127891b44923vboxsync}
b1e4667c5a9588bd509d569ce252127891b44923vboxsync
b1e4667c5a9588bd509d569ce252127891b44923vboxsync#undef IEM_SCAS_CASE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common 'mov r8, imm8' helper.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpCommonMov_r8_Ib, uint8_t, iReg)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL_CONST(uint8_t, u8Value,/*=*/ u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U8(iReg, u8Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_AL_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov AL,Ib");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xAX | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_CL_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov CL,Ib");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xCX | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_DL_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov DL,Ib");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xDX | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_BL_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov BL,Ib");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xBX | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb4. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_mov_AH_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov AH,Ib");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xSP | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb5. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_CH_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov CH,Ib");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xBP | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb6. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_DH_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov DH,Ib");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xSI | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_BH_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov BH,Ib");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xDI | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common 'mov regX,immX' helper.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOpCommonMov_Rv_Iv, uint8_t, iReg)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL_CONST(uint16_t, u16Value,/*=*/ u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16(iReg, u16Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL_CONST(uint32_t, u32Value,/*=*/ u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32(iReg, u32Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
9764e7f62ebac0a206757c5f4cad69d18227920bvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_U64(&u64Imm); /* 64-bit immediate! */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL_CONST(uint64_t, u64Value,/*=*/ u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64(iReg, u64Value);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb8. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_eAX_Iv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov rAX,IV");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xAX | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xb9. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_eCX_Iv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov rCX,IV");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xCX | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xba. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_eDX_Iv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov rDX,IV");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xDX | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xbb. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_eBX_Iv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov rBX,IV");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xBX | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xbc. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_eSP_Iv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov rSP,IV");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xSP | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xbd. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_eBP_Iv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov rBP,IV");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xBP | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xbe. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_eSI_Iv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov rSI,IV");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xSI | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xbf. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_eDI_Iv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov rDI,IV");
f46902c4bc5a4dfcb2b5acf80e329b94b4dd0587vboxsync return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xDI | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp2_Eb_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PCIEMOPSHIFTSIZES pImpl;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: pImpl = &g_iemAImpl_rol; IEMOP_MNEMONIC("rol Eb,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: pImpl = &g_iemAImpl_ror; IEMOP_MNEMONIC("ror Eb,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2: pImpl = &g_iemAImpl_rcl; IEMOP_MNEMONIC("rcl Eb,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3: pImpl = &g_iemAImpl_rcr; IEMOP_MNEMONIC("rcr Eb,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 4: pImpl = &g_iemAImpl_shl; IEMOP_MNEMONIC("shl Eb,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5: pImpl = &g_iemAImpl_shr; IEMOP_MNEMONIC("shr Eb,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7: pImpl = &g_iemAImpl_sar; IEMOP_MNEMONIC("sar Eb,Ib"); break;
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
c32de3017eee1c2fa8eb76c3bae4c178571fac42vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe stupid */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg, cShift, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(cShiftArg, cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp2_Ev_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PCIEMOPSHIFTSIZES pImpl;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: pImpl = &g_iemAImpl_rol; IEMOP_MNEMONIC("rol Ev,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: pImpl = &g_iemAImpl_ror; IEMOP_MNEMONIC("ror Ev,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2: pImpl = &g_iemAImpl_rcl; IEMOP_MNEMONIC("rcl Ev,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3: pImpl = &g_iemAImpl_rcr; IEMOP_MNEMONIC("rcr Ev,Ib"); break;
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync case 4: pImpl = &g_iemAImpl_shl; IEMOP_MNEMONIC("shl Ev,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5: pImpl = &g_iemAImpl_shr; IEMOP_MNEMONIC("shr Ev,Ib"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7: pImpl = &g_iemAImpl_sar; IEMOP_MNEMONIC("sar Ev,Ib"); break;
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
c32de3017eee1c2fa8eb76c3bae4c178571fac42vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe stupid */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg, cShift, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg, cShift, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg, cShift, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(cShiftArg, cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(cShiftArg, cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(cShiftArg, cShift);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc2. */
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsyncFNIEMOP_DEF(iemOp_retn_Iw)
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync{
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEMOP_MNEMONIC("retn Iw");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retn, pIemCpu->enmEffOpSize, u16Imm);
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_retn)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("retn");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retn, pIemCpu->enmEffOpSize, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc4. */
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsyncFNIEMOP_DEF(iemOp_les_Gv_Mp_vex2)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync if ( pIemCpu->enmCpuMode == IEMMODE_64BIT
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync || (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync {
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_MNEMONIC("2-byte-vex");
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync /* The LES instruction is invalid 64-bit mode. In legacy and
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync compatability mode it is invalid with MOD=3.
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync The use as a VEX prefix is made possible by assigning the inverted
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync REX.R to the top MOD bit, and the top bit in the inverted register
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync specifier to the bottom MOD bit, thereby effectively limiting 32-bit
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync to accessing registers 0..7 in this VEX form. */
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync /** @todo VEX: Just use new tables for it. */
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync return IEMOP_RAISE_INVALID_OPCODE();
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync }
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEMOP_MNEMONIC("les Gv,Mp");
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_ES, bRm);
e41f0459369a6d814aa36bf4def225482fc56026vboxsync}
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc5. */
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsyncFNIEMOP_DEF(iemOp_lds_Gv_Mp_vex3)
e41f0459369a6d814aa36bf4def225482fc56026vboxsync{
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync /* The LDS instruction is invalid 64-bit mode. In legacy and
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync compatability mode it is invalid with MOD=3.
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync The use as a VEX prefix is made possible by assigning the inverted
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync REX.R and REX.X to the two MOD bits, since the REX bits are ignored
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync outside of 64-bit mode. VEX is not available in real or v86 mode. */
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync if (pIemCpu->enmCpuMode != IEMMODE_64BIT)
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync {
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync {
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEMOP_MNEMONIC("lds Gv,Mp");
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_DS, bRm);
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync }
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEMOP_HLP_NO_REAL_OR_V86_MODE();
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync }
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEMOP_MNEMONIC("3-byte-vex");
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync /** @todo Test when exctly the VEX conformance checks kick in during
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync * instruction decoding and fetching (using \#PF). */
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync uint8_t bVex1; IEM_OPCODE_GET_NEXT_U8(&bVex1);
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync uint8_t bVex2; IEM_OPCODE_GET_NEXT_U8(&bVex2);
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync uint8_t bOpcode; IEM_OPCODE_GET_NEXT_U8(&bOpcode);
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync#if 0 /* will make sense of this next week... */
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync if ( !(pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX))
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync &&
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync )
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync {
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync }
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync#endif
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync /** @todo VEX: Just use new tables for it. */
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync return IEMOP_RAISE_INVALID_OPCODE();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc6. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp11_Eb_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Eb,Ib");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register access */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory access. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrEffDst, u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp11_Ev_Iz)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mov Ev,Iz");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register access */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
9764e7f62ebac0a206757c5f4cad69d18227920bvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory access. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 2);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrEffDst, u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
9764e7f62ebac0a206757c5f4cad69d18227920bvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffDst, u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc8. */
a16f9305ee0f4dd7723fc312b091ac7705dba237vboxsyncFNIEMOP_DEF(iemOp_enter_Iw_Ib)
a16f9305ee0f4dd7723fc312b091ac7705dba237vboxsync{
a16f9305ee0f4dd7723fc312b091ac7705dba237vboxsync IEMOP_MNEMONIC("enter Iw,Ib");
a16f9305ee0f4dd7723fc312b091ac7705dba237vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
a16f9305ee0f4dd7723fc312b091ac7705dba237vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
a16f9305ee0f4dd7723fc312b091ac7705dba237vboxsync uint16_t cbFrame; IEM_OPCODE_GET_NEXT_U16(&cbFrame);
a16f9305ee0f4dd7723fc312b091ac7705dba237vboxsync uint8_t u8NestingLevel; IEM_OPCODE_GET_NEXT_U8(&u8NestingLevel);
a16f9305ee0f4dd7723fc312b091ac7705dba237vboxsync return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_enter, pIemCpu->enmEffOpSize, cbFrame, u8NestingLevel);
a16f9305ee0f4dd7723fc312b091ac7705dba237vboxsync}
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
b64efece437bfca8872b81be9d0568ba90389d91vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xc9. */
b64efece437bfca8872b81be9d0568ba90389d91vboxsyncFNIEMOP_DEF(iemOp_leave)
b64efece437bfca8872b81be9d0568ba90389d91vboxsync{
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_MNEMONIC("retn");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
b64efece437bfca8872b81be9d0568ba90389d91vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_leave, pIemCpu->enmEffOpSize);
b64efece437bfca8872b81be9d0568ba90389d91vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xca. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_retf_Iw)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("retf Iw");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retf, pIemCpu->enmEffOpSize, u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xcb. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_retf)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("retf");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
6e9b663a1ac9b2adc21436da50bf52d56c8950b7vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retf, pIemCpu->enmEffOpSize, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xcc. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_int_3)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_int, X86_XCPT_BP, true /*fIsBpInstr*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xcd. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_int_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Int; IEM_OPCODE_GET_NEXT_U8(&u8Int);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_int, u8Int, false /*fIsBpInstr*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xce. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_into)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
4a84814aff76797623dd72295fd77e390701d686vboxsync IEMOP_MNEMONIC("into");
4a84814aff76797623dd72295fd77e390701d686vboxsync IEMOP_HLP_NO_64BIT();
4a84814aff76797623dd72295fd77e390701d686vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, u8Int, /*=*/ X86_XCPT_OF, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(bool, fIsBpInstr, /*=*/ false, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_CIMPL_2(iemCImpl_int, u8Int, fIsBpInstr);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xcf. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_iret)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("iret");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_iret, pIemCpu->enmEffOpSize);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xd0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp2_Eb_1)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PCIEMOPSHIFTSIZES pImpl;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: pImpl = &g_iemAImpl_rol; IEMOP_MNEMONIC("rol Eb,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: pImpl = &g_iemAImpl_ror; IEMOP_MNEMONIC("ror Eb,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2: pImpl = &g_iemAImpl_rcl; IEMOP_MNEMONIC("rcl Eb,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3: pImpl = &g_iemAImpl_rcr; IEMOP_MNEMONIC("rcr Eb,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 4: pImpl = &g_iemAImpl_shl; IEMOP_MNEMONIC("shl Eb,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5: pImpl = &g_iemAImpl_shr; IEMOP_MNEMONIC("shr Eb,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7: pImpl = &g_iemAImpl_sar; IEMOP_MNEMONIC("sar Eb,1"); break;
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
c32de3017eee1c2fa8eb76c3bae4c178571fac42vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe, well... */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg,/*=*/1, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg,/*=*/1, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xd1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp2_Ev_1)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PCIEMOPSHIFTSIZES pImpl;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: pImpl = &g_iemAImpl_rol; IEMOP_MNEMONIC("rol Ev,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: pImpl = &g_iemAImpl_ror; IEMOP_MNEMONIC("ror Ev,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2: pImpl = &g_iemAImpl_rcl; IEMOP_MNEMONIC("rcl Ev,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3: pImpl = &g_iemAImpl_rcr; IEMOP_MNEMONIC("rcr Ev,1"); break;
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync case 4: pImpl = &g_iemAImpl_shl; IEMOP_MNEMONIC("shl Ev,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5: pImpl = &g_iemAImpl_shr; IEMOP_MNEMONIC("shr Ev,1"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7: pImpl = &g_iemAImpl_sar; IEMOP_MNEMONIC("sar Ev,1"); break;
edf9b1ca7a0ef1def3f24705ccff26eb2ef7f5b0vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
c32de3017eee1c2fa8eb76c3bae4c178571fac42vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe, well... */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg,/*=1*/1, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg,/*=1*/1, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg,/*=1*/1, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg,/*=1*/1, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg,/*=1*/1, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, cShiftArg,/*=1*/1, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xd2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp2_Eb_CL)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PCIEMOPSHIFTSIZES pImpl;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: pImpl = &g_iemAImpl_rol; IEMOP_MNEMONIC("rol Eb,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: pImpl = &g_iemAImpl_ror; IEMOP_MNEMONIC("ror Eb,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2: pImpl = &g_iemAImpl_rcl; IEMOP_MNEMONIC("rcl Eb,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3: pImpl = &g_iemAImpl_rcr; IEMOP_MNEMONIC("rcr Eb,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 4: pImpl = &g_iemAImpl_shl; IEMOP_MNEMONIC("shl Eb,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5: pImpl = &g_iemAImpl_shr; IEMOP_MNEMONIC("shr Eb,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7: pImpl = &g_iemAImpl_sar; IEMOP_MNEMONIC("sar Eb,CL"); break;
60468377ea17fdce430870d87a375af4019293bcvboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
c32de3017eee1c2fa8eb76c3bae4c178571fac42vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc, grr. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xd3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp2_Ev_CL)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync PCIEMOPSHIFTSIZES pImpl;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0: pImpl = &g_iemAImpl_rol; IEMOP_MNEMONIC("rol Ev,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1: pImpl = &g_iemAImpl_ror; IEMOP_MNEMONIC("ror Ev,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2: pImpl = &g_iemAImpl_rcl; IEMOP_MNEMONIC("rcl Ev,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3: pImpl = &g_iemAImpl_rcr; IEMOP_MNEMONIC("rcr Ev,CL"); break;
064e87232010cd1a6a7e554428a5ba8053e96612vboxsync case 4: pImpl = &g_iemAImpl_shl; IEMOP_MNEMONIC("shl Ev,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5: pImpl = &g_iemAImpl_shr; IEMOP_MNEMONIC("shr Ev,CL"); break;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7: pImpl = &g_iemAImpl_sar; IEMOP_MNEMONIC("sar Ev,CL"); break;
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
cffe630ad33a6b15d6b533c0fa642723e8c90908vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe stupid */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, cShiftArg, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xd4. */
4dcdc5639c686efea425976e25a274602450c6c4vboxsyncFNIEMOP_DEF(iemOp_aam_Ib)
4dcdc5639c686efea425976e25a274602450c6c4vboxsync{
4dcdc5639c686efea425976e25a274602450c6c4vboxsync IEMOP_MNEMONIC("aam Ib");
4dcdc5639c686efea425976e25a274602450c6c4vboxsync uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
4dcdc5639c686efea425976e25a274602450c6c4vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
4dcdc5639c686efea425976e25a274602450c6c4vboxsync IEMOP_HLP_NO_64BIT();
8b148a9b18f1df43970276614ab624e85d42f156vboxsync if (!bImm)
8b148a9b18f1df43970276614ab624e85d42f156vboxsync return IEMOP_RAISE_DIVIDE_ERROR();
4dcdc5639c686efea425976e25a274602450c6c4vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_aam, bImm);
4dcdc5639c686efea425976e25a274602450c6c4vboxsync}
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xd5. */
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsyncFNIEMOP_DEF(iemOp_aad_Ib)
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync{
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync IEMOP_MNEMONIC("aad Ib");
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync IEMOP_HLP_NO_64BIT();
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_aad, bImm);
e28cf5340505fcf342ca7a8d86f5dfec2d152c40vboxsync}
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync/** Opcode 0xd6. */
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsyncFNIEMOP_DEF(iemOp_salc)
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync{
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEMOP_MNEMONIC("salc");
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEMOP_HLP_NO_64BIT();
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEM_MC_BEGIN(0, 0);
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
1f52aa4e03bd1307ea5ac89812bc65be2029b90bvboxsync IEM_MC_STORE_GREG_U8_CONST(X86_GREG_xAX, 0xff);
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync } IEM_MC_ELSE() {
1f52aa4e03bd1307ea5ac89812bc65be2029b90bvboxsync IEM_MC_STORE_GREG_U8_CONST(X86_GREG_xAX, 0x00);
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync } IEM_MC_ENDIF();
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEM_MC_ADVANCE_RIP();
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync IEM_MC_END();
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync return VINF_SUCCESS;
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync}
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xd7. */
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsyncFNIEMOP_DEF(iemOp_xlat)
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync{
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEMOP_MNEMONIC("xlat");
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEMOP_HLP_NO_LOCK_PREFIX();
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync switch (pIemCpu->enmEffAddrMode)
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync {
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync case IEMMODE_16BIT:
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_BEGIN(2, 0);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_LOCAL(uint8_t, u8Tmp);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_LOCAL(uint16_t, u16Addr);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_FETCH_GREG_U8_ZX_U16(u16Addr, X86_GREG_xAX);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_ADD_GREG_U16_TO_LOCAL(u16Addr, X86_GREG_xBX);
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_FETCH_MEM16_U8(u8Tmp, pIemCpu->iEffSeg, u16Addr);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Tmp);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_ADVANCE_RIP();
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_END();
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync return VINF_SUCCESS;
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync case IEMMODE_32BIT:
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_BEGIN(2, 0);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_LOCAL(uint8_t, u8Tmp);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_LOCAL(uint32_t, u32Addr);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_FETCH_GREG_U8_ZX_U32(u32Addr, X86_GREG_xAX);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_ADD_GREG_U32_TO_LOCAL(u32Addr, X86_GREG_xBX);
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_FETCH_MEM32_U8(u8Tmp, pIemCpu->iEffSeg, u32Addr);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Tmp);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_ADVANCE_RIP();
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_END();
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync return VINF_SUCCESS;
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync case IEMMODE_64BIT:
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_BEGIN(2, 0);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_LOCAL(uint8_t, u8Tmp);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_LOCAL(uint64_t, u64Addr);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_FETCH_GREG_U8_ZX_U64(u64Addr, X86_GREG_xAX);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_ADD_GREG_U64_TO_LOCAL(u64Addr, X86_GREG_xBX);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_FETCH_MEM_U8(u8Tmp, pIemCpu->iEffSeg, u64Addr);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Tmp);
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_ADVANCE_RIP();
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_MC_END();
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync return VINF_SUCCESS;
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync }
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync}
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync
26dcae93046505a1d6a46ae2974f5c4e7aebf37fvboxsync
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync/**
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync * Common worker for FPU instructions working on ST0 and STn, and storing the
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync * result in ST0.
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync *
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_2(iemOpHlpFpu_st0_stN, uint8_t, bRm, PFNIEMAIMPLFPUR80, pfnAImpl)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_BEGIN(3, 1);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value2, 2);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, 0, pr80Value2, bRm & X86_MODRM_RM_MASK)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pr80Value2);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_ELSE()
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_ADVANCE_RIP();
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEM_MC_END();
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return VINF_SUCCESS;
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync/**
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync * Common worker for FPU instructions working on ST0 and STn, and only affecting
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync * flags.
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync *
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_2(iemOpHlpFpuNoStore_st0_stN, uint8_t, bRm, PFNIEMAIMPLFPUR80FSW, pfnAImpl)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_BEGIN(3, 1);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value2, 2);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, 0, pr80Value2, bRm & X86_MODRM_RM_MASK)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pu16Fsw, pr80Value1, pr80Value2);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW(u16Fsw);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ELSE()
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FPU_STACK_UNDERFLOW(UINT8_MAX);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ADVANCE_RIP();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_END();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return VINF_SUCCESS;
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync/**
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync * Common worker for FPU instructions working on ST0 and STn, only affecting
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync * flags, and popping when done.
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync *
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_2(iemOpHlpFpuNoStore_st0_stN_pop, uint8_t, bRm, PFNIEMAIMPLFPUR80FSW, pfnAImpl)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_BEGIN(3, 1);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value2, 2);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, 0, pr80Value2, bRm & X86_MODRM_RM_MASK)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pu16Fsw, pr80Value1, pr80Value2);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW_THEN_POP(u16Fsw);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ELSE()
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(UINT8_MAX);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ADVANCE_RIP();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_END();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return VINF_SUCCESS;
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 11/0. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fadd_stN, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fadd st0,stN");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_stN, bRm, iemAImpl_fadd_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 11/1. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fmul_stN, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fmul st0,stN");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_stN, bRm, iemAImpl_fmul_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 11/2. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fcom_stN, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fcom st0,stN");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return FNIEMOP_CALL_2(iemOpHlpFpuNoStore_st0_stN, bRm, iemAImpl_fcom_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 11/3. */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_1(iemOp_fcomp_stN, uint8_t, bRm)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fcomp st0,stN");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return FNIEMOP_CALL_2(iemOpHlpFpuNoStore_st0_stN_pop, bRm, iemAImpl_fcom_r80_by_r80);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 11/4. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fsub_stN, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fsub st0,stN");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_stN, bRm, iemAImpl_fsub_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 11/5. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fsubr_stN, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fsubr st0,stN");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_stN, bRm, iemAImpl_fsubr_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 11/6. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fdiv_stN, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fdiv st0,stN");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_stN, bRm, iemAImpl_fdiv_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 11/7. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fdivr_stN, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fdivr st0,stN");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_stN, bRm, iemAImpl_fdivr_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync/**
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync * Common worker for FPU instructions working on ST0 and an m32r, and storing
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync * the result in ST0.
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync *
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_2(iemOpHlpFpu_st0_m32r, uint8_t, bRm, PFNIEMAIMPLFPUR32, pfnAImpl)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_BEGIN(3, 3);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_LOCAL(RTFLOAT32U, r32Val2);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG_LOCAL_REF(PCRTFLOAT32U, pr32Val2, r32Val2, 2);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FETCH_MEM_R32(r32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pr32Val2);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ELSE()
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ADVANCE_RIP();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_END();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return VINF_SUCCESS;
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 !11/0. */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_1(iemOp_fadd_m32r, uint8_t, bRm)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fadd st0,m32r");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32r, bRm, iemAImpl_fadd_r80_by_r32);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 !11/1. */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_1(iemOp_fmul_m32r, uint8_t, bRm)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fmul st0,m32r");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32r, bRm, iemAImpl_fmul_r80_by_r32);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 !11/2. */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_1(iemOp_fcom_m32r, uint8_t, bRm)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fcom st0,m32r");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_BEGIN(3, 3);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_LOCAL(RTFLOAT32U, r32Val2);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG_LOCAL_REF(PCRTFLOAT32U, pr32Val2, r32Val2, 2);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FETCH_MEM_R32(r32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r32, pu16Fsw, pr80Value1, pr32Val2);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ELSE()
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ADVANCE_RIP();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_END();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return VINF_SUCCESS;
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 !11/3. */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_1(iemOp_fcomp_m32r, uint8_t, bRm)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fcomp st0,m32r");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_BEGIN(3, 3);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_LOCAL(RTFLOAT32U, r32Val2);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG_LOCAL_REF(PCRTFLOAT32U, pr32Val2, r32Val2, 2);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FETCH_MEM_R32(r32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r32, pu16Fsw, pr80Value1, pr32Val2);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ELSE()
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ADVANCE_RIP();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_END();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return VINF_SUCCESS;
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 !11/4. */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_1(iemOp_fsub_m32r, uint8_t, bRm)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fsub st0,m32r");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32r, bRm, iemAImpl_fsub_r80_by_r32);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 !11/5. */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_1(iemOp_fsubr_m32r, uint8_t, bRm)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fsubr st0,m32r");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32r, bRm, iemAImpl_fsubr_r80_by_r32);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 !11/6. */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_1(iemOp_fdiv_m32r, uint8_t, bRm)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fdiv st0,m32r");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32r, bRm, iemAImpl_fdiv_r80_by_r32);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8 !11/7. */
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsyncFNIEMOP_DEF_1(iemOp_fdivr_m32r, uint8_t, bRm)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync{
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_MNEMONIC("fdivr st0,m32r");
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32r, bRm, iemAImpl_fdivr_r80_by_r32);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync}
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd8. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_EscF0)
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync{
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fadd_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fmul_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fcom_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fcomp_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fsub_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fsubr_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fdiv_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fdivr_stN, bRm);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync }
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync }
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync else
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync {
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fadd_m32r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fmul_m32r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fcom_m32r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fcomp_m32r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fsub_m32r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fsubr_m32r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fdiv_m32r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fdivr_m32r, bRm);
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync }
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync }
06ac458ac1e4617fad41757c1319f8f64cf32b89vboxsync}
f6f5b68ebbb3a264e0a27e2a5848774722fccfd2vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync/** Opcode 0xd9 /0 mem32real
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync * @sa iemOp_fld_m64r */
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsyncFNIEMOP_DEF_1(iemOp_fld_m32r, uint8_t, bRm)
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync{
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync IEMOP_MNEMONIC("fld m32r");
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_BEGIN(2, 3);
480a9e8ececc471eae87a2f2ced4f1d33e160614vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
480a9e8ececc471eae87a2f2ced4f1d33e160614vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_LOCAL(RTFLOAT32U, r32Val);
480a9e8ececc471eae87a2f2ced4f1d33e160614vboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG_LOCAL_REF(PCRTFLOAT32U, pr32Val, r32Val, 1);
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
480a9e8ececc471eae87a2f2ced4f1d33e160614vboxsync IEM_MC_FETCH_MEM_R32(r32Val, pIemCpu->iEffSeg, GCPtrEffSrc);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_IF_FPUREG_IS_EMPTY(7)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r32_to_r80, pFpuRes, pr32Val);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ELSE()
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync IEM_MC_ADVANCE_RIP();
480a9e8ececc471eae87a2f2ced4f1d33e160614vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync IEM_MC_END();
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync return VINF_SUCCESS;
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync}
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
60468377ea17fdce430870d87a375af4019293bcvboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xd9 !11/2 mem32real */
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsyncFNIEMOP_DEF_1(iemOp_fst_m32r, uint8_t, bRm)
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync{
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEMOP_MNEMONIC("fst m32r");
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_BEGIN(3, 2);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ARG(PRTFLOAT32U, pr32Dst, 1);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_NEG_QNAN_R32_BY_REF(pr32Dst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_END();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync return VINF_SUCCESS;
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync}
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
60468377ea17fdce430870d87a375af4019293bcvboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xd9 !11/3 */
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsyncFNIEMOP_DEF_1(iemOp_fstp_m32r, uint8_t, bRm)
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync{
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEMOP_MNEMONIC("fstp m32r");
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_BEGIN(3, 2);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ARG(PRTFLOAT32U, pr32Dst, 1);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_NEG_QNAN_R32_BY_REF(pr32Dst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_END();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync return VINF_SUCCESS;
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync}
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
60468377ea17fdce430870d87a375af4019293bcvboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xd9 !11/4 */
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsyncFNIEMOP_DEF_1(iemOp_fldenv, uint8_t, bRm)
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync{
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEMOP_MNEMONIC("fldenv m14/28byte");
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_BEGIN(3, 0);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize, 0);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 1);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_fldenv, enmEffOpSize, iEffSeg, GCPtrEffSrc);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_END();
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync return VINF_SUCCESS;
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync}
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync
60468377ea17fdce430870d87a375af4019293bcvboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xd9 !11/5 */
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsyncFNIEMOP_DEF_1(iemOp_fldcw, uint8_t, bRm)
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync{
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEMOP_MNEMONIC("fldcw m2byte");
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_BEGIN(1, 1);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_ARG(uint16_t, u16Fsw, 0);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_FETCH_MEM_U16(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_fldcw, u16Fsw);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_END();
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync return VINF_SUCCESS;
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync}
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync
60468377ea17fdce430870d87a375af4019293bcvboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xd9 !11/6 */
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsyncFNIEMOP_DEF_1(iemOp_fnstenv, uint8_t, bRm)
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync{
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEMOP_MNEMONIC("fstenv m14/m28byte");
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_BEGIN(3, 0);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize, 0);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 1);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_ARG(RTGCPTR, GCPtrEffDst, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_fnstenv, enmEffOpSize, iEffSeg, GCPtrEffDst);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_END();
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync return VINF_SUCCESS;
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync}
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync
60468377ea17fdce430870d87a375af4019293bcvboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xd9 !11/7 */
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsyncFNIEMOP_DEF_1(iemOp_fnstcw, uint8_t, bRm)
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync{
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEMOP_MNEMONIC("fnstcw m2byte");
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_BEGIN(2, 0);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_LOCAL(uint16_t, u16Fcw);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_FETCH_FCW(u16Fcw);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Fcw);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_ADVANCE_RIP(); /* C0-C3 are documented as undefined, we leave them unmodified. */
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync IEM_MC_END();
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync return VINF_SUCCESS;
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync}
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync
60468377ea17fdce430870d87a375af4019293bcvboxsync
7066fbabca58f9d015a0d7f3b382762e11209b1dvboxsync/** Opcode 0xd9 0xd0, 0xd9 0xd8-0xdf, ++?. */
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsyncFNIEMOP_DEF(iemOp_fnop)
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync{
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_MNEMONIC("fnop");
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_BEGIN(0, 0);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync /** @todo Testcase: looks like FNOP leaves FOP alone but updates FPUIP. Could be
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync * intel optimizations. Investigate. */
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_ADVANCE_RIP(); /* C0-C3 are documented as undefined, we leave them unmodified. */
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_END();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync return VINF_SUCCESS;
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync}
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xd9 11/0 stN */
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsyncFNIEMOP_DEF_1(iemOp_fld_stN, uint8_t, bRm)
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync{
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_MNEMONIC("fld stN");
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync /** @todo Testcase: Check if this raises \#MF? Intel mentioned it not. AMD
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync * indicates that it does. */
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_BEGIN(0, 2);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80Value);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, bRm & X86_MODRM_RM_MASK)
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_SET_FPU_RESULT(FpuRes, 0 /*FSW*/, pr80Value);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_PUSH_FPU_RESULT(FpuRes);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_ELSE()
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_FPU_STACK_PUSH_UNDERFLOW();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_ADVANCE_RIP();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_END();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync return VINF_SUCCESS;
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync}
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xd9 11/3 stN */
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsyncFNIEMOP_DEF_1(iemOp_fxch_stN, uint8_t, bRm)
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync{
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEMOP_MNEMONIC("fxch stN");
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync /** @todo Testcase: Check if this raises \#MF? Intel mentioned it not. AMD
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync * indicates that it does. */
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_BEGIN(1, 3);
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80Value1);
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80Value2);
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_ARG_CONST(uint8_t, iStReg, /*=*/ bRm & X86_MODRM_RM_MASK, 0);
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, 0, pr80Value2, bRm & X86_MODRM_RM_MASK)
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_SET_FPU_RESULT(FpuRes, X86_FSW_C1, pr80Value2);
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_STORE_FPUREG_R80_SRC_REF(bRm & X86_MODRM_RM_MASK, pr80Value1);
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_ELSE()
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_fxch_underflow, iStReg);
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_ADVANCE_RIP();
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync IEM_MC_END();
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync return VINF_SUCCESS;
db55d6ced7db5b116a7662b1eb7d37130a9fe8c4vboxsync}
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
7962cf168afeef286d876738dae7131c2c79ece8vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xd9 11/4, 0xdd 11/2. */
7962cf168afeef286d876738dae7131c2c79ece8vboxsyncFNIEMOP_DEF_1(iemOp_fstp_stN, uint8_t, bRm)
7962cf168afeef286d876738dae7131c2c79ece8vboxsync{
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEMOP_MNEMONIC("fstp st0,stN");
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
7962cf168afeef286d876738dae7131c2c79ece8vboxsync
7962cf168afeef286d876738dae7131c2c79ece8vboxsync /* fstp st0, st0 is frequendly used as an official 'ffreep st0' sequence. */
7962cf168afeef286d876738dae7131c2c79ece8vboxsync uint8_t const iDstReg = bRm & X86_MODRM_RM_MASK;
7962cf168afeef286d876738dae7131c2c79ece8vboxsync if (!iDstReg)
7962cf168afeef286d876738dae7131c2c79ece8vboxsync {
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_BEGIN(0, 1);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL_CONST(uint16_t, u16Fsw, /*=*/ 0);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY(0)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW_THEN_POP(u16Fsw);
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_ELSE()
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(0);
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_ADVANCE_RIP();
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_END();
7962cf168afeef286d876738dae7131c2c79ece8vboxsync }
7962cf168afeef286d876738dae7131c2c79ece8vboxsync else
7962cf168afeef286d876738dae7131c2c79ece8vboxsync {
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_BEGIN(0, 2);
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80Value);
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_SET_FPU_RESULT(FpuRes, 0 /*FSW*/, pr80Value);
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_STORE_FPU_RESULT_THEN_POP(FpuRes, iDstReg);
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_ELSE()
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(iDstReg);
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_ADVANCE_RIP();
7962cf168afeef286d876738dae7131c2c79ece8vboxsync IEM_MC_END();
7962cf168afeef286d876738dae7131c2c79ece8vboxsync }
7962cf168afeef286d876738dae7131c2c79ece8vboxsync return VINF_SUCCESS;
7962cf168afeef286d876738dae7131c2c79ece8vboxsync}
7962cf168afeef286d876738dae7131c2c79ece8vboxsync
60468377ea17fdce430870d87a375af4019293bcvboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync/**
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync * Common worker for FPU instructions working on ST0 and replaces it with the
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync * result, i.e. unary operators.
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync *
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF_1(iemOpHlpFpu_st0, PFNIEMAIMPLFPUR80UNARY, pfnAImpl)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_BEGIN(2, 1);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 1);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_2(pfnAImpl, pFpuRes, pr80Value);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ELSE()
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ADVANCE_RIP();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_END();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return VINF_SUCCESS;
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xe0. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fchs)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fchs st0");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpu_st0, iemAImpl_fchs_r80);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xe1. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fabs)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fabs st0");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpu_st0, iemAImpl_fabs_r80);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync/**
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync * Common worker for FPU instructions working on ST0 and only returns FSW.
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync *
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF_1(iemOpHlpFpuNoStore_st0, PFNIEMAIMPLFPUR80UNARYFSW, pfnAImpl)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_BEGIN(2, 1);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 1);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_2(pfnAImpl, pu16Fsw, pr80Value);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW(u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ELSE()
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_FPU_STACK_UNDERFLOW(UINT8_MAX);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ADVANCE_RIP();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_END();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return VINF_SUCCESS;
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xe4. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_ftst)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("ftst st0");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuNoStore_st0, iemAImpl_ftst_r80);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xe5. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fxam)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fxam st0");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuNoStore_st0, iemAImpl_fxam_r80);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync/**
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync * Common worker for FPU instructions pushing a constant onto the FPU stack.
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync *
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF_1(iemOpHlpFpuPushConstant, PFNIEMAIMPLFPUR80LDCONST, pfnAImpl)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_BEGIN(1, 1);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_IF_FPUREG_IS_EMPTY(7)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_1(pfnAImpl, pFpuRes);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_PUSH_FPU_RESULT(FpuRes);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ELSE()
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_FPU_STACK_PUSH_OVERFLOW();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ADVANCE_RIP();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_END();
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return VINF_SUCCESS;
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xe8. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fld1)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fld1");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuPushConstant, iemAImpl_fld1);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xe9. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fldl2t)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fldl2t");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuPushConstant, iemAImpl_fldl2t);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xea. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fldl2e)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fldl2e");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuPushConstant, iemAImpl_fldl2e);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xeb. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fldpi)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fldpi");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuPushConstant, iemAImpl_fldpi);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xec. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fldlg2)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fldlg2");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuPushConstant, iemAImpl_fldlg2);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xed. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fldln2)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fldln2");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuPushConstant, iemAImpl_fldln2);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xee. */
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsyncFNIEMOP_DEF(iemOp_fldz)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync{
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEMOP_MNEMONIC("fldz");
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuPushConstant, iemAImpl_fldz);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync}
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xf0. */
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsyncFNIEMOP_DEF(iemOp_f2xm1)
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync{
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEMOP_MNEMONIC("f2xm1 st0");
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync return FNIEMOP_CALL_1(iemOpHlpFpu_st0, iemAImpl_f2xm1_r80);
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync}
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xf1. */
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsyncFNIEMOP_DEF(iemOp_fylx2)
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync{
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEMOP_MNEMONIC("fylx2 st0");
5edee73a379880aec95a2a5eb24d61bc9ecab5a6vboxsync return FNIEMOP_CALL_1(iemOpHlpFpu_st0, iemAImpl_fyl2x_r80);
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync}
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync/**
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync * Common worker for FPU instructions working on ST0 and having two outputs, one
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync * replacing ST0 and one pushed onto the stack.
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync *
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF_1(iemOpHlpFpuReplace_st0_push, PFNIEMAIMPLFPUR80UNARYTWO, pfnAImpl)
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync{
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_BEGIN(2, 1);
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_LOCAL(IEMFPURESULTTWO, FpuResTwo);
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULTTWO, pFpuResTwo, FpuResTwo, 0);
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 1);
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_CALL_FPU_AIMPL_2(pfnAImpl, pFpuResTwo, pr80Value);
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_PUSH_FPU_RESULT_TWO(FpuResTwo);
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_ELSE()
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_FPU_STACK_PUSH_UNDERFLOW_TWO();
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_ADVANCE_RIP();
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync IEM_MC_END();
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync return VINF_SUCCESS;
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync/** Opcode 0xd9 0xf2. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fptan)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fptan st0");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_1(iemOpHlpFpuReplace_st0_push, iemAImpl_fptan_r80_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync/**
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync * Common worker for FPU instructions working on STn and ST0, storing the result
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync * in STn, and popping the stack unless IE, DE or ZE was raised.
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync *
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF_2(iemOpHlpFpu_stN_st0_pop, uint8_t, bRm, PFNIEMAIMPLFPUR80, pfnAImpl)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_BEGIN(3, 1);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value2, 2);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, bRm & X86_MODRM_RM_MASK, pr80Value2, 0)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pr80Value2);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_STORE_FPU_RESULT_THEN_POP(FpuRes, bRm & X86_MODRM_RM_MASK);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_ELSE()
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(bRm & X86_MODRM_RM_MASK);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_ADVANCE_RIP();
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEM_MC_END();
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return VINF_SUCCESS;
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync}
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xf3. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fpatan)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fpatan st1,st0");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0_pop, 1, iemAImpl_fpatan_r80_by_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xf4. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fxtract)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fxtract st0");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_1(iemOpHlpFpuReplace_st0_push, iemAImpl_fxtract_r80_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xf5. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fprem1)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fprem1 st0, st1");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_stN, 1, iemAImpl_fprem1_r80_by_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xf6. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fdecstp)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fdecstp");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync /* Note! C0, C2 and C3 are documented as undefined, we clear them. */
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync /** @todo Testcase: Check whether FOP, FPUIP and FPUCS are affected by
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync * FINCSTP and FDECSTP. */
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_BEGIN(0,0);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_FPU_STACK_DEC_TOP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_UPDATE_FSW_CONST(0);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_ADVANCE_RIP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_END();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync return VINF_SUCCESS;
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xf7. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fincstp)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fincstp");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync /* Note! C0, C2 and C3 are documented as undefined, we clear them. */
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync /** @todo Testcase: Check whether FOP, FPUIP and FPUCS are affected by
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync * FINCSTP and FDECSTP. */
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_BEGIN(0,0);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_FPU_STACK_INC_TOP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_UPDATE_FSW_CONST(0);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_ADVANCE_RIP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_END();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync return VINF_SUCCESS;
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xf8. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fprem)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fprem st0, st1");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_stN, 1, iemAImpl_fprem_r80_by_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xf9. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fyl2xp1)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fyl2xp1 st1,st0");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0_pop, 1, iemAImpl_fyl2xp1_r80_by_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xfa. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fsqrt)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fsqrt st0");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_1(iemOpHlpFpu_st0, iemAImpl_fsqrt_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xfb. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fsincos)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fsincos st0");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_1(iemOpHlpFpuReplace_st0_push, iemAImpl_fsincos_r80_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xfc. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_frndint)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("frndint st0");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_1(iemOpHlpFpu_st0, iemAImpl_frndint_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xfd. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fscale)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fscale st0, st1");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_stN, 1, iemAImpl_fscale_r80_by_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xfe. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fsin)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fsin st0");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_1(iemOpHlpFpu_st0, iemAImpl_fsin_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9 0xff. */
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsyncFNIEMOP_DEF(iemOp_fcos)
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync{
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync IEMOP_MNEMONIC("fcos st0");
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync return FNIEMOP_CALL_1(iemOpHlpFpu_st0, iemAImpl_fcos_r80);
14db9e3f0003e1e290ba2c50a3bf2bcf89750a4dvboxsync}
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Used by iemOp_EscF1. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncstatic const PFNIEMOP g_apfnEscF1_E0toFF[32] =
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync{
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe0 */ iemOp_fchs,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe1 */ iemOp_fabs,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe2 */ iemOp_Invalid,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe3 */ iemOp_Invalid,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe4 */ iemOp_ftst,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe5 */ iemOp_fxam,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe6 */ iemOp_Invalid,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe7 */ iemOp_Invalid,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe8 */ iemOp_fld1,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xe9 */ iemOp_fldl2t,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xea */ iemOp_fldl2e,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xeb */ iemOp_fldpi,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xec */ iemOp_fldlg2,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xed */ iemOp_fldln2,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xee */ iemOp_fldz,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xef */ iemOp_Invalid,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf0 */ iemOp_f2xm1,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf1 */ iemOp_fylx2,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf2 */ iemOp_fptan,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf3 */ iemOp_fpatan,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf4 */ iemOp_fxtract,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf5 */ iemOp_fprem1,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf6 */ iemOp_fdecstp,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf7 */ iemOp_fincstp,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf8 */ iemOp_fprem,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xf9 */ iemOp_fyl2xp1,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xfa */ iemOp_fsqrt,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xfb */ iemOp_fsincos,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xfc */ iemOp_frndint,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xfd */ iemOp_fscale,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xfe */ iemOp_fsin,
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync /* 0xff */ iemOp_fcos
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync};
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync
60468377ea17fdce430870d87a375af4019293bcvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xd9. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_EscF1)
60468377ea17fdce430870d87a375af4019293bcvboxsync{
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
60468377ea17fdce430870d87a375af4019293bcvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
60468377ea17fdce430870d87a375af4019293bcvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
60468377ea17fdce430870d87a375af4019293bcvboxsync {
60468377ea17fdce430870d87a375af4019293bcvboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
60468377ea17fdce430870d87a375af4019293bcvboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fld_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fxch_stN, bRm);
60468377ea17fdce430870d87a375af4019293bcvboxsync case 2:
7066fbabca58f9d015a0d7f3b382762e11209b1dvboxsync if (bRm == 0xd0)
60468377ea17fdce430870d87a375af4019293bcvboxsync return FNIEMOP_CALL(iemOp_fnop);
60468377ea17fdce430870d87a375af4019293bcvboxsync return IEMOP_RAISE_INVALID_OPCODE();
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fstp_stN, bRm); /* Reserved. Intel behavior seems to be FSTP ST(i) though. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 4:
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 5:
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 6:
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 7:
0b7eadbb09cc2d7183fda450e973b2d414be6b4fvboxsync Assert((unsigned)bRm - 0xe0U < RT_ELEMENTS(g_apfnEscF1_E0toFF));
0b7eadbb09cc2d7183fda450e973b2d414be6b4fvboxsync return FNIEMOP_CALL(g_apfnEscF1_E0toFF[bRm - 0xe0]);
60468377ea17fdce430870d87a375af4019293bcvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
60468377ea17fdce430870d87a375af4019293bcvboxsync }
60468377ea17fdce430870d87a375af4019293bcvboxsync }
60468377ea17fdce430870d87a375af4019293bcvboxsync else
60468377ea17fdce430870d87a375af4019293bcvboxsync {
60468377ea17fdce430870d87a375af4019293bcvboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
60468377ea17fdce430870d87a375af4019293bcvboxsync {
60468377ea17fdce430870d87a375af4019293bcvboxsync case 0: return FNIEMOP_CALL_1(iemOp_fld_m32r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 1: return IEMOP_RAISE_INVALID_OPCODE();
60468377ea17fdce430870d87a375af4019293bcvboxsync case 2: return FNIEMOP_CALL_1(iemOp_fst_m32r, bRm);
60468377ea17fdce430870d87a375af4019293bcvboxsync case 3: return FNIEMOP_CALL_1(iemOp_fstp_m32r, bRm);
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fldenv, bRm);
8ee0ed815fc40e659c6c47fd7f60562c93eca7c0vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fldcw, bRm);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fnstenv, bRm);
d69e81b7f3f8bdca04768899bf8f87701e0a5c39vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fnstcw, bRm);
60468377ea17fdce430870d87a375af4019293bcvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
60468377ea17fdce430870d87a375af4019293bcvboxsync }
60468377ea17fdce430870d87a375af4019293bcvboxsync }
60468377ea17fdce430870d87a375af4019293bcvboxsync}
60468377ea17fdce430870d87a375af4019293bcvboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda 11/0. */
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsyncFNIEMOP_DEF_1(iemOp_fcmovb_stN, uint8_t, bRm)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync{
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_MNEMONIC("fcmovb st0,stN");
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(0, 1);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(pr80ValueN, bRm & X86_MODRM_RM_MASK, 0)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ELSE()
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ADVANCE_RIP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_END();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync return VINF_SUCCESS;
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync}
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda 11/1. */
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsyncFNIEMOP_DEF_1(iemOp_fcmove_stN, uint8_t, bRm)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync{
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_MNEMONIC("fcmove st0,stN");
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(0, 1);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(pr80ValueN, bRm & X86_MODRM_RM_MASK, 0)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ELSE()
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ADVANCE_RIP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_END();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync return VINF_SUCCESS;
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync}
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda 11/2. */
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsyncFNIEMOP_DEF_1(iemOp_fcmovbe_stN, uint8_t, bRm)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync{
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_MNEMONIC("fcmovbe st0,stN");
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(0, 1);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(pr80ValueN, bRm & X86_MODRM_RM_MASK, 0)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ELSE()
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ADVANCE_RIP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_END();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync return VINF_SUCCESS;
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync}
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda 11/3. */
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsyncFNIEMOP_DEF_1(iemOp_fcmovu_stN, uint8_t, bRm)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync{
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_MNEMONIC("fcmovu st0,stN");
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(0, 1);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(pr80ValueN, bRm & X86_MODRM_RM_MASK, 0)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ELSE()
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ADVANCE_RIP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_END();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync return VINF_SUCCESS;
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync}
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
9b94aa72f427a17f12197fe27073265341da7f52vboxsync/**
9b94aa72f427a17f12197fe27073265341da7f52vboxsync * Common worker for FPU instructions working on ST0 and STn, only affecting
9b94aa72f427a17f12197fe27073265341da7f52vboxsync * flags, and popping twice when done.
9b94aa72f427a17f12197fe27073265341da7f52vboxsync *
9b94aa72f427a17f12197fe27073265341da7f52vboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
9b94aa72f427a17f12197fe27073265341da7f52vboxsync */
9b94aa72f427a17f12197fe27073265341da7f52vboxsyncFNIEMOP_DEF_1(iemOpHlpFpuNoStore_st0_stN_pop_pop, PFNIEMAIMPLFPUR80FSW, pfnAImpl)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(3, 1);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value2, 2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, 0, pr80Value2, 1)
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pu16Fsw, pr80Value1, pr80Value2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_UPDATE_FSW_THEN_POP_POP(u16Fsw);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ELSE()
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP_POP();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ADVANCE_RIP();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_END();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return VINF_SUCCESS;
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
9b94aa72f427a17f12197fe27073265341da7f52vboxsync/** Opcode 0xda 0xe9. */
9b94aa72f427a17f12197fe27073265341da7f52vboxsyncFNIEMOP_DEF(iemOp_fucompp)
9b94aa72f427a17f12197fe27073265341da7f52vboxsync{
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEMOP_MNEMONIC("fucompp st0,stN");
9b94aa72f427a17f12197fe27073265341da7f52vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuNoStore_st0_stN_pop_pop, iemAImpl_fucom_r80_by_r80);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync}
9b94aa72f427a17f12197fe27073265341da7f52vboxsync
9b94aa72f427a17f12197fe27073265341da7f52vboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync/**
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync * Common worker for FPU instructions working on ST0 and an m32i, and storing
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync * the result in ST0.
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync *
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync */
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsyncFNIEMOP_DEF_2(iemOpHlpFpu_st0_m32i, uint8_t, bRm, PFNIEMAIMPLFPUI32, pfnAImpl)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(3, 3);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(int32_t, i32Val2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG_LOCAL_REF(int32_t const *, pi32Val2, i32Val2, 2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_FETCH_MEM_I32(i32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pi32Val2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ELSE()
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ADVANCE_RIP();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_END();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return VINF_SUCCESS;
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda !11/0. */
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsyncFNIEMOP_DEF_1(iemOp_fiadd_m32i, uint8_t, bRm)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_MNEMONIC("fiadd m32i");
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32i, bRm, iemAImpl_fiadd_r80_by_i32);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda !11/1. */
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsyncFNIEMOP_DEF_1(iemOp_fimul_m32i, uint8_t, bRm)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_MNEMONIC("fimul m32i");
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32i, bRm, iemAImpl_fimul_r80_by_i32);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda !11/2. */
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsyncFNIEMOP_DEF_1(iemOp_ficom_m32i, uint8_t, bRm)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_MNEMONIC("ficom st0,m32i");
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(3, 3);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(int32_t, i32Val2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG_LOCAL_REF(int32_t const *, pi32Val2, i32Val2, 2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_FETCH_MEM_I32(i32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i32, pu16Fsw, pr80Value1, pi32Val2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ELSE()
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ADVANCE_RIP();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_END();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return VINF_SUCCESS;
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda !11/3. */
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsyncFNIEMOP_DEF_1(iemOp_ficomp_m32i, uint8_t, bRm)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_MNEMONIC("ficomp st0,m32i");
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(3, 3);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_LOCAL(int32_t, i32Val2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ARG_LOCAL_REF(int32_t const *, pi32Val2, i32Val2, 2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_FETCH_MEM_I32(i32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i32, pu16Fsw, pr80Value1, pi32Val2);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ELSE()
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_ADVANCE_RIP();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_END();
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return VINF_SUCCESS;
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda !11/4. */
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsyncFNIEMOP_DEF_1(iemOp_fisub_m32i, uint8_t, bRm)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_MNEMONIC("fisub m32i");
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32i, bRm, iemAImpl_fisub_r80_by_i32);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda !11/5. */
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsyncFNIEMOP_DEF_1(iemOp_fisubr_m32i, uint8_t, bRm)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_MNEMONIC("fisubr m32i");
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32i, bRm, iemAImpl_fisubr_r80_by_i32);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda !11/6. */
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsyncFNIEMOP_DEF_1(iemOp_fidiv_m32i, uint8_t, bRm)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_MNEMONIC("fidiv m32i");
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32i, bRm, iemAImpl_fidiv_r80_by_i32);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda !11/7. */
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsyncFNIEMOP_DEF_1(iemOp_fidivr_m32i, uint8_t, bRm)
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync{
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEMOP_MNEMONIC("fidivr m32i");
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m32i, bRm, iemAImpl_fidivr_r80_by_i32);
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync}
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xda. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_EscF2)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync{
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fcmovb_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fcmove_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fcmovbe_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fcmovu_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 4: return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 5:
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync if (bRm == 0xe9)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync return FNIEMOP_CALL(iemOp_fucompp);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 7: return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync else
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fiadd_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fimul_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 2: return FNIEMOP_CALL_1(iemOp_ficom_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 3: return FNIEMOP_CALL_1(iemOp_ficomp_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fisub_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fisubr_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fidiv_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fidivr_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb !11/0. */
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsyncFNIEMOP_DEF_1(iemOp_fild_m32i, uint8_t, bRm)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync{
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_MNEMONIC("fild m32i");
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_BEGIN(2, 3);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(int32_t, i32Val);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG_LOCAL_REF(int32_t const *, pi32Val, i32Val, 1);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_FETCH_MEM_I32(i32Val, pIemCpu->iEffSeg, GCPtrEffSrc);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FPUREG_IS_EMPTY(7)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_i32_to_r80, pFpuRes, pi32Val);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_END();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync return VINF_SUCCESS;
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync}
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb !11/1. */
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsyncFNIEMOP_DEF_1(iemOp_fisttp_m32i, uint8_t, bRm)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync{
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_MNEMONIC("fisttp m32i");
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_BEGIN(3, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(int32_t *, pi32Dst, 1);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_I32_CONST_BY_REF(pi32Dst, INT32_MIN /* (integer indefinite) */);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_END();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync return VINF_SUCCESS;
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync}
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb !11/2. */
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsyncFNIEMOP_DEF_1(iemOp_fist_m32i, uint8_t, bRm)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync{
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_MNEMONIC("fist m32i");
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_BEGIN(3, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(int32_t *, pi32Dst, 1);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_I32_CONST_BY_REF(pi32Dst, INT32_MIN /* (integer indefinite) */);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_END();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync return VINF_SUCCESS;
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb !11/3. */
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsyncFNIEMOP_DEF_1(iemOp_fistp_m32i, uint8_t, bRm)
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync{
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_MNEMONIC("fisttp m32i");
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync IEM_MC_BEGIN(3, 2);
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync IEM_MC_ARG(int32_t *, pi32Dst, 1);
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_I32_CONST_BY_REF(pi32Dst, INT32_MIN /* (integer indefinite) */);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync IEM_MC_END();
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync return VINF_SUCCESS;
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync}
cf1cd415fa1ad3b465ef4580e89341f556b63b9fvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb !11/5. */
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsyncFNIEMOP_DEF_1(iemOp_fld_m80r, uint8_t, bRm)
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync{
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEMOP_MNEMONIC("fld m80r");
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_BEGIN(2, 3);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_LOCAL(RTFLOAT80U, r80Val);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ARG_LOCAL_REF(PCRTFLOAT80U, pr80Val, r80Val, 1);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_FETCH_MEM_R80(r80Val, pIemCpu->iEffSeg, GCPtrEffSrc);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_IF_FPUREG_IS_EMPTY(7)
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r80_from_r80, pFpuRes, pr80Val);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ELSE()
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ADVANCE_RIP();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_END();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync return VINF_SUCCESS;
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
7962cf168afeef286d876738dae7131c2c79ece8vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb !11/7. */
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsyncFNIEMOP_DEF_1(iemOp_fstp_m80r, uint8_t, bRm)
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync{
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEMOP_MNEMONIC("fstp m80r");
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_BEGIN(3, 2);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ARG(PRTFLOAT80U, pr80Dst, 1);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_MEM_MAP(pr80Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r80, pu16Fsw, pr80Dst, pr80Value);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr80Dst, IEM_ACCESS_DATA_W, u16Fsw);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ELSE()
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_IF_FCW_IM()
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_STORE_MEM_NEG_QNAN_R80_BY_REF(pr80Dst);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pr80Dst, IEM_ACCESS_DATA_W);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ENDIF();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_ADVANCE_RIP();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync IEM_MC_END();
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync return VINF_SUCCESS;
7e0800bfa4bab140ca8d74f5764720fd136522afvboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 11/0. */
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsyncFNIEMOP_DEF_1(iemOp_fcmovnb_stN, uint8_t, bRm)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync{
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_MNEMONIC("fcmovnb st0,stN");
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(0, 1);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(pr80ValueN, bRm & X86_MODRM_RM_MASK, 0)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_CF)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ELSE()
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ADVANCE_RIP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_END();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync return VINF_SUCCESS;
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync}
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 11/1. */
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsyncFNIEMOP_DEF_1(iemOp_fcmovne_stN, uint8_t, bRm)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync{
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_MNEMONIC("fcmovne st0,stN");
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(0, 1);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(pr80ValueN, bRm & X86_MODRM_RM_MASK, 0)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_ZF)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ELSE()
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ADVANCE_RIP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_END();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync return VINF_SUCCESS;
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync}
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 11/2. */
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsyncFNIEMOP_DEF_1(iemOp_fcmovnbe_stN, uint8_t, bRm)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync{
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_MNEMONIC("fcmovnbe st0,stN");
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(0, 1);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(pr80ValueN, bRm & X86_MODRM_RM_MASK, 0)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_EFL_NO_BITS_SET(X86_EFL_CF | X86_EFL_ZF)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ELSE()
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ADVANCE_RIP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_END();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync return VINF_SUCCESS;
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync}
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 11/3. */
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsyncFNIEMOP_DEF_1(iemOp_fcmovnnu_stN, uint8_t, bRm)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync{
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_MNEMONIC("fcmovnnu st0,stN");
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
7a38fa5bae2ea027a2fcc3f05ac15f91a2716ddbvboxsync IEM_MC_BEGIN(0, 1);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(pr80ValueN, bRm & X86_MODRM_RM_MASK, 0)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_PF)
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ELSE()
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_ADVANCE_RIP();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync IEM_MC_END();
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync return VINF_SUCCESS;
563a5c83151f7468bf1ba61b6a2176a44ffc2d17vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 0xe0. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_fneni)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync{
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEMOP_MNEMONIC("fneni (8087/ign)");
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_BEGIN(0,0);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_ADVANCE_RIP();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_END();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync return VINF_SUCCESS;
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 0xe1. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_fndisi)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync{
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEMOP_MNEMONIC("fndisi (8087/ign)");
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_BEGIN(0,0);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_ADVANCE_RIP();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_END();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync return VINF_SUCCESS;
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 0xe2. */
964f7447f487d909cffc0b03a64ef661450f6639vboxsyncFNIEMOP_DEF(iemOp_fnclex)
964f7447f487d909cffc0b03a64ef661450f6639vboxsync{
964f7447f487d909cffc0b03a64ef661450f6639vboxsync IEMOP_MNEMONIC("fnclex");
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
964f7447f487d909cffc0b03a64ef661450f6639vboxsync IEM_MC_BEGIN(0,0);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
964f7447f487d909cffc0b03a64ef661450f6639vboxsync IEM_MC_CLEAR_FSW_EX();
964f7447f487d909cffc0b03a64ef661450f6639vboxsync IEM_MC_ADVANCE_RIP();
964f7447f487d909cffc0b03a64ef661450f6639vboxsync IEM_MC_END();
964f7447f487d909cffc0b03a64ef661450f6639vboxsync return VINF_SUCCESS;
964f7447f487d909cffc0b03a64ef661450f6639vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 0xe3. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_fninit)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync{
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEMOP_MNEMONIC("fninit");
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_finit, false /*fCheckXcpts*/);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 0xe4. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_fnsetpm)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync{
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEMOP_MNEMONIC("fnsetpm (80287/ign)"); /* set protected mode on fpu. */
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_BEGIN(0,0);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_ADVANCE_RIP();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_END();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync return VINF_SUCCESS;
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 0xe5. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_frstpm)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync{
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEMOP_MNEMONIC("frstpm (80287XL/ign)"); /* reset pm, back to real mode. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync#if 0 /* #UDs on newer CPUs */
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_BEGIN(0,0);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_ADVANCE_RIP();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_MC_END();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync return VINF_SUCCESS;
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync#else
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync#endif
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 11/5. */
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsyncFNIEMOP_DEF_1(iemOp_fucomi_stN, uint8_t, bRm)
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync{
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync IEMOP_MNEMONIC("fucomi st0,stN");
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_fcomi_fucomi, bRm & X86_MODRM_RM_MASK, iemAImpl_fucomi_r80_by_r80, false /*fPop*/);
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync}
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb 11/6. */
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsyncFNIEMOP_DEF_1(iemOp_fcomi_stN, uint8_t, bRm)
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync{
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync IEMOP_MNEMONIC("fcomi st0,stN");
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_fcomi_fucomi, bRm & X86_MODRM_RM_MASK, iemAImpl_fcomi_r80_by_r80, false /*fPop*/);
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdb. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_EscF3)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync{
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
268f430603a77a21f52b2184134fb1a28e920c49vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fcmovnb_stN, bRm);
268f430603a77a21f52b2184134fb1a28e920c49vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fcmovne_stN, bRm);
268f430603a77a21f52b2184134fb1a28e920c49vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fcmovnbe_stN, bRm);
268f430603a77a21f52b2184134fb1a28e920c49vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fcmovnnu_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 4:
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync switch (bRm)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0xe0: return FNIEMOP_CALL(iemOp_fneni);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0xe1: return FNIEMOP_CALL(iemOp_fndisi);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0xe2: return FNIEMOP_CALL(iemOp_fnclex);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0xe3: return FNIEMOP_CALL(iemOp_fninit);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0xe4: return FNIEMOP_CALL(iemOp_fnsetpm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0xe5: return FNIEMOP_CALL(iemOp_frstpm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0xe6: return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0xe7: return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync break;
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fucomi_stN, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fcomi_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 7: return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync else
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fild_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fisttp_m32i,bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fist_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fistp_m32i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 4: return IEMOP_RAISE_INVALID_OPCODE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fld_m80r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fstp_m80r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync/**
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync * Common worker for FPU instructions working on STn and ST0, and storing the
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync * result in STn unless IE, DE or ZE was raised.
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync *
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync */
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsyncFNIEMOP_DEF_2(iemOpHlpFpu_stN_st0, uint8_t, bRm, PFNIEMAIMPLFPUR80, pfnAImpl)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync{
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_BEGIN(3, 1);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value2, 2);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, bRm & X86_MODRM_RM_MASK, pr80Value2, 0)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pr80Value2);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_STORE_FPU_RESULT(FpuRes, bRm & X86_MODRM_RM_MASK);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ELSE()
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_FPU_STACK_UNDERFLOW(bRm & X86_MODRM_RM_MASK);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ADVANCE_RIP();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_END();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync return VINF_SUCCESS;
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync}
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc 11/0. */
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsyncFNIEMOP_DEF_1(iemOp_fadd_stN_st0, uint8_t, bRm)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync{
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_MNEMONIC("fadd stN,st0");
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0, bRm, iemAImpl_fadd_r80_by_r80);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync}
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc 11/1. */
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsyncFNIEMOP_DEF_1(iemOp_fmul_stN_st0, uint8_t, bRm)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync{
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_MNEMONIC("fmul stN,st0");
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0, bRm, iemAImpl_fmul_r80_by_r80);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync}
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc 11/4. */
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsyncFNIEMOP_DEF_1(iemOp_fsubr_stN_st0, uint8_t, bRm)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync{
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_MNEMONIC("fsubr stN,st0");
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0, bRm, iemAImpl_fsubr_r80_by_r80);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync}
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc 11/5. */
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsyncFNIEMOP_DEF_1(iemOp_fsub_stN_st0, uint8_t, bRm)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync{
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_MNEMONIC("fsub stN,st0");
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0, bRm, iemAImpl_fsub_r80_by_r80);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync}
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc 11/6. */
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsyncFNIEMOP_DEF_1(iemOp_fdivr_stN_st0, uint8_t, bRm)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync{
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_MNEMONIC("fdivr stN,st0");
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0, bRm, iemAImpl_fdivr_r80_by_r80);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync}
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc 11/7. */
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsyncFNIEMOP_DEF_1(iemOp_fdiv_stN_st0, uint8_t, bRm)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync{
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_MNEMONIC("fdiv stN,st0");
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0, bRm, iemAImpl_fdiv_r80_by_r80);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync}
04da102834f5018a410bab9ce590c319dfa41824vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync/**
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync * Common worker for FPU instructions working on ST0 and a 64-bit floating point
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync * memory operand, and storing the result in ST0.
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync *
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync */
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsyncFNIEMOP_DEF_2(iemOpHlpFpu_ST0_m64r, uint8_t, bRm, PFNIEMAIMPLFPUR64, pfnImpl)
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync{
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_BEGIN(3, 3);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_LOCAL(RTFLOAT64U, r64Factor2);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Factor1, 1);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_ARG_LOCAL_REF(PRTFLOAT64U, pr64Factor2, r64Factor2, 2);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_FETCH_MEM_R64(r64Factor2, pIemCpu->iEffSeg, GCPtrEffSrc);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Factor1, 0)
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnImpl, pFpuRes, pr80Factor1, pr64Factor2);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_STORE_FPU_RESULT_MEM_OP(FpuRes, 0, pIemCpu->iEffSeg, GCPtrEffSrc);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_ELSE()
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(0, pIemCpu->iEffSeg, GCPtrEffSrc);
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_ADVANCE_RIP();
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync IEM_MC_END();
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync return VINF_SUCCESS;
b3eb676cebf5407921b8f535095ca7655edb9db3vboxsync}
04da102834f5018a410bab9ce590c319dfa41824vboxsync
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync/** Opcode 0xdc !11/0. */
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsyncFNIEMOP_DEF_1(iemOp_fadd_m64r, uint8_t, bRm)
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync{
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync IEMOP_MNEMONIC("fadd m64r");
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_ST0_m64r, bRm, iemAImpl_fadd_r80_by_r64);
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync}
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync/** Opcode 0xdc !11/1. */
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsyncFNIEMOP_DEF_1(iemOp_fmul_m64r, uint8_t, bRm)
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync{
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync IEMOP_MNEMONIC("fmul m64r");
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_ST0_m64r, bRm, iemAImpl_fmul_r80_by_r64);
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync}
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync
9b94aa72f427a17f12197fe27073265341da7f52vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc !11/2. */
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsyncFNIEMOP_DEF_1(iemOp_fcom_m64r, uint8_t, bRm)
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync{
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_MNEMONIC("fcom st0,m64r");
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_BEGIN(3, 3);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_LOCAL(RTFLOAT64U, r64Val2);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ARG_LOCAL_REF(PCRTFLOAT64U, pr64Val2, r64Val2, 2);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_FETCH_MEM_R64(r64Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r64, pu16Fsw, pr80Value1, pr64Val2);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ELSE()
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ADVANCE_RIP();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_END();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync return VINF_SUCCESS;
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync}
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc !11/3. */
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsyncFNIEMOP_DEF_1(iemOp_fcomp_m64r, uint8_t, bRm)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync{
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_MNEMONIC("fcomp st0,m64r");
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_BEGIN(3, 3);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_LOCAL(RTFLOAT64U, r64Val2);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ARG_LOCAL_REF(PCRTFLOAT64U, pr64Val2, r64Val2, 2);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_FETCH_MEM_R64(r64Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r64, pu16Fsw, pr80Value1, pr64Val2);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ELSE()
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_ADVANCE_RIP();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync IEM_MC_END();
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync return VINF_SUCCESS;
9ea3cc17cb4036e70709045b4216c2016cb9d34fvboxsync}
04da102834f5018a410bab9ce590c319dfa41824vboxsync
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc !11/4. */
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsyncFNIEMOP_DEF_1(iemOp_fsub_m64r, uint8_t, bRm)
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync{
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync IEMOP_MNEMONIC("fsub m64r");
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_ST0_m64r, bRm, iemAImpl_fsub_r80_by_r64);
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync}
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc !11/5. */
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsyncFNIEMOP_DEF_1(iemOp_fsubr_m64r, uint8_t, bRm)
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync{
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync IEMOP_MNEMONIC("fsubr m64r");
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_ST0_m64r, bRm, iemAImpl_fsubr_r80_by_r64);
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync}
04da102834f5018a410bab9ce590c319dfa41824vboxsync
0f28b262b58834b0077e3defbc121fca0e269748vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc !11/6. */
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsyncFNIEMOP_DEF_1(iemOp_fdiv_m64r, uint8_t, bRm)
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync{
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEMOP_MNEMONIC("fdiv m64r");
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_ST0_m64r, bRm, iemAImpl_fdiv_r80_by_r64);
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync}
04da102834f5018a410bab9ce590c319dfa41824vboxsync
0f28b262b58834b0077e3defbc121fca0e269748vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync/** Opcode 0xdc !11/7. */
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsyncFNIEMOP_DEF_1(iemOp_fdivr_m64r, uint8_t, bRm)
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync{
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync IEMOP_MNEMONIC("fdivr m64r");
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_ST0_m64r, bRm, iemAImpl_fdivr_r80_by_r64);
53e42b967136278d8a79d9b0eec8c0ff70c390aavboxsync}
04da102834f5018a410bab9ce590c319dfa41824vboxsync
04da102834f5018a410bab9ce590c319dfa41824vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdc. */
04da102834f5018a410bab9ce590c319dfa41824vboxsyncFNIEMOP_DEF(iemOp_EscF4)
04da102834f5018a410bab9ce590c319dfa41824vboxsync{
04da102834f5018a410bab9ce590c319dfa41824vboxsync pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
04da102834f5018a410bab9ce590c319dfa41824vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
04da102834f5018a410bab9ce590c319dfa41824vboxsync {
04da102834f5018a410bab9ce590c319dfa41824vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
04da102834f5018a410bab9ce590c319dfa41824vboxsync {
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fadd_stN_st0, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fmul_stN_st0, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fcom_stN, bRm); /* Marked reserved, intel behavior is that of FCOM ST(i). */
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fcomp_stN, bRm); /* Marked reserved, intel behavior is that of FCOMP ST(i). */
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fsubr_stN_st0, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fsub_stN_st0, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fdivr_stN_st0, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fdiv_stN_st0, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
04da102834f5018a410bab9ce590c319dfa41824vboxsync }
04da102834f5018a410bab9ce590c319dfa41824vboxsync }
04da102834f5018a410bab9ce590c319dfa41824vboxsync else
04da102834f5018a410bab9ce590c319dfa41824vboxsync {
04da102834f5018a410bab9ce590c319dfa41824vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
04da102834f5018a410bab9ce590c319dfa41824vboxsync {
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fadd_m64r, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fmul_m64r, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fcom_m64r, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fcomp_m64r, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fsub_m64r, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fsubr_m64r, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fdiv_m64r, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fdivr_m64r, bRm);
04da102834f5018a410bab9ce590c319dfa41824vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
04da102834f5018a410bab9ce590c319dfa41824vboxsync }
04da102834f5018a410bab9ce590c319dfa41824vboxsync }
04da102834f5018a410bab9ce590c319dfa41824vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync/** Opcode 0xdd !11/0.
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync * @sa iemOp_fld_m32r */
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsyncFNIEMOP_DEF_1(iemOp_fld_m64r, uint8_t, bRm)
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync{
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEMOP_MNEMONIC("fld m64r");
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_BEGIN(2, 3);
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_LOCAL(RTFLOAT64U, r64Val);
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ARG_LOCAL_REF(PCRTFLOAT64U, pr64Val, r64Val, 1);
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_FETCH_MEM_R64(r64Val, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_IF_FPUREG_IS_EMPTY(7)
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r64_to_r80, pFpuRes, pr64Val);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ELSE()
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_ADVANCE_RIP();
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync IEM_MC_END();
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync return VINF_SUCCESS;
58b7ab82f43487a8a838dbeb96387c0d27b527f1vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
5ca366bb4004d8335376abb1718d1cb9beedf4efvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd !11/0. */
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsyncFNIEMOP_DEF_1(iemOp_fisttp_m64i, uint8_t, bRm)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync{
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_MNEMONIC("fisttp m64i");
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_BEGIN(3, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(int64_t *, pi64Dst, 1);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_MAP(pi64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i64, pu16Fsw, pi64Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi64Dst, IEM_ACCESS_DATA_W, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_I64_CONST_BY_REF(pi64Dst, INT64_MIN /* (integer indefinite) */);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pi64Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_END();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync return VINF_SUCCESS;
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd !11/0. */
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsyncFNIEMOP_DEF_1(iemOp_fst_m64r, uint8_t, bRm)
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync{
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEMOP_MNEMONIC("fst m64r");
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_BEGIN(3, 2);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ARG(PRTFLOAT64U, pr64Dst, 1);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_MEM_MAP(pr64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16Fsw, pr64Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_NEG_QNAN_R64_BY_REF(pr64Dst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_END();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync return VINF_SUCCESS;
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync}
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd !11/0. */
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsyncFNIEMOP_DEF_1(iemOp_fstp_m64r, uint8_t, bRm)
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync{
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEMOP_MNEMONIC("fstp m64r");
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_BEGIN(3, 2);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ARG(PRTFLOAT64U, pr64Dst, 1);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_MEM_MAP(pr64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16Fsw, pr64Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw);
44e92d62784be5a0b1410eb28c248a4603bbed40vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_NEG_QNAN_R64_BY_REF(pr64Dst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync IEM_MC_END();
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync return VINF_SUCCESS;
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync}
b5df0afad3afdbe8424359a4a97733c0f8c2b5c4vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd !11/0. */
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsyncFNIEMOP_DEF_1(iemOp_frstor, uint8_t, bRm)
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync{
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEMOP_MNEMONIC("frstor m94/108byte");
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_BEGIN(3, 0);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize, 0);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 1);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_ARG(RTGCPTR, GCPtrEffSrc, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_frstor, enmEffOpSize, iEffSeg, GCPtrEffSrc);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_END();
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync return VINF_SUCCESS;
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync}
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd !11/0. */
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsyncFNIEMOP_DEF_1(iemOp_fnsave, uint8_t, bRm)
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync{
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEMOP_MNEMONIC("fnsave m94/108byte");
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_BEGIN(3, 0);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize, 0);
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ARG(uint8_t, iEffSeg, 1);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_ARG(RTGCPTR, GCPtrEffDst, 2);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
2532c528b686eb371278fc8d8b26b1fdba7960b0vboxsync IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_CALL_CIMPL_3(iemCImpl_fnsave, enmEffOpSize, iEffSeg, GCPtrEffDst);
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync IEM_MC_END();
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync return VINF_SUCCESS;
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
8ad911e0e7b390e7ce4753eb3ef0a3e4aecd458cvboxsync}
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd !11/0. */
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsyncFNIEMOP_DEF_1(iemOp_fnstsw, uint8_t, bRm)
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync{
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEMOP_MNEMONIC("fnstsw m16");
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_BEGIN(0, 2);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_FETCH_FSW(u16Tmp);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Tmp);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_ADVANCE_RIP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync/** @todo Debug / drop a hint to the verifier that things may differ
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync * from REM. Seen 0x4020 (iem) vs 0x4000 (rem) at 0008:801c6b88 booting
f74327eabb87ebb53205b7f1c0ae2258f13989ffvboxsync * NT4SP1. (X86_FSW_PE) */
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_END();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync return VINF_SUCCESS;
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync}
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd 11/0. */
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsyncFNIEMOP_DEF_1(iemOp_ffree_stN, uint8_t, bRm)
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync{
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEMOP_MNEMONIC("ffree stN");
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync /* Note! C0, C1, C2 and C3 are documented as undefined, we leave the
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync unmodified. */
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_BEGIN(0, 0);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_FPU_STACK_FREE(bRm & X86_MODRM_RM_MASK);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_ADVANCE_RIP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_END();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync return VINF_SUCCESS;
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
9b94aa72f427a17f12197fe27073265341da7f52vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd 11/1. */
9b94aa72f427a17f12197fe27073265341da7f52vboxsyncFNIEMOP_DEF_1(iemOp_fst_stN, uint8_t, bRm)
9b94aa72f427a17f12197fe27073265341da7f52vboxsync{
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEMOP_MNEMONIC("fst st0,stN");
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
9b94aa72f427a17f12197fe27073265341da7f52vboxsync
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_BEGIN(0, 2);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_LOCAL(PCRTFLOAT80U, pr80Value);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_SET_FPU_RESULT(FpuRes, 0 /*FSW*/, pr80Value);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_STORE_FPU_RESULT(FpuRes, bRm & X86_MODRM_RM_MASK);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_ELSE()
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_FPU_STACK_UNDERFLOW(bRm & X86_MODRM_RM_MASK);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_ADVANCE_RIP();
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEM_MC_END();
9b94aa72f427a17f12197fe27073265341da7f52vboxsync return VINF_SUCCESS;
9b94aa72f427a17f12197fe27073265341da7f52vboxsync}
9b94aa72f427a17f12197fe27073265341da7f52vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd 11/3. */
9b94aa72f427a17f12197fe27073265341da7f52vboxsyncFNIEMOP_DEF_1(iemOp_fucom_stN_st0, uint8_t, bRm)
9b94aa72f427a17f12197fe27073265341da7f52vboxsync{
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEMOP_MNEMONIC("fcom st0,stN");
9b94aa72f427a17f12197fe27073265341da7f52vboxsync return FNIEMOP_CALL_2(iemOpHlpFpuNoStore_st0_stN, bRm, iemAImpl_fucom_r80_by_r80);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync}
9b94aa72f427a17f12197fe27073265341da7f52vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd 11/4. */
9b94aa72f427a17f12197fe27073265341da7f52vboxsyncFNIEMOP_DEF_1(iemOp_fucomp_stN, uint8_t, bRm)
9b94aa72f427a17f12197fe27073265341da7f52vboxsync{
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEMOP_MNEMONIC("fcomp st0,stN");
9b94aa72f427a17f12197fe27073265341da7f52vboxsync return FNIEMOP_CALL_2(iemOpHlpFpuNoStore_st0_stN_pop, bRm, iemAImpl_fucom_r80_by_r80);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync}
9b94aa72f427a17f12197fe27073265341da7f52vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync/** Opcode 0xdd. */
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsyncFNIEMOP_DEF(iemOp_EscF5)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync{
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 0: return FNIEMOP_CALL_1(iemOp_ffree_stN, bRm);
fa6b73f3e642b12f88ea56488b7059f9910d5e3bvboxsync case 1: return FNIEMOP_CALL_1(iemOp_fxch_stN, bRm); /* Reserved, intel behavior is that of XCHG ST(i). */
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fst_stN, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fstp_stN, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fucom_stN_st0,bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fucomp_stN, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 6: return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 7: return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync else
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync {
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fld_m64r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fisttp_m64i, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fst_m64r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fstp_m64r, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 4: return FNIEMOP_CALL_1(iemOp_frstor, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 5: return IEMOP_RAISE_INVALID_OPCODE();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fnsave, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fnstsw, bRm);
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync }
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync}
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
06194245f8ac73bd13b903e4870fb667bb003ee9vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde 11/0. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_faddp_stN_st0, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("faddp stN,st0");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0_pop, bRm, iemAImpl_fadd_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde 11/0. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fmulp_stN_st0, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fmulp stN,st0");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0_pop, bRm, iemAImpl_fmul_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync/** Opcode 0xde 0xd9. */
9b94aa72f427a17f12197fe27073265341da7f52vboxsyncFNIEMOP_DEF(iemOp_fcompp)
9b94aa72f427a17f12197fe27073265341da7f52vboxsync{
9b94aa72f427a17f12197fe27073265341da7f52vboxsync IEMOP_MNEMONIC("fucompp st0,stN");
9b94aa72f427a17f12197fe27073265341da7f52vboxsync return FNIEMOP_CALL_1(iemOpHlpFpuNoStore_st0_stN_pop_pop, iemAImpl_fcom_r80_by_r80);
9b94aa72f427a17f12197fe27073265341da7f52vboxsync}
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde 11/4. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fsubrp_stN_st0, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fsubrp stN,st0");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0_pop, bRm, iemAImpl_fsubr_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde 11/5. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fsubp_stN_st0, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fsubp stN,st0");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0_pop, bRm, iemAImpl_fsub_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde 11/6. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fdivrp_stN_st0, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fdivrp stN,st0");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0_pop, bRm, iemAImpl_fdivr_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde 11/7. */
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsyncFNIEMOP_DEF_1(iemOp_fdivp_stN_st0, uint8_t, bRm)
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync{
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync IEMOP_MNEMONIC("fdivp stN,st0");
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_stN_st0_pop, bRm, iemAImpl_fdiv_r80_by_r80);
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync}
ce1318f291ab810c19aa03ce38d6a87679ba3af7vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync/**
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync * Common worker for FPU instructions working on ST0 and an m16i, and storing
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync * the result in ST0.
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync *
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync * @param pfnAImpl Pointer to the instruction implementation (assembly).
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync */
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsyncFNIEMOP_DEF_2(iemOpHlpFpu_st0_m16i, uint8_t, bRm, PFNIEMAIMPLFPUI16, pfnAImpl)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync{
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_BEGIN(3, 3);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_LOCAL(int16_t, i16Val2);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ARG_LOCAL_REF(int16_t const *, pi16Val2, i16Val2, 2);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_FETCH_MEM_I16(i16Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pi16Val2);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ELSE()
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_FPU_STACK_UNDERFLOW(0);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ADVANCE_RIP();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_END();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync return VINF_SUCCESS;
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync}
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde !11/0. */
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsyncFNIEMOP_DEF_1(iemOp_fiadd_m16i, uint8_t, bRm)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync{
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_MNEMONIC("fiadd m16i");
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fiadd_r80_by_i16);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync}
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde !11/1. */
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsyncFNIEMOP_DEF_1(iemOp_fimul_m16i, uint8_t, bRm)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync{
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_MNEMONIC("fimul m16i");
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fimul_r80_by_i16);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync}
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde !11/2. */
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsyncFNIEMOP_DEF_1(iemOp_ficom_m16i, uint8_t, bRm)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync{
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_MNEMONIC("ficom st0,m16i");
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_BEGIN(3, 3);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_LOCAL(int16_t, i16Val2);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ARG_LOCAL_REF(int16_t const *, pi16Val2, i16Val2, 2);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_FETCH_MEM_I16(i16Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i16, pu16Fsw, pr80Value1, pi16Val2);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ELSE()
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ADVANCE_RIP();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_END();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync return VINF_SUCCESS;
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync}
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde !11/3. */
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsyncFNIEMOP_DEF_1(iemOp_ficomp_m16i, uint8_t, bRm)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync{
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_MNEMONIC("ficomp st0,m16i");
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_BEGIN(3, 3);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_LOCAL(int16_t, i16Val2);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value1, 1);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ARG_LOCAL_REF(int16_t const *, pi16Val2, i16Val2, 2);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_FETCH_MEM_I16(i16Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i16, pu16Fsw, pr80Value1, pi16Val2);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ELSE()
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_ADVANCE_RIP();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEM_MC_END();
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync return VINF_SUCCESS;
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync}
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde !11/4. */
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsyncFNIEMOP_DEF_1(iemOp_fisub_m16i, uint8_t, bRm)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync{
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_MNEMONIC("fisub m16i");
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fisub_r80_by_i16);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync}
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde !11/5. */
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsyncFNIEMOP_DEF_1(iemOp_fisubr_m16i, uint8_t, bRm)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync{
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_MNEMONIC("fisubr m16i");
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fisubr_r80_by_i16);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync}
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde !11/6. */
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsyncFNIEMOP_DEF_1(iemOp_fidiv_m16i, uint8_t, bRm)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync{
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_MNEMONIC("fiadd m16i");
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fidiv_r80_by_i16);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync}
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xde !11/7. */
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsyncFNIEMOP_DEF_1(iemOp_fidivr_m16i, uint8_t, bRm)
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync{
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync IEMOP_MNEMONIC("fiadd m16i");
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fidivr_r80_by_i16);
9f2a126861374bb11fb9e70265f8a4b6260ccb77vboxsync}
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xde. */
d4a8f6749f70bad88edc04de808643d372faa35avboxsyncFNIEMOP_DEF(iemOp_EscF6)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync{
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 0: return FNIEMOP_CALL_1(iemOp_faddp_stN_st0, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fmulp_stN_st0, bRm);
5d13786cdbbfe98a4ba8476845c80d1396d62272vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fcomp_stN, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 3: if (bRm == 0xd9)
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync return FNIEMOP_CALL(iemOp_fcompp);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync return IEMOP_RAISE_INVALID_OPCODE();
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fsubrp_stN_st0, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fsubp_stN_st0, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fdivrp_stN_st0, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fdivp_stN_st0, bRm);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync else
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
d4a8f6749f70bad88edc04de808643d372faa35avboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fiadd_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fimul_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 2: return FNIEMOP_CALL_1(iemOp_ficom_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 3: return FNIEMOP_CALL_1(iemOp_ficomp_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fisub_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fisubr_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fidiv_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fidivr_m16i, bRm);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync}
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync/** Opcode 0xdf 11/0.
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync * Undocument instruction, assumed to work like ffree + fincstp. */
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsyncFNIEMOP_DEF_1(iemOp_ffreep_stN, uint8_t, bRm)
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync{
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEMOP_MNEMONIC("ffreep stN");
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_BEGIN(0, 0);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_FPU_STACK_FREE(bRm & X86_MODRM_RM_MASK);
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_FPU_STACK_INC_TOP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_UPDATE_FPU_OPCODE_IP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_ADVANCE_RIP();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync IEM_MC_END();
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync return VINF_SUCCESS;
12709910a6c0ee9053dbe6c13820752a0e30acc0vboxsync}
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync/** Opcode 0xdf 0xe0. */
d4a8f6749f70bad88edc04de808643d372faa35avboxsyncFNIEMOP_DEF(iemOp_fnstsw_ax)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync{
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEMOP_MNEMONIC("fnstsw ax");
14089fa53a366de0c6868d9270292d0b84f8c6a5vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_BEGIN(0, 1);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_LOCAL(uint16_t, u16Tmp);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_FETCH_FSW(u16Tmp);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_STORE_GREG_U16(X86_GREG_xAX, u16Tmp);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_ADVANCE_RIP();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_MC_END();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync return VINF_SUCCESS;
d4a8f6749f70bad88edc04de808643d372faa35avboxsync}
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
d4a8f6749f70bad88edc04de808643d372faa35avboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf 11/5. */
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsyncFNIEMOP_DEF_1(iemOp_fucomip_st0_stN, uint8_t, bRm)
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync{
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync IEMOP_MNEMONIC("fcomip st0,stN");
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_fcomi_fucomi, bRm & X86_MODRM_RM_MASK, iemAImpl_fcomi_r80_by_r80, true /*fPop*/);
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync}
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf 11/6. */
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsyncFNIEMOP_DEF_1(iemOp_fcomip_st0_stN, uint8_t, bRm)
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync{
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync IEMOP_MNEMONIC("fcomip st0,stN");
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_fcomi_fucomi, bRm & X86_MODRM_RM_MASK, iemAImpl_fcomi_r80_by_r80, true /*fPop*/);
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync}
8ae783bf7da7b2f0abb7b8d243b79aaafa35aa73vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf !11/0. */
029c12fc226bf56207d01b152d5206090313519dvboxsyncFNIEMOP_DEF_1(iemOp_fild_m16i, uint8_t, bRm)
029c12fc226bf56207d01b152d5206090313519dvboxsync{
029c12fc226bf56207d01b152d5206090313519dvboxsync IEMOP_MNEMONIC("fild m16i");
029c12fc226bf56207d01b152d5206090313519dvboxsync
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_BEGIN(2, 3);
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_LOCAL(int16_t, i16Val);
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_ARG_LOCAL_REF(int16_t const *, pi16Val, i16Val, 1);
029c12fc226bf56207d01b152d5206090313519dvboxsync
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
029c12fc226bf56207d01b152d5206090313519dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
029c12fc226bf56207d01b152d5206090313519dvboxsync
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_FETCH_MEM_I16(i16Val, pIemCpu->iEffSeg, GCPtrEffSrc);
029c12fc226bf56207d01b152d5206090313519dvboxsync
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_IF_FPUREG_IS_EMPTY(7)
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_i16_to_r80, pFpuRes, pi16Val);
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_ELSE()
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_ENDIF();
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_USED_FPU();
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_ADVANCE_RIP();
029c12fc226bf56207d01b152d5206090313519dvboxsync
029c12fc226bf56207d01b152d5206090313519dvboxsync IEM_MC_END();
029c12fc226bf56207d01b152d5206090313519dvboxsync return VINF_SUCCESS;
029c12fc226bf56207d01b152d5206090313519dvboxsync}
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf !11/1. */
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsyncFNIEMOP_DEF_1(iemOp_fisttp_m16i, uint8_t, bRm)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync{
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_MNEMONIC("fisttp m16i");
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_BEGIN(3, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(int16_t *, pi16Dst, 1);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_I16_CONST_BY_REF(pi16Dst, INT16_MIN /* (integer indefinite) */);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_END();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync return VINF_SUCCESS;
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync}
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf !11/2. */
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsyncFNIEMOP_DEF_1(iemOp_fist_m16i, uint8_t, bRm)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync{
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_MNEMONIC("fistp m16i");
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_BEGIN(3, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(int16_t *, pi16Dst, 1);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_I16_CONST_BY_REF(pi16Dst, INT16_MIN /* (integer indefinite) */);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_END();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync return VINF_SUCCESS;
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync}
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf !11/3. */
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsyncFNIEMOP_DEF_1(iemOp_fistp_m16i, uint8_t, bRm)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync{
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_MNEMONIC("fistp m16i");
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_BEGIN(3, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(int16_t *, pi16Dst, 1);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_I16_CONST_BY_REF(pi16Dst, INT16_MIN /* (integer indefinite) */);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_END();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync return VINF_SUCCESS;
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync}
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf !11/4. */
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsyncFNIEMOP_STUB_1(iemOp_fbld_m80d, uint8_t, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf !11/5. */
9ac98355052c66acf78c6cf866013822c35eac8dvboxsyncFNIEMOP_DEF_1(iemOp_fild_m64i, uint8_t, bRm)
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync{
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEMOP_MNEMONIC("fild m64i");
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_BEGIN(2, 3);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_LOCAL(IEMFPURESULT, FpuRes);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_LOCAL(int64_t, i64Val);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_ARG_LOCAL_REF(int64_t const *, pi64Val, i64Val, 1);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_FETCH_MEM_I64(i64Val, pIemCpu->iEffSeg, GCPtrEffSrc);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_IF_FPUREG_IS_EMPTY(7)
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_i64_to_r80, pFpuRes, pi64Val);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_ELSE()
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_ENDIF();
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_USED_FPU();
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_ADVANCE_RIP();
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync IEM_MC_END();
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync return VINF_SUCCESS;
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync}
9ac98355052c66acf78c6cf866013822c35eac8dvboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf !11/6. */
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsyncFNIEMOP_STUB_1(iemOp_fbstp_m80d, uint8_t, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync/** Opcode 0xdf !11/7. */
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsyncFNIEMOP_DEF_1(iemOp_fistp_m64i, uint8_t, bRm)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync{
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_MNEMONIC("fistp m64i");
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_BEGIN(3, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_LOCAL(uint16_t, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(int64_t *, pi64Dst, 1);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MAYBE_RAISE_FPU_XCPT();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_MAP(pi64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i64, pu16Fsw, pi64Dst, pr80Value);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi64Dst, IEM_ACCESS_DATA_W, u16Fsw);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ELSE()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_IF_FCW_IM()
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_STORE_MEM_I64_CONST_BY_REF(pi64Dst, INT64_MIN /* (integer indefinite) */);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pi64Dst, IEM_ACCESS_DATA_W);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ENDIF();
2ce1088c53ef02ce89e45b805920c02fee37d635vboxsync IEM_MC_USED_FPU();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_ADVANCE_RIP();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync IEM_MC_END();
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync return VINF_SUCCESS;
d280ee7a17fc630c6a421724d49e1cd28edcac10vboxsync}
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xdf. */
d4a8f6749f70bad88edc04de808643d372faa35avboxsyncFNIEMOP_DEF(iemOp_EscF7)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
d4a8f6749f70bad88edc04de808643d372faa35avboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 0: return FNIEMOP_CALL_1(iemOp_ffreep_stN, bRm); /* ffree + pop afterwards, since forever according to AMD. */
6e561e438c22d6525356608a7962efda30ba5740vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fxch_stN, bRm); /* Reserved, behaves like FXCH ST(i) on intel. */
6e561e438c22d6525356608a7962efda30ba5740vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fstp_stN, bRm); /* Reserved, behaves like FSTP ST(i) on intel. */
6e561e438c22d6525356608a7962efda30ba5740vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fstp_stN, bRm); /* Reserved, behaves like FSTP ST(i) on intel. */
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 4: if (bRm == 0xe0)
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync return FNIEMOP_CALL(iemOp_fnstsw_ax);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync return IEMOP_RAISE_INVALID_OPCODE();
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fucomip_st0_stN, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fcomip_st0_stN, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 7: return IEMOP_RAISE_INVALID_OPCODE();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync else
d4a8f6749f70bad88edc04de808643d372faa35avboxsync {
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync {
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 0: return FNIEMOP_CALL_1(iemOp_fild_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 1: return FNIEMOP_CALL_1(iemOp_fisttp_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 2: return FNIEMOP_CALL_1(iemOp_fist_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 3: return FNIEMOP_CALL_1(iemOp_fistp_m16i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 4: return FNIEMOP_CALL_1(iemOp_fbld_m80d, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 5: return FNIEMOP_CALL_1(iemOp_fild_m64i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 6: return FNIEMOP_CALL_1(iemOp_fbstp_m80d, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync case 7: return FNIEMOP_CALL_1(iemOp_fistp_m64i, bRm);
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
c3a0242d1bc97bc1bef926c4db3678cc51c84793vboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync }
d4a8f6749f70bad88edc04de808643d372faa35avboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_loopne_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("loopne Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SUB_GREG_U16(X86_GREG_xCX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_CX_IS_NZ_AND_EFL_BIT_NOT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SUB_GREG_U32(X86_GREG_xCX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_ECX_IS_NZ_AND_EFL_BIT_NOT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SUB_GREG_U64(X86_GREG_xCX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_RCX_IS_NZ_AND_EFL_BIT_NOT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe1. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_loope_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("loope Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SUB_GREG_U16(X86_GREG_xCX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_CX_IS_NZ_AND_EFL_BIT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SUB_GREG_U32(X86_GREG_xCX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_ECX_IS_NZ_AND_EFL_BIT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SUB_GREG_U64(X86_GREG_xCX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_RCX_IS_NZ_AND_EFL_BIT_SET(X86_EFL_ZF) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_loop_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("loop Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /** @todo Check out the #GP case if EIP < CS.Base or EIP > CS.Limit when
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * using the 32-bit operand size override. How can that be restarted? See
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * weird pseudo code in intel manual. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync if (-(int8_t)pIemCpu->offOpcode != i8Imm)
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_SUB_GREG_U16(X86_GREG_xCX, 1);
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_IF_CX_IS_NZ() {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_REL_JMP_S8(i8Imm);
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync } IEM_MC_ELSE() {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_ADVANCE_RIP();
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync } IEM_MC_ENDIF();
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync }
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync else
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_STORE_GREG_U16_CONST(X86_GREG_xCX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync if (-(int8_t)pIemCpu->offOpcode != i8Imm)
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_SUB_GREG_U32(X86_GREG_xCX, 1);
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_IF_ECX_IS_NZ() {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_REL_JMP_S8(i8Imm);
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync } IEM_MC_ELSE() {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_ADVANCE_RIP();
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync } IEM_MC_ENDIF();
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync }
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync else
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_STORE_GREG_U32_CONST(X86_GREG_xCX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync if (-(int8_t)pIemCpu->offOpcode != i8Imm)
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_SUB_GREG_U64(X86_GREG_xCX, 1);
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_IF_RCX_IS_NZ() {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_REL_JMP_S8(i8Imm);
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync } IEM_MC_ELSE() {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_ADVANCE_RIP();
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync } IEM_MC_ENDIF();
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync }
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync else
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync {
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync IEM_MC_STORE_GREG_U64_CONST(X86_GREG_xCX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
8d494386ac569b3450d05d2e371fe490dfc17407vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jecxz_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jecxz Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffAddrMode)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_CX_IS_NZ() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ELSE() {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_ECX_IS_NZ() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ELSE() {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0,0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_RCX_IS_NZ() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
e41f0459369a6d814aa36bf4def225482fc56026vboxsync } IEM_MC_ELSE() {
e41f0459369a6d814aa36bf4def225482fc56026vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe4 */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_in_AL_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("in eAX,Ib");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_in, u8Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe5 */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_in_eAX_Ib)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("in eAX,Ib");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_in, u8Imm, pIemCpu->enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe6 */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_out_Ib_AL)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("out Ib,AL");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_out, u8Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe7 */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_out_Ib_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("out Ib,eAX");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_out, u8Imm, pIemCpu->enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe8. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_call_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("call Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
37fd636275891bcf75bd60c624d8fbf3f262c435vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_call_rel_16, (int16_t)u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_call_rel_32, (int32_t)u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_call_rel_64, u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xe9. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jmp_Jv)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jmp Jv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S16(i16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S32(i32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xea. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jmp_Ap)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jmp Ap");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_64BIT();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* Decode the far pointer address and pass it on to the far call C implementation. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint32_t offSeg;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pIemCpu->enmEffOpSize != IEMMODE_16BIT)
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync IEM_OPCODE_GET_NEXT_U32(&offSeg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
37fd636275891bcf75bd60c624d8fbf3f262c435vboxsync IEM_OPCODE_GET_NEXT_U16_ZX_U32(&offSeg);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t uSel; IEM_OPCODE_GET_NEXT_U16(&uSel);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
a13bd47f22085c82960265c150f10f2195369630vboxsync return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_FarJmp, uSel, offSeg, pIemCpu->enmEffOpSize);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xeb. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_jmp_Jb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("jmp Jb");
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(&i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
8f28e374e0b8ea801e7b5364bccd8a7e0a6211d3vboxsync IEM_MC_REL_JMP_S8(i8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xec */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_in_AL_DX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("in AL,DX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_in_eAX_DX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xed */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_eAX_DX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("in eAX,DX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_in_eAX_DX, pIemCpu->enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xee */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_out_DX_AL)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("out DX,AL");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_out_DX_eAX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xef */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_out_DX_eAX)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("out DX,eAX");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_out_DX_eAX, pIemCpu->enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_lock)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("lock");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_LOCK;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
4a84814aff76797623dd72295fd77e390701d686vboxsync/** Opcode 0xf1. */
4a84814aff76797623dd72295fd77e390701d686vboxsyncFNIEMOP_DEF(iemOp_int_1)
4a84814aff76797623dd72295fd77e390701d686vboxsync{
4a84814aff76797623dd72295fd77e390701d686vboxsync IEMOP_MNEMONIC("int1"); /* icebp */
4a84814aff76797623dd72295fd77e390701d686vboxsync /** @todo testcase! */
4a84814aff76797623dd72295fd77e390701d686vboxsync return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_int, X86_XCPT_DB, false /*fIsBpInstr*/);
4a84814aff76797623dd72295fd77e390701d686vboxsync}
4a84814aff76797623dd72295fd77e390701d686vboxsync
4a84814aff76797623dd72295fd77e390701d686vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf2. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_repne)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* This overrides any previous REPE prefix. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes &= ~IEM_OP_PRF_REPZ;
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("repne");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REPNZ;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf3. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_repe)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* This overrides any previous REPNE prefix. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes &= ~IEM_OP_PRF_REPNZ;
93f5e318bdffb66ddc6001c0b0e7ea1ca046887dvboxsync IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("repe");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync pIemCpu->fPrefixes |= IEM_OP_PRF_REPZ;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL(g_apfnOneByteMap[b]);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf4. */
f7f6566815ee2d52e6a10782759ef6278db0f236vboxsyncFNIEMOP_DEF(iemOp_hlt)
f7f6566815ee2d52e6a10782759ef6278db0f236vboxsync{
f7f6566815ee2d52e6a10782759ef6278db0f236vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
f7f6566815ee2d52e6a10782759ef6278db0f236vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_hlt);
f7f6566815ee2d52e6a10782759ef6278db0f236vboxsync}
f7f6566815ee2d52e6a10782759ef6278db0f236vboxsync
f7f6566815ee2d52e6a10782759ef6278db0f236vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf5. */
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsyncFNIEMOP_DEF(iemOp_cmc)
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync{
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync IEMOP_MNEMONIC("cmc");
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync IEM_MC_BEGIN(0, 0);
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync IEM_MC_FLIP_EFL_BIT(X86_EFL_CF);
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync IEM_MC_ADVANCE_RIP();
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync IEM_MC_END();
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync return VINF_SUCCESS;
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common implementation of 'inc/dec/not/neg Eb'.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param bRm The RM byte.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param pImpl The instruction implementation.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_2(iemOpCommonUnaryEb, uint8_t, bRm, PCIEMOPUNARYSIZES, pImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register access */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU8, pu8Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory access. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU8, pu8Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnLockedU8, pu8Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Common implementation of 'inc/dec/not/neg Ev'.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param bRm The RM byte.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param pImpl The instruction implementation.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_2(iemOpCommonUnaryEv, uint8_t, bRm, PCIEMOPUNARYSIZES, pImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* Registers are handled by a common worker. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, pImpl, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* Memory we do here. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU16, pu16Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnLockedU16, pu16Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU32, pu32Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnLockedU32, pu32Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(2, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU64, pu64Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnLockedU64, pu64Dst, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf6 /0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_grp3_test_Eb, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("test Eb,Ib");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register access */
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint8_t, u8Src,/*=*/u8Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory access. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t *, pu8Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, u8Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u8Src, u8Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_R, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u8, pu8Dst, u8Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_R);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf7 /0. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_grp3_test_Ev, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("test Ev,Iv");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register access */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint16_t, u16Src,/*=*/u16Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint32_t, u32Src,/*=*/u32Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u32, pu32Dst, u32Src, pEFlags);
b62bdbcd2079b68453406a73f3f8b63b73959d5cvboxsync /* No clearing the high dword here - test doesn't write back the result. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_CONST(uint64_t, u64Src,/*=*/u64Imm, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory access. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 2);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u16Src, u16Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_R, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u16, pu16Dst, u16Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_R);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t, u32Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u32Src, u32Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_R, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u32, pu32Dst, u32Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_R);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64Dst, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t, u64Src, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ASSIGN(u64Src, u64Imm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_R, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u64, pu64Dst, u64Src, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_R);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_COMMIT_EFLAGS(EFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf6 /4, /5, /6 and /7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_2(iemOpCommonGrp3MulDivEb, uint8_t, bRm, PFNIEMAIMPLMULDIVU8, pfnU8)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register access */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16AX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, u8Value, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_LOCAL(int32_t, rc);
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U8(u8Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_CALL_AIMPL_3(rc, pfnU8, pu16AX, u8Value, pEFlags);
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_IF_LOCAL_IS_Z(rc) {
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_ADVANCE_RIP();
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync } IEM_MC_ELSE() {
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_RAISE_DIVIDE_ERROR();
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync } IEM_MC_ENDIF();
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory access. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_BEGIN(3, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16AX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint8_t, u8Value, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_LOCAL(int32_t, rc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U8(u8Value, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_CALL_AIMPL_3(rc, pfnU8, pu16AX, u8Value, pEFlags);
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_IF_LOCAL_IS_Z(rc) {
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_ADVANCE_RIP();
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync } IEM_MC_ELSE() {
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync IEM_MC_RAISE_DIVIDE_ERROR();
d9e8d25a9d654b882b82e4e33ca8b6f294a770f7vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf7 /4, /5, /6 and /7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_2(iemOpCommonGrp3MulDivEv, uint8_t, bRm, PCIEMOPMULDIVSIZES, pImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* register access */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
9a6d39f9b24d868876d8ae540318c4e5496db8bfvboxsync IEM_MC_BEGIN(4, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16AX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16DX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Value, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(int32_t, rc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_LOCAL_IS_Z(rc) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_RAISE_DIVIDE_ERROR();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
9a6d39f9b24d868876d8ae540318c4e5496db8bfvboxsync IEM_MC_BEGIN(4, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32AX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32DX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t, u32Value, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(int32_t, rc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_LOCAL_IS_Z(rc) {
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32AX);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32DX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_RAISE_DIVIDE_ERROR();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
9a6d39f9b24d868876d8ae540318c4e5496db8bfvboxsync IEM_MC_BEGIN(4, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64AX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64DX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t, u64Value, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(int32_t, rc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_LOCAL_IS_Z(rc) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_RAISE_DIVIDE_ERROR();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* memory access. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
9a6d39f9b24d868876d8ae540318c4e5496db8bfvboxsync IEM_MC_BEGIN(4, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16AX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t *, pu16DX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Value, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(int32_t, rc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_LOCAL_IS_Z(rc) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_RAISE_DIVIDE_ERROR();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
9a6d39f9b24d868876d8ae540318c4e5496db8bfvboxsync IEM_MC_BEGIN(4, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32AX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pu32DX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t, u32Value, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(int32_t, rc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_LOCAL_IS_Z(rc) {
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32AX);
ad48d99bb93b6a4b7706717c9435db9816142953vboxsync IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32DX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_RAISE_DIVIDE_ERROR();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
9a6d39f9b24d868876d8ae540318c4e5496db8bfvboxsync IEM_MC_BEGIN(4, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64AX, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t *, pu64DX, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint64_t, u64Value, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint32_t *, pEFlags, 3);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(int32_t, rc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_REF_EFLAGS(pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_IF_LOCAL_IS_Z(rc) {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ELSE() {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_RAISE_DIVIDE_ERROR();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync } IEM_MC_ENDIF();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf6. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp3_Eb)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_grp3_test_Eb, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("not Eb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_not);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("neg Eb");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_neg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 4:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mul Eb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEb, bRm, iemAImpl_mul_u8);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("imul Eb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEb, bRm, iemAImpl_imul_u8);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 6:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("div Eb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_OF | X86_EFL_CF);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEb, bRm, iemAImpl_div_u8);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("idiv Eb");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_OF | X86_EFL_CF);
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEb, bRm, iemAImpl_idiv_u8);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf7. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp3_Ev)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_grp3_test_Ev, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1:
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("not Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryEv, bRm, &g_iemAImpl_not);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("neg Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryEv, bRm, &g_iemAImpl_neg);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 4:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("mul Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEv, bRm, &g_iemAImpl_mul);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("imul Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEv, bRm, &g_iemAImpl_imul);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 6:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("div Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_OF | X86_EFL_CF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEv, bRm, &g_iemAImpl_div);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("idiv Ev");
b64efece437bfca8872b81be9d0568ba90389d91vboxsync IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_OF | X86_EFL_CF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEv, bRm, &g_iemAImpl_idiv);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf8. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_clc)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("clc");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CLEAR_EFL_BIT(X86_EFL_CF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xf9. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_stc)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
a0b956b161995eb99044ba887c22d4cc220b47c6vboxsync IEMOP_MNEMONIC("stc");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SET_EFL_BIT(X86_EFL_CF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xfa. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_cli)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("cli");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_cli);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_sti)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("sti");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_sti);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xfc. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_cld)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("cld");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_CLEAR_EFL_BIT(X86_EFL_DF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xfd. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_std)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("std");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SET_EFL_BIT(X86_EFL_DF);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xfe. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp4)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_inc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_dec);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync default:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("grp4-ud");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Opcode 0xff /2.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param bRm The RM byte.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp5_calln_Ev, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEMOP_MNEMONIC("calln Ev");
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo Too early? */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync /* The new RIP is taken from a register. */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync switch (pIemCpu->enmEffOpSize)
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_16BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(1, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint16_t, u16Target, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U16(u16Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_call_16, u16Target);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END()
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_32BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(1, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint32_t, u32Target, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U32(u32Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_call_32, u32Target);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END()
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_64BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(1, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint64_t, u64Target, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_GREG_U64(u64Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_call_64, u64Target);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END()
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync else
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync /* The new RIP is taken from a register. */
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync switch (pIemCpu->enmEffOpSize)
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync {
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_16BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(1, 1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint16_t, u16Target, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_MEM_U16(u16Target, pIemCpu->iEffSeg, GCPtrEffSrc);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_call_16, u16Target);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END()
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_32BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(1, 1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint32_t, u32Target, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_MEM_U32(u32Target, pIemCpu->iEffSeg, GCPtrEffSrc);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_call_32, u32Target);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END()
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync case IEMMODE_64BIT:
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_BEGIN(1, 1);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_ARG(uint64_t, u64Target, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_FETCH_MEM_U64(u64Target, pIemCpu->iEffSeg, GCPtrEffSrc);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_CALL_CIMPL_1(iemCImpl_call_64, u64Target);
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_MC_END()
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync return VINF_SUCCESS;
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
4c46bb28a73dee292c3657d2945574a1c267b89dvboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsynctypedef IEM_CIMPL_DECL_TYPE_3(FNIEMCIMPLFARBRANCH, uint16_t, uSel, uint64_t, offSeg, IEMMODE, enmOpSize);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsyncFNIEMOP_DEF_2(iemOpHlp_Grp5_far_Ep, uint8_t, bRm, FNIEMCIMPLFARBRANCH *, pfnCImpl)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* Registers? How?? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync return IEMOP_RAISE_INVALID_OPCODE(); /* callf eax is not legal */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* Far pointer loaded from memory. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(3, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, u16Sel, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ARG(uint16_t, offSeg, 1);
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, IEMMODE_16BIT, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(offSeg, pIemCpu->iEffSeg, GCPtrEffSrc);
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc, 2);
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync IEM_MC_CALL_CIMPL_3(pfnCImpl, u16Sel, offSeg, enmEffOpSize);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync case IEMMODE_64BIT:
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync /** @todo testcase: AMD does not seem to believe in the case (see bs-cpu-xcpt-1)
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync * and will apparently ignore REX.W, at least for the jmp far qword [rsp]
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync * and call far qword [rsp] encodings. */
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync if (!IEM_IS_GUEST_CPU_AMD(pIemCpu))
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync {
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_BEGIN(3, 1);
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_ARG(uint16_t, u16Sel, 0);
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_ARG(uint64_t, offSeg, 1);
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, IEMMODE_16BIT, 2);
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_FETCH_MEM_U64(offSeg, pIemCpu->iEffSeg, GCPtrEffSrc);
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc, 8);
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_CALL_CIMPL_3(pfnCImpl, u16Sel, offSeg, enmEffOpSize);
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync IEM_MC_END();
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync return VINF_SUCCESS;
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync }
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync /* AMD falls thru. */
f2c4137b711f0fbacc1ef4f5612c6e2216cbc956vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_BEGIN(3, 1);
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ARG(uint16_t, u16Sel, 0);
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ARG(uint32_t, offSeg, 1);
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_ARG_CONST(IEMMODE, enmEffOpSize, IEMMODE_32BIT, 2);
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_FETCH_MEM_U32(offSeg, pIemCpu->iEffSeg, GCPtrEffSrc);
c2f73fbf271131906a68f2583f744fe791dd0f11vboxsync IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc, 4);
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync IEM_MC_CALL_CIMPL_3(pfnCImpl, u16Sel, offSeg, enmEffOpSize);
a13bd47f22085c82960265c150f10f2195369630vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync/**
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync * Opcode 0xff /3.
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync * @param bRm The RM byte.
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync */
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsyncFNIEMOP_DEF_1(iemOp_Grp5_callf_Ep, uint8_t, bRm)
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync{
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync IEMOP_MNEMONIC("callf Ep");
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync return FNIEMOP_CALL_2(iemOpHlp_Grp5_far_Ep, bRm, iemCImpl_callf);
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync}
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Opcode 0xff /4.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param bRm The RM byte.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp5_jmpn_Ev, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
247e117c43567928c01d20f586662d66ddb80aa3vboxsync IEMOP_MNEMONIC("jmpn Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo Too early? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* The new RIP is taken from a register. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U16(u16Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SET_RIP_U16(u16Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END()
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U32(u32Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SET_RIP_U32(u32Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END()
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 1);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_GREG_U64(u64Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SET_RIP_U64(u64Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END()
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
3e289133c2cd4a14140904eb6009390fc2de8836vboxsync /* The new RIP is taken from a memory location. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(u16Target, pIemCpu->iEffSeg, GCPtrEffSrc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SET_RIP_U16(u16Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END()
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U32(u32Target, pIemCpu->iEffSeg, GCPtrEffSrc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_SET_RIP_U32(u32Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END()
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
3e289133c2cd4a14140904eb6009390fc2de8836vboxsync IEM_MC_LOCAL(uint64_t, u64Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
3e289133c2cd4a14140904eb6009390fc2de8836vboxsync IEM_MC_FETCH_MEM_U64(u64Target, pIemCpu->iEffSeg, GCPtrEffSrc);
3e289133c2cd4a14140904eb6009390fc2de8836vboxsync IEM_MC_SET_RIP_U64(u64Target);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END()
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Opcode 0xff /5.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param bRm The RM byte.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
a13bd47f22085c82960265c150f10f2195369630vboxsyncFNIEMOP_DEF_1(iemOp_Grp5_jmpf_Ep, uint8_t, bRm)
a13bd47f22085c82960265c150f10f2195369630vboxsync{
bd99d2999e5b67b8db2b3d75ac7744e424d0a524vboxsync IEMOP_MNEMONIC("jmpf Ep");
a5c06635c167bb56b73b3defda0ac2bcd86e940fvboxsync return FNIEMOP_CALL_2(iemOpHlp_Grp5_far_Ep, bRm, iemCImpl_FarJmp);
a13bd47f22085c82960265c150f10f2195369630vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/**
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Opcode 0xff /6.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * @param bRm The RM byte.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF_1(iemOp_Grp5_push_Ev, uint8_t, bRm)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("push Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo Too early? */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* Registers are handled by a common worker. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOpCommonPushGReg, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* Memory we do here. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch (pIemCpu->enmEffOpSize)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_16BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint16_t, u16Src);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U16(u16Src, pIemCpu->iEffSeg, GCPtrEffSrc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U16(u16Src);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_32BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint32_t, u32Src);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U32(u32Src, pIemCpu->iEffSeg, GCPtrEffSrc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U32(u32Src);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case IEMMODE_64BIT:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_BEGIN(0, 2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(uint64_t, u64Src);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
0516b375df438c19cf1632558bf3924d88999c1cvboxsync IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_FETCH_MEM_U64(u64Src, pIemCpu->iEffSeg, GCPtrEffSrc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_PUSH_U64(u64Src);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_ADVANCE_RIP();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEM_MC_END();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return VINF_SUCCESS;
a4b800433571901dfbe3fe952d6ddfe1a8be70b2vboxsync
a4b800433571901dfbe3fe952d6ddfe1a8be70b2vboxsync IEM_NOT_REACHED_DEFAULT_CASE_RET();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** Opcode 0xff. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncFNIEMOP_DEF(iemOp_Grp5)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
ea4433aedd4105e6599e57e0c5f6cb32a68e963cvboxsync uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 0:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("inc Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryEv, bRm, &g_iemAImpl_inc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 1:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("dec Ev");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_2(iemOpCommonUnaryEv, bRm, &g_iemAImpl_dec);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 2:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp5_calln_Ev, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 3:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp5_callf_Ep, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 4:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp5_jmpn_Ev, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 5:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp5_jmpf_Ep, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 6:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return FNIEMOP_CALL_1(iemOp_Grp5_push_Ev, bRm);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync case 7:
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync IEMOP_MNEMONIC("grp5-ud");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return IEMOP_RAISE_INVALID_OPCODE();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync AssertFailedReturn(VERR_INTERNAL_ERROR_2);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncconst PFNIEMOP g_apfnOneByteMap[256] =
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x00 */ iemOp_add_Eb_Gb, iemOp_add_Ev_Gv, iemOp_add_Gb_Eb, iemOp_add_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x04 */ iemOp_add_Al_Ib, iemOp_add_eAX_Iz, iemOp_push_ES, iemOp_pop_ES,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x08 */ iemOp_or_Eb_Gb, iemOp_or_Ev_Gv, iemOp_or_Gb_Eb, iemOp_or_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x0c */ iemOp_or_Al_Ib, iemOp_or_eAX_Iz, iemOp_push_CS, iemOp_2byteEscape,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x10 */ iemOp_adc_Eb_Gb, iemOp_adc_Ev_Gv, iemOp_adc_Gb_Eb, iemOp_adc_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x14 */ iemOp_adc_Al_Ib, iemOp_adc_eAX_Iz, iemOp_push_SS, iemOp_pop_SS,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x18 */ iemOp_sbb_Eb_Gb, iemOp_sbb_Ev_Gv, iemOp_sbb_Gb_Eb, iemOp_sbb_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x1c */ iemOp_sbb_Al_Ib, iemOp_sbb_eAX_Iz, iemOp_push_DS, iemOp_pop_DS,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x20 */ iemOp_and_Eb_Gb, iemOp_and_Ev_Gv, iemOp_and_Gb_Eb, iemOp_and_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x24 */ iemOp_and_Al_Ib, iemOp_and_eAX_Iz, iemOp_seg_ES, iemOp_daa,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x28 */ iemOp_sub_Eb_Gb, iemOp_sub_Ev_Gv, iemOp_sub_Gb_Eb, iemOp_sub_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x2c */ iemOp_sub_Al_Ib, iemOp_sub_eAX_Iz, iemOp_seg_CS, iemOp_das,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x30 */ iemOp_xor_Eb_Gb, iemOp_xor_Ev_Gv, iemOp_xor_Gb_Eb, iemOp_xor_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x34 */ iemOp_xor_Al_Ib, iemOp_xor_eAX_Iz, iemOp_seg_SS, iemOp_aaa,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x38 */ iemOp_cmp_Eb_Gb, iemOp_cmp_Ev_Gv, iemOp_cmp_Gb_Eb, iemOp_cmp_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x3c */ iemOp_cmp_Al_Ib, iemOp_cmp_eAX_Iz, iemOp_seg_DS, iemOp_aas,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x40 */ iemOp_inc_eAX, iemOp_inc_eCX, iemOp_inc_eDX, iemOp_inc_eBX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x44 */ iemOp_inc_eSP, iemOp_inc_eBP, iemOp_inc_eSI, iemOp_inc_eDI,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x48 */ iemOp_dec_eAX, iemOp_dec_eCX, iemOp_dec_eDX, iemOp_dec_eBX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x4c */ iemOp_dec_eSP, iemOp_dec_eBP, iemOp_dec_eSI, iemOp_dec_eDI,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x50 */ iemOp_push_eAX, iemOp_push_eCX, iemOp_push_eDX, iemOp_push_eBX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x54 */ iemOp_push_eSP, iemOp_push_eBP, iemOp_push_eSI, iemOp_push_eDI,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x58 */ iemOp_pop_eAX, iemOp_pop_eCX, iemOp_pop_eDX, iemOp_pop_eBX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x5c */ iemOp_pop_eSP, iemOp_pop_eBP, iemOp_pop_eSI, iemOp_pop_eDI,
b5c8413901ec3070925500c7b7161cad326d8ae1vboxsync /* 0x60 */ iemOp_pusha, iemOp_popa, iemOp_bound_Gv_Ma_evex, iemOp_arpl_Ew_Gw_movsx_Gv_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x64 */ iemOp_seg_FS, iemOp_seg_GS, iemOp_op_size, iemOp_addr_size,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x68 */ iemOp_push_Iz, iemOp_imul_Gv_Ev_Iz, iemOp_push_Ib, iemOp_imul_Gv_Ev_Ib,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x6c */ iemOp_insb_Yb_DX, iemOp_inswd_Yv_DX, iemOp_outsb_Yb_DX, iemOp_outswd_Yv_DX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x70 */ iemOp_jo_Jb, iemOp_jno_Jb, iemOp_jc_Jb, iemOp_jnc_Jb,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x74 */ iemOp_je_Jb, iemOp_jne_Jb, iemOp_jbe_Jb, iemOp_jnbe_Jb,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x78 */ iemOp_js_Jb, iemOp_jns_Jb, iemOp_jp_Jb, iemOp_jnp_Jb,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x7c */ iemOp_jl_Jb, iemOp_jnl_Jb, iemOp_jle_Jb, iemOp_jnle_Jb,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x80 */ iemOp_Grp1_Eb_Ib_80, iemOp_Grp1_Ev_Iz, iemOp_Grp1_Eb_Ib_82, iemOp_Grp1_Ev_Ib,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x84 */ iemOp_test_Eb_Gb, iemOp_test_Ev_Gv, iemOp_xchg_Eb_Gb, iemOp_xchg_Ev_Gv,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x88 */ iemOp_mov_Eb_Gb, iemOp_mov_Ev_Gv, iemOp_mov_Gb_Eb, iemOp_mov_Gv_Ev,
cda57af9589fa1c4aedbee904fc3f3139409c97bvboxsync /* 0x8c */ iemOp_mov_Ev_Sw, iemOp_lea_Gv_M, iemOp_mov_Sw_Ev, iemOp_Grp1A,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x90 */ iemOp_nop, iemOp_xchg_eCX_eAX, iemOp_xchg_eDX_eAX, iemOp_xchg_eBX_eAX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x94 */ iemOp_xchg_eSP_eAX, iemOp_xchg_eBP_eAX, iemOp_xchg_eSI_eAX, iemOp_xchg_eDI_eAX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x98 */ iemOp_cbw, iemOp_cwd, iemOp_call_Ap, iemOp_wait,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0x9c */ iemOp_pushf_Fv, iemOp_popf_Fv, iemOp_sahf, iemOp_lahf,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xa0 */ iemOp_mov_Al_Ob, iemOp_mov_rAX_Ov, iemOp_mov_Ob_AL, iemOp_mov_Ov_rAX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xa4 */ iemOp_movsb_Xb_Yb, iemOp_movswd_Xv_Yv, iemOp_cmpsb_Xb_Yb, iemOp_cmpswd_Xv_Yv,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xa8 */ iemOp_test_AL_Ib, iemOp_test_eAX_Iz, iemOp_stosb_Yb_AL, iemOp_stoswd_Yv_eAX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xac */ iemOp_lodsb_AL_Xb, iemOp_lodswd_eAX_Xv, iemOp_scasb_AL_Xb, iemOp_scaswd_eAX_Xv,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xb0 */ iemOp_mov_AL_Ib, iemOp_CL_Ib, iemOp_DL_Ib, iemOp_BL_Ib,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xb4 */ iemOp_mov_AH_Ib, iemOp_CH_Ib, iemOp_DH_Ib, iemOp_BH_Ib,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xb8 */ iemOp_eAX_Iv, iemOp_eCX_Iv, iemOp_eDX_Iv, iemOp_eBX_Iv,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xbc */ iemOp_eSP_Iv, iemOp_eBP_Iv, iemOp_eSI_Iv, iemOp_eDI_Iv,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc0 */ iemOp_Grp2_Eb_Ib, iemOp_Grp2_Ev_Ib, iemOp_retn_Iw, iemOp_retn,
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync /* 0xc4 */ iemOp_les_Gv_Mp_vex2, iemOp_lds_Gv_Mp_vex3, iemOp_Grp11_Eb_Ib, iemOp_Grp11_Ev_Iz,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xc8 */ iemOp_enter_Iw_Ib, iemOp_leave, iemOp_retf_Iw, iemOp_retf,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xcc */ iemOp_int_3, iemOp_int_Ib, iemOp_into, iemOp_iret,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd0 */ iemOp_Grp2_Eb_1, iemOp_Grp2_Ev_1, iemOp_Grp2_Eb_CL, iemOp_Grp2_Ev_CL,
1b74cf7bca2a816bac9125978a8599c0ae79ed71vboxsync /* 0xd4 */ iemOp_aam_Ib, iemOp_aad_Ib, iemOp_salc, iemOp_xlat,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xd8 */ iemOp_EscF0, iemOp_EscF1, iemOp_EscF2, iemOp_EscF3,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xdc */ iemOp_EscF4, iemOp_EscF5, iemOp_EscF6, iemOp_EscF7,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe0 */ iemOp_loopne_Jb, iemOp_loope_Jb, iemOp_loop_Jb, iemOp_jecxz_Jb,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe4 */ iemOp_in_AL_Ib, iemOp_in_eAX_Ib, iemOp_out_Ib_AL, iemOp_out_Ib_eAX,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xe8 */ iemOp_call_Jv, iemOp_jmp_Jv, iemOp_jmp_Ap, iemOp_jmp_Jb,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xec */ iemOp_in_AL_DX, iemOp_eAX_DX, iemOp_out_DX_AL, iemOp_out_DX_eAX,
4a84814aff76797623dd72295fd77e390701d686vboxsync /* 0xf0 */ iemOp_lock, iemOp_int_1, iemOp_repne, iemOp_repe,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf4 */ iemOp_hlt, iemOp_cmc, iemOp_Grp3_Eb, iemOp_Grp3_Ev,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xf8 */ iemOp_clc, iemOp_stc, iemOp_cli, iemOp_sti,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* 0xfc */ iemOp_cld, iemOp_std, iemOp_Grp4, iemOp_Grp5,
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync};
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** @} */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync