VirtualBox

Ignore:
Timestamp:
Dec 1, 2023 10:43:39 PM (12 months ago)
Author:
vboxsync
Message:

VMM/IEM: Continue refactoring IEM_MC_MEM_MAP into type specific MCs using bUnmapInfo. bugref:10371

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h

    r102397 r102424  
    96629662{
    96639663    IEMOP_MNEMONIC(fst_m32r, "fst m32r");
    9664     IEM_MC_BEGIN(3, 2, 0, 0);
     9664    IEM_MC_BEGIN(3, 3, 0, 0);
    96659665    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    9666     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    9667     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    9668     IEM_MC_ARG(PRTFLOAT32U,             pr32Dst,            1);
    9669     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    9670 
    96719666    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     9667
    96729668    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    96739669    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    96749670    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    9675 
    9676     IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    96779671    IEM_MC_PREPARE_FPU_USAGE();
     9672
     9673    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     9674    IEM_MC_ARG(PRTFLOAT32U,             pr32Dst,            1);
     9675    IEM_MC_MEM_MAP_R32_WO(pr32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9676
     9677    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    96789678    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     9679        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     9680        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    96799681        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value);
    9680         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw);
     9682        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pr32Dst, bUnmapInfo, u16Fsw);
    96819683        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    96829684    } IEM_MC_ELSE() {
    96839685        IEM_MC_IF_FCW_IM() {
    96849686            IEM_MC_STORE_MEM_NEG_QNAN_R32_BY_REF(pr32Dst);
    9685             IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
     9687            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pr32Dst, bUnmapInfo);
     9688        } IEM_MC_ELSE() {
     9689            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pr32Dst, bUnmapInfo);
    96869690        } IEM_MC_ENDIF();
    96879691        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
     
    96979701{
    96989702    IEMOP_MNEMONIC(fstp_m32r, "fstp m32r");
    9699     IEM_MC_BEGIN(3, 2, 0, 0);
     9703    IEM_MC_BEGIN(3, 3, 0, 0);
    97009704    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    9701     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    9702     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    9703     IEM_MC_ARG(PRTFLOAT32U,             pr32Dst,            1);
    9704     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    9705 
    97069705    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     9706
    97079707    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    97089708    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    97099709    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    9710 
    9711     IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    97129710    IEM_MC_PREPARE_FPU_USAGE();
     9711
     9712    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     9713    IEM_MC_ARG(PRTFLOAT32U,             pr32Dst,            1);
     9714    IEM_MC_MEM_MAP_R32_WO(pr32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9715
     9716    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    97139717    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     9718        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     9719        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    97149720        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value);
    9715         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw);
     9721        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pr32Dst, bUnmapInfo, u16Fsw);
    97169722        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    97179723    } IEM_MC_ELSE() {
    97189724        IEM_MC_IF_FCW_IM() {
    97199725            IEM_MC_STORE_MEM_NEG_QNAN_R32_BY_REF(pr32Dst);
    9720             IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
     9726            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pr32Dst, bUnmapInfo);
     9727        } IEM_MC_ELSE() {
     9728            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pr32Dst, bUnmapInfo);
    97219729        } IEM_MC_ENDIF();
    97229730        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
     
    1077910787{
    1078010788    IEMOP_MNEMONIC(fisttp_m32i, "fisttp m32i");
    10781     IEM_MC_BEGIN(3, 2, 0, 0);
     10789    IEM_MC_BEGIN(3, 3, 0, 0);
    1078210790    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    10783     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    10784     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    10785     IEM_MC_ARG(int32_t *,               pi32Dst,            1);
    10786     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    10787 
    1078810791    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     10792
    1078910793    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1079010794    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1079110795    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    10792 
    10793     IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1079410796    IEM_MC_PREPARE_FPU_USAGE();
     10797
     10798    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     10799    IEM_MC_ARG(int32_t *,               pi32Dst,            1);
     10800    IEM_MC_MEM_MAP_I32_WO(pi32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10801
     10802    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    1079510803    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     10804        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     10805        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    1079610806        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
    10797         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
     10807        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pi32Dst, bUnmapInfo, u16Fsw);
    1079810808        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1079910809    } IEM_MC_ELSE() {
    1080010810        IEM_MC_IF_FCW_IM() {
    1080110811            IEM_MC_STORE_MEM_I32_CONST_BY_REF(pi32Dst, INT32_MIN /* (integer indefinite) */);
    10802             IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
     10812            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pi32Dst, bUnmapInfo);
     10813        } IEM_MC_ELSE() {
     10814            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pi32Dst, bUnmapInfo);
    1080310815        } IEM_MC_ENDIF();
    1080410816        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
     
    1081410826{
    1081510827    IEMOP_MNEMONIC(fist_m32i, "fist m32i");
    10816     IEM_MC_BEGIN(3, 2, 0, 0);
     10828    IEM_MC_BEGIN(3, 3, 0, 0);
    1081710829    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    10818     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    10819     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    10820     IEM_MC_ARG(int32_t *,               pi32Dst,            1);
    10821     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    10822 
    1082310830    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     10831
    1082410832    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1082510833    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1082610834    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    10827 
    10828     IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1082910835    IEM_MC_PREPARE_FPU_USAGE();
     10836
     10837    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     10838    IEM_MC_ARG(int32_t *,               pi32Dst,            1);
     10839    IEM_MC_MEM_MAP_I32_WO(pi32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10840
     10841    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    1083010842    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     10843        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     10844        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    1083110845        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
    10832         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
     10846        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pi32Dst, bUnmapInfo, u16Fsw);
    1083310847        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1083410848    } IEM_MC_ELSE() {
    1083510849        IEM_MC_IF_FCW_IM() {
    1083610850            IEM_MC_STORE_MEM_I32_CONST_BY_REF(pi32Dst, INT32_MIN /* (integer indefinite) */);
    10837             IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
     10851            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pi32Dst, bUnmapInfo);
     10852        } IEM_MC_ELSE() {
     10853            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pi32Dst, bUnmapInfo);
    1083810854        } IEM_MC_ENDIF();
    1083910855        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
     
    1085110867    IEM_MC_BEGIN(3, 2, 0, 0);
    1085210868    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    10853     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    10854     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    10855     IEM_MC_ARG(int32_t *,               pi32Dst,            1);
    10856     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    10857 
    1085810869    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     10870
    1085910871    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1086010872    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1086110873    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    10862 
    10863     IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1086410874    IEM_MC_PREPARE_FPU_USAGE();
     10875
     10876    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     10877    IEM_MC_ARG(int32_t *,               pi32Dst,            1);
     10878    IEM_MC_MEM_MAP_I32_WO(pi32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10879
     10880    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    1086510881    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     10882        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     10883        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    1086610884        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
    10867         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
     10885        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pi32Dst, bUnmapInfo, u16Fsw);
    1086810886        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1086910887    } IEM_MC_ELSE() {
    1087010888        IEM_MC_IF_FCW_IM() {
    1087110889            IEM_MC_STORE_MEM_I32_CONST_BY_REF(pi32Dst, INT32_MIN /* (integer indefinite) */);
    10872             IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
     10890            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pi32Dst, bUnmapInfo);
     10891        } IEM_MC_ELSE() {
     10892            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pi32Dst, bUnmapInfo);
    1087310893        } IEM_MC_ENDIF();
    1087410894        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
     
    1091610936{
    1091710937    IEMOP_MNEMONIC(fstp_m80r, "fstp m80r");
    10918     IEM_MC_BEGIN(3, 2, 0, 0);
     10938    IEM_MC_BEGIN(3, 3, 0, 0);
    1091910939    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    10920     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    10921     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    10922     IEM_MC_ARG(PRTFLOAT80U,             pr80Dst,            1);
    10923     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    10924 
    1092510940    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     10941
    1092610942    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1092710943    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1092810944    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    10929 
    10930     IEM_MC_MEM_MAP_EX(pr80Dst, IEM_ACCESS_DATA_W, sizeof(*pr80Dst), pVCpu->iem.s.iEffSeg, GCPtrEffDst, 7 /*cbAlign*/, 1 /*arg*/);
    1093110945    IEM_MC_PREPARE_FPU_USAGE();
     10946
     10947    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     10948    IEM_MC_ARG(PRTFLOAT80U,             pr80Dst,            1);
     10949    IEM_MC_MEM_MAP_R80_WO(pr80Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10950
     10951    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    1093210952    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     10953        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     10954        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    1093310955        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r80, pu16Fsw, pr80Dst, pr80Value);
    10934         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr80Dst, IEM_ACCESS_DATA_W, u16Fsw);
     10956        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pr80Dst, bUnmapInfo, u16Fsw);
    1093510957        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1093610958    } IEM_MC_ELSE() {
    1093710959        IEM_MC_IF_FCW_IM() {
    1093810960            IEM_MC_STORE_MEM_NEG_QNAN_R80_BY_REF(pr80Dst);
    10939             IEM_MC_MEM_COMMIT_AND_UNMAP(pr80Dst, IEM_ACCESS_DATA_W);
     10961            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pr80Dst, bUnmapInfo);
     10962        } IEM_MC_ELSE() {
     10963            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pr80Dst, bUnmapInfo);
    1094010964        } IEM_MC_ENDIF();
    1094110965        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette