IEMAllCImplStrInstr.cpp.h revision 05216b943fc4c290a399c4b75356ada3e4396fe7
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * IEM - String Instruction Implementation Code Template.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (C) 2011 Oracle Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*******************************************************************************
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync* Defined Constants And Macros *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*******************************************************************************/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Implements 'REPE CMPS'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_repe_cmps_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PCCPUMSELREGHID pSrc1Hid = iemSRegGetHid(pIemCpu, iEffSeg);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, pSrc1Hid, iEffSeg);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->esHid, X86_SREG_ES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int8_t const cbIncr = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The loop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Do segmentation and virtual page stuff.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ADDR2_TYPE uVirtSrc1Addr = (uint32_t)pSrc1Hid->u64Base + uSrc1AddrReg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ADDR2_TYPE uVirtSrc2Addr = (uint32_t)pCtx->esHid.u64Base + uSrc2AddrReg;
rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrc1Addr, IEM_ACCESS_DATA_R, &GCPhysSrc1Mem);
rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrc2Addr, IEM_ACCESS_DATA_R, &GCPhysSrc2Mem);
RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&puSrc1Mem[cLeftPage-1], puSrc2Mem[cLeftPage-1], &uEFlags);
uCounterReg--;
puSrc1Mem++;
puSrc2Mem++;
cLeftPage--;
uCounterReg--;
cLeftPage--;
} while ( uCounterReg != 0
return rcStrict;
if (uCounterReg == 0)
return VINF_SUCCESS;
return rcStrict;
return rcStrict;
rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrc1Addr, IEM_ACCESS_DATA_R, &GCPhysSrc1Mem);
rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrc2Addr, IEM_ACCESS_DATA_R, &GCPhysSrc2Mem);
RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&puSrc1Mem[cLeftPage-1], puSrc2Mem[cLeftPage-1], &uEFlags);
uCounterReg--;
puSrc1Mem++;
puSrc2Mem++;
cLeftPage--;
uCounterReg--;
cLeftPage--;
} while ( uCounterReg != 0
return rcStrict;
if (uCounterReg == 0)
return VINF_SUCCESS;
return rcStrict;
bool fQuit;
uint32_t i = 0;
uCounterReg -= i;
if (fQuit)
if (uCounterReg == 0)
cLeftPage = 0;
uCounterReg--;
cLeftPage--;
} while ( uCounterReg != 0
return rcStrict;
if (uCounterReg == 0)
return VINF_SUCCESS;
return rcStrict;
bool fQuit;
uint32_t i = 0;
uCounterReg -= i;
if (fQuit)
if (uCounterReg == 0)
cLeftPage = 0;
uCounterReg--;
cLeftPage--;
} while ( uCounterReg != 0
return rcStrict;
if (uCounterReg == 0)
return VINF_SUCCESS;
return rcStrict;
return rcStrict;
rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrcAddr, IEM_ACCESS_DATA_R, &GCPhysSrcMem);
rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtDstAddr, IEM_ACCESS_DATA_W, &GCPhysDstMem);
uCounterReg--;
cLeftPage--;
} while (uCounterReg != 0);
return rcStrict;
if (uCounterReg == 0)
return VINF_SUCCESS;
return rcStrict;
while (cLeftPage-- > 0)
if (uCounterReg == 0)
cLeftPage = 0;
uCounterReg--;
cLeftPage--;
} while (uCounterReg != 0);
return rcStrict;
if (uCounterReg == 0)
return VINF_SUCCESS;
return rcStrict;
if (uCounterReg == 0)
cLeftPage = 0;
uCounterReg--;
cLeftPage--;
} while (uCounterReg != 0);
return rcStrict;
return rcStrict;
rcStrict = iemMemMap(pIemCpu, (void **)&puMem, OP_SIZE / 8, X86_SREG_ES, pCtx->ADDR_rDI, IEM_ACCESS_DATA_W);
return rcStrict;
return rcStrict;
return rcStrict;
if (uCounterReg == 0)
return VINF_SUCCESS;
return rcStrict;
while (cLeftPage-- > 0)
if (uCounterReg == 0)
cLeftPage = 0;
rcStrict = iemMemMap(pIemCpu, (void **)&puMem, OP_SIZE / 8, X86_SREG_ES, uAddrReg, IEM_ACCESS_DATA_W);
AssertLogRelBreakStmt(rcStrict2 == VINF_SUCCESS, rcStrict = VERR_INTERNAL_ERROR_3); /* See non-rep version. */
uCounterReg--;
cLeftPage--;
} while (uCounterReg != 0);
return rcStrict;
return rcStrict;
return rcStrict;
return rcStrict;
if (uCounterReg == 0)
return VINF_SUCCESS;
return rcStrict;
while (cLeftPage-- > 0)
if (uCounterReg == 0)
cLeftPage = 0;
uCounterReg--;
cLeftPage--;
} while (uCounterReg != 0);
return rcStrict;