Changeset 99306 in vbox
- Timestamp:
- Apr 6, 2023 2:07:50 AM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 156694
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r99305 r99306 10648 10648 } 10649 10649 10650 #define IEMOP_BODY_BIT_Ev_Ib(a_fnNormalU16, a_fnNormalU32, a_fnNormalU64, a_fRW) \ 10651 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF); \ 10652 \ 10653 if (IEM_IS_MODRM_REG_MODE(bRm)) \ 10654 { \ 10655 /* register destination. */ \ 10656 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); \ 10657 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 10658 \ 10659 switch (pVCpu->iem.s.enmEffOpSize) \ 10660 { \ 10661 case IEMMODE_16BIT: \ 10662 IEM_MC_BEGIN(3, 0); \ 10663 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \ 10664 IEM_MC_ARG_CONST(uint16_t, u16Src, /*=*/ bImm & 0x0f, 1); \ 10665 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 10666 \ 10667 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 10668 IEM_MC_REF_EFLAGS(pEFlags); \ 10669 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \ 10670 \ 10671 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 10672 IEM_MC_END(); \ 10673 break; \ 10674 \ 10675 case IEMMODE_32BIT: \ 10676 IEM_MC_BEGIN(3, 0); \ 10677 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \ 10678 IEM_MC_ARG_CONST(uint32_t, u32Src, /*=*/ bImm & 0x1f, 1); \ 10679 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 10680 \ 10681 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 10682 IEM_MC_REF_EFLAGS(pEFlags); \ 10683 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \ 10684 \ 10685 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst); \ 10686 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 10687 IEM_MC_END(); \ 10688 break; \ 10689 \ 10690 case IEMMODE_64BIT: \ 10691 IEM_MC_BEGIN(3, 0); \ 10692 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \ 10693 IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ bImm & 0x3f, 1); \ 10694 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 10695 \ 10696 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 10697 IEM_MC_REF_EFLAGS(pEFlags); \ 10698 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \ 10699 \ 10700 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 10701 IEM_MC_END(); \ 10702 break; \ 10703 \ 10704 IEM_NOT_REACHED_DEFAULT_CASE_RET(); \ 10705 } \ 10706 } \ 10707 else \ 10708 { \ 10709 /* memory destination. */ \ 10710 /** @todo test negative bit offsets! */ \ 10711 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)) \ 10712 { \ 10713 switch (pVCpu->iem.s.enmEffOpSize) \ 10714 { \ 10715 case IEMMODE_16BIT: \ 10716 IEM_MC_BEGIN(3, 1); \ 10717 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \ 10718 IEM_MC_ARG(uint16_t, u16Src, 1); \ 10719 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2); \ 10720 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 10721 \ 10722 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1); \ 10723 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); \ 10724 IEM_MC_ASSIGN(u16Src, bImm & 0x0f); \ 10725 IEMOP_HLP_DONE_DECODING(); \ 10726 IEM_MC_FETCH_EFLAGS(EFlags); \ 10727 IEM_MC_MEM_MAP(pu16Dst, a_fRW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \ 10728 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \ 10729 IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, a_fRW); \ 10730 \ 10731 IEM_MC_COMMIT_EFLAGS(EFlags); \ 10732 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 10733 IEM_MC_END(); \ 10734 break; \ 10735 \ 10736 case IEMMODE_32BIT: \ 10737 IEM_MC_BEGIN(3, 1); \ 10738 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \ 10739 IEM_MC_ARG(uint32_t, u32Src, 1); \ 10740 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2); \ 10741 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 10742 \ 10743 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1); \ 10744 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); \ 10745 IEM_MC_ASSIGN(u32Src, bImm & 0x1f); \ 10746 IEMOP_HLP_DONE_DECODING(); \ 10747 IEM_MC_FETCH_EFLAGS(EFlags); \ 10748 IEM_MC_MEM_MAP(pu32Dst, a_fRW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \ 10749 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \ 10750 IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, a_fRW); \ 10751 \ 10752 IEM_MC_COMMIT_EFLAGS(EFlags); \ 10753 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 10754 IEM_MC_END(); \ 10755 break; \ 10756 \ 10757 case IEMMODE_64BIT: \ 10758 IEM_MC_BEGIN(3, 1); \ 10759 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \ 10760 IEM_MC_ARG(uint64_t, u64Src, 1); \ 10761 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2); \ 10762 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 10763 \ 10764 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1); \ 10765 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); \ 10766 IEM_MC_ASSIGN(u64Src, bImm & 0x3f); \ 10767 IEMOP_HLP_DONE_DECODING(); \ 10768 IEM_MC_FETCH_EFLAGS(EFlags); \ 10769 IEM_MC_MEM_MAP(pu64Dst, a_fRW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \ 10770 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \ 10771 IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, a_fRW); \ 10772 \ 10773 IEM_MC_COMMIT_EFLAGS(EFlags); \ 10774 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 10775 IEM_MC_END(); \ 10776 break; \ 10777 \ 10778 IEM_NOT_REACHED_DEFAULT_CASE_RET(); \ 10779 } \ 10780 } \ 10781 else \ 10782 { \ 10783 (void)0 10784 10785 #define IEMOP_BODY_BIT_Ev_Ib_NO_LOCK() \ 10786 IEMOP_HLP_DONE_DECODING(); \ 10787 return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \ 10788 } \ 10789 } \ 10790 (void)0 10791 10792 #define IEMOP_BODY_BIT_Ev_Ib_LOCKED(a_fnLockedU16, a_fnLockedU32, a_fnLockedU64) \ 10793 switch (pVCpu->iem.s.enmEffOpSize) \ 10794 { \ 10795 case IEMMODE_16BIT: \ 10796 IEM_MC_BEGIN(3, 1); \ 10797 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \ 10798 IEM_MC_ARG(uint16_t, u16Src, 1); \ 10799 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2); \ 10800 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 10801 \ 10802 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1); \ 10803 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); \ 10804 IEM_MC_ASSIGN(u16Src, bImm & 0x0f); \ 10805 IEMOP_HLP_DONE_DECODING(); \ 10806 IEM_MC_FETCH_EFLAGS(EFlags); \ 10807 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \ 10808 IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU16, pu16Dst, u16Src, pEFlags); \ 10809 IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW); \ 10810 \ 10811 IEM_MC_COMMIT_EFLAGS(EFlags); \ 10812 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 10813 IEM_MC_END(); \ 10814 break; \ 10815 \ 10816 case IEMMODE_32BIT: \ 10817 IEM_MC_BEGIN(3, 1); \ 10818 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \ 10819 IEM_MC_ARG(uint32_t, u32Src, 1); \ 10820 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2); \ 10821 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 10822 \ 10823 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1); \ 10824 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); \ 10825 IEM_MC_ASSIGN(u32Src, bImm & 0x1f); \ 10826 IEMOP_HLP_DONE_DECODING(); \ 10827 IEM_MC_FETCH_EFLAGS(EFlags); \ 10828 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \ 10829 IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU32, pu32Dst, u32Src, pEFlags); \ 10830 IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW); \ 10831 \ 10832 IEM_MC_COMMIT_EFLAGS(EFlags); \ 10833 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 10834 IEM_MC_END(); \ 10835 break; \ 10836 \ 10837 case IEMMODE_64BIT: \ 10838 IEM_MC_BEGIN(3, 1); \ 10839 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \ 10840 IEM_MC_ARG(uint64_t, u64Src, 1); \ 10841 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2); \ 10842 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 10843 \ 10844 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1); \ 10845 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); \ 10846 IEM_MC_ASSIGN(u64Src, bImm & 0x3f); \ 10847 IEMOP_HLP_DONE_DECODING(); \ 10848 IEM_MC_FETCH_EFLAGS(EFlags); \ 10849 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \ 10850 IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU64, pu64Dst, u64Src, pEFlags); \ 10851 IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW); \ 10852 \ 10853 IEM_MC_COMMIT_EFLAGS(EFlags); \ 10854 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 10855 IEM_MC_END(); \ 10856 break; \ 10857 \ 10858 IEM_NOT_REACHED_DEFAULT_CASE_RET(); \ 10859 } \ 10860 } \ 10861 } \ 10862 (void)0 10863 10864 10865 /** Opcode 0x0f 0xba /4. */ 10866 FNIEMOPRM_DEF(iemOp_Grp8_bt_Ev_Ib) 10867 { 10868 IEMOP_MNEMONIC(bt_Ev_Ib, "bt Ev,Ib"); 10869 IEMOP_BODY_BIT_Ev_Ib(iemAImpl_bt_u16, iemAImpl_bt_u32, iemAImpl_bt_u64, IEM_ACCESS_DATA_R); 10870 IEMOP_BODY_BIT_Ev_Ib_NO_LOCK(); 10871 } 10872 10873 10874 /** Opcode 0x0f 0xba /5. */ 10875 FNIEMOPRM_DEF(iemOp_Grp8_bts_Ev_Ib) 10876 { 10877 IEMOP_MNEMONIC(bts_Ev_Ib, "bts Ev,Ib"); 10878 IEMOP_BODY_BIT_Ev_Ib( iemAImpl_bts_u16, iemAImpl_bts_u32, iemAImpl_bts_u64, IEM_ACCESS_DATA_RW); 10879 IEMOP_BODY_BIT_Ev_Ib_LOCKED(iemAImpl_bts_u16_locked, iemAImpl_bts_u32_locked, iemAImpl_bts_u64_locked); 10880 } 10881 10882 10883 /** Opcode 0x0f 0xba /6. */ 10884 FNIEMOPRM_DEF(iemOp_Grp8_btr_Ev_Ib) 10885 { 10886 IEMOP_MNEMONIC(btr_Ev_Ib, "btr Ev,Ib"); 10887 IEMOP_BODY_BIT_Ev_Ib( iemAImpl_btr_u16, iemAImpl_btr_u32, iemAImpl_btr_u64, IEM_ACCESS_DATA_RW); 10888 IEMOP_BODY_BIT_Ev_Ib_LOCKED(iemAImpl_btr_u16_locked, iemAImpl_btr_u32_locked, iemAImpl_btr_u64_locked); 10889 } 10890 10891 10892 /** Opcode 0x0f 0xba /7. */ 10893 FNIEMOPRM_DEF(iemOp_Grp8_btc_Ev_Ib) 10894 { 10895 IEMOP_MNEMONIC(btc_Ev_Ib, "btc Ev,Ib"); 10896 IEMOP_BODY_BIT_Ev_Ib( iemAImpl_btc_u16, iemAImpl_btc_u32, iemAImpl_btc_u64, IEM_ACCESS_DATA_RW); 10897 IEMOP_BODY_BIT_Ev_Ib_LOCKED(iemAImpl_btc_u16_locked, iemAImpl_btc_u32_locked, iemAImpl_btc_u64_locked); 10898 } 10899 10650 10900 10651 10901 /** Opcode 0x0f 0xba. */ … … 10654 10904 IEMOP_HLP_MIN_386(); 10655 10905 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 10656 PCIEMOPBINSIZES pImpl;10657 10906 switch (IEM_GET_MODRM_REG_8(bRm)) 10658 10907 { 10908 case 4: return FNIEMOP_CALL_1(iemOp_Grp8_bt_Ev_Ib, bRm); 10909 case 5: return FNIEMOP_CALL_1(iemOp_Grp8_bts_Ev_Ib, bRm); 10910 case 6: return FNIEMOP_CALL_1(iemOp_Grp8_btr_Ev_Ib, bRm); 10911 case 7: return FNIEMOP_CALL_1(iemOp_Grp8_btc_Ev_Ib, bRm); 10912 10659 10913 case 0: case 1: case 2: case 3: 10660 10914 /* Both AMD and Intel want full modr/m decoding and imm8. */ 10661 10915 return FNIEMOP_CALL_1(iemOp_InvalidWithRMAllNeedImm8, bRm); 10662 case 4: pImpl = &g_iemAImpl_bt; IEMOP_MNEMONIC(bt_Ev_Ib, "bt Ev,Ib"); break; 10663 case 5: pImpl = &g_iemAImpl_bts; IEMOP_MNEMONIC(bts_Ev_Ib, "bts Ev,Ib"); break; 10664 case 6: pImpl = &g_iemAImpl_btr; IEMOP_MNEMONIC(btr_Ev_Ib, "btr Ev,Ib"); break; 10665 case 7: pImpl = &g_iemAImpl_btc; IEMOP_MNEMONIC(btc_Ev_Ib, "btc Ev,Ib"); break; 10916 10666 10917 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 10667 }10668 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);10669 10670 if (IEM_IS_MODRM_REG_MODE(bRm))10671 {10672 /* register destination. */10673 uint8_t u8Bit; IEM_OPCODE_GET_NEXT_U8(&u8Bit);10674 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();10675 10676 switch (pVCpu->iem.s.enmEffOpSize)10677 {10678 case IEMMODE_16BIT:10679 IEM_MC_BEGIN(3, 0);10680 IEM_MC_ARG(uint16_t *, pu16Dst, 0);10681 IEM_MC_ARG_CONST(uint16_t, u16Src, /*=*/ u8Bit & 0x0f, 1);10682 IEM_MC_ARG(uint32_t *, pEFlags, 2);10683 10684 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm));10685 IEM_MC_REF_EFLAGS(pEFlags);10686 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);10687 10688 IEM_MC_ADVANCE_RIP_AND_FINISH();10689 IEM_MC_END();10690 break;10691 10692 case IEMMODE_32BIT:10693 IEM_MC_BEGIN(3, 0);10694 IEM_MC_ARG(uint32_t *, pu32Dst, 0);10695 IEM_MC_ARG_CONST(uint32_t, u32Src, /*=*/ u8Bit & 0x1f, 1);10696 IEM_MC_ARG(uint32_t *, pEFlags, 2);10697 10698 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm));10699 IEM_MC_REF_EFLAGS(pEFlags);10700 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);10701 10702 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);10703 IEM_MC_ADVANCE_RIP_AND_FINISH();10704 IEM_MC_END();10705 break;10706 10707 case IEMMODE_64BIT:10708 IEM_MC_BEGIN(3, 0);10709 IEM_MC_ARG(uint64_t *, pu64Dst, 0);10710 IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ u8Bit & 0x3f, 1);10711 IEM_MC_ARG(uint32_t *, pEFlags, 2);10712 10713 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm));10714 IEM_MC_REF_EFLAGS(pEFlags);10715 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);10716 10717 IEM_MC_ADVANCE_RIP_AND_FINISH();10718 IEM_MC_END();10719 break;10720 10721 IEM_NOT_REACHED_DEFAULT_CASE_RET();10722 }10723 }10724 else10725 {10726 /* memory destination. */10727 10728 uint32_t fAccess;10729 if (pImpl->pfnLockedU16)10730 fAccess = IEM_ACCESS_DATA_RW;10731 else /* BT */10732 fAccess = IEM_ACCESS_DATA_R;10733 10734 /** @todo test negative bit offsets! */10735 switch (pVCpu->iem.s.enmEffOpSize)10736 {10737 case IEMMODE_16BIT:10738 IEM_MC_BEGIN(3, 1);10739 IEM_MC_ARG(uint16_t *, pu16Dst, 0);10740 IEM_MC_ARG(uint16_t, u16Src, 1);10741 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);10742 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);10743 10744 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);10745 uint8_t u8Bit; IEM_OPCODE_GET_NEXT_U8(&u8Bit);10746 IEM_MC_ASSIGN(u16Src, u8Bit & 0x0f);10747 if (pImpl->pfnLockedU16)10748 IEMOP_HLP_DONE_DECODING();10749 else10750 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();10751 IEM_MC_FETCH_EFLAGS(EFlags);10752 IEM_MC_MEM_MAP(pu16Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);10753 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))10754 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);10755 else10756 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU16, pu16Dst, u16Src, pEFlags);10757 IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, fAccess);10758 10759 IEM_MC_COMMIT_EFLAGS(EFlags);10760 IEM_MC_ADVANCE_RIP_AND_FINISH();10761 IEM_MC_END();10762 break;10763 10764 case IEMMODE_32BIT:10765 IEM_MC_BEGIN(3, 1);10766 IEM_MC_ARG(uint32_t *, pu32Dst, 0);10767 IEM_MC_ARG(uint32_t, u32Src, 1);10768 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);10769 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);10770 10771 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);10772 uint8_t u8Bit; IEM_OPCODE_GET_NEXT_U8(&u8Bit);10773 IEM_MC_ASSIGN(u32Src, u8Bit & 0x1f);10774 if (pImpl->pfnLockedU16)10775 IEMOP_HLP_DONE_DECODING();10776 else10777 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();10778 IEM_MC_FETCH_EFLAGS(EFlags);10779 IEM_MC_MEM_MAP(pu32Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);10780 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))10781 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);10782 else10783 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU32, pu32Dst, u32Src, pEFlags);10784 IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, fAccess);10785 10786 IEM_MC_COMMIT_EFLAGS(EFlags);10787 IEM_MC_ADVANCE_RIP_AND_FINISH();10788 IEM_MC_END();10789 break;10790 10791 case IEMMODE_64BIT:10792 IEM_MC_BEGIN(3, 1);10793 IEM_MC_ARG(uint64_t *, pu64Dst, 0);10794 IEM_MC_ARG(uint64_t, u64Src, 1);10795 IEM_MC_ARG_LOCAL_EFLAGS( pEFlags, EFlags, 2);10796 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);10797 10798 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);10799 uint8_t u8Bit; IEM_OPCODE_GET_NEXT_U8(&u8Bit);10800 IEM_MC_ASSIGN(u64Src, u8Bit & 0x3f);10801 if (pImpl->pfnLockedU16)10802 IEMOP_HLP_DONE_DECODING();10803 else10804 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();10805 IEM_MC_FETCH_EFLAGS(EFlags);10806 IEM_MC_MEM_MAP(pu64Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);10807 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))10808 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);10809 else10810 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU64, pu64Dst, u64Src, pEFlags);10811 IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, fAccess);10812 10813 IEM_MC_COMMIT_EFLAGS(EFlags);10814 IEM_MC_ADVANCE_RIP_AND_FINISH();10815 IEM_MC_END();10816 break;10817 10818 IEM_NOT_REACHED_DEFAULT_CASE_RET();10819 }10820 10918 } 10821 10919 }
Note:
See TracChangeset
for help on using the changeset viewer.