VirtualBox

Changeset 100072 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jun 5, 2023 3:17:42 PM (19 months ago)
Author:
vboxsync
Message:

VMM/IEM: Reworked all the IEM_MC_CALL/DEFER_TO_CIMPL macros to include some clues about what they may end up doing. The IEM_MC_DEFER_TO_CIMPL_X macros now returns implictly and is renamed to IEM_MC_DEFER_TO_CIMPL_X_RET - this will ease adding more code/whatever to follow the return from the call when recompiling and such. Also fixed buggy POP CS in 8086 mode. bugref:10369

Location:
trunk/src/VBox/VMM/VMMAll
Files:
10 edited

Legend:

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

    r100052 r100072  
    14731473
    14741474    IEM_SVM_INSTR_COMMON_CHECKS(pVCpu, invlpga);
    1475     if (IEM_SVM_IS_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_INVLPGA))
     1475    if (!IEM_SVM_IS_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_INVLPGA))
     1476    { /* probable */ }
     1477    else
    14761478    {
    14771479        Log2(("invlpga: Guest intercept (%RGp) -> #VMEXIT\n", GCPtrPage));
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions3DNow.cpp.h

    r98103 r100072  
    136136        case 0xbf: return FNIEMOP_CALL(iemOp_3Dnow_pavgusb_PQ_Qq);
    137137        default:
    138             return IEMOP_RAISE_INVALID_OPCODE();
     138            IEMOP_RAISE_INVALID_OPCODE_RET();
    139139    }
    140140}
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsCommon.cpp.h

    r99309 r100072  
    712712{
    713713    IEMOP_MNEMONIC(Invalid, "Invalid");
    714     return IEMOP_RAISE_INVALID_OPCODE();
     714    IEMOP_RAISE_INVALID_OPCODE_RET();
    715715}
    716716
     
    721721    RT_NOREF_PV(bRm);
    722722    IEMOP_MNEMONIC(InvalidWithRm, "InvalidWithRM");
    723     return IEMOP_RAISE_INVALID_OPCODE();
     723    IEMOP_RAISE_INVALID_OPCODE_RET();
    724724}
    725725
     
    743743    }
    744744    IEMOP_HLP_DONE_DECODING();
    745     return IEMOP_RAISE_INVALID_OPCODE();
     745    IEMOP_RAISE_INVALID_OPCODE_RET();
    746746}
    747747
     
    762762#endif
    763763    IEMOP_HLP_DONE_DECODING();
    764     return IEMOP_RAISE_INVALID_OPCODE();
     764    IEMOP_RAISE_INVALID_OPCODE_RET();
    765765}
    766766
     
    785785    }
    786786    IEMOP_HLP_DONE_DECODING();
    787     return IEMOP_RAISE_INVALID_OPCODE();
     787    IEMOP_RAISE_INVALID_OPCODE_RET();
    788788}
    789789
     
    805805    uint8_t bImm8;  IEM_OPCODE_GET_NEXT_U8(&bImm8);  RT_NOREF(bRm);
    806806    IEMOP_HLP_DONE_DECODING();
    807     return IEMOP_RAISE_INVALID_OPCODE();
     807    IEMOP_RAISE_INVALID_OPCODE_RET();
    808808}
    809809
     
    827827    }
    828828    IEMOP_HLP_DONE_DECODING();
    829     return IEMOP_RAISE_INVALID_OPCODE();
     829    IEMOP_RAISE_INVALID_OPCODE_RET();
    830830}
    831831
     
    846846#endif
    847847    IEMOP_HLP_DONE_DECODING();
    848     return IEMOP_RAISE_INVALID_OPCODE();
     848    IEMOP_RAISE_INVALID_OPCODE_RET();
    849849}
    850850
     
    870870    }
    871871    IEMOP_HLP_DONE_DECODING();
    872     return IEMOP_RAISE_INVALID_OPCODE();
     872    IEMOP_RAISE_INVALID_OPCODE_RET();
    873873}
    874874
     
    894894    }
    895895    IEMOP_HLP_DONE_DECODING();
    896     return IEMOP_RAISE_INVALID_OPCODE();
     896    IEMOP_RAISE_INVALID_OPCODE_RET();
    897897}
    898898
     
    919919        IEMOP_HLP_DONE_DECODING();
    920920    }
    921     return IEMOP_RAISE_INVALID_OPCODE();
    922 }
    923 
     921    IEMOP_RAISE_INVALID_OPCODE_RET();
     922}
     923
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r100052 r100072  
    119119#define IEMOP_BODY_BINARY_rm_r8_NO_LOCK() \
    120120            IEMOP_HLP_DONE_DECODING(); \
    121             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     121            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    122122        } \
    123123    } \
     
    341341#define IEMOP_BODY_BINARY_rm_rv_NO_LOCK() \
    342342            IEMOP_HLP_DONE_DECODING(); \
    343             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     343            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    344344        } \
    345345    } \
     
    624624    IEMOP_HLP_NO_64BIT();
    625625    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    626     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_ES, pVCpu->iem.s.enmEffOpSize);
     626    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE, iemCImpl_pop_Sreg, X86_SREG_ES, pVCpu->iem.s.enmEffOpSize);
    627627}
    628628
     
    791791    IEMOP_HLP_NO_64BIT();
    792792    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    793     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_ES, pVCpu->iem.s.enmEffOpSize);
     793    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_END_TB/*?*/,
     794                                iemCImpl_pop_Sreg, X86_SREG_CS, pVCpu->iem.s.enmEffOpSize);
    794795}
    795796
     
    910911    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    911912    IEMOP_HLP_NO_64BIT();
    912     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_SS, pVCpu->iem.s.enmEffOpSize);
     913    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE, iemCImpl_pop_Sreg, X86_SREG_SS, pVCpu->iem.s.enmEffOpSize);
    913914}
    914915
     
    10151016    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    10161017    IEMOP_HLP_NO_64BIT();
    1017     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_DS, pVCpu->iem.s.enmEffOpSize);
     1018    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE, iemCImpl_pop_Sreg, X86_SREG_DS, pVCpu->iem.s.enmEffOpSize);
    10181019}
    10191020
     
    11431144    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11441145    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
    1145     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_daa);
     1146    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_daa);
    11461147}
    11471148
     
    12531254    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12541255    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
    1255     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_das);
     1256    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_das);
    12561257}
    12571258
     
    14141415    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
    14151416
    1416     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_aaa);
     1417    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_aaa);
    14171418}
    14181419
     
    15431544    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_OF);
    15441545
    1545     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_aas);
     1546    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_aas);
    15461547}
    15471548
     
    22822283    IEMOP_HLP_NO_64BIT();
    22832284    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    2284         return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_pusha_16);
     2285        IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_pusha_16);
    22852286    Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT);
    2286     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_pusha_32);
     2287    IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_pusha_32);
    22872288}
    22882289
     
    22992300        IEMOP_HLP_NO_64BIT();
    23002301        if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    2301             return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_16);
     2302            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS, iemCImpl_popa_16);
    23022303        Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT);
    2303         return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_32);
     2304        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS, iemCImpl_popa_32);
    23042305    }
    23052306    IEMOP_MNEMONIC(mvex, "mvex");
    23062307    Log(("mvex prefix is not supported!\n"));
    2307     return IEMOP_RAISE_INVALID_OPCODE();
     2308    IEMOP_RAISE_INVALID_OPCODE_RET();
    23082309}
    23092310
     
    23962397                IEM_MC_FETCH_MEM_U16_DISP(u16UpperBounds, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 2);
    23972398
    2398                 IEM_MC_CALL_CIMPL_3(iemCImpl_bound_16, u16Index, u16LowerBounds, u16UpperBounds); /* returns */
     2399                IEM_MC_CALL_CIMPL_3(0, iemCImpl_bound_16, u16Index, u16LowerBounds, u16UpperBounds); /* returns */
    23992400                IEM_MC_END();
    24002401            }
     
    24142415                IEM_MC_FETCH_MEM_U32_DISP(u32UpperBounds, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 4);
    24152416
    2416                 IEM_MC_CALL_CIMPL_3(iemCImpl_bound_32, u32Index, u32LowerBounds, u32UpperBounds); /* returns */
     2417                IEM_MC_CALL_CIMPL_3(0, iemCImpl_bound_32, u32Index, u32LowerBounds, u32UpperBounds); /* returns */
    24172418                IEM_MC_END();
    24182419            }
     
    24272428               here because MODRM.MOD == 3. */
    24282429            Log(("evex not supported by the guest CPU!\n"));
    2429             return IEMOP_RAISE_INVALID_OPCODE();
     2430            IEMOP_RAISE_INVALID_OPCODE_RET();
    24302431        }
    24312432    }
     
    30693070        switch (pVCpu->iem.s.enmEffAddrMode)
    30703071        {
    3071             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op8_addr16, false);
    3072             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op8_addr32, false);
    3073             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op8_addr64, false);
     3072            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_ins_op8_addr16, false);
     3073            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_ins_op8_addr32, false);
     3074            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_ins_op8_addr64, false);
    30743075            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    30753076        }
     
    30803081        switch (pVCpu->iem.s.enmEffAddrMode)
    30813082        {
    3082             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op8_addr16, false);
    3083             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op8_addr32, false);
    3084             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op8_addr64, false);
     3083            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_ins_op8_addr16, false);
     3084            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_ins_op8_addr32, false);
     3085            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_ins_op8_addr64, false);
    30853086            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    30863087        }
     
    31043105                switch (pVCpu->iem.s.enmEffAddrMode)
    31053106                {
    3106                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op16_addr16, false);
    3107                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op16_addr32, false);
    3108                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op16_addr64, false);
     3107                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_ins_op16_addr16, false);
     3108                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_ins_op16_addr32, false);
     3109                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_ins_op16_addr64, false);
    31093110                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    31103111                }
     
    31143115                switch (pVCpu->iem.s.enmEffAddrMode)
    31153116                {
    3116                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op32_addr16, false);
    3117                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op32_addr32, false);
    3118                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op32_addr64, false);
     3117                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_ins_op32_addr16, false);
     3118                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_ins_op32_addr32, false);
     3119                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_ins_op32_addr64, false);
    31193120                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    31203121                }
     
    31313132                switch (pVCpu->iem.s.enmEffAddrMode)
    31323133                {
    3133                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op16_addr16, false);
    3134                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op16_addr32, false);
    3135                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op16_addr64, false);
     3134                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_ins_op16_addr16, false);
     3135                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_ins_op16_addr32, false);
     3136                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_ins_op16_addr64, false);
    31363137                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    31373138                }
     
    31413142                switch (pVCpu->iem.s.enmEffAddrMode)
    31423143                {
    3143                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op32_addr16, false);
    3144                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op32_addr32, false);
    3145                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op32_addr64, false);
     3144                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_ins_op32_addr16, false);
     3145                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_ins_op32_addr32, false);
     3146                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_ins_op32_addr64, false);
    31463147                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    31473148                }
     
    31653166        switch (pVCpu->iem.s.enmEffAddrMode)
    31663167        {
    3167             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr16, pVCpu->iem.s.iEffSeg, false);
    3168             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr32, pVCpu->iem.s.iEffSeg, false);
    3169             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr64, pVCpu->iem.s.iEffSeg, false);
     3168            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_outs_op8_addr16, pVCpu->iem.s.iEffSeg, false);
     3169            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_outs_op8_addr32, pVCpu->iem.s.iEffSeg, false);
     3170            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_outs_op8_addr64, pVCpu->iem.s.iEffSeg, false);
    31703171            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    31713172        }
     
    31763177        switch (pVCpu->iem.s.enmEffAddrMode)
    31773178        {
    3178             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr16, pVCpu->iem.s.iEffSeg, false);
    3179             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr32, pVCpu->iem.s.iEffSeg, false);
    3180             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr64, pVCpu->iem.s.iEffSeg, false);
     3179            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_outs_op8_addr16, pVCpu->iem.s.iEffSeg, false);
     3180            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_outs_op8_addr32, pVCpu->iem.s.iEffSeg, false);
     3181            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_outs_op8_addr64, pVCpu->iem.s.iEffSeg, false);
    31813182            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    31823183        }
     
    32003201                switch (pVCpu->iem.s.enmEffAddrMode)
    32013202                {
    3202                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr16, pVCpu->iem.s.iEffSeg, false);
    3203                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr32, pVCpu->iem.s.iEffSeg, false);
    3204                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr64, pVCpu->iem.s.iEffSeg, false);
     3203                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_outs_op16_addr16, pVCpu->iem.s.iEffSeg, false);
     3204                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_outs_op16_addr32, pVCpu->iem.s.iEffSeg, false);
     3205                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_outs_op16_addr64, pVCpu->iem.s.iEffSeg, false);
    32053206                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    32063207                }
     
    32103211                switch (pVCpu->iem.s.enmEffAddrMode)
    32113212                {
    3212                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr16, pVCpu->iem.s.iEffSeg, false);
    3213                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr32, pVCpu->iem.s.iEffSeg, false);
    3214                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr64, pVCpu->iem.s.iEffSeg, false);
     3213                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_outs_op32_addr16, pVCpu->iem.s.iEffSeg, false);
     3214                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_outs_op32_addr32, pVCpu->iem.s.iEffSeg, false);
     3215                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT, iemCImpl_rep_outs_op32_addr64, pVCpu->iem.s.iEffSeg, false);
    32153216                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    32163217                }
     
    32273228                switch (pVCpu->iem.s.enmEffAddrMode)
    32283229                {
    3229                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr16, pVCpu->iem.s.iEffSeg, false);
    3230                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr32, pVCpu->iem.s.iEffSeg, false);
    3231                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr64, pVCpu->iem.s.iEffSeg, false);
     3230                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_outs_op16_addr16, pVCpu->iem.s.iEffSeg, false);
     3231                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_outs_op16_addr32, pVCpu->iem.s.iEffSeg, false);
     3232                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_outs_op16_addr64, pVCpu->iem.s.iEffSeg, false);
    32323233                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    32333234                }
     
    32373238                switch (pVCpu->iem.s.enmEffAddrMode)
    32383239                {
    3239                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr16, pVCpu->iem.s.iEffSeg, false);
    3240                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr32, pVCpu->iem.s.iEffSeg, false);
    3241                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr64, pVCpu->iem.s.iEffSeg, false);
     3240                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_outs_op32_addr16, pVCpu->iem.s.iEffSeg, false);
     3241                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_outs_op32_addr32, pVCpu->iem.s.iEffSeg, false);
     3242                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_outs_op32_addr64, pVCpu->iem.s.iEffSeg, false);
    32423243                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    32433244                }
     
    36203621#define IEMOP_BODY_BINARY_Eb_Ib_NO_LOCK() \
    36213622            IEMOP_HLP_DONE_DECODING(); \
    3622             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     3623            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    36233624        } \
    36243625    } \
     
    39193920#define IEMOP_BODY_BINARY_Ev_Iz_NO_LOCK() \
    39203921            IEMOP_HLP_DONE_DECODING(); \
    3921             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     3922            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    39223923        } \
    39233924    } \
     
    42864287#define IEMOP_BODY_BINARY_Ev_Ib_NO_LOCK() \
    42874288            IEMOP_HLP_DONE_DECODING(); \
    4288             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     4289            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    42894290        } \
    42904291    } \
     
    50015002    uint8_t const iSegReg = IEM_GET_MODRM_REG_8(bRm);
    50025003    if (   iSegReg > X86_SREG_GS)
    5003         return IEMOP_RAISE_INVALID_OPCODE(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
     5004        IEMOP_RAISE_INVALID_OPCODE_RET(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
    50045005
    50055006    /*
     
    50755076    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    50765077    if (IEM_IS_MODRM_REG_MODE(bRm))
    5077         return IEMOP_RAISE_INVALID_OPCODE(); /* no register form */
     5078        IEMOP_RAISE_INVALID_OPCODE_RET(); /* no register form */
    50785079
    50795080    switch (pVCpu->iem.s.enmEffOpSize)
     
    51415142    if (   iSegReg == X86_SREG_CS
    51425143        || iSegReg > X86_SREG_GS)
    5143         return IEMOP_RAISE_INVALID_OPCODE(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
     5144        IEMOP_RAISE_INVALID_OPCODE_RET(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
    51445145
    51455146    /*
     
    51535154        IEM_MC_ARG(uint16_t,      u16Value,          1);
    51545155        IEM_MC_FETCH_GREG_U16(u16Value, IEM_GET_MODRM_RM(pVCpu, bRm));
    5155         IEM_MC_CALL_CIMPL_2(iemCImpl_load_SReg, iSRegArg, u16Value);
     5156        if (iSRegArg >= X86_SREG_FS || !IEM_IS_32BIT_CODE(pVCpu))
     5157            IEM_MC_CALL_CIMPL_2(               0, iemCImpl_load_SReg, iSRegArg, u16Value);
     5158        else
     5159            IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_MODE, iemCImpl_load_SReg, iSRegArg, u16Value);
    51565160        IEM_MC_END();
    51575161    }
     
    51695173        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    51705174        IEM_MC_FETCH_MEM_U16(u16Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    5171         IEM_MC_CALL_CIMPL_2(iemCImpl_load_SReg, iSRegArg, u16Value);
     5175        if (iSRegArg >= X86_SREG_FS || !IEM_IS_32BIT_CODE(pVCpu))
     5176            IEM_MC_CALL_CIMPL_2(               0, iemCImpl_load_SReg, iSRegArg, u16Value);
     5177        else
     5178            IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_MODE, iemCImpl_load_SReg, iSRegArg, u16Value);
    51725179        IEM_MC_END();
    51735180    }
     
    53225329                default:
    53235330                    Log(("XOP: Invalid vvvv value: %#x!\n", bRm & 0x1f));
    5324                     return IEMOP_RAISE_INVALID_OPCODE();
     5331                    IEMOP_RAISE_INVALID_OPCODE_RET();
    53255332            }
    53265333        }
     
    53305337    else
    53315338        Log(("XOP: XOP support disabled!\n"));
    5332     return IEMOP_RAISE_INVALID_OPCODE();
     5339    IEMOP_RAISE_INVALID_OPCODE_RET();
    53335340}
    53345341
     
    54005407    {
    54015408        IEMOP_MNEMONIC(pause, "pause");
     5409        /* ASSUMING that we keep the IEM_F_X86_CTX_IN_GUEST, IEM_F_X86_CTX_VMX
     5410           and IEM_F_X86_CTX_SVM in the TB key, we can safely do the following: */
     5411        if (!IEM_IS_IN_GUEST(pVCpu))
     5412        { /* probable */ }
    54025413#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    5403         if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fVmx)
    5404             return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_vmx_pause);
     5414        else if (pVCpu->iem.s.fExec & IEM_F_X86_CTX_VMX)
     5415            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmx_pause);
    54055416#endif
    54065417#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    5407         if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvm)
    5408             return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_svm_pause);
     5418        else if (pVCpu->iem.s.fExec & IEM_F_X86_CTX_SVM)
     5419            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_svm_pause);
    54095420#endif
    54105421    }
     
    56015612    uint16_t uSel;  IEM_OPCODE_GET_NEXT_U16(&uSel);
    56025613    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5603     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_callf, uSel, offSeg, pVCpu->iem.s.enmEffOpSize);
     5614    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     5615                                iemCImpl_callf, uSel, offSeg, pVCpu->iem.s.enmEffOpSize);
    56045616}
    56055617
     
    56275639    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    56285640    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    5629     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_pushf, pVCpu->iem.s.enmEffOpSize);
     5641    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_pushf, pVCpu->iem.s.enmEffOpSize);
    56305642}
    56315643
     
    56395651    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    56405652    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    5641     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_popf, pVCpu->iem.s.enmEffOpSize);
     5653    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS, iemCImpl_popf, pVCpu->iem.s.enmEffOpSize);
    56425654}
    56435655
     
    56525664    if (   IEM_IS_64BIT_CODE(pVCpu)
    56535665        && !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fLahfSahf)
    5654         return IEMOP_RAISE_INVALID_OPCODE();
     5666        IEMOP_RAISE_INVALID_OPCODE_RET();
    56555667    IEM_MC_BEGIN(0, 2);
    56565668    IEM_MC_LOCAL(uint32_t, u32Flags);
     
    56775689    if (   IEM_IS_64BIT_CODE(pVCpu)
    56785690        && !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fLahfSahf)
    5679         return IEMOP_RAISE_INVALID_OPCODE();
     5691        IEMOP_RAISE_INVALID_OPCODE_RET();
    56805692    IEM_MC_BEGIN(0, 1);
    56815693    IEM_MC_LOCAL(uint8_t, u8Flags);
     
    58915903        switch (pVCpu->iem.s.enmEffAddrMode)
    58925904        {
    5893             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr16, pVCpu->iem.s.iEffSeg);
    5894             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr32, pVCpu->iem.s.iEffSeg);
    5895             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr64, pVCpu->iem.s.iEffSeg);
     5905            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op8_addr16, pVCpu->iem.s.iEffSeg);
     5906            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op8_addr32, pVCpu->iem.s.iEffSeg);
     5907            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op8_addr64, pVCpu->iem.s.iEffSeg);
    58965908            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    58975909        }
     
    59305942                switch (pVCpu->iem.s.enmEffAddrMode)
    59315943                {
    5932                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr16, pVCpu->iem.s.iEffSeg);
    5933                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr32, pVCpu->iem.s.iEffSeg);
    5934                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr64, pVCpu->iem.s.iEffSeg);
     5944                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op16_addr16, pVCpu->iem.s.iEffSeg);
     5945                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op16_addr32, pVCpu->iem.s.iEffSeg);
     5946                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op16_addr64, pVCpu->iem.s.iEffSeg);
    59355947                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    59365948                }
     
    59395951                switch (pVCpu->iem.s.enmEffAddrMode)
    59405952                {
    5941                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr16, pVCpu->iem.s.iEffSeg);
    5942                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr32, pVCpu->iem.s.iEffSeg);
    5943                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr64, pVCpu->iem.s.iEffSeg);
     5953                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op32_addr16, pVCpu->iem.s.iEffSeg);
     5954                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op32_addr32, pVCpu->iem.s.iEffSeg);
     5955                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op32_addr64, pVCpu->iem.s.iEffSeg);
    59445956                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    59455957                }
     
    59485960                {
    59495961                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_6);
    5950                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op64_addr32, pVCpu->iem.s.iEffSeg);
    5951                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op64_addr64, pVCpu->iem.s.iEffSeg);
     5962                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op64_addr32, pVCpu->iem.s.iEffSeg);
     5963                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op64_addr64, pVCpu->iem.s.iEffSeg);
    59525964                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    59535965                }
     
    60406052        switch (pVCpu->iem.s.enmEffAddrMode)
    60416053        {
    6042             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr16, pVCpu->iem.s.iEffSeg);
    6043             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr32, pVCpu->iem.s.iEffSeg);
    6044             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr64, pVCpu->iem.s.iEffSeg);
     6054            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op8_addr16, pVCpu->iem.s.iEffSeg);
     6055            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op8_addr32, pVCpu->iem.s.iEffSeg);
     6056            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op8_addr64, pVCpu->iem.s.iEffSeg);
    60456057            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    60466058        }
     
    60516063        switch (pVCpu->iem.s.enmEffAddrMode)
    60526064        {
    6053             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr16, pVCpu->iem.s.iEffSeg);
    6054             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr32, pVCpu->iem.s.iEffSeg);
    6055             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr64, pVCpu->iem.s.iEffSeg);
     6065            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op8_addr16, pVCpu->iem.s.iEffSeg);
     6066            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op8_addr32, pVCpu->iem.s.iEffSeg);
     6067            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op8_addr64, pVCpu->iem.s.iEffSeg);
    60566068            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    60576069        }
     
    60906102                switch (pVCpu->iem.s.enmEffAddrMode)
    60916103                {
    6092                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr16, pVCpu->iem.s.iEffSeg);
    6093                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr32, pVCpu->iem.s.iEffSeg);
    6094                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr64, pVCpu->iem.s.iEffSeg);
     6104                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op16_addr16, pVCpu->iem.s.iEffSeg);
     6105                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op16_addr32, pVCpu->iem.s.iEffSeg);
     6106                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op16_addr64, pVCpu->iem.s.iEffSeg);
    60956107                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    60966108                }
     
    60996111                switch (pVCpu->iem.s.enmEffAddrMode)
    61006112                {
    6101                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr16, pVCpu->iem.s.iEffSeg);
    6102                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr32, pVCpu->iem.s.iEffSeg);
    6103                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr64, pVCpu->iem.s.iEffSeg);
     6113                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op32_addr16, pVCpu->iem.s.iEffSeg);
     6114                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op32_addr32, pVCpu->iem.s.iEffSeg);
     6115                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op32_addr64, pVCpu->iem.s.iEffSeg);
    61046116                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    61056117                }
     
    61086120                {
    61096121                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_4);
    6110                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op64_addr32, pVCpu->iem.s.iEffSeg);
    6111                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op64_addr64, pVCpu->iem.s.iEffSeg);
     6122                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op64_addr32, pVCpu->iem.s.iEffSeg);
     6123                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_cmps_op64_addr64, pVCpu->iem.s.iEffSeg);
    61126124                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    61136125                }
     
    61246136                switch (pVCpu->iem.s.enmEffAddrMode)
    61256137                {
    6126                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr16, pVCpu->iem.s.iEffSeg);
    6127                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr32, pVCpu->iem.s.iEffSeg);
    6128                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr64, pVCpu->iem.s.iEffSeg);
     6138                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op16_addr16, pVCpu->iem.s.iEffSeg);
     6139                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op16_addr32, pVCpu->iem.s.iEffSeg);
     6140                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op16_addr64, pVCpu->iem.s.iEffSeg);
    61296141                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    61306142                }
     
    61336145                switch (pVCpu->iem.s.enmEffAddrMode)
    61346146                {
    6135                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr16, pVCpu->iem.s.iEffSeg);
    6136                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr32, pVCpu->iem.s.iEffSeg);
    6137                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr64, pVCpu->iem.s.iEffSeg);
     6147                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op32_addr16, pVCpu->iem.s.iEffSeg);
     6148                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op32_addr32, pVCpu->iem.s.iEffSeg);
     6149                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op32_addr64, pVCpu->iem.s.iEffSeg);
    61386150                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    61396151                }
     
    61426154                {
    61436155                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_2);
    6144                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op64_addr32, pVCpu->iem.s.iEffSeg);
    6145                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op64_addr64, pVCpu->iem.s.iEffSeg);
     6156                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op64_addr32, pVCpu->iem.s.iEffSeg);
     6157                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_cmps_op64_addr64, pVCpu->iem.s.iEffSeg);
    61466158                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    61476159                }
     
    62466258        switch (pVCpu->iem.s.enmEffAddrMode)
    62476259        {
    6248             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_al_m16);
    6249             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_al_m32);
    6250             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_al_m64);
     6260            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP, iemCImpl_stos_al_m16);
     6261            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP, iemCImpl_stos_al_m32);
     6262            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP, iemCImpl_stos_al_m64);
    62516263            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    62526264        }
     
    62856297                switch (pVCpu->iem.s.enmEffAddrMode)
    62866298                {
    6287                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_ax_m16);
    6288                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_ax_m32);
    6289                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_ax_m64);
     6299                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_ax_m16);
     6300                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_ax_m32);
     6301                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_ax_m64);
    62906302                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    62916303                }
     
    62946306                switch (pVCpu->iem.s.enmEffAddrMode)
    62956307                {
    6296                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_eax_m16);
    6297                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_eax_m32);
    6298                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_eax_m64);
     6308                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_eax_m16);
     6309                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_eax_m32);
     6310                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_eax_m64);
    62996311                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    63006312                }
     
    63036315                {
    63046316                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_9);
    6305                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_rax_m32);
    6306                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_rax_m64);
     6317                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_rax_m32);
     6318                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_rax_m64);
    63076319                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    63086320                }
     
    63846396        switch (pVCpu->iem.s.enmEffAddrMode)
    63856397        {
    6386             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m16, pVCpu->iem.s.iEffSeg);
    6387             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m32, pVCpu->iem.s.iEffSeg);
    6388             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m64, pVCpu->iem.s.iEffSeg);
     6398            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_al_m16, pVCpu->iem.s.iEffSeg);
     6399            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_al_m32, pVCpu->iem.s.iEffSeg);
     6400            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_al_m64, pVCpu->iem.s.iEffSeg);
    63896401            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    63906402        }
     
    64236435                switch (pVCpu->iem.s.enmEffAddrMode)
    64246436                {
    6425                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m16, pVCpu->iem.s.iEffSeg);
    6426                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m32, pVCpu->iem.s.iEffSeg);
    6427                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m64, pVCpu->iem.s.iEffSeg);
     6437                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_ax_m16, pVCpu->iem.s.iEffSeg);
     6438                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_ax_m32, pVCpu->iem.s.iEffSeg);
     6439                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_ax_m64, pVCpu->iem.s.iEffSeg);
    64286440                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    64296441                }
     
    64326444                switch (pVCpu->iem.s.enmEffAddrMode)
    64336445                {
    6434                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m16, pVCpu->iem.s.iEffSeg);
    6435                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m32, pVCpu->iem.s.iEffSeg);
    6436                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m64, pVCpu->iem.s.iEffSeg);
     6446                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_eax_m16, pVCpu->iem.s.iEffSeg);
     6447                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_eax_m32, pVCpu->iem.s.iEffSeg);
     6448                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_eax_m64, pVCpu->iem.s.iEffSeg);
    64376449                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    64386450                }
     
    64416453                {
    64426454                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_7);
    6443                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_rax_m32, pVCpu->iem.s.iEffSeg);
    6444                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_rax_m64, pVCpu->iem.s.iEffSeg);
     6455                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_rax_m32, pVCpu->iem.s.iEffSeg);
     6456                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_rax_m64, pVCpu->iem.s.iEffSeg);
    64456457                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    64466458                }
     
    65286540        switch (pVCpu->iem.s.enmEffAddrMode)
    65296541        {
    6530             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_al_m16);
    6531             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_al_m32);
    6532             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_al_m64);
     6542            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_al_m16);
     6543            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_al_m32);
     6544            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_al_m64);
    65336545            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    65346546        }
     
    65396551        switch (pVCpu->iem.s.enmEffAddrMode)
    65406552        {
    6541             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_al_m16);
    6542             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_al_m32);
    6543             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_al_m64);
     6553            case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_al_m16);
     6554            case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_al_m32);
     6555            case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_al_m64);
    65446556            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    65456557        }
     
    65786590                switch (pVCpu->iem.s.enmEffAddrMode)
    65796591                {
    6580                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_ax_m16);
    6581                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_ax_m32);
    6582                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_ax_m64);
     6592                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_ax_m16);
     6593                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_ax_m32);
     6594                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_ax_m64);
    65836595                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    65846596                }
     
    65876599                switch (pVCpu->iem.s.enmEffAddrMode)
    65886600                {
    6589                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_eax_m16);
    6590                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_eax_m32);
    6591                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_eax_m64);
     6601                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_eax_m16);
     6602                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_eax_m32);
     6603                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_eax_m64);
    65926604                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    65936605                }
     
    65966608                {
    65976609                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_6); /** @todo It's this wrong, we can do 16-bit addressing in 64-bit mode, but not 32-bit. right? */
    6598                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_rax_m32);
    6599                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_rax_m64);
     6610                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_rax_m32);
     6611                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_rax_m64);
    66006612                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    66016613                }
     
    66116623                switch (pVCpu->iem.s.enmEffAddrMode)
    66126624                {
    6613                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m16);
    6614                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m32);
    6615                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m64);
     6625                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_ax_m16);
     6626                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_ax_m32);
     6627                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_ax_m64);
    66166628                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    66176629                }
     
    66206632                switch (pVCpu->iem.s.enmEffAddrMode)
    66216633                {
    6622                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m16);
    6623                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m32);
    6624                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m64);
     6634                    case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_eax_m16);
     6635                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_eax_m32);
     6636                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_eax_m64);
    66256637                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    66266638                }
     
    66296641                {
    66306642                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_5);
    6631                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_rax_m32);
    6632                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_rax_m64);
     6643                    case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_rax_m32);
     6644                    case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_rax_m64);
    66336645                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    66346646                }
     
    69216933        case 5: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_shr_eflags); IEMOP_MNEMONIC(shr_Eb_Ib, "shr Eb,Ib"); break;
    69226934        case 7: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_sar_eflags); IEMOP_MNEMONIC(sar_Eb_Ib, "sar Eb,Ib"); break;
    6923         case 6: return IEMOP_RAISE_INVALID_OPCODE();
     6935        case 6: IEMOP_RAISE_INVALID_OPCODE_RET();
    69246936        IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe stupid */
    69256937    }
     
    69836995        case 5: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_shr_eflags); IEMOP_MNEMONIC(shr_Ev_Ib, "shr Ev,Ib"); break;
    69846996        case 7: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_sar_eflags); IEMOP_MNEMONIC(sar_Ev_Ib, "sar Ev,Ib"); break;
    6985         case 6: return IEMOP_RAISE_INVALID_OPCODE();
     6997        case 6: IEMOP_RAISE_INVALID_OPCODE_RET();
    69866998        IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe stupid */
    69876999    }
     
    71217133    {
    71227134        case IEMMODE_16BIT:
    7123             return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_retn_iw_16, u16Imm);
     7135            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH, iemCImpl_retn_iw_16, u16Imm);
    71247136        case IEMMODE_32BIT:
    7125             return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_retn_iw_32, u16Imm);
     7137            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH, iemCImpl_retn_iw_32, u16Imm);
    71267138        case IEMMODE_64BIT:
    7127             return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_retn_iw_64, u16Imm);
     7139            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH, iemCImpl_retn_iw_64, u16Imm);
    71287140        IEM_NOT_REACHED_DEFAULT_CASE_RET();
    71297141    }
     
    71427154    {
    71437155        case IEMMODE_16BIT:
    7144             return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_retn_16);
     7156            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH, iemCImpl_retn_16);
    71457157        case IEMMODE_32BIT:
    7146             return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_retn_32);
     7158            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH, iemCImpl_retn_32);
    71477159        case IEMMODE_64BIT:
    7148             return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_retn_64);
     7160            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH, iemCImpl_retn_64);
    71497161        IEM_NOT_REACHED_DEFAULT_CASE_RET();
    71507162    }
     
    72117223                default:
    72127224                    Log(("VEX3: Invalid vvvv value: %#x!\n", bRm & 0x1f));
    7213                     return IEMOP_RAISE_INVALID_OPCODE();
     7225                    IEMOP_RAISE_INVALID_OPCODE_RET();
    72147226            }
    72157227        }
    72167228        Log(("VEX3: VEX support disabled!\n"));
    7217         return IEMOP_RAISE_INVALID_OPCODE();
     7229        IEMOP_RAISE_INVALID_OPCODE_RET();
    72187230    }
    72197231
     
    72607272        /** @todo does intel completely decode the sequence with SIB/disp before \#UD? */
    72617273        Log(("VEX2: VEX support disabled!\n"));
    7262         return IEMOP_RAISE_INVALID_OPCODE();
     7274        IEMOP_RAISE_INVALID_OPCODE_RET();
    72637275    }
    72647276
     
    72757287    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    72767288    if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */
    7277         return IEMOP_RAISE_INVALID_OPCODE();
     7289        IEMOP_RAISE_INVALID_OPCODE_RET();
    72787290    IEMOP_MNEMONIC(mov_Eb_Ib, "mov Eb,Ib");
    72797291
     
    73107322    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    73117323    if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */
    7312         return IEMOP_RAISE_INVALID_OPCODE();
     7324        IEMOP_RAISE_INVALID_OPCODE_RET();
    73137325    IEMOP_MNEMONIC(mov_Ev_Iz, "mov Ev,Iz");
    73147326
     
    74057417    uint8_t  u8NestingLevel; IEM_OPCODE_GET_NEXT_U8(&u8NestingLevel);
    74067418    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7407     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_enter, pVCpu->iem.s.enmEffOpSize, cbFrame, u8NestingLevel);
     7419    IEM_MC_DEFER_TO_CIMPL_3_RET(0, iemCImpl_enter, pVCpu->iem.s.enmEffOpSize, cbFrame, u8NestingLevel);
    74087420}
    74097421
     
    74187430    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    74197431    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7420     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_leave, pVCpu->iem.s.enmEffOpSize);
     7432    IEM_MC_DEFER_TO_CIMPL_1_RET(0, iemCImpl_leave, pVCpu->iem.s.enmEffOpSize);
    74217433}
    74227434
     
    74307442    uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    74317443    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7432     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, u16Imm);
     7444    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH, iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, u16Imm);
    74337445}
    74347446
     
    74417453    IEMOP_MNEMONIC(retf, "retf");
    74427454    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7443     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, 0);
     7455    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH, iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, 0);
    74447456}
    74457457
     
    74527464    IEMOP_MNEMONIC(int3, "int3");
    74537465    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7454     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_int, X86_XCPT_BP, IEMINT_INT3);
     7466    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     7467                                iemCImpl_int, X86_XCPT_BP, IEMINT_INT3);
    74557468}
    74567469
     
    74647477    uint8_t u8Int; IEM_OPCODE_GET_NEXT_U8(&u8Int);
    74657478    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7466     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_int, u8Int, IEMINT_INTN);
     7479    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     7480                                iemCImpl_int, u8Int, IEMINT_INTN);
    74677481}
    74687482
     
    74757489    IEMOP_MNEMONIC(into, "into");
    74767490    IEMOP_HLP_NO_64BIT();
    7477 
    7478     IEM_MC_BEGIN(2, 0);
    7479     IEM_MC_ARG_CONST(uint8_t,   u8Int,  /*=*/ X86_XCPT_OF, 0);
    7480     IEM_MC_ARG_CONST(IEMINT,    enmInt, /*=*/ IEMINT_INTO, 1);
    7481     IEM_MC_CALL_CIMPL_2(iemCImpl_int, u8Int, enmInt);
    7482     IEM_MC_END();
     7491    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     7492                                iemCImpl_int, X86_XCPT_OF, IEMINT_INTO);
    74837493}
    74847494
     
    74917501    IEMOP_MNEMONIC(iret, "iret");
    74927502    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    7493     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_iret, pVCpu->iem.s.enmEffOpSize);
     7503    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     7504                                iemCImpl_iret, pVCpu->iem.s.enmEffOpSize);
    74947505}
    74957506
     
    75117522        case 5: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_shr_eflags); IEMOP_MNEMONIC(shr_Eb_1, "shr Eb,1"); break;
    75127523        case 7: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_sar_eflags); IEMOP_MNEMONIC(sar_Eb_1, "sar Eb,1"); break;
    7513         case 6: return IEMOP_RAISE_INVALID_OPCODE();
     7524        case 6: IEMOP_RAISE_INVALID_OPCODE_RET();
    75147525        IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe, well... */
    75157526    }
     
    75707581        case 5: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_shr_eflags); IEMOP_MNEMONIC(shr_Ev_1, "shr Ev,1"); break;
    75717582        case 7: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_sar_eflags); IEMOP_MNEMONIC(sar_Ev_1, "sar Ev,1"); break;
    7572         case 6: return IEMOP_RAISE_INVALID_OPCODE();
     7583        case 6: IEMOP_RAISE_INVALID_OPCODE_RET();
    75737584        IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe, well... */
    75747585    }
     
    77057716        case 5: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_shr_eflags); IEMOP_MNEMONIC(shr_Eb_CL, "shr Eb,CL"); break;
    77067717        case 7: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_sar_eflags); IEMOP_MNEMONIC(sar_Eb_CL, "sar Eb,CL"); break;
    7707         case 6: return IEMOP_RAISE_INVALID_OPCODE();
     7718        case 6: IEMOP_RAISE_INVALID_OPCODE_RET();
    77087719        IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc, grr. */
    77097720    }
     
    77657776        case 5: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_shr_eflags); IEMOP_MNEMONIC(shr_Ev_CL, "shr Ev,CL"); break;
    77667777        case 7: pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_sar_eflags); IEMOP_MNEMONIC(sar_Ev_CL, "sar Ev,CL"); break;
    7767         case 6: return IEMOP_RAISE_INVALID_OPCODE();
     7778        case 6: IEMOP_RAISE_INVALID_OPCODE_RET();
    77687779        IEM_NOT_REACHED_DEFAULT_CASE_RET(); /* gcc maybe stupid */
    77697780    }
     
    78997910    IEMOP_HLP_NO_64BIT();
    79007911    if (!bImm)
    7901         return IEMOP_RAISE_DIVIDE_ERROR();
    7902     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_aam, bImm);
     7912        IEMOP_RAISE_DIVIDE_ERROR_RET();
     7913    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_aam, bImm);
    79037914}
    79047915
     
    79137924    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    79147925    IEMOP_HLP_NO_64BIT();
    7915     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_aad, bImm);
     7926    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_aad, bImm);
    79167927}
    79177928
     
    84558466    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    84568467    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    8457     IEM_MC_CALL_CIMPL_3(iemCImpl_fldenv, enmEffOpSize, iEffSeg, GCPtrEffSrc);
     8468    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_FPU, iemCImpl_fldenv, enmEffOpSize, iEffSeg, GCPtrEffSrc);
    84588469    IEM_MC_END();
    84598470}
     
    84728483    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    84738484    IEM_MC_FETCH_MEM_U16(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    8474     IEM_MC_CALL_CIMPL_1(iemCImpl_fldcw, u16Fsw);
     8485    IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_FPU, iemCImpl_fldcw, u16Fsw);
    84758486    IEM_MC_END();
    84768487}
     
    84908501    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    84918502    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    8492     IEM_MC_CALL_CIMPL_3(iemCImpl_fnstenv, enmEffOpSize, iEffSeg, GCPtrEffDst);
     8503    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_FPU, iemCImpl_fnstenv, enmEffOpSize, iEffSeg, GCPtrEffDst);
    84938504    IEM_MC_END();
    84948505}
     
    85818592        IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
    85828593    } IEM_MC_ELSE() {
    8583         IEM_MC_CALL_CIMPL_2(iemCImpl_fxch_underflow, iStReg, uFpuOpcode);
     8594        IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_FPU, iemCImpl_fxch_underflow, iStReg, uFpuOpcode);
    85848595    } IEM_MC_ENDIF();
    85858596
     
    90969107                if (bRm == 0xd0)
    90979108                    return FNIEMOP_CALL(iemOp_fnop);
    9098                 return IEMOP_RAISE_INVALID_OPCODE();
     9109                IEMOP_RAISE_INVALID_OPCODE_RET();
    90999110            case 3: return FNIEMOP_CALL_1(iemOp_fstp_stN, bRm); /* Reserved. Intel behavior seems to be FSTP ST(i) though. */
    91009111            case 4:
     
    91129123        {
    91139124            case 0: return FNIEMOP_CALL_1(iemOp_fld_m32r,  bRm);
    9114             case 1: return IEMOP_RAISE_INVALID_OPCODE();
     9125            case 1: IEMOP_RAISE_INVALID_OPCODE_RET();
    91159126            case 2: return FNIEMOP_CALL_1(iemOp_fst_m32r,  bRm);
    91169127            case 3: return FNIEMOP_CALL_1(iemOp_fstp_m32r, bRm);
     
    94399450            case 2: return FNIEMOP_CALL_1(iemOp_fcmovbe_stN, bRm);
    94409451            case 3: return FNIEMOP_CALL_1(iemOp_fcmovu_stN, bRm);
    9441             case 4: return IEMOP_RAISE_INVALID_OPCODE();
     9452            case 4: IEMOP_RAISE_INVALID_OPCODE_RET();
    94429453            case 5:
    94439454                if (bRm == 0xe9)
    94449455                    return FNIEMOP_CALL(iemOp_fucompp);
    9445                 return IEMOP_RAISE_INVALID_OPCODE();
    9446             case 6: return IEMOP_RAISE_INVALID_OPCODE();
    9447             case 7: return IEMOP_RAISE_INVALID_OPCODE();
     9456                IEMOP_RAISE_INVALID_OPCODE_RET();
     9457            case 6: IEMOP_RAISE_INVALID_OPCODE_RET();
     9458            case 7: IEMOP_RAISE_INVALID_OPCODE_RET();
    94489459            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    94499460        }
     
    98239834    IEMOP_MNEMONIC(fninit, "fninit");
    98249835    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    9825     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_finit, false /*fCheckXcpts*/);
     9836    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_FPU, iemCImpl_finit, false /*fCheckXcpts*/);
    98269837}
    98279838
     
    98519862    return VINF_SUCCESS;
    98529863#else
    9853     return IEMOP_RAISE_INVALID_OPCODE();
     9864    IEMOP_RAISE_INVALID_OPCODE_RET();
    98549865#endif
    98559866}
     
    98609871{
    98619872    IEMOP_MNEMONIC(fucomi_st0_stN, "fucomi st0,stN");
    9862     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), iemAImpl_fucomi_r80_by_r80,
    9863                                    0 /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
     9873    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS,
     9874                                iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), iemAImpl_fucomi_r80_by_r80,
     9875                                0 /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
    98649876}
    98659877
     
    98699881{
    98709882    IEMOP_MNEMONIC(fcomi_st0_stN, "fcomi st0,stN");
    9871     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), iemAImpl_fcomi_r80_by_r80,
    9872                                    false /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
     9883    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS,
     9884                                iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), iemAImpl_fcomi_r80_by_r80,
     9885                                false /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
    98739886}
    98749887
     
    98989911                    case 0xe4:  return FNIEMOP_CALL(iemOp_fnsetpm);
    98999912                    case 0xe5:  return FNIEMOP_CALL(iemOp_frstpm);
    9900                     case 0xe6:  return IEMOP_RAISE_INVALID_OPCODE();
    9901                     case 0xe7:  return IEMOP_RAISE_INVALID_OPCODE();
     9913                    case 0xe6:  IEMOP_RAISE_INVALID_OPCODE_RET();
     9914                    case 0xe7:  IEMOP_RAISE_INVALID_OPCODE_RET();
    99029915                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    99039916                }
     
    99059918            case 5: return FNIEMOP_CALL_1(iemOp_fucomi_stN, bRm);
    99069919            case 6: return FNIEMOP_CALL_1(iemOp_fcomi_stN,  bRm);
    9907             case 7: return IEMOP_RAISE_INVALID_OPCODE();
     9920            case 7: IEMOP_RAISE_INVALID_OPCODE_RET();
    99089921            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    99099922        }
     
    99179930            case 2: return FNIEMOP_CALL_1(iemOp_fist_m32i,  bRm);
    99189931            case 3: return FNIEMOP_CALL_1(iemOp_fistp_m32i, bRm);
    9919             case 4: return IEMOP_RAISE_INVALID_OPCODE();
     9932            case 4: IEMOP_RAISE_INVALID_OPCODE_RET();
    99209933            case 5: return FNIEMOP_CALL_1(iemOp_fld_m80r,   bRm);
    9921             case 6: return IEMOP_RAISE_INVALID_OPCODE();
     9934            case 6: IEMOP_RAISE_INVALID_OPCODE_RET();
    99229935            case 7: return FNIEMOP_CALL_1(iemOp_fstp_m80r,  bRm);
    99239936            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    1035010363    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    1035110364    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    10352     IEM_MC_CALL_CIMPL_3(iemCImpl_frstor, enmEffOpSize, iEffSeg, GCPtrEffSrc);
     10365    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_FPU, iemCImpl_frstor, enmEffOpSize, iEffSeg, GCPtrEffSrc);
    1035310366    IEM_MC_END();
    1035410367}
     
    1036810381    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); /* Note! Implicit fninit after the save, do not use FOR_READ here! */
    1036910382    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    10370     IEM_MC_CALL_CIMPL_3(iemCImpl_fnsave, enmEffOpSize, iEffSeg, GCPtrEffDst);
     10383    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_FPU, iemCImpl_fnsave, enmEffOpSize, iEffSeg, GCPtrEffDst);
    1037110384    IEM_MC_END();
    1037210385}
     
    1047710490            case 4: return FNIEMOP_CALL_1(iemOp_fucom_stN_st0,bRm);
    1047810491            case 5: return FNIEMOP_CALL_1(iemOp_fucomp_stN,  bRm);
    10479             case 6: return IEMOP_RAISE_INVALID_OPCODE();
    10480             case 7: return IEMOP_RAISE_INVALID_OPCODE();
     10492            case 6: IEMOP_RAISE_INVALID_OPCODE_RET();
     10493            case 7: IEMOP_RAISE_INVALID_OPCODE_RET();
    1048110494            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1048210495        }
     
    1049110504            case 3: return FNIEMOP_CALL_1(iemOp_fstp_m64r,   bRm);
    1049210505            case 4: return FNIEMOP_CALL_1(iemOp_frstor,      bRm);
    10493             case 5: return IEMOP_RAISE_INVALID_OPCODE();
     10506            case 5: IEMOP_RAISE_INVALID_OPCODE_RET();
    1049410507            case 6: return FNIEMOP_CALL_1(iemOp_fnsave,      bRm);
    1049510508            case 7: return FNIEMOP_CALL_1(iemOp_fnstsw,      bRm);
     
    1072310736            case 3: if (bRm == 0xd9)
    1072410737                        return FNIEMOP_CALL(iemOp_fcompp);
    10725                     return IEMOP_RAISE_INVALID_OPCODE();
     10738                    IEMOP_RAISE_INVALID_OPCODE_RET();
    1072610739            case 4: return FNIEMOP_CALL_1(iemOp_fsubrp_stN_st0, bRm);
    1072710740            case 5: return FNIEMOP_CALL_1(iemOp_fsubp_stN_st0, bRm);
     
    1079210805{
    1079310806    IEMOP_MNEMONIC(fucomip_st0_stN, "fucomip st0,stN");
    10794     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), iemAImpl_fcomi_r80_by_r80,
    10795                                    RT_BIT_32(31) /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
     10807    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS,
     10808                                iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), iemAImpl_fcomi_r80_by_r80,
     10809                                RT_BIT_32(31) /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
    1079610810}
    1079710811
     
    1080110815{
    1080210816    IEMOP_MNEMONIC(fcomip_st0_stN, "fcomip st0,stN");
    10803     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), iemAImpl_fcomi_r80_by_r80,
    10804                                    RT_BIT_32(31) /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
     10817    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS,
     10818                                iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), iemAImpl_fcomi_r80_by_r80,
     10819                                RT_BIT_32(31) /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
    1080510820}
    1080610821
     
    1109311108            case 4: if (bRm == 0xe0)
    1109411109                        return FNIEMOP_CALL(iemOp_fnstsw_ax);
    11095                     return IEMOP_RAISE_INVALID_OPCODE();
     11110                    IEMOP_RAISE_INVALID_OPCODE_RET();
    1109611111            case 5: return FNIEMOP_CALL_1(iemOp_fucomip_st0_stN, bRm);
    1109711112            case 6: return FNIEMOP_CALL_1(iemOp_fcomip_st0_stN,  bRm);
    11098             case 7: return IEMOP_RAISE_INVALID_OPCODE();
     11113            case 7: IEMOP_RAISE_INVALID_OPCODE_RET();
    1109911114            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1110011115        }
     
    1135911374    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1136011375    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11361     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_in, u8Imm, 1, 0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
     11376    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_in, u8Imm, 1, 0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
    1136211377}
    1136311378
     
    1136911384    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1137011385    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11371     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_in, u8Imm, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
    11372                                    0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
     11386    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_in, u8Imm, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
     11387                                0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
    1137311388}
    1137411389
     
    1138011395    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1138111396    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11382     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_out, u8Imm, 1, 0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
     11397    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_out, u8Imm, 1, 0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
    1138311398}
    1138411399
     
    1139011405    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1139111406    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11392     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_out, u8Imm, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
    11393                                    0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
     11407    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_out, u8Imm, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
     11408                                0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
    1139411409}
    1139511410
     
    1140711422        {
    1140811423            uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    11409             return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_call_rel_16, (int16_t)u16Imm);
     11424            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH, iemCImpl_call_rel_16, (int16_t)u16Imm);
    1141011425        }
    1141111426
     
    1141311428        {
    1141411429            uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
    11415             return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_call_rel_32, (int32_t)u32Imm);
     11430            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH, iemCImpl_call_rel_32, (int32_t)u32Imm);
    1141611431        }
    1141711432
     
    1141911434        {
    1142011435            uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
    11421             return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_call_rel_64, u64Imm);
     11436            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH, iemCImpl_call_rel_64, u64Imm);
    1142211437        }
    1142311438
     
    1147611491    uint16_t uSel;  IEM_OPCODE_GET_NEXT_U16(&uSel);
    1147711492    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11478     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_FarJmp, uSel, offSeg, pVCpu->iem.s.enmEffOpSize);
     11493    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     11494                                iemCImpl_FarJmp, uSel, offSeg, pVCpu->iem.s.enmEffOpSize);
    1147911495}
    1148011496
     
    1150111517    IEMOP_MNEMONIC(in_AL_DX, "in  AL,DX");
    1150211518    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11503     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_in_eAX_DX, 1, pVCpu->iem.s.enmEffAddrMode);
     11519    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_in_eAX_DX, 1, pVCpu->iem.s.enmEffAddrMode);
    1150411520}
    1150511521
     
    1151011526    IEMOP_MNEMONIC(in_eAX_DX, "in  eAX,DX");
    1151111527    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11512     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_in_eAX_DX, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
    11513                                    pVCpu->iem.s.enmEffAddrMode);
     11528    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT,
     11529                                iemCImpl_in_eAX_DX, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
     11530                                pVCpu->iem.s.enmEffAddrMode);
    1151411531}
    1151511532
     
    1152011537    IEMOP_MNEMONIC(out_DX_AL, "out DX,AL");
    1152111538    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11522     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_out_DX_eAX, 1, pVCpu->iem.s.enmEffAddrMode);
     11539    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_out_DX_eAX, 1, pVCpu->iem.s.enmEffAddrMode);
    1152311540}
    1152411541
     
    1152911546    IEMOP_MNEMONIC(out_DX_eAX, "out DX,eAX");
    1153011547    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11531     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_out_DX_eAX, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
    11532                                    pVCpu->iem.s.enmEffAddrMode);
     11548    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT,
     11549                                iemCImpl_out_DX_eAX, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
     11550                                pVCpu->iem.s.enmEffAddrMode);
    1153311551}
    1153411552
     
    1155911577    IEMOP_HLP_MIN_386();
    1156011578    /** @todo testcase! */
    11561     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_int, X86_XCPT_DB, IEMINT_INT1);
     11579    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     11580                                iemCImpl_int, X86_XCPT_DB, IEMINT_INT1);
    1156211581}
    1156311582
     
    1160811627    IEMOP_MNEMONIC(hlt, "hlt");
    1160911628    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11610     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_hlt);
     11629    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_END_TB | IEM_CIMPL_F_VMEXIT, iemCImpl_hlt);
    1161111630}
    1161211631
     
    1243312452    IEMOP_MNEMONIC(cli, "cli");
    1243412453    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12435     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_cli);
     12454    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, iemCImpl_cli);
    1243612455}
    1243712456
     
    1244112460    IEMOP_MNEMONIC(sti, "sti");
    1244212461    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12443     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_sti);
     12462    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, iemCImpl_sti);
    1244412463}
    1244512464
     
    1250812527            /** @todo is the eff-addr decoded? */
    1250912528            IEMOP_MNEMONIC(grp4_ud, "grp4-ud");
    12510             return IEMOP_RAISE_INVALID_OPCODE();
     12529            IEMOP_RAISE_INVALID_OPCODE_RET();
    1251112530    }
    1251212531}
     
    1254912568                IEM_MC_ARG(uint16_t, u16Target, 0);
    1255012569                IEM_MC_FETCH_GREG_U16(u16Target, IEM_GET_MODRM_RM(pVCpu, bRm));
    12551                 IEM_MC_CALL_CIMPL_1(iemCImpl_call_16, u16Target);
     12570                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH, iemCImpl_call_16, u16Target);
    1255212571                IEM_MC_END();
    1255312572                break;
     
    1255712576                IEM_MC_ARG(uint32_t, u32Target, 0);
    1255812577                IEM_MC_FETCH_GREG_U32(u32Target, IEM_GET_MODRM_RM(pVCpu, bRm));
    12559                 IEM_MC_CALL_CIMPL_1(iemCImpl_call_32, u32Target);
     12578                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH, iemCImpl_call_32, u32Target);
    1256012579                IEM_MC_END();
    1256112580                break;
     
    1256512584                IEM_MC_ARG(uint64_t, u64Target, 0);
    1256612585                IEM_MC_FETCH_GREG_U64(u64Target, IEM_GET_MODRM_RM(pVCpu, bRm));
    12567                 IEM_MC_CALL_CIMPL_1(iemCImpl_call_64, u64Target);
     12586                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH, iemCImpl_call_64, u64Target);
    1256812587                IEM_MC_END();
    1256912588                break;
     
    1258412603                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1258512604                IEM_MC_FETCH_MEM_U16(u16Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    12586                 IEM_MC_CALL_CIMPL_1(iemCImpl_call_16, u16Target);
     12605                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH, iemCImpl_call_16, u16Target);
    1258712606                IEM_MC_END();
    1258812607                break;
     
    1259512614                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1259612615                IEM_MC_FETCH_MEM_U32(u32Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    12597                 IEM_MC_CALL_CIMPL_1(iemCImpl_call_32, u32Target);
     12616                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH, iemCImpl_call_32, u32Target);
    1259812617                IEM_MC_END();
    1259912618                break;
     
    1260612625                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1260712626                IEM_MC_FETCH_MEM_U64(u64Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    12608                 IEM_MC_CALL_CIMPL_1(iemCImpl_call_64, u64Target);
     12627                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH, iemCImpl_call_64, u64Target);
    1260912628                IEM_MC_END();
    1261012629                break;
     
    1261512634}
    1261612635
    12617 FNIEMOP_DEF_2(iemOpHlp_Grp5_far_Ep, uint8_t, bRm, PFNIEMCIMPLFARBRANCH, pfnCImpl)
    12618 {
    12619     /* Registers? How?? */
    12620     if (RT_LIKELY(IEM_IS_MODRM_MEM_MODE(bRm)))
    12621     { /* likely */ }
    12622     else
    12623         return IEMOP_RAISE_INVALID_OPCODE(); /* callf eax is not legal */
    12624 
    12625     /* 64-bit mode: Default is 32-bit, but only intel respects a REX.W prefix. */
    12626     /** @todo what does VIA do? */
    12627     if (!IEM_IS_64BIT_CODE(pVCpu) || pVCpu->iem.s.enmEffOpSize != IEMMODE_64BIT || IEM_IS_GUEST_CPU_INTEL(pVCpu))
    12628     { /* likely */ }
    12629     else
    12630         pVCpu->iem.s.enmEffOpSize = IEMMODE_32BIT;
    12631 
    12632     /* Far pointer loaded from memory. */
    12633     switch (pVCpu->iem.s.enmEffOpSize)
    12634     {
    12635         case IEMMODE_16BIT:
    12636             IEM_MC_BEGIN(3, 1);
    12637             IEM_MC_ARG(uint16_t,        u16Sel,                         0);
    12638             IEM_MC_ARG(uint16_t,        offSeg,                         1);
    12639             IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize, IEMMODE_16BIT,    2);
    12640             IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    12641             IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    12642             IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12643             IEM_MC_FETCH_MEM_U16(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    12644             IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 2);
    12645             IEM_MC_CALL_CIMPL_3(pfnCImpl, u16Sel, offSeg, enmEffOpSize);
    12646             IEM_MC_END();
    12647             break;
    12648 
    12649         case IEMMODE_32BIT:
    12650             IEM_MC_BEGIN(3, 1);
    12651             IEM_MC_ARG(uint16_t,        u16Sel,                         0);
    12652             IEM_MC_ARG(uint32_t,        offSeg,                         1);
    12653             IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize, IEMMODE_32BIT,    2);
    12654             IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    12655             IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    12656             IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12657             IEM_MC_FETCH_MEM_U32(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    12658             IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 4);
    12659             IEM_MC_CALL_CIMPL_3(pfnCImpl, u16Sel, offSeg, enmEffOpSize);
    12660             IEM_MC_END();
    12661             break;
    12662 
    12663         case IEMMODE_64BIT:
    12664             Assert(!IEM_IS_GUEST_CPU_AMD(pVCpu));
    12665             IEM_MC_BEGIN(3, 1);
    12666             IEM_MC_ARG(uint16_t,        u16Sel,                         0);
    12667             IEM_MC_ARG(uint64_t,        offSeg,                         1);
    12668             IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize, IEMMODE_64BIT,    2);
    12669             IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    12670             IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    12671             IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12672             IEM_MC_FETCH_MEM_U64(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    12673             IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 8);
    12674             IEM_MC_CALL_CIMPL_3(pfnCImpl, u16Sel, offSeg, enmEffOpSize);
    12675             IEM_MC_END();
    12676             break;
    12677 
    12678         IEM_NOT_REACHED_DEFAULT_CASE_RET();
    12679     }
    12680 }
     12636#define IEMOP_BODY_GRP5_FAR_EP(a_bRm, a_fnCImpl) \
     12637    /* Registers? How?? */ \
     12638    if (RT_LIKELY(IEM_IS_MODRM_MEM_MODE(a_bRm))) \
     12639    { /* likely */ } \
     12640    else \
     12641        IEMOP_RAISE_INVALID_OPCODE_RET(); /* callf eax is not legal */ \
     12642    \
     12643    /* 64-bit mode: Default is 32-bit, but only intel respects a REX.W prefix. */ \
     12644    /** @todo what does VIA do? */ \
     12645    if (!IEM_IS_64BIT_CODE(pVCpu) || pVCpu->iem.s.enmEffOpSize != IEMMODE_64BIT || IEM_IS_GUEST_CPU_INTEL(pVCpu)) \
     12646    { /* likely */ } \
     12647    else \
     12648        pVCpu->iem.s.enmEffOpSize = IEMMODE_32BIT; \
     12649    \
     12650    /* Far pointer loaded from memory. */ \
     12651    switch (pVCpu->iem.s.enmEffOpSize) \
     12652    { \
     12653        case IEMMODE_16BIT: \
     12654            IEM_MC_BEGIN(3, 1); \
     12655            IEM_MC_ARG(uint16_t,        u16Sel,                         0); \
     12656            IEM_MC_ARG(uint16_t,        offSeg,                         1); \
     12657            IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize, IEMMODE_16BIT,    2); \
     12658            IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \
     12659            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, a_bRm, 0); \
     12660            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     12661            IEM_MC_FETCH_MEM_U16(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
     12662            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 2); \
     12663            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, \
     12664                                a_fnCImpl, u16Sel, offSeg, enmEffOpSize); \
     12665            IEM_MC_END(); \
     12666            break; \
     12667        \
     12668        case IEMMODE_32BIT: \
     12669            IEM_MC_BEGIN(3, 1); \
     12670            IEM_MC_ARG(uint16_t,        u16Sel,                         0); \
     12671            IEM_MC_ARG(uint32_t,        offSeg,                         1); \
     12672            IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize, IEMMODE_32BIT,    2); \
     12673            IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \
     12674            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, a_bRm, 0); \
     12675            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     12676            IEM_MC_FETCH_MEM_U32(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
     12677            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 4); \
     12678            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, \
     12679                                a_fnCImpl, u16Sel, offSeg, enmEffOpSize); \
     12680            IEM_MC_END(); \
     12681            break; \
     12682        \
     12683        case IEMMODE_64BIT: \
     12684            Assert(!IEM_IS_GUEST_CPU_AMD(pVCpu)); \
     12685            IEM_MC_BEGIN(3, 1); \
     12686            IEM_MC_ARG(uint16_t,        u16Sel,                         0); \
     12687            IEM_MC_ARG(uint64_t,        offSeg,                         1); \
     12688            IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize, IEMMODE_64BIT,    2); \
     12689            IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); \
     12690            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, a_bRm, 0); \
     12691            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     12692            IEM_MC_FETCH_MEM_U64(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
     12693            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 8); \
     12694            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_MODE /* no gates */, \
     12695                                a_fnCImpl, u16Sel, offSeg, enmEffOpSize); \
     12696            IEM_MC_END(); \
     12697            break; \
     12698        \
     12699        IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
     12700    } do {} while (0)
    1268112701
    1268212702
     
    1268812708{
    1268912709    IEMOP_MNEMONIC(callf_Ep, "callf Ep");
    12690     return FNIEMOP_CALL_2(iemOpHlp_Grp5_far_Ep, bRm, iemCImpl_callf);
     12710    IEMOP_BODY_GRP5_FAR_EP(bRm, iemCImpl_callf);
    1269112711}
    1269212712
     
    1278512805{
    1278612806    IEMOP_MNEMONIC(jmpf_Ep, "jmpf Ep");
    12787     return FNIEMOP_CALL_2(iemOpHlp_Grp5_far_Ep, bRm, iemCImpl_FarJmp);
     12807    IEMOP_BODY_GRP5_FAR_EP(bRm, iemCImpl_FarJmp);
    1278812808}
    1278912809
     
    1287012890        case 7:
    1287112891            IEMOP_MNEMONIC(grp5_ud, "grp5-ud");
    12872             return IEMOP_RAISE_INVALID_OPCODE();
     12892            IEMOP_RAISE_INVALID_OPCODE_RET();
    1287312893    }
    1287412894    AssertFailedReturn(VERR_IEM_IPE_3);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThreadedRecompiler.cpp

    r100061 r100072  
    243243 * IEMOP_RAISE_INVALID_OPCODE and their users.
    244244 */
    245 #undef IEM_MC_DEFER_TO_CIMPL_0
    246 #define IEM_MC_DEFER_TO_CIMPL_0(a_pfnCImpl) iemThreadedRecompilerMcDeferToCImpl0(pVCpu, a_pfnCImpl)
     245#undef IEM_MC_DEFER_TO_CIMPL_0_RET
     246#define IEM_MC_DEFER_TO_CIMPL_0_RET(a_fFlags, a_pfnCImpl) return iemThreadedRecompilerMcDeferToCImpl0(pVCpu, a_pfnCImpl)
    247247
    248248typedef IEM_CIMPL_DECL_TYPE_0(FNIEMCIMPL0);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f38.cpp.h

    r99342 r100072  
    10661066     */
    10671067    else
    1068         return IEMOP_RAISE_INVALID_OPCODE();
     1068        IEMOP_RAISE_INVALID_OPCODE_RET();
    10691069}
    10701070
     
    13261326            IEM_MC_CALC_RM_EFF_ADDR(GCPtrInveptDesc, bRm, 0);
    13271327            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1328             IEM_MC_CALL_CIMPL_3(iemCImpl_invept, iEffSeg, GCPtrInveptDesc, uInveptType);
     1328            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS,
     1329                                iemCImpl_invept, iEffSeg, GCPtrInveptDesc, uInveptType);
    13291330            IEM_MC_END();
    13301331        }
     
    13381339            IEM_MC_CALC_RM_EFF_ADDR(GCPtrInveptDesc, bRm, 0);
    13391340            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1340             IEM_MC_CALL_CIMPL_3(iemCImpl_invept, iEffSeg, GCPtrInveptDesc, uInveptType);
     1341            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS,
     1342                                iemCImpl_invept, iEffSeg, GCPtrInveptDesc, uInveptType);
    13411343            IEM_MC_END();
    13421344        }
    13431345    }
    13441346    Log(("iemOp_invept_Gy_Mdq: invalid encoding -> #UD\n"));
    1345     return IEMOP_RAISE_INVALID_OPCODE();
     1347    IEMOP_RAISE_INVALID_OPCODE_RET();
    13461348}
    13471349#else
     
    13701372            IEM_MC_CALC_RM_EFF_ADDR(GCPtrInvvpidDesc, bRm, 0);
    13711373            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1372             IEM_MC_CALL_CIMPL_3(iemCImpl_invvpid, iEffSeg, GCPtrInvvpidDesc, uInvvpidType);
     1374            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS,
     1375                                iemCImpl_invvpid, iEffSeg, GCPtrInvvpidDesc, uInvvpidType);
    13731376            IEM_MC_END();
    13741377        }
     
    13821385            IEM_MC_CALC_RM_EFF_ADDR(GCPtrInvvpidDesc, bRm, 0);
    13831386            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1384             IEM_MC_CALL_CIMPL_3(iemCImpl_invvpid, iEffSeg, GCPtrInvvpidDesc, uInvvpidType);
     1387            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS,
     1388                                iemCImpl_invvpid, iEffSeg, GCPtrInvvpidDesc, uInvvpidType);
    13851389            IEM_MC_END();
    13861390        }
    13871391    }
    13881392    Log(("iemOp_invvpid_Gy_Mdq: invalid encoding -> #UD\n"));
    1389     return IEMOP_RAISE_INVALID_OPCODE();
     1393    IEMOP_RAISE_INVALID_OPCODE_RET();
    13901394}
    13911395#else
     
    14111415            IEM_MC_CALC_RM_EFF_ADDR(GCPtrInvpcidDesc, bRm, 0);
    14121416            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1413             IEM_MC_CALL_CIMPL_3(iemCImpl_invpcid, iEffSeg, GCPtrInvpcidDesc, uInvpcidType);
     1417            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT, iemCImpl_invpcid, iEffSeg, GCPtrInvpcidDesc, uInvpcidType);
    14141418            IEM_MC_END();
    14151419        }
     
    14231427            IEM_MC_CALC_RM_EFF_ADDR(GCPtrInvpcidDesc, bRm, 0);
    14241428            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1425             IEM_MC_CALL_CIMPL_3(iemCImpl_invpcid, iEffSeg, GCPtrInvpcidDesc, uInvpcidType);
     1429            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT, iemCImpl_invpcid, iEffSeg, GCPtrInvpcidDesc, uInvpcidType);
    14261430            IEM_MC_END();
    14271431        }
    14281432    }
    14291433    Log(("iemOp_invpcid_Gy_Mdq: invalid encoding -> #UD\n"));
    1430     return IEMOP_RAISE_INVALID_OPCODE();
     1434    IEMOP_RAISE_INVALID_OPCODE_RET();
    14311435}
    14321436
     
    17791783    {
    17801784        /* Reg/reg not supported. */
    1781         return IEMOP_RAISE_INVALID_OPCODE();
     1785        IEMOP_RAISE_INVALID_OPCODE_RET();
    17821786    }
    17831787}
     
    18951899    {
    18961900        /* Reg/reg not supported. */
    1897         return IEMOP_RAISE_INVALID_OPCODE();
     1901        IEMOP_RAISE_INVALID_OPCODE_RET();
    18981902    }
    18991903}
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r100052 r100072  
    12001200    {
    12011201        IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    1202         return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_sldt_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
     1202        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_sldt_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
    12031203    }
    12041204
     
    12101210    IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    12111211    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1212     IEM_MC_CALL_CIMPL_2(iemCImpl_sldt_mem, iEffSeg, GCPtrEffDst);
     1212    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT, iemCImpl_sldt_mem, iEffSeg, GCPtrEffDst);
    12131213    IEM_MC_END();
    12141214}
     
    12261226    {
    12271227        IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    1228         return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_str_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
     1228        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_str_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
    12291229    }
    12301230
     
    12361236    IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    12371237    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1238     IEM_MC_CALL_CIMPL_2(iemCImpl_str_mem, iEffSeg, GCPtrEffDst);
     1238    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT, iemCImpl_str_mem, iEffSeg, GCPtrEffDst);
    12391239    IEM_MC_END();
    12401240}
     
    12541254        IEM_MC_ARG(uint16_t, u16Sel, 0);
    12551255        IEM_MC_FETCH_GREG_U16(u16Sel, IEM_GET_MODRM_RM(pVCpu, bRm));
    1256         IEM_MC_CALL_CIMPL_1(iemCImpl_lldt, u16Sel);
     1256        IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_VMEXIT, iemCImpl_lldt, u16Sel);
    12571257        IEM_MC_END();
    12581258    }
     
    12661266        IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO(); /** @todo test order */
    12671267        IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1268         IEM_MC_CALL_CIMPL_1(iemCImpl_lldt, u16Sel);
     1268        IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_VMEXIT, iemCImpl_lldt, u16Sel);
    12691269        IEM_MC_END();
    12701270    }
     
    12851285        IEM_MC_ARG(uint16_t, u16Sel, 0);
    12861286        IEM_MC_FETCH_GREG_U16(u16Sel, IEM_GET_MODRM_RM(pVCpu, bRm));
    1287         IEM_MC_CALL_CIMPL_1(iemCImpl_ltr, u16Sel);
     1287        IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_VMEXIT, iemCImpl_ltr, u16Sel);
    12881288        IEM_MC_END();
    12891289    }
     
    12971297        IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO(); /** @todo test order */
    12981298        IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1299         IEM_MC_CALL_CIMPL_1(iemCImpl_ltr, u16Sel);
     1299        IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_VMEXIT, iemCImpl_ltr, u16Sel);
    13001300        IEM_MC_END();
    13011301    }
     
    13161316        IEM_MC_ARG_CONST(bool,  fWriteArg, fWrite, 1);
    13171317        IEM_MC_FETCH_GREG_U16(u16Sel, IEM_GET_MODRM_RM(pVCpu, bRm));
    1318         IEM_MC_CALL_CIMPL_2(iemCImpl_VerX, u16Sel, fWriteArg);
     1318        IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_VerX, u16Sel, fWriteArg);
    13191319        IEM_MC_END();
    13201320    }
     
    13281328        IEMOP_HLP_DECODED_NL_1(fWrite ? OP_VERW : OP_VERR, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    13291329        IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1330         IEM_MC_CALL_CIMPL_2(iemCImpl_VerX, u16Sel, fWriteArg);
     1330        IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_VerX, u16Sel, fWriteArg);
    13311331        IEM_MC_END();
    13321332    }
     
    13871387    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    13881388    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1389     IEM_MC_CALL_CIMPL_2(iemCImpl_sgdt, iEffSeg, GCPtrEffSrc);
     1389    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT, iemCImpl_sgdt, iEffSeg, GCPtrEffSrc);
    13901390    IEM_MC_END();
    13911391}
     
    14021402             hypercall isn't handled by GIM or HMSvm will raise an #UD.
    14031403             (NEM/win makes ASSUMPTIONS about this behavior.)  */
    1404     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_vmcall);
     1404    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, iemCImpl_vmcall);
    14051405}
    14061406
     
    14141414    IEMOP_HLP_VMX_INSTR("vmlaunch", kVmxVDiag_Vmentry);
    14151415    IEMOP_HLP_DONE_DECODING();
    1416     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_vmlaunch);
     1416    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     1417                                iemCImpl_vmlaunch);
    14171418}
    14181419#else
     
    14201421{
    14211422    IEMOP_BITCH_ABOUT_STUB();
    1422     return IEMOP_RAISE_INVALID_OPCODE();
     1423    IEMOP_RAISE_INVALID_OPCODE_RET();
    14231424}
    14241425#endif
     
    14331434    IEMOP_HLP_VMX_INSTR("vmresume", kVmxVDiag_Vmentry);
    14341435    IEMOP_HLP_DONE_DECODING();
    1435     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_vmresume);
     1436    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     1437                                iemCImpl_vmresume);
    14361438}
    14371439#else
     
    14391441{
    14401442    IEMOP_BITCH_ABOUT_STUB();
    1441     return IEMOP_RAISE_INVALID_OPCODE();
     1443    IEMOP_RAISE_INVALID_OPCODE_RET();
    14421444}
    14431445#endif
     
    14521454    IEMOP_HLP_VMX_INSTR("vmxoff", kVmxVDiag_Vmxoff);
    14531455    IEMOP_HLP_DONE_DECODING();
    1454     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_vmxoff);
     1456    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmxoff);
    14551457}
    14561458#else
     
    14581460{
    14591461    IEMOP_BITCH_ABOUT_STUB();
    1460     return IEMOP_RAISE_INVALID_OPCODE();
     1462    IEMOP_RAISE_INVALID_OPCODE_RET();
    14611463}
    14621464#endif
     
    14751477    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    14761478    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1477     IEM_MC_CALL_CIMPL_2(iemCImpl_sidt, iEffSeg, GCPtrEffSrc);
     1479    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT, iemCImpl_sidt, iEffSeg, GCPtrEffSrc);
    14781480    IEM_MC_END();
    14791481}
     
    14851487    IEMOP_MNEMONIC(monitor, "monitor");
    14861488    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo Verify that monitor is allergic to lock prefixes. */
    1487     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_monitor, pVCpu->iem.s.iEffSeg);
     1489    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_monitor, pVCpu->iem.s.iEffSeg);
    14881490}
    14891491
     
    14941496    IEMOP_MNEMONIC(mwait, "mwait"); /** @todo Verify that mwait is allergic to lock prefixes. */
    14951497    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1496     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_mwait);
     1498    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_END_TB | IEM_CIMPL_F_VMEXIT, iemCImpl_mwait);
    14971499}
    14981500
     
    15101512    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    15111513    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1512     IEM_MC_CALL_CIMPL_3(iemCImpl_lgdt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
     1514    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT, iemCImpl_lgdt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
    15131515    IEM_MC_END();
    15141516}
     
    15251527         *        IEMOP_HLP_DONE_DECODING_NO_SIZE_OP_REPZ_OR_REPNZ_PREFIXES here. */
    15261528        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
    1527         return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_xgetbv);
    1528     }
    1529     return IEMOP_RAISE_INVALID_OPCODE();
     1529        IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_xgetbv);
     1530    }
     1531    IEMOP_RAISE_INVALID_OPCODE_RET();
    15301532}
    15311533
     
    15411543         *        IEMOP_HLP_DONE_DECODING_NO_SIZE_OP_REPZ_OR_REPNZ_PREFIXES here. */
    15421544        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
    1543         return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_xsetbv);
    1544     }
    1545     return IEMOP_RAISE_INVALID_OPCODE();
     1545        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_xsetbv);
     1546    }
     1547    IEMOP_RAISE_INVALID_OPCODE_RET();
    15461548}
    15471549
     
    15591561    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    15601562    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1561     IEM_MC_CALL_CIMPL_3(iemCImpl_lidt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
     1563    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT, iemCImpl_lidt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
    15621564    IEM_MC_END();
    15631565}
     
    15701572    IEMOP_MNEMONIC(vmrun, "vmrun");
    15711573    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1572     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_vmrun);
     1574    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     1575                                iemCImpl_vmrun);
    15731576}
    15741577#else
     
    15861589             hypercall isn't handled by GIM or HMSvm will raise an #UD.
    15871590             (NEM/win makes ASSUMPTIONS about this behavior.) */
    1588     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_vmmcall);
     1591    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmmcall);
    15891592}
    15901593
     
    15951598    IEMOP_MNEMONIC(vmload, "vmload");
    15961599    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1597     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_vmload);
     1600    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmload);
    15981601}
    15991602#else
     
    16081611    IEMOP_MNEMONIC(vmsave, "vmsave");
    16091612    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1610     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_vmsave);
     1613    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmsave);
    16111614}
    16121615#else
     
    16211624    IEMOP_MNEMONIC(stgi, "stgi");
    16221625    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1623     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stgi);
     1626    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_stgi);
    16241627}
    16251628#else
     
    16341637    IEMOP_MNEMONIC(clgi, "clgi");
    16351638    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1636     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_clgi);
     1639    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_clgi);
    16371640}
    16381641#else
     
    16471650    IEMOP_MNEMONIC(invlpga, "invlpga");
    16481651    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1649     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_invlpga);
     1652    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_invlpga);
    16501653}
    16511654#else
     
    16601663    IEMOP_MNEMONIC(skinit, "skinit");
    16611664    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1662     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_skinit);
     1665    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_skinit);
    16631666}
    16641667#else
     
    16751678    {
    16761679        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1677         return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_smsw_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
     1680        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_smsw_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
    16781681    }
    16791682
     
    16851688    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    16861689    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1687     IEM_MC_CALL_CIMPL_2(iemCImpl_smsw_mem, iEffSeg, GCPtrEffDst);
     1690    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT, iemCImpl_smsw_mem, iEffSeg, GCPtrEffDst);
    16881691    IEM_MC_END();
    16891692}
     
    17041707        IEM_MC_ARG_CONST(RTGCPTR,  GCPtrEffDst, NIL_RTGCPTR, 1);
    17051708        IEM_MC_FETCH_GREG_U16(u16Tmp, IEM_GET_MODRM_RM(pVCpu, bRm));
    1706         IEM_MC_CALL_CIMPL_2(iemCImpl_lmsw, u16Tmp, GCPtrEffDst);
     1709        IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT, iemCImpl_lmsw, u16Tmp, GCPtrEffDst);
    17071710        IEM_MC_END();
    17081711    }
     
    17151718        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    17161719        IEM_MC_FETCH_MEM_U16(u16Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1717         IEM_MC_CALL_CIMPL_2(iemCImpl_lmsw, u16Tmp, GCPtrEffDst);
     1720        IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT, iemCImpl_lmsw, u16Tmp, GCPtrEffDst);
    17181721        IEM_MC_END();
    17191722    }
     
    17301733    IEM_MC_ARG(RTGCPTR, GCPtrEffDst, 0);
    17311734    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    1732     IEM_MC_CALL_CIMPL_1(iemCImpl_invlpg, GCPtrEffDst);
     1735    IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_VMEXIT, iemCImpl_invlpg, GCPtrEffDst);
    17331736    IEM_MC_END();
    17341737}
     
    17411744    IEMOP_HLP_ONLY_64BIT();
    17421745    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1743     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_swapgs);
     1746    IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_swapgs);
    17441747}
    17451748
     
    17501753    IEMOP_MNEMONIC(rdtscp, "rdtscp");
    17511754    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1752     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rdtscp);
     1755    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_rdtscp);
    17531756}
    17541757
     
    17871790                case 4: return FNIEMOP_CALL(iemOp_Grp7_vmxoff);
    17881791            }
    1789             return IEMOP_RAISE_INVALID_OPCODE();
     1792            IEMOP_RAISE_INVALID_OPCODE_RET();
    17901793
    17911794        case 1:
     
    17951798                case 1: return FNIEMOP_CALL(iemOp_Grp7_mwait);
    17961799            }
    1797             return IEMOP_RAISE_INVALID_OPCODE();
     1800            IEMOP_RAISE_INVALID_OPCODE_RET();
    17981801
    17991802        case 2:
     
    18031806                case 1: return FNIEMOP_CALL(iemOp_Grp7_xsetbv);
    18041807            }
    1805             return IEMOP_RAISE_INVALID_OPCODE();
     1808            IEMOP_RAISE_INVALID_OPCODE_RET();
    18061809
    18071810        case 3:
     
    18231826
    18241827        case 5:
    1825             return IEMOP_RAISE_INVALID_OPCODE();
     1828            IEMOP_RAISE_INVALID_OPCODE_RET();
    18261829
    18271830        case 6:
     
    18341837                case 1: return FNIEMOP_CALL(iemOp_Grp7_rdtscp);
    18351838            }
    1836             return IEMOP_RAISE_INVALID_OPCODE();
     1839            IEMOP_RAISE_INVALID_OPCODE_RET();
    18371840
    18381841        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    18601863                IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
    18611864                IEM_MC_FETCH_GREG_U16(u16Sel, IEM_GET_MODRM_RM(pVCpu, bRm));
    1862                 IEM_MC_CALL_CIMPL_3(iemCImpl_LarLsl_u16, pu16Dst, u16Sel, fIsLarArg);
     1865                IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_LarLsl_u16, pu16Dst, u16Sel, fIsLarArg);
    18631866
    18641867                IEM_MC_END();
     
    18751878                IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
    18761879                IEM_MC_FETCH_GREG_U16(u16Sel, IEM_GET_MODRM_RM(pVCpu, bRm));
    1877                 IEM_MC_CALL_CIMPL_3(iemCImpl_LarLsl_u64, pu64Dst, u16Sel, fIsLarArg);
     1880                IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_LarLsl_u64, pu64Dst, u16Sel, fIsLarArg);
    18781881
    18791882                IEM_MC_END();
     
    19001903                IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    19011904                IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
    1902                 IEM_MC_CALL_CIMPL_3(iemCImpl_LarLsl_u16, pu16Dst, u16Sel, fIsLarArg);
     1905                IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_LarLsl_u16, pu16Dst, u16Sel, fIsLarArg);
    19031906
    19041907                IEM_MC_END();
     
    19201923                IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    19211924                IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
    1922                 IEM_MC_CALL_CIMPL_3(iemCImpl_LarLsl_u64, pu64Dst, u16Sel, fIsLarArg);
     1925                IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_LarLsl_u64, pu64Dst, u16Sel, fIsLarArg);
    19231926
    19241927                IEM_MC_END();
     
    19531956    IEMOP_MNEMONIC(syscall, "syscall"); /** @todo 286 LOADALL   */
    19541957    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1955     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_syscall);
     1958    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_END_TB,
     1959                                iemCImpl_syscall);
    19561960}
    19571961
     
    19621966    IEMOP_MNEMONIC(clts, "clts");
    19631967    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1964     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_clts);
     1968    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_clts);
    19651969}
    19661970
     
    19711975    IEMOP_MNEMONIC(sysret, "sysret");  /** @todo 386 LOADALL   */
    19721976    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1973     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_sysret, pVCpu->iem.s.enmEffOpSize);
     1977    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_END_TB,
     1978                                iemCImpl_sysret, pVCpu->iem.s.enmEffOpSize);
    19741979}
    19751980
     
    19811986    IEMOP_HLP_MIN_486();
    19821987    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1983     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_invd);
     1988    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_invd);
    19841989}
    19851990
     
    19911996    IEMOP_HLP_MIN_486();
    19921997    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1993     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_wbinvd);
     1998    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_wbinvd);
    19941999}
    19952000
     
    19992004{
    20002005    IEMOP_MNEMONIC(ud2, "ud2");
    2001     return IEMOP_RAISE_INVALID_OPCODE();
     2006    IEMOP_RAISE_INVALID_OPCODE_RET();
    20022007}
    20032008
     
    20092014    {
    20102015        IEMOP_MNEMONIC(GrpPNotSupported, "GrpP");
    2011         return IEMOP_RAISE_INVALID_OPCODE();
     2016        IEMOP_RAISE_INVALID_OPCODE_RET();
    20122017    }
    20132018
     
    20162021    {
    20172022        IEMOP_MNEMONIC(GrpPInvalid, "GrpP");
    2018         return IEMOP_RAISE_INVALID_OPCODE();
     2023        IEMOP_RAISE_INVALID_OPCODE_RET();
    20192024    }
    20202025
     
    20652070    {
    20662071        IEMOP_MNEMONIC(Inv3Dnow, "3Dnow");
    2067         return IEMOP_RAISE_INVALID_OPCODE();
     2072        IEMOP_RAISE_INVALID_OPCODE_RET();
    20682073    }
    20692074
     
    25992604     */
    26002605    else
    2601         return IEMOP_RAISE_INVALID_OPCODE();
     2606        IEMOP_RAISE_INVALID_OPCODE_RET();
    26022607}
    26032608
     
    27632768     */
    27642769    else
    2765         return IEMOP_RAISE_INVALID_OPCODE();
     2770        IEMOP_RAISE_INVALID_OPCODE_RET();
    27662771}
    27672772
     
    28102815     */
    28112816    else
    2812         return IEMOP_RAISE_INVALID_OPCODE();
     2817        IEMOP_RAISE_INVALID_OPCODE_RET();
    28132818}
    28142819
     
    30173022     */
    30183023    else
    3019         return IEMOP_RAISE_INVALID_OPCODE();
     3024        IEMOP_RAISE_INVALID_OPCODE_RET();
    30203025}
    30213026
     
    31363141     */
    31373142    else
    3138         return IEMOP_RAISE_INVALID_OPCODE();
     3143        IEMOP_RAISE_INVALID_OPCODE_RET();
    31393144}
    31403145
     
    31843189     */
    31853190    else
    3186         return IEMOP_RAISE_INVALID_OPCODE();
     3191        IEMOP_RAISE_INVALID_OPCODE_RET();
    31873192}
    31883193
     
    32393244    }
    32403245    else
    3241         return IEMOP_RAISE_INVALID_OPCODE();
     3246        IEMOP_RAISE_INVALID_OPCODE_RET();
    32423247}
    32433248
     
    32863291        /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
    32873292        if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMovCr8In32Bit)
    3288             return IEMOP_RAISE_INVALID_OPCODE(); /* #UD takes precedence over #GP(), see test. */
     3293            IEMOP_RAISE_INVALID_OPCODE_RET(); /* #UD takes precedence over #GP(), see test. */
    32893294        iCrReg |= 8;
    32903295    }
     
    32943299            break;
    32953300        default:
    3296             return IEMOP_RAISE_INVALID_OPCODE();
     3301            IEMOP_RAISE_INVALID_OPCODE_RET();
    32973302    }
    32983303    IEMOP_HLP_DONE_DECODING();
    32993304
    3300     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Rd_Cd, IEM_GET_MODRM_RM(pVCpu, bRm), iCrReg);
     3305    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_mov_Rd_Cd, IEM_GET_MODRM_RM(pVCpu, bRm), iCrReg);
    33013306}
    33023307
     
    33103315    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    33113316    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX_R)
    3312         return IEMOP_RAISE_INVALID_OPCODE();
    3313     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Rd_Dd,
    3314                                    IEM_GET_MODRM_RM(pVCpu, bRm),
    3315                                    IEM_GET_MODRM_REG_8(bRm));
     3317        IEMOP_RAISE_INVALID_OPCODE_RET();
     3318    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_mov_Rd_Dd, IEM_GET_MODRM_RM(pVCpu, bRm), IEM_GET_MODRM_REG_8(bRm));
    33163319}
    33173320
     
    33343337        /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
    33353338        if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMovCr8In32Bit)
    3336             return IEMOP_RAISE_INVALID_OPCODE(); /* #UD takes precedence over #GP(), see test. */
     3339            IEMOP_RAISE_INVALID_OPCODE_RET(); /* #UD takes precedence over #GP(), see test. */
    33373340        iCrReg |= 8;
    33383341    }
     
    33423345            break;
    33433346        default:
    3344             return IEMOP_RAISE_INVALID_OPCODE();
     3347            IEMOP_RAISE_INVALID_OPCODE_RET();
    33453348    }
    33463349    IEMOP_HLP_DONE_DECODING();
    33473350
    3348     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Cd_Rd, iCrReg, IEM_GET_MODRM_RM(pVCpu, bRm));
     3351    if (iCrReg & (2 | 8))
     3352        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT,
     3353                                    iemCImpl_mov_Cd_Rd, iCrReg, IEM_GET_MODRM_RM(pVCpu, bRm));
     3354    else
     3355        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT,
     3356                                    iemCImpl_mov_Cd_Rd, iCrReg, IEM_GET_MODRM_RM(pVCpu, bRm));
    33493357}
    33503358
     
    33583366    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    33593367    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX_R)
    3360         return IEMOP_RAISE_INVALID_OPCODE();
    3361     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Dd_Rd,
    3362                                    IEM_GET_MODRM_REG_8(bRm),
    3363                                    IEM_GET_MODRM_RM(pVCpu, bRm));
     3368        IEMOP_RAISE_INVALID_OPCODE_RET();
     3369    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_mov_Dd_Rd, IEM_GET_MODRM_REG_8(bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    33643370}
    33653371
     
    33733379    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    33743380    if (RT_LIKELY(IEM_GET_TARGET_CPU(pVCpu) >= IEMTARGETCPU_PENTIUM))
    3375         return IEMOP_RAISE_INVALID_OPCODE();
    3376     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Rd_Td,
    3377                                    IEM_GET_MODRM_RM(pVCpu, bRm),
    3378                                    IEM_GET_MODRM_REG_8(bRm));
     3381        IEMOP_RAISE_INVALID_OPCODE_RET();
     3382    IEM_MC_DEFER_TO_CIMPL_2_RET(0, iemCImpl_mov_Rd_Td, IEM_GET_MODRM_RM(pVCpu, bRm), IEM_GET_MODRM_REG_8(bRm));
    33793383}
    33803384
     
    33883392    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    33893393    if (RT_LIKELY(IEM_GET_TARGET_CPU(pVCpu) >= IEMTARGETCPU_PENTIUM))
    3390         return IEMOP_RAISE_INVALID_OPCODE();
    3391     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Td_Rd,
    3392                                    IEM_GET_MODRM_REG_8(bRm),
    3393                                    IEM_GET_MODRM_RM(pVCpu, bRm));
     3394        IEMOP_RAISE_INVALID_OPCODE_RET();
     3395    IEM_MC_DEFER_TO_CIMPL_2_RET(0, iemCImpl_mov_Td_Rd, IEM_GET_MODRM_REG_8(bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    33943396}
    33953397
     
    40254027    /* The register, register encoding is invalid. */
    40264028    else
    4027         return IEMOP_RAISE_INVALID_OPCODE();
     4029        IEMOP_RAISE_INVALID_OPCODE_RET();
    40284030}
    40294031
     
    40644066    /* The register, register encoding is invalid. */
    40654067    else
    4066         return IEMOP_RAISE_INVALID_OPCODE();
     4068        IEMOP_RAISE_INVALID_OPCODE_RET();
    40674069}
    40684070/*  Opcode 0xf3 0x0f 0x2b - invalid */
     
    51365138    IEMOP_MNEMONIC(wrmsr, "wrmsr");
    51375139    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5138     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_wrmsr);
     5140    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_wrmsr);
    51395141}
    51405142
     
    51455147    IEMOP_MNEMONIC(rdtsc, "rdtsc");
    51465148    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5147     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rdtsc);
     5149    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_rdtsc);
    51485150}
    51495151
     
    51545156    IEMOP_MNEMONIC(rdmsr, "rdmsr");
    51555157    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5156     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rdmsr);
     5158    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_rdmsr);
    51575159}
    51585160
     
    51635165    IEMOP_MNEMONIC(rdpmc, "rdpmc");
    51645166    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5165     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rdpmc);
     5167    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_rdpmc);
    51665168}
    51675169
     
    51725174    IEMOP_MNEMONIC0(FIXED, SYSENTER, sysenter, DISOPTYPE_CONTROLFLOW | DISOPTYPE_UNCOND_CONTROLFLOW, 0);
    51735175    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5174     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_sysenter);
     5176    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB,
     5177                                iemCImpl_sysenter);
    51755178}
    51765179
     
    51805183    IEMOP_MNEMONIC0(FIXED, SYSEXIT, sysexit, DISOPTYPE_CONTROLFLOW | DISOPTYPE_UNCOND_CONTROLFLOW, 0);
    51815184    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5182     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_sysexit, pVCpu->iem.s.enmEffOpSize);
     5185    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB,
     5186                                iemCImpl_sysexit, pVCpu->iem.s.enmEffOpSize);
    51835187}
    51845188
     
    54705474    /* No memory operand. */
    54715475    else
    5472         return IEMOP_RAISE_INVALID_OPCODE();
     5476        IEMOP_RAISE_INVALID_OPCODE_RET();
    54735477}
    54745478
     
    54995503    /* No memory operand. */
    55005504    else
    5501         return IEMOP_RAISE_INVALID_OPCODE();
     5505        IEMOP_RAISE_INVALID_OPCODE_RET();
    55025506
    55035507}
     
    71007104            IEM_MC_FETCH_GREG_U64(u64Enc, IEM_GET_MODRM_REG(pVCpu, bRm));
    71017105            IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    7102             IEM_MC_CALL_CIMPL_2(iemCImpl_vmread_reg64, pu64Dst, u64Enc);
     7106            IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_vmread_reg64, pu64Dst, u64Enc);
    71037107            IEM_MC_END();
    71047108        }
     
    71107114            IEM_MC_FETCH_GREG_U32(u32Enc, IEM_GET_MODRM_REG(pVCpu, bRm));
    71117115            IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    7112             IEM_MC_CALL_CIMPL_2(iemCImpl_vmread_reg32, pu64Dst, u32Enc);
     7116            IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_vmread_reg32, pu64Dst, u32Enc);
    71137117            IEM_MC_END();
    71147118        }
     
    71297133            IEM_MC_FETCH_GREG_U64(u64Enc, IEM_GET_MODRM_REG(pVCpu, bRm));
    71307134            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    7131             IEM_MC_CALL_CIMPL_3(iemCImpl_vmread_mem_reg64, iEffSeg, GCPtrVal, u64Enc);
     7135            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS,
     7136                                iemCImpl_vmread_mem_reg64, iEffSeg, GCPtrVal, u64Enc);
    71327137            IEM_MC_END();
    71337138        }
     
    71427147            IEM_MC_FETCH_GREG_U32(u32Enc, IEM_GET_MODRM_REG(pVCpu, bRm));
    71437148            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    7144             IEM_MC_CALL_CIMPL_3(iemCImpl_vmread_mem_reg32, iEffSeg, GCPtrVal, u32Enc);
     7149            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS,
     7150                                iemCImpl_vmread_mem_reg32, iEffSeg, GCPtrVal, u32Enc);
    71457151            IEM_MC_END();
    71467152        }
     
    71797185            IEM_MC_FETCH_GREG_U64(u64Val, IEM_GET_MODRM_RM(pVCpu, bRm));
    71807186            IEM_MC_FETCH_GREG_U64(u64Enc, IEM_GET_MODRM_REG(pVCpu, bRm));
    7181             IEM_MC_CALL_CIMPL_2(iemCImpl_vmwrite_reg, u64Val, u64Enc);
     7187            IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_vmwrite_reg, u64Val, u64Enc);
    71827188            IEM_MC_END();
    71837189        }
     
    71897195            IEM_MC_FETCH_GREG_U32(u32Val, IEM_GET_MODRM_RM(pVCpu, bRm));
    71907196            IEM_MC_FETCH_GREG_U32(u32Enc, IEM_GET_MODRM_REG(pVCpu, bRm));
    7191             IEM_MC_CALL_CIMPL_2(iemCImpl_vmwrite_reg, u32Val, u32Enc);
     7197            IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_vmwrite_reg, u32Val, u32Enc);
    71927198            IEM_MC_END();
    71937199        }
     
    72087214            IEM_MC_FETCH_GREG_U64(u64Enc, IEM_GET_MODRM_REG(pVCpu, bRm));
    72097215            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    7210             IEM_MC_CALL_CIMPL_3(iemCImpl_vmwrite_mem, iEffSeg, GCPtrVal, u64Enc);
     7216            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS,
     7217                                iemCImpl_vmwrite_mem, iEffSeg, GCPtrVal, u64Enc);
    72117218            IEM_MC_END();
    72127219        }
     
    72217228            IEM_MC_FETCH_GREG_U32(u32Enc, IEM_GET_MODRM_REG(pVCpu, bRm));
    72227229            IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    7223             IEM_MC_CALL_CIMPL_3(iemCImpl_vmwrite_mem, iEffSeg, GCPtrVal, u32Enc);
     7230            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS,
     7231                                iemCImpl_vmwrite_mem, iEffSeg, GCPtrVal, u32Enc);
    72247232            IEM_MC_END();
    72257233        }
     
    89648972    IEMOP_HLP_MIN_386();
    89658973    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8966     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_FS, pVCpu->iem.s.enmEffOpSize);
     8974    IEM_MC_DEFER_TO_CIMPL_2_RET(0, iemCImpl_pop_Sreg, X86_SREG_FS, pVCpu->iem.s.enmEffOpSize);
    89678975}
    89688976
     
    89748982    IEMOP_HLP_MIN_486(); /* not all 486es. */
    89758983    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8976     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_cpuid);
     8984    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_cpuid);
    89778985}
    89788986
     
    91429150#define IEMOP_BODY_BIT_Ev_Gv_NO_LOCK() \
    91439151            IEMOP_HLP_DONE_DECODING(); \
    9144             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     9152            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    91459153        } \
    91469154    } \
     
    95749582    IEMOP_HLP_MIN_386();
    95759583    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    9576     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_GS, pVCpu->iem.s.enmEffOpSize);
     9584    IEM_MC_DEFER_TO_CIMPL_2_RET(0, iemCImpl_pop_Sreg, X86_SREG_GS, pVCpu->iem.s.enmEffOpSize);
    95779585}
    95789586
     
    95849592    IEMOP_HLP_MIN_386(); /* 386SL and later. */
    95859593    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    9586     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rsm);
     9594    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_BRANCH | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB,
     9595                                iemCImpl_rsm);
    95879596}
    95889597
     
    96229631    IEMOP_MNEMONIC(fxsave, "fxsave m512");
    96239632    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fFxSaveRstor)
    9624         return IEMOP_RAISE_INVALID_OPCODE();
     9633        IEMOP_RAISE_INVALID_OPCODE_RET();
    96259634
    96269635    IEM_MC_BEGIN(3, 1);
     
    96329641    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    96339642    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    9634     IEM_MC_CALL_CIMPL_3(iemCImpl_fxsave, iEffSeg, GCPtrEff, enmEffOpSize);
     9643    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_FPU, iemCImpl_fxsave, iEffSeg, GCPtrEff, enmEffOpSize);
    96359644    IEM_MC_END();
    96369645}
     
    96429651    IEMOP_MNEMONIC(fxrstor, "fxrstor m512");
    96439652    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fFxSaveRstor)
    9644         return IEMOP_RAISE_INVALID_OPCODE();
     9653        IEMOP_RAISE_INVALID_OPCODE_RET();
    96459654
    96469655    IEM_MC_BEGIN(3, 1);
     
    96529661    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    96539662    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    9654     IEM_MC_CALL_CIMPL_3(iemCImpl_fxrstor, iEffSeg, GCPtrEff, enmEffOpSize);
     9663    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_FPU, iemCImpl_fxrstor, iEffSeg, GCPtrEff, enmEffOpSize);
    96559664    IEM_MC_END();
    96569665}
     
    96809689    IEMOP_MNEMONIC1(M_MEM, LDMXCSR, ldmxcsr, Md_RO, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    96819690    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse)
    9682         return IEMOP_RAISE_INVALID_OPCODE();
     9691        IEMOP_RAISE_INVALID_OPCODE_RET();
    96839692
    96849693    IEM_MC_BEGIN(2, 0);
     
    96899698    IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    96909699    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    9691     IEM_MC_CALL_CIMPL_2(iemCImpl_ldmxcsr, iEffSeg, GCPtrEff);
     9700    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_FPU, iemCImpl_ldmxcsr, iEffSeg, GCPtrEff);
    96929701    IEM_MC_END();
    96939702}
     
    97169725    IEMOP_MNEMONIC1(M_MEM, STMXCSR, stmxcsr, Md_WO, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    97179726    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse)
    9718         return IEMOP_RAISE_INVALID_OPCODE();
     9727        IEMOP_RAISE_INVALID_OPCODE_RET();
    97199728
    97209729    IEM_MC_BEGIN(2, 0);
     
    97259734    IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    97269735    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    9727     IEM_MC_CALL_CIMPL_2(iemCImpl_stmxcsr, iEffSeg, GCPtrEff);
     9736    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_FPU, iemCImpl_stmxcsr, iEffSeg, GCPtrEff);
    97289737    IEM_MC_END();
    97299738}
     
    97429751    IEMOP_MNEMONIC1(M_MEM, XSAVE, xsave, M_RW, DISOPTYPE_HARMLESS, 0);
    97439752    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fXSaveRstor)
    9744         return IEMOP_RAISE_INVALID_OPCODE();
     9753        IEMOP_RAISE_INVALID_OPCODE_RET();
    97459754
    97469755    IEM_MC_BEGIN(3, 0);
     
    97529761    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    97539762    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    9754     IEM_MC_CALL_CIMPL_3(iemCImpl_xsave, iEffSeg, GCPtrEff, enmEffOpSize);
     9763    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_FPU, iemCImpl_xsave, iEffSeg, GCPtrEff, enmEffOpSize);
    97559764    IEM_MC_END();
    97569765}
     
    97699778    IEMOP_MNEMONIC1(M_MEM, XRSTOR, xrstor, M_RO, DISOPTYPE_HARMLESS, 0);
    97709779    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fXSaveRstor)
    9771         return IEMOP_RAISE_INVALID_OPCODE();
     9780        IEMOP_RAISE_INVALID_OPCODE_RET();
    97729781
    97739782    IEM_MC_BEGIN(3, 0);
     
    97799788    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    97809789    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    9781     IEM_MC_CALL_CIMPL_3(iemCImpl_xrstor, iEffSeg, GCPtrEff, enmEffOpSize);
     9790    IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_FPU, iemCImpl_xrstor, iEffSeg, GCPtrEff, enmEffOpSize);
    97829791    IEM_MC_END();
    97839792}
     
    98069815    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    98079816    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    9808     IEM_MC_CALL_CIMPL_2(iemCImpl_clflush_clflushopt, iEffSeg, GCPtrEff);
     9817    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT, iemCImpl_clflush_clflushopt, iEffSeg, GCPtrEff);
    98099818    IEM_MC_END();
    98109819}
     
    98309839    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    98319840    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    9832     IEM_MC_CALL_CIMPL_2(iemCImpl_clflush_clflushopt, iEffSeg, GCPtrEff);
     9841    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT, iemCImpl_clflush_clflushopt, iEffSeg, GCPtrEff);
    98339842    IEM_MC_END();
    98349843}
     
    98429851    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    98439852    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2)
    9844         return IEMOP_RAISE_INVALID_OPCODE();
     9853        IEMOP_RAISE_INVALID_OPCODE_RET();
    98459854
    98469855    IEM_MC_BEGIN(0, 0);
     
    98659874    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    98669875    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2)
    9867         return IEMOP_RAISE_INVALID_OPCODE();
     9876        IEMOP_RAISE_INVALID_OPCODE_RET();
    98689877
    98699878    IEM_MC_BEGIN(0, 0);
     
    98889897    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    98899898    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2)
    9890         return IEMOP_RAISE_INVALID_OPCODE();
     9899        IEMOP_RAISE_INVALID_OPCODE_RET();
    98919900
    98929901    IEM_MC_BEGIN(0, 0);
     
    1035810367            IEM_MC_FETCH_MEM_U16(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEff);
    1035910368            IEM_MC_FETCH_MEM_U16_DISP(uSel, pVCpu->iem.s.iEffSeg, GCPtrEff, 2);
    10360             IEM_MC_CALL_CIMPL_5(iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
     10369            if (iSegReg >= X86_SREG_FS || !IEM_IS_32BIT_CODE(pVCpu))
     10370                IEM_MC_CALL_CIMPL_5(               0, iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
     10371            else
     10372                IEM_MC_CALL_CIMPL_5(IEM_CIMPL_F_MODE, iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
    1036110373            IEM_MC_END();
    1036210374
     
    1037310385            IEM_MC_FETCH_MEM_U32(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEff);
    1037410386            IEM_MC_FETCH_MEM_U16_DISP(uSel, pVCpu->iem.s.iEffSeg, GCPtrEff, 4);
    10375             IEM_MC_CALL_CIMPL_5(iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
     10387            if (iSegReg >= X86_SREG_FS || !IEM_IS_32BIT_CODE(pVCpu))
     10388                IEM_MC_CALL_CIMPL_5(               0, iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
     10389            else
     10390                IEM_MC_CALL_CIMPL_5(IEM_CIMPL_F_MODE, iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
    1037610391            IEM_MC_END();
    1037710392
     
    1039110406                IEM_MC_FETCH_MEM_U64(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEff);
    1039210407            IEM_MC_FETCH_MEM_U16_DISP(uSel, pVCpu->iem.s.iEffSeg, GCPtrEff, 8);
    10393             IEM_MC_CALL_CIMPL_5(iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
     10408            IEM_MC_CALL_CIMPL_5(0, iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
    1039410409            IEM_MC_END();
    1039510410
     
    1040610421    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1040710422    if (IEM_IS_MODRM_REG_MODE(bRm))
    10408         return IEMOP_RAISE_INVALID_OPCODE();
     10423        IEMOP_RAISE_INVALID_OPCODE_RET();
    1040910424    return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_SS, bRm);
    1041010425}
     
    1042810443    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1042910444    if (IEM_IS_MODRM_REG_MODE(bRm))
    10430         return IEMOP_RAISE_INVALID_OPCODE();
     10445        IEMOP_RAISE_INVALID_OPCODE_RET();
    1043110446    return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_FS, bRm);
    1043210447}
     
    1044010455    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1044110456    if (IEM_IS_MODRM_REG_MODE(bRm))
    10442         return IEMOP_RAISE_INVALID_OPCODE();
     10457        IEMOP_RAISE_INVALID_OPCODE_RET();
    1044310458    return FNIEMOP_CALL_2(iemOpCommonLoadSRegAndGreg, X86_SREG_GS, bRm);
    1044410459}
     
    1078910804#define IEMOP_BODY_BIT_Ev_Ib_NO_LOCK() \
    1079010805            IEMOP_HLP_DONE_DECODING(); \
    10791             return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     10806            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    1079210807        } \
    1079310808    } \
     
    1185411869            case IEMMODE_16BIT:
    1185511870                /** @todo check this form.   */
    11856                 return IEMOP_RAISE_INVALID_OPCODE();
     11871                IEMOP_RAISE_INVALID_OPCODE_RET();
    1185711872
    1185811873            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    1186011875    }
    1186111876    else
    11862         return IEMOP_RAISE_INVALID_OPCODE();
     11877        IEMOP_RAISE_INVALID_OPCODE_RET();
    1186311878}
    1186411879
     
    1200512020    /* No memory operand. */
    1200612021    else
    12007         return IEMOP_RAISE_INVALID_OPCODE();
     12022        IEMOP_RAISE_INVALID_OPCODE_RET();
    1200812023}
    1200912024
     
    1203612051    /* No memory operand. */
    1203712052    else
    12038         return IEMOP_RAISE_INVALID_OPCODE();
     12053        IEMOP_RAISE_INVALID_OPCODE_RET();
    1203912054}
    1204012055
     
    1223912254                IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b_fallback, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
    1224012255            else
    12241                 IEM_MC_CALL_CIMPL_4(iemCImpl_cmpxchg16b_fallback_rendezvous, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
     12256                IEM_MC_CALL_CIMPL_4(IEM_CIMPL_F_STATUS_FLAGS,
     12257                                    iemCImpl_cmpxchg16b_fallback_rendezvous, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
    1224212258        }
    1224312259
     
    1225812274        else
    1225912275        {
    12260             IEM_MC_CALL_CIMPL_4(iemCImpl_cmpxchg16b_fallback_rendezvous, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
     12276            IEM_MC_CALL_CIMPL_4(IEM_CIMPL_F_STATUS_FLAGS,
     12277                                iemCImpl_cmpxchg16b_fallback_rendezvous, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
    1226112278            /* Does not get here, tail code is duplicated in iemCImpl_cmpxchg16b_fallback_rendezvous. */
    1226212279        }
     
    1227412291    }
    1227512292    Log(("cmpxchg16b -> #UD\n"));
    12276     return IEMOP_RAISE_INVALID_OPCODE();
     12293    IEMOP_RAISE_INVALID_OPCODE_RET();
    1227712294}
    1227812295
     
    1228912306{
    1229012307    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fRdRand)
    12291         return IEMOP_RAISE_INVALID_OPCODE();
     12308        IEMOP_RAISE_INVALID_OPCODE_RET();
    1229212309
    1229312310    if (IEM_IS_MODRM_REG_MODE(bRm))
     
    1234512362    /* Register only. */
    1234612363    else
    12347         return IEMOP_RAISE_INVALID_OPCODE();
     12364        IEMOP_RAISE_INVALID_OPCODE_RET();
    1234812365}
    1234912366
     
    1236112378    IEMOP_HLP_DONE_DECODING_NO_SIZE_OP_REPZ_OR_REPNZ_PREFIXES();
    1236212379    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    12363     IEM_MC_CALL_CIMPL_2(iemCImpl_vmptrld, iEffSeg, GCPtrEffSrc);
     12380    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_vmptrld, iEffSeg, GCPtrEffSrc);
    1236412381    IEM_MC_END();
    1236512382}
     
    1238112398    IEMOP_HLP_DONE_DECODING();
    1238212399    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    12383     IEM_MC_CALL_CIMPL_2(iemCImpl_vmclear, iEffSeg, GCPtrEffDst);
     12400    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_vmclear, iEffSeg, GCPtrEffDst);
    1238412401    IEM_MC_END();
    1238512402}
     
    1240012417    IEMOP_HLP_DONE_DECODING();
    1240112418    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    12402     IEM_MC_CALL_CIMPL_2(iemCImpl_vmxon, iEffSeg, GCPtrEffSrc);
     12419    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_vmxon, iEffSeg, GCPtrEffSrc);
    1240312420    IEM_MC_END();
    1240412421}
     
    1242012437    IEMOP_HLP_DONE_DECODING_NO_SIZE_OP_REPZ_OR_REPNZ_PREFIXES();
    1242112438    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    12422     IEM_MC_CALL_CIMPL_2(iemCImpl_vmptrst, iEffSeg, GCPtrEffDst);
     12439    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_vmptrst, iEffSeg, GCPtrEffDst);
    1242312440    IEM_MC_END();
    1242412441}
     
    1243112448{
    1243212449    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fRdSeed)
    12433         return IEMOP_RAISE_INVALID_OPCODE();
     12450        IEMOP_RAISE_INVALID_OPCODE_RET();
    1243412451
    1243512452    if (IEM_IS_MODRM_REG_MODE(bRm))
     
    1248712504    /* Register only. */
    1248812505    else
    12489         return IEMOP_RAISE_INVALID_OPCODE();
     12506        IEMOP_RAISE_INVALID_OPCODE_RET();
    1249012507}
    1249112508
     
    1295112968    }
    1295212969    else
    12953         return IEMOP_RAISE_INVALID_OPCODE();
     12970        IEMOP_RAISE_INVALID_OPCODE_RET();
    1295412971}
    1295512972
     
    1297712994    }
    1297812995    else
    12979         return IEMOP_RAISE_INVALID_OPCODE();
     12996        IEMOP_RAISE_INVALID_OPCODE_RET();
    1298012997}
    1298112998
     
    1332013337     */
    1332113338    else
    13322         return IEMOP_RAISE_INVALID_OPCODE();
     13339        IEMOP_RAISE_INVALID_OPCODE_RET();
    1332313340}
    1332413341
     
    1336713384     */
    1336813385    else
    13369         return IEMOP_RAISE_INVALID_OPCODE();
     13386        IEMOP_RAISE_INVALID_OPCODE_RET();
    1337013387}
    1337113388
     
    1354413561         * Register, register - (not implemented, assuming it raises \#UD).
    1354513562         */
    13546         return IEMOP_RAISE_INVALID_OPCODE();
     13563        IEMOP_RAISE_INVALID_OPCODE_RET();
    1354713564    }
    1354813565    else
     
    1383213849        IEMOP_HLP_DONE_DECODING();
    1383313850    }
    13834     return IEMOP_RAISE_INVALID_OPCODE();
     13851    IEMOP_RAISE_INVALID_OPCODE_RET();
    1383513852}
    1383613853
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r99336 r100072  
    404404{
    405405    IEMOP_MNEMONIC(vud2, "vud2");
    406     return IEMOP_RAISE_INVALID_OPCODE();
     406    IEMOP_RAISE_INVALID_OPCODE_RET();
    407407}
    408408
     
    10851085     */
    10861086    else
    1087         return IEMOP_RAISE_INVALID_OPCODE();
     1087        IEMOP_RAISE_INVALID_OPCODE_RET();
    10881088}
    10891089
     
    13391339     */
    13401340    else
    1341         return IEMOP_RAISE_INVALID_OPCODE();
     1341        IEMOP_RAISE_INVALID_OPCODE_RET();
    13421342}
    13431343
     
    13861386     */
    13871387    else
    1388         return IEMOP_RAISE_INVALID_OPCODE();
     1388        IEMOP_RAISE_INVALID_OPCODE_RET();
    13891389}
    13901390
     
    15411541     */
    15421542    else
    1543         return IEMOP_RAISE_INVALID_OPCODE();
     1543        IEMOP_RAISE_INVALID_OPCODE_RET();
    15441544}
    15451545
     
    16921692     */
    16931693    else
    1694         return IEMOP_RAISE_INVALID_OPCODE();
     1694        IEMOP_RAISE_INVALID_OPCODE_RET();
    16951695}
    16961696
     
    17371737     */
    17381738    else
    1739         return IEMOP_RAISE_INVALID_OPCODE();
     1739        IEMOP_RAISE_INVALID_OPCODE_RET();
    17401740}
    17411741
     
    21762176    /* The register, register encoding is invalid. */
    21772177    else
    2178         return IEMOP_RAISE_INVALID_OPCODE();
     2178        IEMOP_RAISE_INVALID_OPCODE_RET();
    21792179}
    21802180
     
    22372237    /* The register, register encoding is invalid. */
    22382238    else
    2239         return IEMOP_RAISE_INVALID_OPCODE();
     2239        IEMOP_RAISE_INVALID_OPCODE_RET();
    22402240}
    22412241
     
    26472647    /* No memory operand. */
    26482648    else
    2649         return IEMOP_RAISE_INVALID_OPCODE();
     2649        IEMOP_RAISE_INVALID_OPCODE_RET();
    26502650}
    26512651
     
    26982698    /* No memory operand. */
    26992699    else
    2700         return IEMOP_RAISE_INVALID_OPCODE();
     2700        IEMOP_RAISE_INVALID_OPCODE_RET();
    27012701}
    27022702
     
    42934293    IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    42944294    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    4295     IEM_MC_CALL_CIMPL_2(iemCImpl_vstmxcsr, iEffSeg, GCPtrEff);
     4295    IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_FPU, iemCImpl_vstmxcsr, iEffSeg, GCPtrEff);
    42964296    IEM_MC_END();
    42974297}
     
    44824482    /* No memory operand. */
    44834483    else
    4484         return IEMOP_RAISE_INVALID_OPCODE();
     4484        IEMOP_RAISE_INVALID_OPCODE_RET();
    44854485}
    44864486
     
    47854785    }
    47864786    else
    4787         return IEMOP_RAISE_INVALID_OPCODE();
     4787        IEMOP_RAISE_INVALID_OPCODE_RET();
    47884788}
    47894789
     
    50295029     */
    50305030    else
    5031         return IEMOP_RAISE_INVALID_OPCODE();
     5031        IEMOP_RAISE_INVALID_OPCODE_RET();
    50325032}
    50335033
     
    51375137         * Register, register - (not implemented, assuming it raises \#UD).
    51385138         */
    5139         return IEMOP_RAISE_INVALID_OPCODE();
     5139        IEMOP_RAISE_INVALID_OPCODE_RET();
    51405140    }
    51415141    else if (pVCpu->iem.s.uVexLength == 0)
     
    53495349        IEMOP_HLP_DONE_DECODING();
    53505350    }
    5351     return IEMOP_RAISE_INVALID_OPCODE();
     5351    IEMOP_RAISE_INVALID_OPCODE_RET();
    53525352}
    53535353
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h

    r99958 r100072  
    606606     */
    607607    else
    608         return IEMOP_RAISE_INVALID_OPCODE();
     608        IEMOP_RAISE_INVALID_OPCODE_RET();
    609609}
    610610
  • trunk/src/VBox/VMM/VMMAll/IEMAllThreadedFunctions.cpp

    r99301 r100072  
    135135
    136136/** Variant of IEM_MC_CALL_CIMPL_1 with explicit instruction length parameter. */
    137 #define IEM_MC_CALL_CIMPL_1_THREADED(a_cbInstr, a_pfnCImpl, a0) \
     137#define IEM_MC_CALL_CIMPL_1_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0) \
    138138    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0)
    139139#undef  IEM_MC_CALL_CIMPL_1
    140140
    141141/** Variant of IEM_MC_CALL_CIMPL_2 with explicit instruction length parameter. */
    142 #define IEM_MC_CALL_CIMPL_2_THREADED(a_cbInstr, a_pfnCImpl, a0, a1) \
     142#define IEM_MC_CALL_CIMPL_2_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1) \
    143143    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1)
    144144#undef  IEM_MC_CALL_CIMPL_2
    145145
    146146/** Variant of IEM_MC_CALL_CIMPL_3 with explicit instruction length parameter. */
    147 #define IEM_MC_CALL_CIMPL_3_THREADED(a_cbInstr, a_pfnCImpl, a0, a1, a2) \
     147#define IEM_MC_CALL_CIMPL_3_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1, a2) \
    148148    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1, a2)
    149149#undef  IEM_MC_CALL_CIMPL_3
    150150
    151151/** Variant of IEM_MC_CALL_CIMPL_4 with explicit instruction length parameter. */
    152 #define IEM_MC_CALL_CIMPL_4_THREADED(a_cbInstr, a_pfnCImpl, a0, a1, a2, a3) \
     152#define IEM_MC_CALL_CIMPL_4_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1, a2, a3) \
    153153    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1, a2, a3)
    154154#undef  IEM_MC_CALL_CIMPL_4
    155155
    156156/** Variant of IEM_MC_CALL_CIMPL_5 with explicit instruction length parameter. */
    157 #define IEM_MC_CALL_CIMPL_5_THREADED(a_cbInstr, a_pfnCImpl, a0, a1, a2, a3, a4) \
     157#define IEM_MC_CALL_CIMPL_5_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1, a2, a3, a4) \
    158158    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1, a2, a3, a4)
    159159#undef  IEM_MC_CALL_CIMPL_5
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