IEMAllAImplC.cpp revision 9b8acb34695d1c4f6a110e41c6119bf40929d1c4
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/* $Id$ */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** @file
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * IEM - Instruction Implementation in Assembly, portable C variant.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/*
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync * 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/*******************************************************************************
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync* Header Files *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync*******************************************************************************/
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#include "IEMInternal.h"
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#include <VBox/vmm/vm.h>
2d97f8baccdd684bc0a8a15eb86bbe9ff2b85374vboxsync#include <iprt/x86.h>
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync#ifdef RT_ARCH_X86
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync/*
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync * There are a few 64-bit on 32-bit things we'd rather do in C.
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsyncIEM_DECL_IMPL_DEF(int, iemAImpl_mul_u64,(uint64_t *pu64RAX, uint64_t *pu64RDX, uint64_t u64Factor, uint32_t *pEFlags))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync AssertFailed();
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync return -1;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsyncIEM_DECL_IMPL_DEF(int, iemAImpl_imul_u64,(uint64_t *pu64RAX, uint64_t *pu64RDX, uint64_t u64Factor, uint32_t *pEFlags))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync AssertFailed();
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync return -1;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsyncIEM_DECL_IMPL_DEF(int, iemAImpl_div_u64,(uint64_t *pu64RAX, uint64_t *pu64RDX, uint64_t u64Divisor, uint32_t *pEFlags))
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync{
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync AssertFailed();
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync return -1;
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync}
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsyncIEM_DECL_IMPL_DEF(int, iemAImpl_idiv_u64,(uint64_t *pu64RAX, uint64_t *pu64RDX, uint64_t u64Divisor, uint32_t *pEFlags))
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync{
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync AssertFailed();
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync return -1;
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync}
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync
9cc7e8426e849f8d610a4b4aef461c546fce097dvboxsync#endif /* RT_ARCH_X86 */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsyncIEM_DECL_IMPL_DEF(void, iemAImpl_arpl,(uint16_t *pu16Dst, uint16_t u16Src, uint32_t *pEFlags))
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync{
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync if ((*pu16Dst & X86_SEL_RPL) < (u16Src & X86_SEL_RPL))
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync {
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync *pu16Dst &= X86_SEL_MASK_OFF_RPL;
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync *pu16Dst |= u16Src & X86_SEL_RPL;
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync *pEFlags |= X86_EFL_ZF;
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync }
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync else
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync *pEFlags &= ~X86_EFL_ZF;
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync}
9b8acb34695d1c4f6a110e41c6119bf40929d1c4vboxsync