VirtualBox

Changeset 101984 in vbox for trunk/src


Ignore:
Timestamp:
Nov 8, 2023 3:56:18 PM (16 months ago)
Author:
vboxsync
Message:

VMM/IEM: Added a flush mask for guest register shadows to the IEM_MC_DEFER_TO_CIMPL_X_RET macros to better manage register optimizations when recompiling to native code. bugref:10371

Location:
trunk/src/VBox/VMM
Files:
11 edited

Legend:

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

    r101958 r101984  
    835835    IEMOP_HLP_NO_64BIT();
    836836    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    837     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE, iemCImpl_pop_Sreg, X86_SREG_ES, pVCpu->iem.s.enmEffOpSize);
     837    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE,
     838                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     839                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_ES)
     840                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_ES)
     841                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_ES),
     842                                iemCImpl_pop_Sreg, X86_SREG_ES, pVCpu->iem.s.enmEffOpSize);
    838843}
    839844
     
    10041009    /** @todo eliminate END_TB here */
    10051010    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_END_TB,
     1011                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     1012                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst + X86_SREG_CS),
    10061013                                iemCImpl_pop_Sreg, X86_SREG_CS, pVCpu->iem.s.enmEffOpSize);
    10071014}
     
    11241131    IEMOP_HLP_NO_64BIT();
    11251132    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_INHIBIT_SHADOW,
     1133                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     1134                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_SS)
     1135                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_SS)
     1136                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_SS),
    11261137                                iemCImpl_pop_Sreg, X86_SREG_SS, pVCpu->iem.s.enmEffOpSize);
    11271138}
     
    12291240    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12301241    IEMOP_HLP_NO_64BIT();
    1231     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE, iemCImpl_pop_Sreg, X86_SREG_DS, pVCpu->iem.s.enmEffOpSize);
     1242    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE,
     1243                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     1244                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_DS)
     1245                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_DS)
     1246                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_DS),
     1247                                iemCImpl_pop_Sreg, X86_SREG_DS, pVCpu->iem.s.enmEffOpSize);
    12321248}
    12331249
     
    13571373    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    13581374    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
    1359     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_daa);
     1375    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX), iemCImpl_daa);
    13601376}
    13611377
     
    14671483    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    14681484    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
    1469     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_das);
     1485    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX), iemCImpl_das);
    14701486}
    14711487
     
    16281644    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
    16291645
    1630     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_aaa);
     1646    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX), iemCImpl_aaa);
    16311647}
    16321648
     
    17561772    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_OF);
    17571773
    1758     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_aas);
     1774    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_STATUS_FLAGS, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX), iemCImpl_aas);
    17591775}
    17601776
     
    25052521    IEMOP_HLP_NO_64BIT();
    25062522    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    2507         IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_pusha_16);
     2523        IEM_MC_DEFER_TO_CIMPL_0_RET(0, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP), iemCImpl_pusha_16);
    25082524    Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT);
    2509     IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_pusha_32);
     2525    IEM_MC_DEFER_TO_CIMPL_0_RET(0, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP), iemCImpl_pusha_32);
    25102526}
    25112527
     
    25222538        IEMOP_HLP_NO_64BIT();
    25232539        if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    2524             IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_popa_16);
     2540            IEM_MC_DEFER_TO_CIMPL_0_RET(0,
     2541                                          RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     2542                                        | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX)
     2543                                        | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDX)
     2544                                        | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xBX)
     2545                                        | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     2546                                        | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xBP)
     2547                                        | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     2548                                        | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     2549                                        iemCImpl_popa_16);
    25252550        Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT);
    2526         IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_popa_32);
     2551        IEM_MC_DEFER_TO_CIMPL_0_RET(0,
     2552                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     2553                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX)
     2554                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDX)
     2555                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xBX)
     2556                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     2557                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xBP)
     2558                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     2559                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     2560                                    iemCImpl_popa_32);
    25272561    }
    25282562    IEMOP_MNEMONIC(mvex, "mvex");
     
    32843318        switch (pVCpu->iem.s.enmEffAddrMode)
    32853319        {
    3286             case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3287                                                             iemCImpl_rep_ins_op8_addr16, false);
    3288             case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3289                                                             iemCImpl_rep_ins_op8_addr32, false);
    3290             case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3291                                                             iemCImpl_rep_ins_op8_addr64, false);
     3320            case IEMMODE_16BIT:
     3321                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3322                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     3323                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     3324                                            iemCImpl_rep_ins_op8_addr16, false);
     3325            case IEMMODE_32BIT:
     3326                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3327                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     3328                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     3329                                            iemCImpl_rep_ins_op8_addr32, false);
     3330            case IEMMODE_64BIT:
     3331                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3332                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     3333                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     3334                                            iemCImpl_rep_ins_op8_addr64, false);
    32923335            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    32933336        }
     
    32983341        switch (pVCpu->iem.s.enmEffAddrMode)
    32993342        {
    3300             case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3301                                                             iemCImpl_ins_op8_addr16, false);
    3302             case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3303                                                             iemCImpl_ins_op8_addr32, false);
    3304             case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3305                                                             iemCImpl_ins_op8_addr64, false);
     3343            case IEMMODE_16BIT:
     3344                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3345                                            RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     3346                                            iemCImpl_ins_op8_addr16, false);
     3347            case IEMMODE_32BIT:
     3348                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3349                                            RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     3350                                            iemCImpl_ins_op8_addr32, false);
     3351            case IEMMODE_64BIT:
     3352                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3353                                            RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     3354                                            iemCImpl_ins_op8_addr64, false);
    33063355            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    33073356        }
     
    33273376                    case IEMMODE_16BIT:
    33283377                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3378                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     3379                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    33293380                                                    iemCImpl_rep_ins_op16_addr16, false);
    33303381                    case IEMMODE_32BIT:
    33313382                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3383                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     3384                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    33323385                                                    iemCImpl_rep_ins_op16_addr32, false);
    33333386                    case IEMMODE_64BIT:
    33343387                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3388                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     3389                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    33353390                                                    iemCImpl_rep_ins_op16_addr64, false);
    33363391                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    33433398                    case IEMMODE_16BIT:
    33443399                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3400                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     3401                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    33453402                                                    iemCImpl_rep_ins_op32_addr16, false);
    33463403                    case IEMMODE_32BIT:
    33473404                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3405                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     3406                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    33483407                                                    iemCImpl_rep_ins_op32_addr32, false);
    33493408                    case IEMMODE_64BIT:
    33503409                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3410                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     3411                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    33513412                                                    iemCImpl_rep_ins_op32_addr64, false);
    33523413                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    33643425                switch (pVCpu->iem.s.enmEffAddrMode)
    33653426                {
    3366                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3367                                                                     iemCImpl_ins_op16_addr16, false);
    3368                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3369                                                                     iemCImpl_ins_op16_addr32, false);
    3370                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3371                                                                     iemCImpl_ins_op16_addr64, false);
     3427                    case IEMMODE_16BIT:
     3428                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3429                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     3430                                                    iemCImpl_ins_op16_addr16, false);
     3431                    case IEMMODE_32BIT:
     3432                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3433                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     3434                                                    iemCImpl_ins_op16_addr32, false);
     3435                    case IEMMODE_64BIT:
     3436                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3437                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     3438                                                    iemCImpl_ins_op16_addr64, false);
    33723439                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    33733440                }
     
    33773444                switch (pVCpu->iem.s.enmEffAddrMode)
    33783445                {
    3379                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3380                                                                     iemCImpl_ins_op32_addr16, false);
    3381                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3382                                                                     iemCImpl_ins_op32_addr32, false);
    3383                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
    3384                                                                     iemCImpl_ins_op32_addr64, false);
     3446                    case IEMMODE_16BIT:
     3447                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3448                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     3449                                                    iemCImpl_ins_op32_addr16, false);
     3450                    case IEMMODE_32BIT:
     3451                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3452                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     3453                                                    iemCImpl_ins_op32_addr32, false);
     3454                    case IEMMODE_64BIT:
     3455                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3456                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI),
     3457                                                    iemCImpl_ins_op32_addr64, false);
    33853458                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    33863459                }
     
    34063479            case IEMMODE_16BIT:
    34073480                IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3481                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     3482                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    34083483                                            iemCImpl_rep_outs_op8_addr16, pVCpu->iem.s.iEffSeg, false);
    34093484            case IEMMODE_32BIT:
    34103485                IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3486                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     3487                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    34113488                                            iemCImpl_rep_outs_op8_addr32, pVCpu->iem.s.iEffSeg, false);
    34123489            case IEMMODE_64BIT:
    34133490                IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3491                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     3492                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    34143493                                            iemCImpl_rep_outs_op8_addr64, pVCpu->iem.s.iEffSeg, false);
    34153494            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    34233502            case IEMMODE_16BIT:
    34243503                IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3504                                            RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI),
    34253505                                            iemCImpl_outs_op8_addr16, pVCpu->iem.s.iEffSeg, false);
    34263506            case IEMMODE_32BIT:
    34273507                IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3508                                            RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI),
    34283509                                            iemCImpl_outs_op8_addr32, pVCpu->iem.s.iEffSeg, false);
    34293510            case IEMMODE_64BIT:
    34303511                IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3512                                            RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI),
    34313513                                            iemCImpl_outs_op8_addr64, pVCpu->iem.s.iEffSeg, false);
    34323514            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    34533535                    case IEMMODE_16BIT:
    34543536                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3537                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     3538                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    34553539                                                    iemCImpl_rep_outs_op16_addr16, pVCpu->iem.s.iEffSeg, false);
    34563540                    case IEMMODE_32BIT:
    34573541                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3542                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     3543                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    34583544                                                    iemCImpl_rep_outs_op16_addr32, pVCpu->iem.s.iEffSeg, false);
    34593545                    case IEMMODE_64BIT:
    34603546                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3547                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     3548                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    34613549                                                    iemCImpl_rep_outs_op16_addr64, pVCpu->iem.s.iEffSeg, false);
    34623550                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    34693557                    case IEMMODE_16BIT:
    34703558                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3559                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     3560                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    34713561                                                    iemCImpl_rep_outs_op32_addr16, pVCpu->iem.s.iEffSeg, false);
    34723562                    case IEMMODE_32BIT:
    34733563                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3564                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     3565                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    34743566                                                    iemCImpl_rep_outs_op32_addr32, pVCpu->iem.s.iEffSeg, false);
    34753567                    case IEMMODE_64BIT:
    34763568                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3569                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     3570                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
    34773571                                                    iemCImpl_rep_outs_op32_addr64, pVCpu->iem.s.iEffSeg, false);
    34783572                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    34923586                    case IEMMODE_16BIT:
    34933587                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3588                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI),
    34943589                                                    iemCImpl_outs_op16_addr16, pVCpu->iem.s.iEffSeg, false);
    34953590                    case IEMMODE_32BIT:
    34963591                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3592                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI),
    34973593                                                    iemCImpl_outs_op16_addr32, pVCpu->iem.s.iEffSeg, false);
    34983594                    case IEMMODE_64BIT:
    34993595                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3596                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI),
    35003597                                                    iemCImpl_outs_op16_addr64, pVCpu->iem.s.iEffSeg, false);
    35013598                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    35083605                    case IEMMODE_16BIT:
    35093606                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3607                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI),
    35103608                                                    iemCImpl_outs_op32_addr16, pVCpu->iem.s.iEffSeg, false);
    35113609                    case IEMMODE_32BIT:
    35123610                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3611                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI),
    35133612                                                    iemCImpl_outs_op32_addr32, pVCpu->iem.s.iEffSeg, false);
    35143613                    case IEMMODE_64BIT:
    35153614                        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     3615                                                    RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI),
    35163616                                                    iemCImpl_outs_op32_addr64, pVCpu->iem.s.iEffSeg, false);
    35173617                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    61386238#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    61396239        else if (pVCpu->iem.s.fExec & IEM_F_X86_CTX_VMX)
    6140             IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmx_pause);
     6240            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_vmx_pause);
    61416241#endif
    61426242#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    61436243        else if (pVCpu->iem.s.fExec & IEM_F_X86_CTX_SVM)
    6144             IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_svm_pause);
     6244            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_svm_pause);
    61456245#endif
    61466246    }
     
    63436443    uint16_t u16Sel;  IEM_OPCODE_GET_NEXT_U16(&u16Sel);
    63446444    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    6345     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_BRANCH_DIRECT | IEM_CIMPL_F_BRANCH_FAR
    6346                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     6445    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_BRANCH_DIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK
     6446                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, UINT64_MAX,
    63476447                                iemCImpl_callf, u16Sel, off32Seg, pVCpu->iem.s.enmEffOpSize);
     6448    /** @todo make task-switches, ring-switches, ++ return non-zero status */
    63486449}
    63496450
     
    63706471    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    63716472    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    6372     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_pushf, pVCpu->iem.s.enmEffOpSize);
     6473    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP),
     6474                                iemCImpl_pushf, pVCpu->iem.s.enmEffOpSize);
    63736475}
    63746476
     
    63836485    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    63846486    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_CHECK_IRQ_BEFORE_AND_AFTER,
     6487                                RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP),
    63856488                                iemCImpl_popf, pVCpu->iem.s.enmEffOpSize);
    63866489}
     
    66426745        switch (pVCpu->iem.s.enmEffAddrMode)
    66436746        {
    6644             case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op8_addr16, pVCpu->iem.s.iEffSeg);
    6645             case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op8_addr32, pVCpu->iem.s.iEffSeg);
    6646             case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op8_addr64, pVCpu->iem.s.iEffSeg);
     6747            case IEMMODE_16BIT:
     6748                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6749                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6750                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6751                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6752                                            iemCImpl_rep_movs_op8_addr16, pVCpu->iem.s.iEffSeg);
     6753            case IEMMODE_32BIT:
     6754                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6755                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6756                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6757                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6758                                            iemCImpl_rep_movs_op8_addr32, pVCpu->iem.s.iEffSeg);
     6759            case IEMMODE_64BIT:
     6760                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6761                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6762                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6763                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6764                                            iemCImpl_rep_movs_op8_addr64, pVCpu->iem.s.iEffSeg);
    66476765            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    66486766        }
     
    66816799                switch (pVCpu->iem.s.enmEffAddrMode)
    66826800                {
    6683                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op16_addr16, pVCpu->iem.s.iEffSeg);
    6684                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op16_addr32, pVCpu->iem.s.iEffSeg);
    6685                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op16_addr64, pVCpu->iem.s.iEffSeg);
     6801                    case IEMMODE_16BIT:
     6802                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6803                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6804                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6805                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6806                                                    iemCImpl_rep_movs_op16_addr16, pVCpu->iem.s.iEffSeg);
     6807                    case IEMMODE_32BIT:
     6808                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6809                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6810                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6811                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6812                                                    iemCImpl_rep_movs_op16_addr32, pVCpu->iem.s.iEffSeg);
     6813                    case IEMMODE_64BIT:
     6814                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6815                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6816                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6817                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6818                                                    iemCImpl_rep_movs_op16_addr64, pVCpu->iem.s.iEffSeg);
    66866819                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    66876820                }
     
    66906823                switch (pVCpu->iem.s.enmEffAddrMode)
    66916824                {
    6692                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op32_addr16, pVCpu->iem.s.iEffSeg);
    6693                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op32_addr32, pVCpu->iem.s.iEffSeg);
    6694                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op32_addr64, pVCpu->iem.s.iEffSeg);
     6825                    case IEMMODE_16BIT:
     6826                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6827                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6828                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6829                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6830                                                    iemCImpl_rep_movs_op32_addr16, pVCpu->iem.s.iEffSeg);
     6831                    case IEMMODE_32BIT:
     6832                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6833                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6834                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6835                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6836                                                    iemCImpl_rep_movs_op32_addr32, pVCpu->iem.s.iEffSeg);
     6837                    case IEMMODE_64BIT:
     6838                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6839                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6840                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6841                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6842                                                    iemCImpl_rep_movs_op32_addr64, pVCpu->iem.s.iEffSeg);
    66956843                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    66966844                }
     
    66996847                {
    67006848                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_6);
    6701                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op64_addr32, pVCpu->iem.s.iEffSeg);
    6702                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_rep_movs_op64_addr64, pVCpu->iem.s.iEffSeg);
     6849                    case IEMMODE_32BIT:
     6850                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6851                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6852                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6853                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6854                                                    iemCImpl_rep_movs_op64_addr32, pVCpu->iem.s.iEffSeg);
     6855                    case IEMMODE_64BIT:
     6856                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     6857                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6858                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6859                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6860                                                    iemCImpl_rep_movs_op64_addr64, pVCpu->iem.s.iEffSeg);
    67036861                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    67046862                }
     
    67926950        switch (pVCpu->iem.s.enmEffAddrMode)
    67936951        {
    6794             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);
    6795             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);
    6796             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);
     6952            case IEMMODE_16BIT:
     6953                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     6954                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6955                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6956                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6957                                            iemCImpl_repe_cmps_op8_addr16, pVCpu->iem.s.iEffSeg);
     6958            case IEMMODE_32BIT:
     6959                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     6960                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6961                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6962                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6963                                            iemCImpl_repe_cmps_op8_addr32, pVCpu->iem.s.iEffSeg);
     6964            case IEMMODE_64BIT:
     6965                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     6966                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6967                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6968                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6969                                            iemCImpl_repe_cmps_op8_addr64, pVCpu->iem.s.iEffSeg);
    67976970            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    67986971        }
     
    68046977        switch (pVCpu->iem.s.enmEffAddrMode)
    68056978        {
    6806             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);
    6807             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);
    6808             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);
     6979            case IEMMODE_16BIT:
     6980                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     6981                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6982                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6983                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6984                                            iemCImpl_repne_cmps_op8_addr16, pVCpu->iem.s.iEffSeg);
     6985            case IEMMODE_32BIT:
     6986                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     6987                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6988                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6989                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6990                                            iemCImpl_repne_cmps_op8_addr32, pVCpu->iem.s.iEffSeg);
     6991            case IEMMODE_64BIT:
     6992                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     6993                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     6994                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     6995                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     6996                                            iemCImpl_repne_cmps_op8_addr64, pVCpu->iem.s.iEffSeg);
    68096997            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    68106998        }
     
    68427030                switch (pVCpu->iem.s.enmEffAddrMode)
    68437031                {
    6844                     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);
    6845                     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);
    6846                     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);
     7032                    case IEMMODE_16BIT:
     7033                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7034                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7035                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7036                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7037                                                    iemCImpl_repe_cmps_op16_addr16, pVCpu->iem.s.iEffSeg);
     7038                    case IEMMODE_32BIT:
     7039                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7040                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7041                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7042                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7043                                                    iemCImpl_repe_cmps_op16_addr32, pVCpu->iem.s.iEffSeg);
     7044                    case IEMMODE_64BIT:
     7045                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7046                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7047                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7048                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7049                                                    iemCImpl_repe_cmps_op16_addr64, pVCpu->iem.s.iEffSeg);
    68477050                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    68487051                }
     
    68517054                switch (pVCpu->iem.s.enmEffAddrMode)
    68527055                {
    6853                     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);
    6854                     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);
    6855                     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);
     7056                    case IEMMODE_16BIT:
     7057                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7058                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7059                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7060                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7061                                                    iemCImpl_repe_cmps_op32_addr16, pVCpu->iem.s.iEffSeg);
     7062                    case IEMMODE_32BIT:
     7063                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7064                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7065                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7066                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7067                                                    iemCImpl_repe_cmps_op32_addr32, pVCpu->iem.s.iEffSeg);
     7068                    case IEMMODE_64BIT:
     7069                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7070                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7071                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7072                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7073                                                    iemCImpl_repe_cmps_op32_addr64, pVCpu->iem.s.iEffSeg);
    68567074                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    68577075                }
     
    68607078                {
    68617079                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_4);
    6862                     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);
    6863                     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);
     7080                    case IEMMODE_32BIT:
     7081                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7082                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7083                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7084                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7085                                                    iemCImpl_repe_cmps_op64_addr32, pVCpu->iem.s.iEffSeg);
     7086                    case IEMMODE_64BIT:
     7087                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7088                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7089                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7090                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7091                                                    iemCImpl_repe_cmps_op64_addr64, pVCpu->iem.s.iEffSeg);
    68647092                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    68657093                }
     
    68777105                switch (pVCpu->iem.s.enmEffAddrMode)
    68787106                {
    6879                     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);
    6880                     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);
    6881                     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);
     7107                    case IEMMODE_16BIT:
     7108                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7109                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7110                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7111                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7112                                                    iemCImpl_repne_cmps_op16_addr16, pVCpu->iem.s.iEffSeg);
     7113                    case IEMMODE_32BIT:
     7114                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7115                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7116                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7117                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7118                                                    iemCImpl_repne_cmps_op16_addr32, pVCpu->iem.s.iEffSeg);
     7119                    case IEMMODE_64BIT:
     7120                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7121                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7122                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7123                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7124                                                    iemCImpl_repne_cmps_op16_addr64, pVCpu->iem.s.iEffSeg);
    68827125                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    68837126                }
     
    68867129                switch (pVCpu->iem.s.enmEffAddrMode)
    68877130                {
    6888                     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);
    6889                     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);
    6890                     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);
     7131                    case IEMMODE_16BIT:
     7132                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7133                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7134                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7135                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7136                                                    iemCImpl_repne_cmps_op32_addr16, pVCpu->iem.s.iEffSeg);
     7137                    case IEMMODE_32BIT:
     7138                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7139                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7140                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7141                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7142                                                    iemCImpl_repne_cmps_op32_addr32, pVCpu->iem.s.iEffSeg);
     7143                    case IEMMODE_64BIT:
     7144                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7145                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7146                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7147                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7148                                                    iemCImpl_repne_cmps_op32_addr64, pVCpu->iem.s.iEffSeg);
    68917149                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    68927150                }
     
    68957153                {
    68967154                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_2);
    6897                     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);
    6898                     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);
     7155                    case IEMMODE_32BIT:
     7156                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7157                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7158                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7159                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7160                                                    iemCImpl_repne_cmps_op64_addr32, pVCpu->iem.s.iEffSeg);
     7161                    case IEMMODE_64BIT:
     7162                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7163                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7164                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7165                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7166                                                    iemCImpl_repne_cmps_op64_addr64, pVCpu->iem.s.iEffSeg);
    68997167                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    69007168                }
     
    69987266        switch (pVCpu->iem.s.enmEffAddrMode)
    69997267        {
    7000             case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP, iemCImpl_stos_al_m16);
    7001             case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP, iemCImpl_stos_al_m32);
    7002             case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP, iemCImpl_stos_al_m64);
     7268            case IEMMODE_16BIT:
     7269                IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP,
     7270                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7271                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7272                                            iemCImpl_stos_al_m16);
     7273            case IEMMODE_32BIT:
     7274                IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP,
     7275                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7276                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7277                                            iemCImpl_stos_al_m32);
     7278            case IEMMODE_64BIT:
     7279                IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP,
     7280                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7281                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7282                                            iemCImpl_stos_al_m64);
    70037283            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    70047284        }
     
    70367316                switch (pVCpu->iem.s.enmEffAddrMode)
    70377317                {
    7038                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_ax_m16);
    7039                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_ax_m32);
    7040                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_ax_m64);
     7318                    case IEMMODE_16BIT:
     7319                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP,
     7320                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7321                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7322                                                    iemCImpl_stos_ax_m16);
     7323                    case IEMMODE_32BIT:
     7324                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP,
     7325                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7326                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7327                                                    iemCImpl_stos_ax_m32);
     7328                    case IEMMODE_64BIT:
     7329                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP,
     7330                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7331                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7332                                                    iemCImpl_stos_ax_m64);
    70417333                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    70427334                }
     
    70457337                switch (pVCpu->iem.s.enmEffAddrMode)
    70467338                {
    7047                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_eax_m16);
    7048                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_eax_m32);
    7049                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_eax_m64);
     7339                    case IEMMODE_16BIT:
     7340                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP,
     7341                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7342                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7343                                                    iemCImpl_stos_eax_m16);
     7344                    case IEMMODE_32BIT:
     7345                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP,
     7346                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7347                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7348                                                    iemCImpl_stos_eax_m32);
     7349                    case IEMMODE_64BIT:
     7350                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP,
     7351                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7352                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7353                                                    iemCImpl_stos_eax_m64);
    70507354                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    70517355                }
     
    70547358                {
    70557359                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_9);
    7056                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_rax_m32);
    7057                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP, iemCImpl_stos_rax_m64);
     7360                    case IEMMODE_32BIT:
     7361                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP,
     7362                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7363                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7364                                                    iemCImpl_stos_rax_m32);
     7365                    case IEMMODE_64BIT:
     7366                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_REP,
     7367                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDI)
     7368                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7369                                                    iemCImpl_stos_rax_m64);
    70587370                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    70597371                }
     
    71357447        switch (pVCpu->iem.s.enmEffAddrMode)
    71367448        {
    7137             case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_al_m16, pVCpu->iem.s.iEffSeg);
    7138             case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_al_m32, pVCpu->iem.s.iEffSeg);
    7139             case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_al_m64, pVCpu->iem.s.iEffSeg);
     7449            case IEMMODE_16BIT:
     7450                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7451                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7452                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7453                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7454                                            iemCImpl_lods_al_m16, pVCpu->iem.s.iEffSeg);
     7455            case IEMMODE_32BIT:
     7456                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7457                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7458                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7459                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7460                                            iemCImpl_lods_al_m32, pVCpu->iem.s.iEffSeg);
     7461            case IEMMODE_64BIT:
     7462                IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7463                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7464                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7465                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7466                                            iemCImpl_lods_al_m64, pVCpu->iem.s.iEffSeg);
    71407467            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    71417468        }
     
    71737500                switch (pVCpu->iem.s.enmEffAddrMode)
    71747501                {
    7175                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_ax_m16, pVCpu->iem.s.iEffSeg);
    7176                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_ax_m32, pVCpu->iem.s.iEffSeg);
    7177                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_ax_m64, pVCpu->iem.s.iEffSeg);
     7502                    case IEMMODE_16BIT:
     7503                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7504                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7505                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7506                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7507                                                    iemCImpl_lods_ax_m16, pVCpu->iem.s.iEffSeg);
     7508                    case IEMMODE_32BIT:
     7509                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7510                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7511                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7512                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7513                                                    iemCImpl_lods_ax_m32, pVCpu->iem.s.iEffSeg);
     7514                    case IEMMODE_64BIT:
     7515                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7516                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7517                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7518                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7519                                                    iemCImpl_lods_ax_m64, pVCpu->iem.s.iEffSeg);
    71787520                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    71797521                }
     
    71827524                switch (pVCpu->iem.s.enmEffAddrMode)
    71837525                {
    7184                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_eax_m16, pVCpu->iem.s.iEffSeg);
    7185                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_eax_m32, pVCpu->iem.s.iEffSeg);
    7186                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_eax_m64, pVCpu->iem.s.iEffSeg);
     7526                    case IEMMODE_16BIT:
     7527                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7528                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7529                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7530                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7531                                                    iemCImpl_lods_eax_m16, pVCpu->iem.s.iEffSeg);
     7532                    case IEMMODE_32BIT:
     7533                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7534                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7535                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7536                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7537                                                    iemCImpl_lods_eax_m32, pVCpu->iem.s.iEffSeg);
     7538                    case IEMMODE_64BIT:
     7539                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7540                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7541                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7542                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7543                                                    iemCImpl_lods_eax_m64, pVCpu->iem.s.iEffSeg);
    71877544                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    71887545                }
     
    71917548                {
    71927549                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_7);
    7193                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_rax_m32, pVCpu->iem.s.iEffSeg);
    7194                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP, iemCImpl_lods_rax_m64, pVCpu->iem.s.iEffSeg);
     7550                    case IEMMODE_32BIT:
     7551                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7552                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7553                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7554                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7555                                                    iemCImpl_lods_rax_m32, pVCpu->iem.s.iEffSeg);
     7556                    case IEMMODE_64BIT:
     7557                        IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_REP,
     7558                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     7559                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7560                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7561                                                    iemCImpl_lods_rax_m64, pVCpu->iem.s.iEffSeg);
    71957562                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    71967563                }
     
    72787645        switch (pVCpu->iem.s.enmEffAddrMode)
    72797646        {
    7280             case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_al_m16);
    7281             case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_al_m32);
    7282             case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_al_m64);
     7647            case IEMMODE_16BIT:
     7648                IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7649                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7650                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7651                                            iemCImpl_repe_scas_al_m16);
     7652            case IEMMODE_32BIT:
     7653                IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7654                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7655                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7656                                            iemCImpl_repe_scas_al_m32);
     7657            case IEMMODE_64BIT:
     7658                IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7659                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7660                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7661                                            iemCImpl_repe_scas_al_m64);
    72837662            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    72847663        }
     
    72907669        switch (pVCpu->iem.s.enmEffAddrMode)
    72917670        {
    7292             case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_al_m16);
    7293             case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_al_m32);
    7294             case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_al_m64);
     7671            case IEMMODE_16BIT:
     7672                IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7673                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7674                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7675                                            iemCImpl_repne_scas_al_m16);
     7676            case IEMMODE_32BIT:
     7677                IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7678                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7679                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7680                                            iemCImpl_repne_scas_al_m32);
     7681            case IEMMODE_64BIT:
     7682                IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7683                                              RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7684                                            | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7685                                            iemCImpl_repne_scas_al_m64);
    72957686            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    72967687        }
     
    73287719                switch (pVCpu->iem.s.enmEffAddrMode)
    73297720                {
    7330                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_ax_m16);
    7331                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_ax_m32);
    7332                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_ax_m64);
     7721                    case IEMMODE_16BIT:
     7722                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7723                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7724                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7725                                                    iemCImpl_repe_scas_ax_m16);
     7726                    case IEMMODE_32BIT:
     7727                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7728                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7729                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7730                                                    iemCImpl_repe_scas_ax_m32);
     7731                    case IEMMODE_64BIT:
     7732                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7733                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7734                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7735                                                    iemCImpl_repe_scas_ax_m64);
    73337736                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    73347737                }
     
    73377740                switch (pVCpu->iem.s.enmEffAddrMode)
    73387741                {
    7339                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_eax_m16);
    7340                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_eax_m32);
    7341                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_eax_m64);
     7742                    case IEMMODE_16BIT:
     7743                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7744                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7745                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7746                                                    iemCImpl_repe_scas_eax_m16);
     7747                    case IEMMODE_32BIT:
     7748                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7749                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7750                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7751                                                    iemCImpl_repe_scas_eax_m32);
     7752                    case IEMMODE_64BIT:
     7753                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7754                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7755                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7756                                                    iemCImpl_repe_scas_eax_m64);
    73427757                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    73437758                }
     
    73467761                {
    73477762                    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? */
    7348                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_rax_m32);
    7349                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repe_scas_rax_m64);
     7763                    case IEMMODE_32BIT:
     7764                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7765                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7766                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7767                                                    iemCImpl_repe_scas_rax_m32);
     7768                    case IEMMODE_64BIT:
     7769                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7770                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7771                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7772                                                    iemCImpl_repe_scas_rax_m64);
    73507773                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    73517774                }
     
    73627785                switch (pVCpu->iem.s.enmEffAddrMode)
    73637786                {
    7364                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_ax_m16);
    7365                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_ax_m32);
    7366                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_ax_m64);
     7787                    case IEMMODE_16BIT:
     7788                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7789                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7790                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7791                                                    iemCImpl_repne_scas_ax_m16);
     7792                    case IEMMODE_32BIT:
     7793                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7794                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7795                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7796                                                    iemCImpl_repne_scas_ax_m32);
     7797                    case IEMMODE_64BIT:
     7798                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7799                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7800                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7801                                                    iemCImpl_repne_scas_ax_m64);
    73677802                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    73687803                }
     
    73717806                switch (pVCpu->iem.s.enmEffAddrMode)
    73727807                {
    7373                     case IEMMODE_16BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_eax_m16);
    7374                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_eax_m32);
    7375                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_eax_m64);
     7808                    case IEMMODE_16BIT:
     7809                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7810                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7811                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7812                                                    iemCImpl_repne_scas_eax_m16);
     7813                    case IEMMODE_32BIT:
     7814                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7815                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7816                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7817                                                    iemCImpl_repne_scas_eax_m32);
     7818                    case IEMMODE_64BIT:
     7819                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7820                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7821                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7822                                                    iemCImpl_repne_scas_eax_m64);
    73767823                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    73777824                }
     
    73807827                {
    73817828                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_5);
    7382                     case IEMMODE_32BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_rax_m32);
    7383                     case IEMMODE_64BIT: IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_repne_scas_rax_m64);
     7829                    case IEMMODE_32BIT:
     7830                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7831                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7832                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7833                                                    iemCImpl_repne_scas_rax_m32);
     7834                    case IEMMODE_64BIT:
     7835                        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_REP | IEM_CIMPL_F_STATUS_FLAGS,
     7836                                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSI)
     7837                                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     7838                                                    iemCImpl_repne_scas_rax_m64);
    73847839                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    73857840                }
     
    78698324    {
    78708325        case IEMMODE_16BIT:
    7871             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_iw_16, u16Imm);
     8326            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, 0, iemCImpl_retn_iw_16, u16Imm);
    78728327        case IEMMODE_32BIT:
    7873             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_iw_32, u16Imm);
     8328            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, 0, iemCImpl_retn_iw_32, u16Imm);
    78748329        case IEMMODE_64BIT:
    7875             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_iw_64, u16Imm);
     8330            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, 0, iemCImpl_retn_iw_64, u16Imm);
    78768331        IEM_NOT_REACHED_DEFAULT_CASE_RET();
    78778332    }
     
    78908345    {
    78918346        case IEMMODE_16BIT:
    7892             IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_16);
     8347            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, 0, iemCImpl_retn_16);
    78938348        case IEMMODE_32BIT:
    7894             IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_32);
     8349            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, 0, iemCImpl_retn_32);
    78958350        case IEMMODE_64BIT:
    7896             IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_retn_64);
     8351            IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, 0, iemCImpl_retn_64);
    78978352        IEM_NOT_REACHED_DEFAULT_CASE_RET();
    78988353    }
     
    81538608    uint8_t  u8NestingLevel; IEM_OPCODE_GET_NEXT_U8(&u8NestingLevel);
    81548609    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8155     IEM_MC_DEFER_TO_CIMPL_3_RET(0, iemCImpl_enter, pVCpu->iem.s.enmEffOpSize, cbFrame, u8NestingLevel);
     8610    IEM_MC_DEFER_TO_CIMPL_3_RET(0,
     8611                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     8612                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xBP),
     8613                                iemCImpl_enter, pVCpu->iem.s.enmEffOpSize, cbFrame, u8NestingLevel);
    81568614}
    81578615
     
    81668624    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    81678625    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8168     IEM_MC_DEFER_TO_CIMPL_1_RET(0, iemCImpl_leave, pVCpu->iem.s.enmEffOpSize);
     8626    IEM_MC_DEFER_TO_CIMPL_1_RET(0,
     8627                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     8628                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xBP),
     8629                                iemCImpl_leave, pVCpu->iem.s.enmEffOpSize);
    81698630}
    81708631
     
    81788639    uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    81798640    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8180     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_MODE,
     8641    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK
     8642                                | IEM_CIMPL_F_MODE,
     8643                                  RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_DS)
     8644                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_ES)
     8645                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_FS)
     8646                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_GS)
     8647                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_DS)
     8648                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_ES)
     8649                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_FS)
     8650                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_GS)
     8651                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_DS)
     8652                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_ES)
     8653                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_FS)
     8654                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_GS),
    81818655                                iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, u16Imm);
    81828656}
     
    81908664    IEMOP_MNEMONIC(retf, "retf");
    81918665    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8192     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_MODE,
     8666    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK
     8667                                | IEM_CIMPL_F_MODE,
     8668                                  RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_DS)
     8669                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_ES)
     8670                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_FS)
     8671                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_GS)
     8672                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_DS)
     8673                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_ES)
     8674                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_FS)
     8675                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_GS)
     8676                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_DS)
     8677                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_ES)
     8678                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_FS)
     8679                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_GS),
    81938680                                iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, 0);
    81948681}
     
    82028689    IEMOP_MNEMONIC(int3, "int3");
    82038690    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8204     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    8205                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     8691    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
     8692                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_END_TB, 0,
    82068693                                iemCImpl_int, X86_XCPT_BP, IEMINT_INT3);
    82078694}
     
    82168703    uint8_t u8Int; IEM_OPCODE_GET_NEXT_U8(&u8Int);
    82178704    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8218     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    8219                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     8705    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
     8706                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS, UINT64_MAX,
    82208707                                iemCImpl_int, u8Int, IEMINT_INTN);
     8708    /** @todo make task-switches, ring-switches, ++ return non-zero status */
    82218709}
    82228710
     
    82298717    IEMOP_MNEMONIC(into, "into");
    82308718    IEMOP_HLP_NO_64BIT();
    8231     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_CONDITIONAL
    8232                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     8719    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
     8720                                | IEM_CIMPL_F_BRANCH_CONDITIONAL | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     8721                                UINT64_MAX,
    82338722                                iemCImpl_int, X86_XCPT_OF, IEMINT_INTO);
     8723    /** @todo make task-switches, ring-switches, ++ return non-zero status */
    82348724}
    82358725
     
    82428732    IEMOP_MNEMONIC(iret, "iret");
    82438733    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8244     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
     8734    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
    82458735                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_CHECK_IRQ_BEFORE | IEM_CIMPL_F_VMEXIT,
     8736                                  RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_DS)
     8737                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_DS)
     8738                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_DS)
     8739                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_ES)
     8740                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_ES)
     8741                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_ES)
     8742                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_FS)
     8743                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_FS)
     8744                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_FS)
     8745                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_GS)
     8746                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_GS)
     8747                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_GS),
    82468748                                iemCImpl_iret, pVCpu->iem.s.enmEffOpSize);
     8749    /* Segment registers are sanitized when returning to an outer ring, or fully
     8750       reloaded when returning  to v86 mode.  Thus the large flush list above. */
    82478751}
    82488752
     
    86659169    if (!bImm)
    86669170        IEMOP_RAISE_DIVIDE_ERROR_RET();
    8667     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_aam, bImm);
     9171    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_STATUS_FLAGS, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX), iemCImpl_aam, bImm);
    86689172}
    86699173
     
    86789182    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    86799183    IEMOP_HLP_NO_64BIT();
    8680     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_STATUS_FLAGS, iemCImpl_aad, bImm);
     9184    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_STATUS_FLAGS, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX), iemCImpl_aad, bImm);
    86819185}
    86829186
     
    1057111075    IEMOP_MNEMONIC(fninit, "fninit");
    1057211076    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    10573     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_FPU, iemCImpl_finit, false /*fCheckXcpts*/);
     11077    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_FPU, 0, iemCImpl_finit, false /*fCheckXcpts*/);
    1057411078}
    1057511079
     
    1060811112{
    1060911113    IEMOP_MNEMONIC(fucomi_st0_stN, "fucomi st0,stN");
    10610     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS,
     11114    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS, 0,
    1061111115                                iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), true /*fUCmp*/,
    1061211116                                0 /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
     
    1061811122{
    1061911123    IEMOP_MNEMONIC(fcomi_st0_stN, "fcomi st0,stN");
    10620     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS,
     11124    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS, 0,
    1062111125                                iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), false /*fUCmp*/,
    1062211126                                false /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
     
    1153912043{
    1154012044    IEMOP_MNEMONIC(fucomip_st0_stN, "fucomip st0,stN");
    11541     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS,
     12045    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS, 0,
    1154212046                                iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), false /*fUCmp*/,
    1154312047                                RT_BIT_32(31) /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
     
    1154912053{
    1155012054    IEMOP_MNEMONIC(fcomip_st0_stN, "fcomip st0,stN");
    11551     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS,
     12055    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_FPU | IEM_CIMPL_F_STATUS_FLAGS, 0,
    1155212056                                iemCImpl_fcomi_fucomi, IEM_GET_MODRM_RM_8(bRm), false /*fUCmp*/,
    1155312057                                RT_BIT_32(31) /*fPop*/ | pVCpu->iem.s.uFpuOpcode);
     
    1211912623    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1212012624    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12121     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     12625    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX),
    1212212626                                iemCImpl_in, u8Imm, 1, 0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
    1212312627}
     
    1213012634    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1213112635    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12132     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     12636    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO, RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX),
    1213312637                                iemCImpl_in, u8Imm, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
    1213412638                                0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
     
    1214212646    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1214312647    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12144     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     12648    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO, 0,
    1214512649                                iemCImpl_out, u8Imm, 1, 0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
    1214612650}
     
    1215312657    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1215412658    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12155     IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     12659    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO, 0,
    1215612660                                iemCImpl_out, u8Imm, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
    1215712661                                0x80 /* fImm */ | pVCpu->iem.s.enmEffAddrMode);
     
    1217112675        {
    1217212676            uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    12173             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_RELATIVE, iemCImpl_call_rel_16, (int16_t)u16Imm);
     12677            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_RELATIVE | IEM_CIMPL_F_BRANCH_STACK, 0,
     12678                                        iemCImpl_call_rel_16, (int16_t)u16Imm);
    1217412679        }
    1217512680
     
    1217712682        {
    1217812683            uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
    12179             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_RELATIVE, iemCImpl_call_rel_32, (int32_t)u32Imm);
     12684            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_RELATIVE | IEM_CIMPL_F_BRANCH_STACK, 0,
     12685                                        iemCImpl_call_rel_32, (int32_t)u32Imm);
    1218012686        }
    1218112687
     
    1218312689        {
    1218412690            uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
    12185             IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_RELATIVE, iemCImpl_call_rel_64, u64Imm);
     12691            IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_RELATIVE | IEM_CIMPL_F_BRANCH_STACK, 0,
     12692                                        iemCImpl_call_rel_64, u64Imm);
    1218612693        }
    1218712694
     
    1223912746    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1224012747    IEM_MC_DEFER_TO_CIMPL_3_RET(IEM_CIMPL_F_BRANCH_DIRECT | IEM_CIMPL_F_BRANCH_FAR
    12241                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT,
     12748                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, UINT64_MAX,
    1224212749                                iemCImpl_FarJmp, u16Sel, off32Seg, pVCpu->iem.s.enmEffOpSize);
     12750    /** @todo make task-switches, ring-switches, ++ return non-zero status */
    1224312751}
    1224412752
     
    1226612774    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1226712775    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     12776                                RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX),
    1226812777                                iemCImpl_in_eAX_DX, 1, pVCpu->iem.s.enmEffAddrMode);
    1226912778}
     
    1227612785    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1227712786    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     12787                                RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX),
    1227812788                                iemCImpl_in_eAX_DX, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
    1227912789                                pVCpu->iem.s.enmEffAddrMode);
     
    1228612796    IEMOP_MNEMONIC(out_DX_AL, "out DX,AL");
    1228712797    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12288     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     12798    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO, 0,
    1228912799                                iemCImpl_out_DX_eAX, 1, pVCpu->iem.s.enmEffAddrMode);
    1229012800}
     
    1229612806    IEMOP_MNEMONIC(out_DX_eAX, "out DX,eAX");
    1229712807    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12298     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO,
     12808    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_IO, 0,
    1229912809                                iemCImpl_out_DX_eAX, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4,
    1230012810                                pVCpu->iem.s.enmEffAddrMode);
     
    1232712837    IEMOP_HLP_MIN_386();
    1232812838    /** @todo testcase! */
    12329     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    12330                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS,
     12839    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
     12840                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_END_TB, 0,
    1233112841                                iemCImpl_int, X86_XCPT_DB, IEMINT_INT1);
    1233212842}
     
    1237812888    IEMOP_MNEMONIC(hlt, "hlt");
    1237912889    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    12380     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_END_TB | IEM_CIMPL_F_VMEXIT, iemCImpl_hlt);
     12890    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_END_TB | IEM_CIMPL_F_VMEXIT, 0, iemCImpl_hlt);
    1238112891}
    1238212892
     
    1320313713    IEMOP_MNEMONIC(cli, "cli");
    1320413714    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    13205     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_CHECK_IRQ_BEFORE, iemCImpl_cli);
     13715    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_CHECK_IRQ_BEFORE, 0, iemCImpl_cli);
    1320613716}
    1320713717
     
    1321213722    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1321313723    IEM_MC_DEFER_TO_CIMPL_0_RET(  IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_CHECK_IRQ_AFTER
    13214                                 | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_INHIBIT_SHADOW, iemCImpl_sti);
     13724                                | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_INHIBIT_SHADOW, 0, iemCImpl_sti);
    1321513725}
    1321613726
     
    1332013830                IEM_MC_ARG(uint16_t, u16Target, 0);
    1332113831                IEM_MC_FETCH_GREG_U16(u16Target, IEM_GET_MODRM_RM(pVCpu, bRm));
    13322                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_16, u16Target);
     13832                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, iemCImpl_call_16, u16Target);
    1332313833                IEM_MC_END();
    1332413834                break;
     
    1332913839                IEM_MC_ARG(uint32_t, u32Target, 0);
    1333013840                IEM_MC_FETCH_GREG_U32(u32Target, IEM_GET_MODRM_RM(pVCpu, bRm));
    13331                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_32, u32Target);
     13841                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, iemCImpl_call_32, u32Target);
    1333213842                IEM_MC_END();
    1333313843                break;
     
    1333813848                IEM_MC_ARG(uint64_t, u64Target, 0);
    1333913849                IEM_MC_FETCH_GREG_U64(u64Target, IEM_GET_MODRM_RM(pVCpu, bRm));
    13340                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_64, u64Target);
     13850                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, iemCImpl_call_64, u64Target);
    1334113851                IEM_MC_END();
    1334213852                break;
     
    1335713867                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1335813868                IEM_MC_FETCH_MEM_U16(u16Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    13359                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_16, u16Target);
     13869                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, iemCImpl_call_16, u16Target);
    1336013870                IEM_MC_END();
    1336113871                break;
     
    1336813878                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1336913879                IEM_MC_FETCH_MEM_U32(u32Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    13370                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_32, u32Target);
     13880                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, iemCImpl_call_32, u32Target);
    1337113881                IEM_MC_END();
    1337213882                break;
     
    1337913889                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1338013890                IEM_MC_FETCH_MEM_U64(u64Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    13381                 IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT, iemCImpl_call_64, u64Target);
     13891                IEM_MC_CALL_CIMPL_1(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_STACK, iemCImpl_call_64, u64Target);
    1338213892                IEM_MC_END();
    1338313893                break;
     
    1338813898}
    1338913899
    13390 #define IEMOP_BODY_GRP5_FAR_EP(a_bRm, a_fnCImpl) \
     13900#define IEMOP_BODY_GRP5_FAR_EP(a_bRm, a_fnCImpl, a_fCImplExtra) \
    1339113901    /* Registers? How?? */ \
    1339213902    if (RT_LIKELY(IEM_IS_MODRM_MEM_MODE(a_bRm))) \
     
    1341613926            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 2); \
    1341713927            IEM_MC_HINT_FLUSH_GUEST_SHADOW_GREG(X86_GREG_xSP); \
    13418             IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR \
     13928            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | (a_fCImplExtra) \
    1341913929                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, \
    1342013930                                a_fnCImpl, u16Sel, offSeg, enmEffOpSize); \
     
    1343313943            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 4); \
    1343413944            IEM_MC_HINT_FLUSH_GUEST_SHADOW_GREG(X86_GREG_xSP); \
    13435             IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR \
     13945            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | (a_fCImplExtra) \
    1343613946                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, \
    1343713947                                a_fnCImpl, u16Sel, offSeg, enmEffOpSize); \
     
    1345113961            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 8); \
    1345213962            IEM_MC_HINT_FLUSH_GUEST_SHADOW_GREG(X86_GREG_xSP); \
    13453             IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_MODE /* no gates */, \
     13963            IEM_MC_CALL_CIMPL_3(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | (a_fCImplExtra) \
     13964                                | IEM_CIMPL_F_MODE /* no gates */, \
    1345413965                                a_fnCImpl, u16Sel, offSeg, enmEffOpSize); \
    1345513966            IEM_MC_END(); \
     
    1346713978{
    1346813979    IEMOP_MNEMONIC(callf_Ep, "callf Ep");
    13469     IEMOP_BODY_GRP5_FAR_EP(bRm, iemCImpl_callf);
     13980    IEMOP_BODY_GRP5_FAR_EP(bRm, iemCImpl_callf, IEM_CIMPL_F_BRANCH_STACK);
    1347013981}
    1347113982
     
    1356614077{
    1356714078    IEMOP_MNEMONIC(jmpf_Ep, "jmpf Ep");
    13568     IEMOP_BODY_GRP5_FAR_EP(bRm, iemCImpl_FarJmp);
     14079    IEMOP_BODY_GRP5_FAR_EP(bRm, iemCImpl_FarJmp, 0);
    1356914080}
    1357014081
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r101958 r101984  
    19591959    'IEM_CIMPL_F_BRANCH_ANY':           ('IEM_CIMPL_F_BRANCH_DIRECT', 'IEM_CIMPL_F_BRANCH_INDIRECT',
    19601960                                         'IEM_CIMPL_F_BRANCH_RELATIVE',),
     1961    'IEM_CIMPL_F_BRANCH_STACK':         (),
     1962    'IEM_CIMPL_F_BRANCH_STACK_FAR':     (),
    19611963    'IEM_CIMPL_F_MODE':                 (),
    19621964    'IEM_CIMPL_F_RFLAGS':               (),
     
    22142216            for sFlag in sFlags.split('|'):
    22152217                sFlag = sFlag.strip();
     2218                if sFlag[0] == '(':  sFlag = sFlag[1:].strip();
     2219                if sFlag[-1] == ')': sFlag = sFlag[:-1].strip();
    22162220                #print('debug:   %s' % sFlag)
    22172221                if sFlag not in g_kdCImplFlags:
     2222                    if sFlag == '0':
     2223                        continue;
    22182224                    self.raiseStmtError(sName, 'Unknown flag: %s' % (sFlag, ));
    22192225                self.dsCImplFlags[sFlag] = True;
     
    22332239    def parseMcDeferToCImpl(oSelf, sName, asParams):
    22342240        """ IEM_MC_DEFER_TO_CIMPL_[0|1|2|3]_RET """
     2241        # Note! This code is called by workerIemMcDeferToCImplXRet.
    22352242        #print('debug: %s, %s,...' % (sName, asParams[0],));
    22362243        cArgs = int(sName[-5]);
    2237         oSelf.checkStmtParamCount(sName, asParams, 2 + cArgs);
     2244        oSelf.checkStmtParamCount(sName, asParams, 3 + cArgs);
    22382245        oSelf.parseCImplFlags(sName, asParams[0]);
    2239         return McStmtCall(sName, asParams, 1);
     2246        return McStmtCall(sName, asParams, 2);
    22402247
    22412248    @staticmethod
     
    51865193        if asArgs is None:
    51875194            self.raiseError('%s: Closing parenthesis not found!' % (sStmt,));
    5188         if len(asArgs) != cParams + 3:
    5189             self.raiseError('%s: findAndParseMacroInvocationEx returns %s args, expected %s!'
    5190                             % (sStmt, len(asArgs), cParams + 3,));
     5195        if len(asArgs) != cParams + 4:
     5196            self.raiseError('%s: findAndParseMacroInvocationEx returns %s args, expected %s! (%s)'
     5197                            % (sStmt, len(asArgs), cParams + 4, asArgs));
    51915198
    51925199        oMcBlock.aoStmts = [ McBlock.parseMcDeferToCImpl(oMcBlock, asArgs[0], asArgs[1:]), ];
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h

    r101958 r101984  
    12001200    {
    12011201        IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    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);
     1202        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT,  0,
     1203                                    iemCImpl_sldt_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
    12031204    }
    12041205
     
    12251226    {
    12261227        IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    1227         IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, 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, 0,
     1229                                    iemCImpl_str_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
    12281230    }
    12291231
     
    13971399             hypercall isn't handled by GIM or HMSvm will raise an #UD.
    13981400             (NEM/win makes ASSUMPTIONS about this behavior.)  */
    1399     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT, iemCImpl_vmcall);
     1401    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB, 0, iemCImpl_vmcall);
    14001402}
    14011403
     
    14101412    IEMOP_HLP_DONE_DECODING();
    14111413    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    1412                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB,
     1414                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB, 0,
    14131415                                iemCImpl_vmlaunch);
    14141416}
     
    14311433    IEMOP_HLP_DONE_DECODING();
    14321434    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    1433                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB,
     1435                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB, 0,
    14341436                                iemCImpl_vmresume);
    14351437}
     
    14511453    IEMOP_HLP_VMX_INSTR("vmxoff", kVmxVDiag_Vmxoff);
    14521454    IEMOP_HLP_DONE_DECODING();
    1453     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmxoff);
     1455    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_vmxoff);
    14541456}
    14551457#else
     
    14831485    IEMOP_MNEMONIC(monitor, "monitor");
    14841486    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo Verify that monitor is allergic to lock prefixes. */
    1485     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_monitor, pVCpu->iem.s.iEffSeg);
     1487    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_monitor, pVCpu->iem.s.iEffSeg);
    14861488}
    14871489
     
    14921494    IEMOP_MNEMONIC(mwait, "mwait"); /** @todo Verify that mwait is allergic to lock prefixes. */
    14931495    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1494     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_END_TB | IEM_CIMPL_F_VMEXIT, iemCImpl_mwait);
     1496    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_END_TB | IEM_CIMPL_F_VMEXIT, 0, iemCImpl_mwait);
    14951497}
    14961498
     
    15241526 *        OPSIZE one ... */
    15251527        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
    1526         IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_xgetbv);
     1528        IEM_MC_DEFER_TO_CIMPL_0_RET(0,
     1529                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     1530                                    | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDX),
     1531                                    iemCImpl_xgetbv);
    15271532    }
    15281533    IEMOP_RAISE_INVALID_OPCODE_RET();
     
    15421547 *        OPSIZE one ... */
    15431548        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
    1544         IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_xsetbv);
     1549        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_xsetbv);
    15451550    }
    15461551    IEMOP_RAISE_INVALID_OPCODE_RET();
     
    15711576    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    15721577    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    1573                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB,
     1578                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB, 0,
    15741579                                iemCImpl_vmrun);
    15751580}
     
    15911596             hypercall isn't handled by GIM or HMSvm will raise an #UD.
    15921597             (NEM/win makes ASSUMPTIONS about this behavior.) */
    1593     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmmcall);
     1598    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB, 0, iemCImpl_vmmcall);
    15941599}
    15951600
     
    16001605    IEMOP_MNEMONIC(vmload, "vmload");
    16011606    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1602     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmload);
     1607    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_vmload);
    16031608}
    16041609#else
     
    16131618    IEMOP_MNEMONIC(vmsave, "vmsave");
    16141619    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1615     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_vmsave);
     1620    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_vmsave);
    16161621}
    16171622#else
     
    16261631    IEMOP_MNEMONIC(stgi, "stgi");
    16271632    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1628     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_stgi);
     1633    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_stgi);
    16291634}
    16301635#else
     
    16391644    IEMOP_MNEMONIC(clgi, "clgi");
    16401645    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1641     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_clgi);
     1646    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_clgi);
    16421647}
    16431648#else
     
    16521657    IEMOP_MNEMONIC(invlpga, "invlpga");
    16531658    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1654     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_invlpga);
     1659    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_invlpga);
    16551660}
    16561661#else
     
    16651670    IEMOP_MNEMONIC(skinit, "skinit");
    16661671    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo check prefix effect on the SVM instructions. ASSUMING no lock for now. */
    1667     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_skinit);
     1672    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_skinit);
    16681673}
    16691674#else
     
    16801685    {
    16811686        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1682         IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_smsw_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
     1687        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, 0,
     1688                                    iemCImpl_smsw_reg, IEM_GET_MODRM_RM(pVCpu, bRm), pVCpu->iem.s.enmEffOpSize);
    16831689    }
    16841690
     
    17451751    IEMOP_HLP_ONLY_64BIT();
    17461752    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1747     IEM_MC_DEFER_TO_CIMPL_0_RET(0, iemCImpl_swapgs);
     1753    IEM_MC_DEFER_TO_CIMPL_0_RET(0, RT_BIT_64(kIemNativeGstReg_SegBaseFirst + X86_SREG_GS), iemCImpl_swapgs);
    17481754}
    17491755
     
    17541760    IEMOP_MNEMONIC(rdtscp, "rdtscp");
    17551761    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1756     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_rdtscp);
     1762    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT,
     1763                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     1764                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDX)
     1765                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX),
     1766                                iemCImpl_rdtscp);
    17571767}
    17581768
     
    19581968    IEMOP_MNEMONIC(syscall, "syscall"); /** @todo 286 LOADALL   */
    19591969    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1960     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    1961                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_END_TB,
     1970    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
     1971                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_END_TB, 0,
    19621972                                iemCImpl_syscall);
    19631973}
     
    19691979    IEMOP_MNEMONIC(clts, "clts");
    19701980    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1971     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_clts);
     1981    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_clts);
    19721982}
    19731983
     
    19781988    IEMOP_MNEMONIC(sysret, "sysret");  /** @todo 386 LOADALL   */
    19791989    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1980     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    1981                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_END_TB,
     1990    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
     1991                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_END_TB, 0,
    19821992                                iemCImpl_sysret, pVCpu->iem.s.enmEffOpSize);
    19831993}
     
    19902000    IEMOP_HLP_MIN_486();
    19912001    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1992     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_invd);
     2002    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_invd);
    19932003}
    19942004
     
    20002010    IEMOP_HLP_MIN_486();
    20012011    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    2002     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_wbinvd);
     2012    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_wbinvd);
    20032013}
    20042014
     
    32843294{
    32853295    /* mod is ignored, as is operand size overrides. */
     3296/** @todo testcase: check memory encoding. */
    32863297    IEMOP_MNEMONIC(mov_Rd_Cd, "mov Rd,Cd");
    32873298    IEMOP_HLP_MIN_386();
     
    33093320    IEMOP_HLP_DONE_DECODING();
    33103321
    3311     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_mov_Rd_Cd, IEM_GET_MODRM_RM(pVCpu, bRm), iCrReg);
     3322    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT,
     3323                                RT_BIT_64(kIemNativeGstReg_GprFirst + IEM_GET_MODRM_RM(pVCpu, bRm)),
     3324                                iemCImpl_mov_Rd_Cd, IEM_GET_MODRM_RM(pVCpu, bRm), iCrReg);
    33123325}
    33133326
     
    33163329FNIEMOP_DEF(iemOp_mov_Rd_Dd)
    33173330{
     3331/** @todo testcase: check memory encoding. */
    33183332    IEMOP_MNEMONIC(mov_Rd_Dd, "mov Rd,Dd");
    33193333    IEMOP_HLP_MIN_386();
     
    33223336    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX_R)
    33233337        IEMOP_RAISE_INVALID_OPCODE_RET();
    3324     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));
     3338    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT,
     3339                                RT_BIT_64(kIemNativeGstReg_GprFirst + IEM_GET_MODRM_RM(pVCpu, bRm)),
     3340                                iemCImpl_mov_Rd_Dd, IEM_GET_MODRM_RM(pVCpu, bRm), IEM_GET_MODRM_REG_8(bRm));
    33253341}
    33263342
     
    33563372
    33573373    if (iCrReg & (2 | 8))
    3358         IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT,
     3374        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_VMEXIT, 0,
    33593375                                    iemCImpl_mov_Cd_Rd, iCrReg, IEM_GET_MODRM_RM(pVCpu, bRm));
    33603376    else
    3361         IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT,
     3377        IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT, 0,
    33623378                                    iemCImpl_mov_Cd_Rd, iCrReg, IEM_GET_MODRM_RM(pVCpu, bRm));
    33633379}
     
    33733389    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX_R)
    33743390        IEMOP_RAISE_INVALID_OPCODE_RET();
    3375     IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT,
     3391    IEM_MC_DEFER_TO_CIMPL_2_RET(IEM_CIMPL_F_MODE | IEM_CIMPL_F_VMEXIT, 0,
    33763392                                iemCImpl_mov_Dd_Rd, IEM_GET_MODRM_REG_8(bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    33773393}
     
    33873403    if (RT_LIKELY(IEM_GET_TARGET_CPU(pVCpu) >= IEMTARGETCPU_PENTIUM))
    33883404        IEMOP_RAISE_INVALID_OPCODE_RET();
    3389     IEM_MC_DEFER_TO_CIMPL_2_RET(0, iemCImpl_mov_Rd_Td, IEM_GET_MODRM_RM(pVCpu, bRm), IEM_GET_MODRM_REG_8(bRm));
     3405    IEM_MC_DEFER_TO_CIMPL_2_RET(0, RT_BIT_64(kIemNativeGstReg_GprFirst + IEM_GET_MODRM_RM(pVCpu, bRm)),
     3406                                iemCImpl_mov_Rd_Td, IEM_GET_MODRM_RM(pVCpu, bRm), IEM_GET_MODRM_REG_8(bRm));
    33903407}
    33913408
     
    34003417    if (RT_LIKELY(IEM_GET_TARGET_CPU(pVCpu) >= IEMTARGETCPU_PENTIUM))
    34013418        IEMOP_RAISE_INVALID_OPCODE_RET();
    3402     IEM_MC_DEFER_TO_CIMPL_2_RET(0, iemCImpl_mov_Td_Rd, IEM_GET_MODRM_REG_8(bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
     3419    IEM_MC_DEFER_TO_CIMPL_2_RET(0, 0, iemCImpl_mov_Td_Rd, IEM_GET_MODRM_REG_8(bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    34033420}
    34043421
     
    51395156    IEMOP_MNEMONIC(wrmsr, "wrmsr");
    51405157    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5141     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_wrmsr);
     5158    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, 0, iemCImpl_wrmsr);
    51425159}
    51435160
     
    51485165    IEMOP_MNEMONIC(rdtsc, "rdtsc");
    51495166    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5150     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_rdtsc);
     5167    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT,
     5168                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     5169                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDX),
     5170                                iemCImpl_rdtsc);
    51515171}
    51525172
     
    51575177    IEMOP_MNEMONIC(rdmsr, "rdmsr");
    51585178    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5159     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_rdmsr);
     5179    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT,
     5180                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     5181                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDX),
     5182                                iemCImpl_rdmsr);
    51605183}
    51615184
     
    51665189    IEMOP_MNEMONIC(rdpmc, "rdpmc");
    51675190    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5168     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_rdpmc);
     5191    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT,
     5192                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     5193                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDX),
     5194                                iemCImpl_rdpmc);
    51695195}
    51705196
     
    51755201    IEMOP_MNEMONIC0(FIXED, SYSENTER, sysenter, DISOPTYPE_CONTROLFLOW | DISOPTYPE_UNCOND_CONTROLFLOW, 0);
    51765202    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5177     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    5178                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB,
     5203    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
     5204                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB, 0,
    51795205                                iemCImpl_sysenter);
    51805206}
     
    51855211    IEMOP_MNEMONIC0(FIXED, SYSEXIT, sysexit, DISOPTYPE_CONTROLFLOW | DISOPTYPE_UNCOND_CONTROLFLOW, 0);
    51865212    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5187     IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    5188                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB,
     5213    IEM_MC_DEFER_TO_CIMPL_1_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
     5214                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB, 0,
    51895215                                iemCImpl_sysexit, pVCpu->iem.s.enmEffOpSize);
    51905216}
     
    89018927    IEMOP_HLP_MIN_386();
    89028928    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8903     IEM_MC_DEFER_TO_CIMPL_2_RET(0, iemCImpl_pop_Sreg, X86_SREG_FS, pVCpu->iem.s.enmEffOpSize);
     8929    IEM_MC_DEFER_TO_CIMPL_2_RET(0,
     8930                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     8931                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_FS)
     8932                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_FS)
     8933                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_FS),
     8934                                iemCImpl_pop_Sreg, X86_SREG_FS, pVCpu->iem.s.enmEffOpSize);
    89048935}
    89058936
     
    89118942    IEMOP_HLP_MIN_486(); /* not all 486es. */
    89128943    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8913     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT, iemCImpl_cpuid);
     8944    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_VMEXIT,
     8945                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     8946                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xCX)
     8947                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xDX)
     8948                                | RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xBX),
     8949                                iemCImpl_cpuid);
    89148950}
    89158951
     
    96929728    IEMOP_HLP_MIN_386();
    96939729    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    9694     IEM_MC_DEFER_TO_CIMPL_2_RET(0, iemCImpl_pop_Sreg, X86_SREG_GS, pVCpu->iem.s.enmEffOpSize);
     9730    IEM_MC_DEFER_TO_CIMPL_2_RET(0,
     9731                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     9732                                | RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_GS)
     9733                                | RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_GS)
     9734                                | RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_GS),
     9735                                iemCImpl_pop_Sreg, X86_SREG_GS, pVCpu->iem.s.enmEffOpSize);
    96959736}
    96969737
     
    97029743    IEMOP_HLP_MIN_386(); /* 386SL and later. */
    97039744    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    9704     IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR
    9705                                 | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB,
     9745    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR
     9746                                | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT | IEM_CIMPL_F_END_TB, 0,
    97069747                                iemCImpl_rsm);
    97079748}
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp

    r101958 r101984  
    21602160    /* [kIemNativeGstReg_Pc] = */                       { CPUMCTX_OFF_AND_SIZE(rip),                "rip", },
    21612161    /* [kIemNativeGstReg_EFlags] = */                   { CPUMCTX_OFF_AND_SIZE(eflags),             "eflags", },
    2162     /* [18] = */                                        { UINT32_C(0xfffffff7),                  0, NULL, },
    2163     /* [19] = */                                        { UINT32_C(0xfffffff5),                  0, NULL, },
    2164     /* [20] = */                                        { UINT32_C(0xfffffff3),                  0, NULL, },
    2165     /* [21] = */                                        { UINT32_C(0xfffffff1),                  0, NULL, },
    2166     /* [22] = */                                        { UINT32_C(0xffffffef),                  0, NULL, },
    2167     /* [23] = */                                        { UINT32_C(0xffffffed),                  0, NULL, },
    21682162    /* [kIemNativeGstReg_SegSelFirst + 0] = */          { CPUMCTX_OFF_AND_SIZE(aSRegs[0].Sel),      "es", },
    21692163    /* [kIemNativeGstReg_SegSelFirst + 1] = */          { CPUMCTX_OFF_AND_SIZE(aSRegs[1].Sel),      "cs", },
     
    34603454
    34613455/**
     3456 * Converts IEM_CIMPL_F_XXX flags into a guest register shadow copy flush mask.
     3457 *
     3458 * @returns The flush mask.
     3459 * @param   fCImpl          The IEM_CIMPL_F_XXX flags.
     3460 * @param   fGstShwFlush    The starting flush mask.
     3461 */
     3462DECL_FORCE_INLINE(uint64_t) iemNativeCImplFlagsToGuestShadowFlushMask(uint32_t fCImpl, uint64_t fGstShwFlush)
     3463{
     3464    if (fCImpl & IEM_CIMPL_F_BRANCH_FAR)
     3465        fGstShwFlush |= RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_CS)
     3466                     |  RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_CS)
     3467                     |  RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_CS);
     3468    if (fCImpl & IEM_CIMPL_F_BRANCH_STACK_FAR)
     3469        fGstShwFlush |= RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP)
     3470                     |  RT_BIT_64(kIemNativeGstReg_SegSelFirst   + X86_SREG_SS)
     3471                     |  RT_BIT_64(kIemNativeGstReg_SegBaseFirst  + X86_SREG_SS)
     3472                     |  RT_BIT_64(kIemNativeGstReg_SegLimitFirst + X86_SREG_SS);
     3473    else if (fCImpl & IEM_CIMPL_F_BRANCH_STACK)
     3474        fGstShwFlush |= RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xSP);
     3475    if (fCImpl & (IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_STATUS_FLAGS | IEM_CIMPL_F_INHIBIT_SHADOW))
     3476        fGstShwFlush |= RT_BIT_64(kIemNativeGstReg_EFlags);
     3477    return fGstShwFlush;
     3478}
     3479
     3480
     3481/**
    34623482 * Emits a call to a CImpl function or something similar.
    34633483 */
    3464 static int32_t iemNativeEmitCImplCall(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxInstr,
     3484static int32_t iemNativeEmitCImplCall(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxInstr, uint64_t fGstShwFlush,
    34653485                                      uintptr_t pfnCImpl, uint8_t cbInstr, uint8_t cAddParams,
    34663486                                      uint64_t uParam0, uint64_t uParam1, uint64_t uParam2)
    34673487{
    3468     iemNativeRegFlushGuestShadows(pReNative, UINT64_MAX); /** @todo optimize this */
     3488    /*
     3489     * Flush stuff.
     3490     */
     3491    fGstShwFlush = iemNativeCImplFlagsToGuestShadowFlushMask(pReNative->fCImpl, fGstShwFlush | RT_BIT_64(kIemNativeGstReg_Pc));
     3492    iemNativeRegFlushGuestShadows(pReNative, fGstShwFlush);
     3493
    34693494    off = iemNativeRegMoveAndFreeAndFlushAtCall(pReNative, off, 4);
    34703495
     
    39163941*********************************************************************************************************************************/
    39173942
    3918 #define IEM_MC_DEFER_TO_CIMPL_0_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl) \
     3943#define IEM_MC_DEFER_TO_CIMPL_0_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl) \
    39193944    pReNative->fMc    = 0; \
    39203945    pReNative->fCImpl = (a_fFlags); \
    3921     return iemNativeEmitCImplCall0(pReNative, off, pCallEntry->idxInstr, (uintptr_t)a_pfnCImpl, a_cbInstr) /** @todo not used ... */
    3922 
    3923 
    3924 #define IEM_MC_DEFER_TO_CIMPL_1_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0) \
     3946    return iemNativeEmitCImplCall0(pReNative, off, pCallEntry->idxInstr, a_fGstShwFlush, (uintptr_t)a_pfnCImpl, a_cbInstr) /** @todo not used ... */
     3947
     3948
     3949#define IEM_MC_DEFER_TO_CIMPL_1_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0) \
    39253950    pReNative->fMc    = 0; \
    39263951    pReNative->fCImpl = (a_fFlags); \
    3927     return iemNativeEmitCImplCall1(pReNative, off, pCallEntry->idxInstr, (uintptr_t)a_pfnCImpl, a_cbInstr, a0)
    3928 
    3929 DECL_INLINE_THROW(uint32_t) iemNativeEmitCImplCall1(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxInstr,
     3952    return iemNativeEmitCImplCall1(pReNative, off, pCallEntry->idxInstr, a_fGstShwFlush, (uintptr_t)a_pfnCImpl, a_cbInstr, a0)
     3953
     3954DECL_INLINE_THROW(uint32_t) iemNativeEmitCImplCall1(PIEMRECOMPILERSTATE pReNative, uint32_t off,
     3955                                                    uint8_t idxInstr, uint64_t a_fGstShwFlush,
    39303956                                                    uintptr_t pfnCImpl, uint8_t cbInstr, uint64_t uArg0)
    39313957{
    3932     return iemNativeEmitCImplCall(pReNative, off, idxInstr, pfnCImpl, cbInstr, 1, uArg0, 0, 0);
    3933 }
    3934 
    3935 
    3936 #define IEM_MC_DEFER_TO_CIMPL_2_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1) \
     3958    return iemNativeEmitCImplCall(pReNative, off, idxInstr, a_fGstShwFlush, pfnCImpl, cbInstr, 1, uArg0, 0, 0);
     3959}
     3960
     3961
     3962#define IEM_MC_DEFER_TO_CIMPL_2_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1) \
    39373963    pReNative->fMc    = 0; \
    39383964    pReNative->fCImpl = (a_fFlags); \
    3939     return iemNativeEmitCImplCall2(pReNative, off, pCallEntry->idxInstr, (uintptr_t)a_pfnCImpl, a_cbInstr, a0, a1)
    3940 
    3941 DECL_INLINE_THROW(uint32_t) iemNativeEmitCImplCall2(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxInstr,
     3965    return iemNativeEmitCImplCall2(pReNative, off, pCallEntry->idxInstr, a_fGstShwFlush, \
     3966                                   (uintptr_t)a_pfnCImpl, a_cbInstr, a0, a1)
     3967
     3968DECL_INLINE_THROW(uint32_t) iemNativeEmitCImplCall2(PIEMRECOMPILERSTATE pReNative, uint32_t off,
     3969                                                    uint8_t idxInstr, uint64_t a_fGstShwFlush,
    39423970                                                    uintptr_t pfnCImpl, uint8_t cbInstr, uint64_t uArg0, uint64_t uArg1)
    39433971{
    3944     return iemNativeEmitCImplCall(pReNative, off, idxInstr, pfnCImpl, cbInstr, 2, uArg0, uArg1, 0);
    3945 }
    3946 
    3947 
    3948 #define IEM_MC_DEFER_TO_CIMPL_3_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1, a2) \
     3972    return iemNativeEmitCImplCall(pReNative, off, idxInstr, a_fGstShwFlush, pfnCImpl, cbInstr, 2, uArg0, uArg1, 0);
     3973}
     3974
     3975
     3976#define IEM_MC_DEFER_TO_CIMPL_3_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1, a2) \
    39493977    pReNative->fMc    = 0; \
    39503978    pReNative->fCImpl = (a_fFlags); \
    3951     return iemNativeEmitCImplCall3(pReNative, off, pCallEntry->idxInstr, (uintptr_t)a_pfnCImpl, a_cbInstr, a0, a1, a2)
    3952 
    3953 DECL_INLINE_THROW(uint32_t) iemNativeEmitCImplCall3(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxInstr,
     3979    return iemNativeEmitCImplCall3(pReNative, off, pCallEntry->idxInstr, a_fGstShwFlush, \
     3980                                   (uintptr_t)a_pfnCImpl, a_cbInstr, a0, a1, a2)
     3981
     3982DECL_INLINE_THROW(uint32_t) iemNativeEmitCImplCall3(PIEMRECOMPILERSTATE pReNative, uint32_t off,
     3983                                                    uint8_t idxInstr, uint64_t a_fGstShwFlush,
    39543984                                                    uintptr_t pfnCImpl, uint8_t cbInstr, uint64_t uArg0, uint64_t uArg1,
    39553985                                                    uint64_t uArg2)
    39563986{
    3957     return iemNativeEmitCImplCall(pReNative, off, idxInstr, pfnCImpl, cbInstr, 3, uArg0, uArg1, uArg2);
     3987    return iemNativeEmitCImplCall(pReNative, off, idxInstr, a_fGstShwFlush, pfnCImpl, cbInstr, 3, uArg0, uArg1, uArg2);
    39583988}
    39593989
     
    55375567/** @todo Always flush EFLAGS if this is an xxF variation. */
    55385568    iemNativeRegFlushGuestShadows(pReNative,
    5539                                     RT_BIT_64(kIemNativeGstReg_Pc)
    5540                                   | (pReNative->fCImpl & (  IEM_CIMPL_F_RFLAGS
    5541                                                           | IEM_CIMPL_F_STATUS_FLAGS
    5542                                                           | IEM_CIMPL_F_INHIBIT_SHADOW)
    5543                                      ? RT_BIT_64(kIemNativeGstReg_EFlags) : 0)
    5544                                   );
     5569                                  iemNativeCImplFlagsToGuestShadowFlushMask(pReNative->fCImpl, RT_BIT_64(kIemNativeGstReg_Pc)) );
    55455570
    55465571    return iemNativeEmitCheckCallRetAndPassUp(pReNative, off, idxInstr);
     
    59245949    PFNIEMCIMPL0 const pfnCImpl = (PFNIEMCIMPL0)(uintptr_t)pCallEntry->auParams[0];
    59255950    uint8_t const      cbInstr  = (uint8_t)pCallEntry->auParams[1];
    5926     return iemNativeEmitCImplCall(pReNative, off, pCallEntry->idxInstr, (uintptr_t)pfnCImpl, cbInstr, 0, 0, 0, 0);
     5951    /** @todo Drop this crap hack?
     5952     *  We don't have the flush mask here so we we must pass UINT64_MAX. */
     5953    return iemNativeEmitCImplCall(pReNative, off, pCallEntry->idxInstr, UINT64_MAX, (uintptr_t)pfnCImpl, cbInstr, 0, 0, 0, 0);
    59275954}
    59285955
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdFuncs.cpp

    r101694 r101984  
    278278/** Variant of IEM_MC_DEFER_TO_CIMPL_0_RET with explicit instruction
    279279 * length parameter. */
    280 #define IEM_MC_DEFER_TO_CIMPL_0_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl) \
     280#define IEM_MC_DEFER_TO_CIMPL_0_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl) \
    281281    return (a_pfnCImpl)(pVCpu, (a_cbInstr))
    282282#undef  IEM_MC_DEFER_TO_CIMPL_0_RET
     
    284284/** Variant of IEM_MC_DEFER_TO_CIMPL_1_RET with explicit instruction
    285285 * length parameter. */
    286 #define IEM_MC_DEFER_TO_CIMPL_1_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0) \
     286#define IEM_MC_DEFER_TO_CIMPL_1_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0) \
    287287    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0)
    288288#undef  IEM_MC_DEFER_TO_CIMPL_1_RET
    289289
    290290/** Variant of IEM_MC_CALL_CIMPL_2 with explicit instruction length parameter. */
    291 #define IEM_MC_DEFER_TO_CIMPL_2_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1) \
     291#define IEM_MC_DEFER_TO_CIMPL_2_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1) \
    292292    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1)
    293293#undef  IEM_MC_DEFER_TO_CIMPL_2_RET
     
    295295/** Variant of IEM_MC_DEFER_TO_CIMPL_3 with explicit instruction length
    296296 *  parameter. */
    297 #define IEM_MC_DEFER_TO_CIMPL_3_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1, a2) \
     297#define IEM_MC_DEFER_TO_CIMPL_3_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1, a2) \
    298298    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1, a2)
    299299#undef  IEM_MC_DEFER_TO_CIMPL_3_RET
     
    301301/** Variant of IEM_MC_DEFER_TO_CIMPL_4 with explicit instruction length
    302302 *  parameter. */
    303 #define IEM_MC_DEFER_TO_CIMPL_4_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1, a2, a3) \
     303#define IEM_MC_DEFER_TO_CIMPL_4_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1, a2, a3) \
    304304    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1, a2, a3)
    305305#undef  IEM_MC_DEFER_TO_CIMPL_4_RET
     
    307307/** Variant of IEM_MC_DEFER_TO_CIMPL_5 with explicit instruction length
    308308 *  parameter. */
    309 #define IEM_MC_DEFER_TO_CIMPL_5_RET_THREADED(a_cbInstr, a_fFlags, a_pfnCImpl, a0, a1, a2, a3, a4) \
     309#define IEM_MC_DEFER_TO_CIMPL_5_RET_THREADED(a_cbInstr, a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1, a2, a3, a4) \
    310310    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1, a2, a3, a4)
    311311#undef  IEM_MC_DEFER_TO_CIMPL_5_RET
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r101950 r101984  
    407407        'IEM_CIMPL_F_BRANCH_CONDITIONAL':           False,
    408408        # IEM_CIMPL_F_BRANCH_ANY should only be used for testing, so not included here.
     409        'IEM_CIMPL_F_BRANCH_STACK':                 False,
     410        'IEM_CIMPL_F_BRANCH_STACK_FAR':             False,
    409411        'IEM_CIMPL_F_RFLAGS':                       False,
    410412        'IEM_CIMPL_F_INHIBIT_SHADOW':               False,
     
    11261128                                  or sRef.startswith('g_')
    11271129                                  or sRef.startswith('iemAImpl_')
     1130                                  or sRef.startswith('kIemNativeGstReg_')
    11281131                                  or sRef in ( 'int8_t',    'int16_t',    'int32_t',    'int64_t',
    11291132                                               'INT8_C',    'INT16_C',    'INT32_C',    'INT64_C',
     
    11331136                                               'INT8_MIN',  'INT16_MIN',  'INT32_MIN',  'INT64_MIN',
    11341137                                               'sizeof',    'NOREF',      'RT_NOREF',   'IEMMODE_64BIT',
    1135                                                'RT_BIT_32', 'true',       'false',      'NIL_RTGCPTR',) ):
     1138                                               'RT_BIT_32', 'RT_BIT_64',  'true',       'false',
     1139                                               'NIL_RTGCPTR',) ):
    11361140                                pass;
    11371141
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdTables.h

    r101538 r101984  
    301301 */
    302302#undef IEM_MC_DEFER_TO_CIMPL_0_RET
    303 #define IEM_MC_DEFER_TO_CIMPL_0_RET(a_fFlags, a_pfnCImpl) \
     303#define IEM_MC_DEFER_TO_CIMPL_0_RET(a_fFlags, a_fGstShwFlush, a_pfnCImpl) \
    304304    return iemThreadedRecompilerMcDeferToCImpl0(pVCpu, a_fFlags, a_pfnCImpl)
    305305
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r101722 r101984  
    619619/** Force end of TB after the instruction. */
    620620#define IEM_CIMPL_F_END_TB              RT_BIT_32(15)
     621/** Flag set if a branch may also modify the stack (push/pop return address). */
     622#define IEM_CIMPL_F_BRANCH_STACK        RT_BIT_32(16)
     623/** Flag set if a branch may also modify the stack (push/pop return address)
     624 *  and switch it (load/restore SS:RSP). */
     625#define IEM_CIMPL_F_BRANCH_STACK_FAR    RT_BIT_32(17)
    621626/** Convenience: Raise exception (technically unnecessary, since it shouldn't return VINF_SUCCESS). */
    622627#define IEM_CIMPL_F_XCPT \
    623     (IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT)
     628    (IEM_CIMPL_F_BRANCH_INDIRECT | IEM_CIMPL_F_BRANCH_FAR | IEM_CIMPL_F_BRANCH_STACK_FAR \
     629     | IEM_CIMPL_F_MODE | IEM_CIMPL_F_RFLAGS | IEM_CIMPL_F_VMEXIT)
    624630
    625631/** The block calls a C-implementation instruction function with two implicit arguments.
     
    627633 * IEM_CIMPL_F_CALLS_AIMPL_WITH_FXSTATE.
    628634 * @note The python scripts will add this is missing.  */
    629 #define IEM_CIMPL_F_CALLS_CIMPL                 RT_BIT_32(16)
     635#define IEM_CIMPL_F_CALLS_CIMPL                 RT_BIT_32(18)
    630636/** The block calls an ASM-implementation instruction function.
    631637 * Mutually exclusive with IEM_CIMPL_F_CALLS_CIMPL and
    632638 * IEM_CIMPL_F_CALLS_AIMPL_WITH_FXSTATE.
    633639 * @note The python scripts will add this is missing.  */
    634 #define IEM_CIMPL_F_CALLS_AIMPL                 RT_BIT_32(17)
     640#define IEM_CIMPL_F_CALLS_AIMPL                 RT_BIT_32(19)
    635641/** The block calls an ASM-implementation instruction function with an implicit
    636642 * X86FXSTATE pointer argument.
    637643 * Mutually exclusive with IEM_CIMPL_F_CALLS_CIMPL and IEM_CIMPL_F_CALLS_AIMPL.
    638644 * @note The python scripts will add this is missing.  */
    639 #define IEM_CIMPL_F_CALLS_AIMPL_WITH_FXSTATE    RT_BIT_32(18)
     645#define IEM_CIMPL_F_CALLS_AIMPL_WITH_FXSTATE    RT_BIT_32(20)
    640646/** @} */
    641647
     
    13051311/** @name IEMBRANCHED_F_XXX - Branched indicator (IEMCPU::fTbBranched).
    13061312 *
    1307  * These flags parallels IEM_CIMPL_F_BRANCH_XXX.
     1313 * These flags parallels the main IEM_CIMPL_F_BRANCH_XXX flags.
    13081314 *
    13091315 * @{ */
     
    13201326/** Flag set if it's a far branch. */
    13211327#define IEMBRANCHED_F_FAR           UINT8_C(0x10)
     1328/** Flag set if the stack pointer is modified. */
     1329#define IEMBRANCHED_F_STACK         UINT8_C(0x20)
     1330/** Flag set if the stack pointer and (maybe) the stack segment are modified. */
     1331#define IEMBRANCHED_F_STACK_FAR     UINT8_C(0x40)
    13221332/** Flag set (by IEM_MC_REL_JMP_XXX) if it's a zero bytes relative jump. */
    1323 #define IEMBRANCHED_F_ZERO          UINT8_C(0x20)
     1333#define IEMBRANCHED_F_ZERO          UINT8_C(0x80)
    13241334/** @} */
    13251335
     
    49204930 * @return  Strict VBox status code.
    49214931 */
    4922 #define IEMOP_RAISE_DIVIDE_ERROR_RET()      IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, iemCImplRaiseDivideError)
     4932#define IEMOP_RAISE_DIVIDE_ERROR_RET()          IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, 0, iemCImplRaiseDivideError)
    49234933
    49244934/**
     
    49304940 * @return  Strict VBox status code.
    49314941 */
    4932 #define IEMOP_RAISE_INVALID_LOCK_PREFIX_RET() IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, iemCImplRaiseInvalidLockPrefix)
     4942#define IEMOP_RAISE_INVALID_LOCK_PREFIX_RET()   IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, 0, iemCImplRaiseInvalidLockPrefix)
    49334943
    49344944/**
     
    49404950 * @return  Strict VBox status code.
    49414951 */
    4942 #define IEMOP_RAISE_INVALID_OPCODE_RET()    IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, iemCImplRaiseInvalidOpcode)
     4952#define IEMOP_RAISE_INVALID_OPCODE_RET()        IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, 0, iemCImplRaiseInvalidOpcode)
    49434953
    49444954/**
     
    49514961 * @see     IEMOP_RAISE_INVALID_OPCODE_RET
    49524962 */
    4953 #define IEMOP_RAISE_INVALID_OPCODE_RUNTIME_RET()   IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, iemCImplRaiseInvalidOpcode)
     4963#define IEMOP_RAISE_INVALID_OPCODE_RUNTIME_RET() IEM_MC_DEFER_TO_CIMPL_0_RET(IEM_CIMPL_F_XCPT, 0, iemCImplRaiseInvalidOpcode)
    49544964
    49554965/** @} */
  • trunk/src/VBox/VMM/include/IEMMc.h

    r101958 r101984  
    21012101 *
    21022102 * @param   a_fFlags        IEM_CIMPL_F_XXX.
     2103 * @param   a_fGstShwFlush  Guest shadow register copies needing to be flushed
     2104 *                          in the native recompiler.
    21032105 * @param   a_pfnCImpl      The pointer to the C routine.
    21042106 * @sa      IEM_DECL_IMPL_C_TYPE_0 and IEM_CIMPL_DEF_0.
    21052107 */
    2106 #define IEM_MC_DEFER_TO_CIMPL_0_RET(a_fFlags, a_pfnCImpl) \
     2108#define IEM_MC_DEFER_TO_CIMPL_0_RET(a_fFlags, a_fGstShwFlush, a_pfnCImpl) \
    21072109    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu)))
    21082110
     
    21142116 *
    21152117 * @param   a_fFlags        IEM_CIMPL_F_XXX.
     2118 * @param   a_fGstShwFlush  Guest shadow register copies needing to be flushed
     2119 *                          in the native recompiler.
    21162120 * @param   a_pfnCImpl      The pointer to the C routine.
    21172121 * @param   a0              The argument.
    21182122 */
    2119 #define IEM_MC_DEFER_TO_CIMPL_1_RET(a_fFlags, a_pfnCImpl, a0) \
     2123#define IEM_MC_DEFER_TO_CIMPL_1_RET(a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0) \
    21202124    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0))
    21212125
     
    21272131 *
    21282132 * @param   a_fFlags        IEM_CIMPL_F_XXX.
     2133 * @param   a_fGstShwFlush  Guest shadow register copies needing to be flushed
     2134 *                          in the native recompiler.
    21292135 * @param   a_pfnCImpl      The pointer to the C routine.
    21302136 * @param   a0              The first extra argument.
    21312137 * @param   a1              The second extra argument.
    21322138 */
    2133 #define IEM_MC_DEFER_TO_CIMPL_2_RET(a_fFlags, a_pfnCImpl, a0, a1) \
     2139#define IEM_MC_DEFER_TO_CIMPL_2_RET(a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1) \
    21342140    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1))
    21352141
     
    21412147 *
    21422148 * @param   a_fFlags        IEM_CIMPL_F_XXX.
     2149 * @param   a_fGstShwFlush  Guest shadow register copies needing to be flushed
     2150 *                          in the native recompiler.
    21432151 * @param   a_pfnCImpl      The pointer to the C routine.
    21442152 * @param   a0              The first extra argument.
     
    21462154 * @param   a2              The third extra argument.
    21472155 */
    2148 #define IEM_MC_DEFER_TO_CIMPL_3_RET(a_fFlags, a_pfnCImpl, a0, a1, a2) \
     2156#define IEM_MC_DEFER_TO_CIMPL_3_RET(a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1, a2) \
    21492157    IEM_MC_CALL_CIMPL_HLP_RET(a_fFlags, (a_pfnCImpl)(pVCpu, IEM_GET_INSTR_LEN(pVCpu), a0, a1, a2))
    21502158
  • trunk/src/VBox/VMM/include/IEMN8veRecompiler.h

    r101913 r101984  
    348348{
    349349    kIemNativeGstReg_GprFirst      = 0,
    350     kIemNativeGstReg_GprLast       = 15,
     350    kIemNativeGstReg_GprLast       = kIemNativeGstReg_GprFirst + 15,
    351351    kIemNativeGstReg_Pc,
    352     kIemNativeGstReg_EFlags,            /**< This one is problematic since the higher bits are used internally. */
    353     /* gap: 18..23 */
    354     kIemNativeGstReg_SegSelFirst   = 24,
    355     kIemNativeGstReg_SegSelLast    = 29,
    356     kIemNativeGstReg_SegBaseFirst  = 30,
    357     kIemNativeGstReg_SegBaseLast   = 35,
    358     kIemNativeGstReg_SegLimitFirst = 36,
    359     kIemNativeGstReg_SegLimitLast  = 41,
     352    kIemNativeGstReg_EFlags,            /**< 32-bit, includes internal flags.  */
     353    kIemNativeGstReg_SegSelFirst,
     354    kIemNativeGstReg_SegSelLast    = kIemNativeGstReg_SegSelFirst + 5,
     355    kIemNativeGstReg_SegBaseFirst,
     356    kIemNativeGstReg_SegBaseLast   = kIemNativeGstReg_SegBaseFirst + 5,
     357    kIemNativeGstReg_SegLimitFirst,
     358    kIemNativeGstReg_SegLimitLast  = kIemNativeGstReg_SegLimitFirst + 5,
    360359    kIemNativeGstReg_End
    361360} IEMNATIVEGSTREG;
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r101958 r101984  
    941941#define IEM_MC_CALL_CIMPL_5(a_fFlags, a_pfnCImpl, a0, a1, a2, a3, a4) \
    942942    do { CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); CHK_CALL_ARG(a3, 3); CHK_CALL_ARG(a4, 4); (void)fMcBegin; return VINF_SUCCESS; } while (0)
    943 #define IEM_MC_DEFER_TO_CIMPL_0_RET(a_fFlags, a_pfnCImpl)                   return VINF_SUCCESS
    944 #define IEM_MC_DEFER_TO_CIMPL_1_RET(a_fFlags, a_pfnCImpl, a0)               return VINF_SUCCESS
    945 #define IEM_MC_DEFER_TO_CIMPL_2_RET(a_fFlags, a_pfnCImpl, a0, a1)           return VINF_SUCCESS
    946 #define IEM_MC_DEFER_TO_CIMPL_3_RET(a_fFlags, a_pfnCImpl, a0, a1, a2)       return VINF_SUCCESS
     943#define IEM_MC_DEFER_TO_CIMPL_0_RET(a_fFlags, a_fGstShwFlush, a_pfnCImpl)                       return VINF_SUCCESS
     944#define IEM_MC_DEFER_TO_CIMPL_1_RET(a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0)                   return VINF_SUCCESS
     945#define IEM_MC_DEFER_TO_CIMPL_2_RET(a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1)               return VINF_SUCCESS
     946#define IEM_MC_DEFER_TO_CIMPL_3_RET(a_fFlags, a_fGstShwFlush, a_pfnCImpl, a0, a1, a2)           return VINF_SUCCESS
    947947
    948948#define IEM_MC_CALL_FPU_AIMPL_1(a_pfnAImpl, a0) \
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