Changeset 98975 in vbox
- Timestamp:
- Mar 15, 2023 10:05:22 AM (19 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h
r98969 r98975 11630 11630 11631 11631 /** 11632 * Common implementation of 'inc/dec/not/neg Eb'. 11633 * 11634 * @param bRm The RM byte. 11635 * @param pImpl The instruction implementation. 11636 */ 11637 FNIEMOP_DEF_2(iemOpCommonUnaryEb, uint8_t, bRm, PCIEMOPUNARYSIZES, pImpl) 11638 { 11639 if (IEM_IS_MODRM_REG_MODE(bRm)) 11640 { 11641 /* register access */ 11642 IEM_MC_BEGIN(2, 0); 11643 IEM_MC_ARG(uint8_t *, pu8Dst, 0); 11644 IEM_MC_ARG(uint32_t *, pEFlags, 1); 11645 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); 11646 IEM_MC_REF_EFLAGS(pEFlags); 11647 IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU8, pu8Dst, pEFlags); 11648 IEM_MC_ADVANCE_RIP_AND_FINISH(); 11649 IEM_MC_END(); 11650 } 11651 else 11652 { 11653 /* memory access. */ 11654 IEM_MC_BEGIN(2, 2); 11655 IEM_MC_ARG(uint8_t *, pu8Dst, 0); 11656 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 1); 11657 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 11658 11659 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); 11660 IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/); 11661 IEM_MC_FETCH_EFLAGS(EFlags); 11662 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)) 11663 IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU8, pu8Dst, pEFlags); 11664 else 11665 IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnLockedU8, pu8Dst, pEFlags); 11666 11667 IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW); 11668 IEM_MC_COMMIT_EFLAGS(EFlags); 11669 IEM_MC_ADVANCE_RIP_AND_FINISH(); 11670 IEM_MC_END(); 11671 } 11672 } 11632 * Body for of 'inc/dec/not/neg Eb'. 11633 */ 11634 #define IEMOP_BODY_UNARY_Eb(a_bRm, a_fnNormalU8, a_fnLockedU8) \ 11635 if (IEM_IS_MODRM_REG_MODE(a_bRm)) \ 11636 { \ 11637 /* register access */ \ 11638 IEMOP_HLP_DONE_DECODING(); \ 11639 IEM_MC_BEGIN(2, 0); \ 11640 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \ 11641 IEM_MC_ARG(uint32_t *, pEFlags, 1); \ 11642 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \ 11643 IEM_MC_REF_EFLAGS(pEFlags); \ 11644 IEM_MC_CALL_VOID_AIMPL_2(a_fnNormalU8, pu8Dst, pEFlags); \ 11645 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 11646 IEM_MC_END(); \ 11647 } \ 11648 else \ 11649 { \ 11650 /* memory access. */ \ 11651 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)) \ 11652 { \ 11653 IEM_MC_BEGIN(2, 2); \ 11654 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \ 11655 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 1); \ 11656 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 11657 \ 11658 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \ 11659 IEMOP_HLP_DONE_DECODING(); \ 11660 IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/); \ 11661 IEM_MC_FETCH_EFLAGS(EFlags); \ 11662 IEM_MC_CALL_VOID_AIMPL_2(a_fnNormalU8, pu8Dst, pEFlags); \ 11663 \ 11664 IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW); \ 11665 IEM_MC_COMMIT_EFLAGS(EFlags); \ 11666 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 11667 IEM_MC_END(); \ 11668 } \ 11669 else \ 11670 { \ 11671 IEM_MC_BEGIN(2, 2); \ 11672 IEM_MC_ARG(uint8_t *, pu8Dst, 0); \ 11673 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 1); \ 11674 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 11675 \ 11676 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \ 11677 IEMOP_HLP_DONE_DECODING(); \ 11678 IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/); \ 11679 IEM_MC_FETCH_EFLAGS(EFlags); \ 11680 IEM_MC_CALL_VOID_AIMPL_2(a_fnLockedU8, pu8Dst, pEFlags); \ 11681 \ 11682 IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW); \ 11683 IEM_MC_COMMIT_EFLAGS(EFlags); \ 11684 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 11685 IEM_MC_END(); \ 11686 } \ 11687 } \ 11688 (void)0 11673 11689 11674 11690 … … 11753 11769 11754 11770 11755 /** Opcode 0xf6 /0. */ 11771 /** 11772 * @opmaps grp3_f6 11773 * @opcode /0 11774 * @todo also /1 11775 */ 11756 11776 FNIEMOP_DEF_1(iemOp_grp3_test_Eb, uint8_t, bRm) 11757 11777 { … … 12177 12197 } 12178 12198 12199 12200 /** 12201 * @opmaps grp3_f6 12202 * @opcode /2 12203 */ 12204 FNIEMOP_DEF_1(iemOp_grp3_not_Eb, uint8_t, bRm) 12205 { 12206 IEMOP_MNEMONIC(not_Eb, "not Eb"); 12207 IEMOP_BODY_UNARY_Eb(bRm, iemAImpl_not_u8, iemAImpl_not_u8_locked); 12208 } 12209 12210 12211 /** 12212 * @opmaps grp3_f6 12213 * @opcode /3 12214 */ 12215 FNIEMOP_DEF_1(iemOp_grp3_neg_Eb, uint8_t, bRm) 12216 { 12217 IEMOP_MNEMONIC(net_Eb, "neg Eb"); 12218 IEMOP_BODY_UNARY_Eb(bRm, iemAImpl_neg_u8, iemAImpl_neg_u8_locked); 12219 } 12220 12221 12179 12222 /** 12180 12223 * @opcode 0xf6 … … 12185 12228 switch (IEM_GET_MODRM_REG_8(bRm)) 12186 12229 { 12187 case 0: 12188 return FNIEMOP_CALL_1(iemOp_grp3_test_Eb, bRm); 12189 case 1: 12190 /** @todo testcase: Present on <=386, most 486 (not early), Pentiums, and current CPUs too. CPUUNDOC.EXE */ 12191 return IEMOP_RAISE_INVALID_OPCODE(); 12192 case 2: 12193 IEMOP_MNEMONIC(not_Eb, "not Eb"); 12194 return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_not); 12195 case 3: 12196 IEMOP_MNEMONIC(neg_Eb, "neg Eb"); 12197 return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_neg); 12230 case 0: return FNIEMOP_CALL_1(iemOp_grp3_test_Eb, bRm); 12231 case 1: return FNIEMOP_CALL_1(iemOp_grp3_test_Eb, bRm); 12232 case 2: return FNIEMOP_CALL_1(iemOp_grp3_not_Eb, bRm); 12233 case 3: return FNIEMOP_CALL_1(iemOp_grp3_neg_Eb, bRm); 12198 12234 case 4: 12199 12235 IEMOP_MNEMONIC(mul_Eb, "mul Eb"); … … 12333 12369 12334 12370 /** 12371 * @opmaps grp4 12372 * @opcode /0 12373 */ 12374 FNIEMOP_DEF_1(iemOp_Grp4_inc_Eb, uint8_t, bRm) 12375 { 12376 IEMOP_MNEMONIC(inc_Eb, "inc Eb"); 12377 IEMOP_BODY_UNARY_Eb(bRm, iemAImpl_inc_u8, iemAImpl_inc_u8_locked); 12378 } 12379 12380 12381 /** 12382 * @opmaps grp4 12383 * @opcode /1 12384 */ 12385 FNIEMOP_DEF_1(iemOp_Grp4_dec_Eb, uint8_t, bRm) 12386 { 12387 IEMOP_MNEMONIC(dec_Eb, "dec Eb"); 12388 IEMOP_BODY_UNARY_Eb(bRm, iemAImpl_dec_u8, iemAImpl_dec_u8_locked); 12389 } 12390 12391 12392 /** 12335 12393 * @opcode 0xfe 12336 12394 */ … … 12340 12398 switch (IEM_GET_MODRM_REG_8(bRm)) 12341 12399 { 12342 case 0: 12343 IEMOP_MNEMONIC(inc_Eb, "inc Eb"); 12344 return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_inc); 12345 case 1: 12346 IEMOP_MNEMONIC(dec_Eb, "dec Eb"); 12347 return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_dec); 12400 case 0: return FNIEMOP_CALL_1(iemOp_Grp4_inc_Eb, bRm); 12401 case 1: return FNIEMOP_CALL_1(iemOp_Grp4_dec_Eb, bRm); 12348 12402 default: 12403 /** @todo is the eff-addr decoded? */ 12349 12404 IEMOP_MNEMONIC(grp4_ud, "grp4-ud"); 12350 12405 return IEMOP_RAISE_INVALID_OPCODE();
Note:
See TracChangeset
for help on using the changeset viewer.

