VirtualBox

Changeset 104183 in vbox for trunk


Ignore:
Timestamp:
Apr 5, 2024 12:55:25 PM (10 months ago)
Author:
vboxsync
Message:

VMM/IEM: Get rid of IEM_MC_IF_MXCSR_XCPT_PENDING() and IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT() and replace with IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(). This makes the microcode blocks leaner and the recompiler doesn't has to do as much state keeping. Furthermore there is now exactly one way of doing SSE/AVX floating point operations when it comes to exception handling, bugref:10641

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r104177 r104183  
    31623162    'IEM_MC_IF_GREG_BIT_SET':                                    (McBlock.parseMcGenericCond,       True,  False, True,  ),
    31633163    'IEM_MC_IF_LOCAL_IS_Z':                                      (McBlock.parseMcGenericCond,       True,  False, True,  ),
    3164     'IEM_MC_IF_MXCSR_XCPT_PENDING':                              (McBlock.parseMcGenericCond,       True,  True,  g_fNativeSimd),
    31653164    'IEM_MC_IF_RCX_IS_NZ':                                       (McBlock.parseMcGenericCond,       True,  False, True,  ),
    31663165    'IEM_MC_IF_RCX_IS_NOT_ONE':                                  (McBlock.parseMcGenericCond,       True,  False, True,  ),
     
    32613260    'IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO':                          (McBlock.parseMcGeneric,           True,  True,  False, ),
    32623261    'IEM_MC_RAISE_GP0_IF_EFF_ADDR_UNALIGNED':                    (McBlock.parseMcGeneric,           True,  True,  True,  ),
    3263     'IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT':                   (McBlock.parseMcGeneric,           True,  True,  True,  ),
    32643262    'IEM_MC_REF_EFLAGS':                                         (McBlock.parseMcGeneric,           False, False, True,  ),
    32653263    'IEM_MC_REF_FPUREG':                                         (McBlock.parseMcGeneric,           False, False, False, ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h

    r104177 r104183  
    34873487
    34883488        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtpi2ps_u128, pDst, u64Src);
    3489         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3490             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3491         } IEM_MC_ELSE() {
    3492             IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    3493         } IEM_MC_ENDIF();
     3489        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3490        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    34943491
    34953492        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    35173514
    35183515        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtpi2ps_u128, pDst, u64Src);
    3519         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3520             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3521         } IEM_MC_ELSE() {
    3522             IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    3523         } IEM_MC_ENDIF();
     3516        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3517        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    35243518
    35253519        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    35523546
    35533547        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtpi2pd_u128, pDst, u64Src);
    3554         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3555             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3556         } IEM_MC_ELSE() {
    3557             IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    3558         } IEM_MC_ENDIF();
     3548        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3549        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    35593550
    35603551        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    35823573
    35833574        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtpi2pd_u128, pDst, u64Src);
    3584         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3585             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3586         } IEM_MC_ELSE() {
    3587             IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    3588         } IEM_MC_ENDIF();
     3575        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3576        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    35893577
    35903578        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    36163604            IEM_MC_REF_GREG_I64_CONST(pi64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    36173605            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2ss_r32_i64, pr32Dst, pi64Src);
    3618             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3619                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3620             } IEM_MC_ELSE() {
    3621                 IEM_MC_STORE_XREG_R32(IEM_GET_MODRM_REG(pVCpu, bRm), r32Dst);
    3622             } IEM_MC_ENDIF();
     3606            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3607            IEM_MC_STORE_XREG_R32(IEM_GET_MODRM_REG(pVCpu, bRm), r32Dst);
    36233608
    36243609            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    36423627            IEM_MC_FETCH_MEM_I64(i64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    36433628            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2ss_r32_i64, pr32Dst, pi64Src);
    3644             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3645                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3646             } IEM_MC_ELSE() {
    3647                 IEM_MC_STORE_XREG_R32(IEM_GET_MODRM_REG(pVCpu, bRm), r32Dst);
    3648             } IEM_MC_ENDIF();
     3629            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3630            IEM_MC_STORE_XREG_R32(IEM_GET_MODRM_REG(pVCpu, bRm), r32Dst);
    36493631
    36503632            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    36683650            IEM_MC_REF_GREG_I32_CONST(pi32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    36693651            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2ss_r32_i32, pr32Dst, pi32Src);
    3670             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3671                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3672             } IEM_MC_ELSE() {
    3673                 IEM_MC_STORE_XREG_R32(IEM_GET_MODRM_REG(pVCpu, bRm), r32Dst);
    3674             } IEM_MC_ENDIF();
     3652            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3653            IEM_MC_STORE_XREG_R32(IEM_GET_MODRM_REG(pVCpu, bRm), r32Dst);
    36753654
    36763655            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    36943673            IEM_MC_FETCH_MEM_I32(i32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    36953674            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2ss_r32_i32, pr32Dst, pi32Src);
    3696             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3697                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3698             } IEM_MC_ELSE() {
    3699                 IEM_MC_STORE_XREG_R32(IEM_GET_MODRM_REG(pVCpu, bRm), r32Dst);
    3700             } IEM_MC_ENDIF();
     3675            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3676            IEM_MC_STORE_XREG_R32(IEM_GET_MODRM_REG(pVCpu, bRm), r32Dst);
    37013677
    37023678            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    37293705            IEM_MC_REF_GREG_I64_CONST(pi64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    37303706            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2sd_r64_i64, pr64Dst, pi64Src);
    3731             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3732                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3733             } IEM_MC_ELSE() {
    3734                 IEM_MC_STORE_XREG_R64(IEM_GET_MODRM_REG(pVCpu, bRm), r64Dst);
    3735             } IEM_MC_ENDIF();
     3707            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3708            IEM_MC_STORE_XREG_R64(IEM_GET_MODRM_REG(pVCpu, bRm), r64Dst);
    37363709
    37373710            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    37553728            IEM_MC_FETCH_MEM_I64(i64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    37563729            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2sd_r64_i64, pr64Dst, pi64Src);
    3757             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3758                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3759             } IEM_MC_ELSE() {
    3760                 IEM_MC_STORE_XREG_R64(IEM_GET_MODRM_REG(pVCpu, bRm), r64Dst);
    3761             } IEM_MC_ENDIF();
     3730            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3731            IEM_MC_STORE_XREG_R64(IEM_GET_MODRM_REG(pVCpu, bRm), r64Dst);
    37623732
    37633733            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    37813751            IEM_MC_REF_GREG_I32_CONST(pi32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    37823752            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2sd_r64_i32, pr64Dst, pi32Src);
    3783             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3784                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3785             } IEM_MC_ELSE() {
    3786                 IEM_MC_STORE_XREG_R64(IEM_GET_MODRM_REG(pVCpu, bRm), r64Dst);
    3787             } IEM_MC_ENDIF();
     3753            IEM_MC_STORE_XREG_R64(IEM_GET_MODRM_REG(pVCpu, bRm), r64Dst);
    37883754
    37893755            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    38073773            IEM_MC_FETCH_MEM_I32(i32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    38083774            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2sd_r64_i32, pr64Dst, pi32Src);
    3809             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3810                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3811             } IEM_MC_ELSE() {
    3812                 IEM_MC_STORE_XREG_R64(IEM_GET_MODRM_REG(pVCpu, bRm), r64Dst);
    3813             } IEM_MC_ENDIF();
     3775            IEM_MC_STORE_XREG_R64(IEM_GET_MODRM_REG(pVCpu, bRm), r64Dst);
    38143776
    38153777            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    39233885
    39243886        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttps2pi_u128, pu64Dst, u64Src);
    3925         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3926             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3927         } IEM_MC_ELSE() {
    3928             IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    3929         } IEM_MC_ENDIF();
     3887        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3888        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    39303889
    39313890        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    39523911
    39533912        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttps2pi_u128, pu64Dst, u64Src);
    3954         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3955             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3956         } IEM_MC_ELSE() {
    3957             IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    3958         } IEM_MC_ENDIF();
     3913        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3914        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    39593915
    39603916        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    39863942
    39873943        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttpd2pi_u128, pu64Dst, pSrc);
    3988         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    3989             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    3990         } IEM_MC_ELSE() {
    3991             IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    3992         } IEM_MC_ENDIF();
     3944        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3945        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    39933946
    39943947        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    40163969
    40173970        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttpd2pi_u128, pu64Dst, pSrc);
    4018         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4019             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4020         } IEM_MC_ELSE() {
    4021             IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    4022         } IEM_MC_ENDIF();
     3971        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3972        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    40233973
    40243974        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    40504000            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    40514001            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttss2si_i64_r32, pi64Dst, pu32Src);
    4052             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4053                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4054             } IEM_MC_ELSE() {
    4055                 IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    4056             } IEM_MC_ENDIF();
     4002            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4003            IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    40574004
    40584005            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    40764023            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    40774024            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttss2si_i64_r32, pi64Dst, pu32Src);
    4078             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4079                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4080             } IEM_MC_ELSE() {
    4081                 IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    4082             } IEM_MC_ENDIF();
     4025            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4026            IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    40834027
    40844028            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    41024046            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    41034047            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttss2si_i32_r32, pi32Dst, pu32Src);
    4104             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4105                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4106             } IEM_MC_ELSE() {
    4107                 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    4108             } IEM_MC_ENDIF();
     4048            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4049            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    41094050
    41104051            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    41284069            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    41294070            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttss2si_i32_r32, pi32Dst, pu32Src);
    4130             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4131                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4132             } IEM_MC_ELSE() {
    4133                 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    4134             } IEM_MC_ENDIF();
     4071            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4072            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    41354073
    41364074            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    41634101            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    41644102            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttsd2si_i64_r64, pi64Dst, pu64Src);
    4165             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4166                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4167             } IEM_MC_ELSE() {
    4168                 IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    4169             } IEM_MC_ENDIF();
     4103            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4104            IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    41704105
    41714106            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    41894124            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    41904125            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttsd2si_i64_r64, pi64Dst, pu64Src);
    4191             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4192                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4193             } IEM_MC_ELSE() {
    4194                 IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    4195             } IEM_MC_ENDIF();
     4126            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4127            IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    41964128
    41974129            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    42154147            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    42164148            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttsd2si_i32_r64, pi32Dst, pu64Src);
    4217             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4218                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4219             } IEM_MC_ELSE() {
    4220                 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    4221             } IEM_MC_ENDIF();
     4149            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4150            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    42224151
    42234152            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    42414170            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    42424171            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttsd2si_i32_r64, pi32Dst, pu64Src);
    4243             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4244                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4245             } IEM_MC_ELSE() {
    4246                 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    4247             } IEM_MC_ENDIF();
     4172            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4173            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    42484174
    42494175            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    42774203
    42784204        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtps2pi_u128, pu64Dst, u64Src);
    4279         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4280             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4281         } IEM_MC_ELSE() {
    4282             IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    4283         } IEM_MC_ENDIF();
     4205        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4206        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    42844207
    42854208        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    43064229
    43074230        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtps2pi_u128, pu64Dst, u64Src);
    4308         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4309             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4310         } IEM_MC_ELSE() {
    4311             IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    4312         } IEM_MC_ENDIF();
     4231        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4232        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    43134233
    43144234        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    43414261
    43424262        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtpd2pi_u128, pu64Dst, pSrc);
    4343         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4344             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4345         } IEM_MC_ELSE() {
    4346             IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    4347         } IEM_MC_ENDIF();
     4263        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4264        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    43484265
    43494266        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    43714288
    43724289        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtpd2pi_u128, pu64Dst, pSrc);
    4373         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4374             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4375         } IEM_MC_ELSE() {
    4376             IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    4377         } IEM_MC_ENDIF();
     4290        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4291        IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Dst);
    43784292
    43794293        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    44054319            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    44064320            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtss2si_i64_r32, pi64Dst, pu32Src);
    4407             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4408                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4409             } IEM_MC_ELSE() {
    4410                 IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    4411             } IEM_MC_ENDIF();
     4321            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4322            IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    44124323
    44134324            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    44314342            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    44324343            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtss2si_i64_r32, pi64Dst, pu32Src);
    4433             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4434                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4435             } IEM_MC_ELSE() {
    4436                 IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    4437             } IEM_MC_ENDIF();
     4344            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4345            IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    44384346
    44394347            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    44574365            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    44584366            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtss2si_i32_r32,  pi32Dst, pu32Src);
    4459             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4460                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4461             } IEM_MC_ELSE() {
    4462                 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    4463             } IEM_MC_ENDIF();
     4367            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4368            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    44644369
    44654370            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    44834388            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    44844389            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtss2si_i32_r32, pi32Dst, pu32Src);
    4485             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4486                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4487             } IEM_MC_ELSE() {
    4488                 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    4489             } IEM_MC_ENDIF();
     4390            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4391            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    44904392
    44914393            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    45184420            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    45194421            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsd2si_i64_r64, pi64Dst, pu64Src);
    4520             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4521                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4522             } IEM_MC_ELSE() {
    4523                 IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    4524             } IEM_MC_ENDIF();
     4422            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4423            IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    45254424
    45264425            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    45444443            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    45454444            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsd2si_i64_r64, pi64Dst, pu64Src);
    4546             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4547                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4548             } IEM_MC_ELSE() {
    4549                 IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    4550             } IEM_MC_ENDIF();
     4445            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4446            IEM_MC_STORE_GREG_I64(IEM_GET_MODRM_REG(pVCpu, bRm), i64Dst);
    45514447
    45524448            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    45704466            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    45714467            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsd2si_i32_r64, pi32Dst, pu64Src);
    4572             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4573                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4574             } IEM_MC_ELSE() {
    4575                 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    4576             } IEM_MC_ENDIF();
     4468            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4469            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    45774470
    45784471            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    45964489            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    45974490            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsd2si_i32_r64, pi32Dst, pu64Src);
    4598             IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4599                 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4600             } IEM_MC_ELSE() {
    4601                 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    4602             } IEM_MC_ENDIF();
     4491            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4492            IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), i32Dst);
    46034493
    46044494            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    46364526        IEM_MC_FETCH_XREG_R32(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm), 0 /*a_iDWord*/);
    46374527        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomiss_u128, pEFlags, uSrc1, uSrc2);
    4638         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4639             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4640         } IEM_MC_ELSE() {
    4641             IEM_MC_COMMIT_EFLAGS(fEFlags);
    4642         } IEM_MC_ENDIF();
     4528        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4529        IEM_MC_COMMIT_EFLAGS(fEFlags);
    46434530
    46444531        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    46664553        IEM_MC_FETCH_XREG_R32(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDWord*/);
    46674554        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomiss_u128, pEFlags, uSrc1, uSrc2);
    4668         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4669             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4670         } IEM_MC_ELSE() {
    4671             IEM_MC_COMMIT_EFLAGS(fEFlags);
    4672         } IEM_MC_ENDIF();
     4555        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4556        IEM_MC_COMMIT_EFLAGS(fEFlags);
    46734557
    46744558        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    47054589        IEM_MC_FETCH_XREG_R64(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm),  0 /*a_iQWord*/);
    47064590        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomisd_u128, pEFlags, uSrc1, uSrc2);
    4707         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4708             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4709         } IEM_MC_ELSE() {
    4710             IEM_MC_COMMIT_EFLAGS(fEFlags);
    4711         } IEM_MC_ENDIF();
     4591        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4592        IEM_MC_COMMIT_EFLAGS(fEFlags);
    47124593
    47134594        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    47354616        IEM_MC_FETCH_XREG_R64(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQWord*/);
    47364617        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomisd_u128, pEFlags, uSrc1, uSrc2);
    4737         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4738             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4739         } IEM_MC_ELSE() {
    4740             IEM_MC_COMMIT_EFLAGS(fEFlags);
    4741         } IEM_MC_ENDIF();
     4618        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4619        IEM_MC_COMMIT_EFLAGS(fEFlags);
    47424620
    47434621        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    47784656        IEM_MC_FETCH_XREG_R32(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm),  0 /*a_iDWord*/);
    47794657        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comiss_u128, pEFlags, uSrc1, uSrc2);
    4780         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4781             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4782         } IEM_MC_ELSE() {
    4783             IEM_MC_COMMIT_EFLAGS(fEFlags);
    4784         } IEM_MC_ENDIF();
     4658        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4659        IEM_MC_COMMIT_EFLAGS(fEFlags);
    47854660
    47864661        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    48084683        IEM_MC_FETCH_XREG_R32(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDWord*/);
    48094684        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comiss_u128, pEFlags, uSrc1, uSrc2);
    4810         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4811             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4812         } IEM_MC_ELSE() {
    4813             IEM_MC_COMMIT_EFLAGS(fEFlags);
    4814         } IEM_MC_ENDIF();
     4685        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4686        IEM_MC_COMMIT_EFLAGS(fEFlags);
    48154687
    48164688        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    48474719        IEM_MC_FETCH_XREG_R64(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm),  0 /*a_iQWord*/);
    48484720        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comisd_u128, pEFlags, uSrc1, uSrc2);
    4849         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4850             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4851         } IEM_MC_ELSE() {
    4852             IEM_MC_COMMIT_EFLAGS(fEFlags);
    4853         } IEM_MC_ENDIF();
     4721        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4722        IEM_MC_COMMIT_EFLAGS(fEFlags);
    48544723
    48554724        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    48774746        IEM_MC_FETCH_XREG_R64(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQWord*/);
    48784747        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comisd_u128, pEFlags, uSrc1, uSrc2);
    4879         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    4880             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    4881         } IEM_MC_ELSE() {
    4882             IEM_MC_COMMIT_EFLAGS(fEFlags);
    4883         } IEM_MC_ENDIF();
     4748        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4749        IEM_MC_COMMIT_EFLAGS(fEFlags);
    48844750
    48854751        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1179211658        IEM_MC_FETCH_XREG_PAIR_XMM(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    1179311659        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cmpps_u128, pDst, pSrc, bImmArg);
    11794         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    11795             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    11796         } IEM_MC_ELSE() {
    11797             IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    11798         } IEM_MC_ENDIF();
     11660        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     11661        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    1179911662
    1180011663        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1182211685        IEM_MC_FETCH_MEM_XMM_ALIGN_SSE_AND_XREG_XMM(Src, IEM_GET_MODRM_REG(pVCpu, bRm), pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1182311686        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cmpps_u128, pDst, pSrc, bImmArg);
    11824         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    11825             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    11826         } IEM_MC_ELSE() {
    11827             IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    11828         } IEM_MC_ENDIF();
     11687        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     11688        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    1182911689
    1183011690        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1185711717        IEM_MC_FETCH_XREG_PAIR_XMM(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    1185811718        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cmppd_u128, pDst, pSrc, bImmArg);
    11859         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    11860             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    11861         } IEM_MC_ELSE() {
    11862             IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    11863         } IEM_MC_ENDIF();
     11719        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     11720        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    1186411721
    1186511722        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1188711744        IEM_MC_FETCH_MEM_XMM_ALIGN_SSE_AND_XREG_XMM(Src, IEM_GET_MODRM_REG(pVCpu, bRm), pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1188811745        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cmppd_u128, pDst, pSrc, bImmArg);
    11889         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    11890             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    11891         } IEM_MC_ELSE() {
    11892             IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    11893         } IEM_MC_ENDIF();
     11746        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     11747        IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst);
    1189411748
    1189511749        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1192211776        IEM_MC_FETCH_XREG_PAIR_XMM(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    1192311777        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cmpss_u128, pDst, pSrc, bImmArg);
    11924         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    11925             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    11926         } IEM_MC_ELSE() {
    11927             IEM_MC_STORE_XREG_XMM_U32(IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDword*/, Dst);
    11928         } IEM_MC_ENDIF();
     11778        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     11779        IEM_MC_STORE_XREG_XMM_U32(IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDword*/, Dst);
    1192911780
    1193011781        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1195311804                                              0 /*a_iDword*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1195411805        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cmpss_u128, pDst, pSrc, bImmArg);
    11955         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    11956             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    11957         } IEM_MC_ELSE() {
    11958             IEM_MC_STORE_XREG_XMM_U32(IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDword*/, Dst);
    11959         } IEM_MC_ENDIF();
     11806        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     11807        IEM_MC_STORE_XREG_XMM_U32(IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDword*/, Dst);
    1196011808
    1196111809        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1198811836        IEM_MC_FETCH_XREG_PAIR_XMM(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    1198911837        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cmpsd_u128, pDst, pSrc, bImmArg);
    11990         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    11991             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    11992         } IEM_MC_ELSE() {
    11993             IEM_MC_STORE_XREG_XMM_U64(IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQword*/, Dst);
    11994         } IEM_MC_ENDIF();
     11838        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     11839        IEM_MC_STORE_XREG_XMM_U64(IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQword*/, Dst);
    1199511840
    1199611841        IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1201911864                                              0 /*a_iQword */, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1202011865        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cmpsd_u128, pDst, pSrc, bImmArg);
    12021         IEM_MC_IF_MXCSR_XCPT_PENDING() {
    12022             IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    12023         } IEM_MC_ELSE() {
    12024             IEM_MC_STORE_XREG_XMM_U64(IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQword*/, Dst);
    12025         } IEM_MC_ENDIF();
     11866        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     11867        IEM_MC_STORE_XREG_XMM_U64(IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQword*/, Dst);
    1202611868
    1202711869        IEM_MC_ADVANCE_RIP_AND_FINISH();
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veLiveness.cpp

    r104177 r104183  
    466466#define IEM_MC_MAYBE_RAISE_NON_CANONICAL_ADDR_GP0(a_u64Addr)        IEM_LIVENESS_MARK_XCPT_OR_CALL()
    467467#define IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT()             IEM_LIVENESS_MARK_XCPT_OR_CALL(); IEM_LIVENESS_CR4_INPUT() /** @todo revisit when implemented. */
    468 #define IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT()                   IEM_LIVENESS_MARK_XCPT_OR_CALL(); IEM_LIVENESS_CR4_INPUT()
    469468
    470469#define IEM_MC_LOCAL(a_Type, a_Name)                                NOP()
     
    11721171#define IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(a_pr80Dst0, a_iSt0, a_iSt1) {
    11731172#define IEM_MC_IF_FCW_IM()                              {
    1174 #define IEM_MC_IF_MXCSR_XCPT_PENDING()                  {
    11751173
    11761174#define IEM_MC_ELSE()                                   } /*else*/ {
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h

    r104177 r104183  
    11941194
    11951195
    1196 #define IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT() \
    1197     off = iemNativeEmitRaiseSseAvxSimdFpXcpt(pReNative, off, pCallEntry->idxInstr)
    1198 
    1199 /**
    1200  * Emits code to raise a SIMD floating point (either \#UD or \#XF) should be raised.
    1201  *
    1202  * @returns New code buffer offset, UINT32_MAX on failure.
    1203  * @param   pReNative       The native recompile state.
    1204  * @param   off             The code buffer offset.
    1205  * @param   idxInstr        The current instruction.
    1206  */
    1207 DECL_INLINE_THROW(uint32_t)
    1208 iemNativeEmitRaiseSseAvxSimdFpXcpt(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxInstr)
    1209 {
    1210     /*
    1211      * Make sure we don't have any outstanding guest register writes as we may
    1212      * raise an \#UD or \#NM and all guest register must be up to date in CPUMCTX.
    1213      */
    1214     off = iemNativeRegFlushPendingWrites(pReNative, off);
    1215 
    1216 #ifdef IEMNATIVE_WITH_INSTRUCTION_COUNTING
    1217     off = iemNativeEmitStoreImmToVCpuU8(pReNative, off, idxInstr, RT_UOFFSETOF(VMCPUCC, iem.s.idxTbCurInstr));
    1218 #else
    1219     RT_NOREF(idxInstr);
    1220 #endif
    1221 
    1222     /* Allocate a temporary CR4 register. */
    1223     uint8_t const idxCr4Reg       = iemNativeRegAllocTmpForGuestReg(pReNative, &off, kIemNativeGstReg_Cr4, kIemNativeGstRegUse_ReadOnly);
    1224     uint8_t const idxLabelRaiseXf = iemNativeLabelCreate(pReNative, kIemNativeLabelType_RaiseXf);
    1225     uint8_t const idxLabelRaiseUd = iemNativeLabelCreate(pReNative, kIemNativeLabelType_RaiseUd);
    1226 
    1227     /*
    1228      * if (!(cr4 & X86_CR4_OSXMMEEXCPT))
    1229      *     return raisexcpt();
    1230      */
    1231     off = iemNativeEmitTestBitInGprAndJmpToLabelIfNotSet(pReNative, off, idxCr4Reg, X86_CR4_OSXMMEEXCPT_BIT, idxLabelRaiseXf);
    1232 
    1233     /* raise \#UD exception unconditionally. */
    1234     off = iemNativeEmitJmpToLabel(pReNative, off, idxLabelRaiseUd);
    1235 
    1236     /* Free but don't flush the CR4 register. */
    1237     iemNativeRegFreeTmp(pReNative, idxCr4Reg);
    1238 
    1239     return off;
    1240 }
    1241 
    1242 
    12431196#define IEM_MC_RAISE_DIVIDE_ERROR() \
    12441197    off = iemNativeEmitRaiseDivideError(pReNative, off, pCallEntry->idxInstr)
     
    20892042}
    20902043
    2091 
    2092 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR
    2093 
    2094 #define IEM_MC_IF_MXCSR_XCPT_PENDING() \
    2095     off = iemNativeEmitIfMxcsrXcptPending(pReNative, off); \
    2096     do {
    2097 
    2098 /** Emits code for IEM_MC_IF_MXCSR_XCPT_PENDING. */
    2099 DECL_INLINE_THROW(uint32_t)
    2100 iemNativeEmitIfMxcsrXcptPending(PIEMRECOMPILERSTATE pReNative, uint32_t off)
    2101 {
    2102     PIEMNATIVECOND const pEntry = iemNativeCondPushIf(pReNative, &off);
    2103 
    2104     uint8_t const idxGstMxcsrReg = iemNativeRegAllocTmpForGuestReg(pReNative, &off, kIemNativeGstReg_MxCsr,
    2105                                                                    kIemNativeGstRegUse_Calculation);
    2106     uint8_t const idxRegTmp      = iemNativeRegAllocTmp(pReNative, &off);
    2107 
    2108     /* mov tmp0, mxcsr */
    2109     off = iemNativeEmitLoadGprFromGpr(pReNative, off, idxRegTmp, idxGstMxcsrReg);
    2110     /* tmp0 &= X86_MXCSR_XCPT_FLAGS */
    2111     off = iemNativeEmitAndGprByImm(pReNative, off, idxRegTmp, X86_MXCSR_XCPT_FLAGS);
    2112     /* mxcsr &= X86_MXCSR_XCPT_MASK */
    2113     off = iemNativeEmitAndGprByImm(pReNative, off, idxGstMxcsrReg, X86_MXCSR_XCPT_MASK);
    2114     /* mxcsr ~= mxcsr */
    2115     off = iemNativeEmitInvBitsGpr(pReNative, off, idxGstMxcsrReg, idxGstMxcsrReg);
    2116     /* mxcsr >>= X86_MXCSR_XCPT_MASK_SHIFT */
    2117     off = iemNativeEmitShiftGprRight(pReNative, off, idxGstMxcsrReg, X86_MXCSR_XCPT_MASK_SHIFT);
    2118     /* tmp0 &= mxcsr */
    2119     off = iemNativeEmitAndGprByGpr(pReNative, off, idxRegTmp, idxGstMxcsrReg);
    2120 
    2121     off = iemNativeEmitTestIfGprIsZeroAndJmpToLabel(pReNative, off, idxRegTmp, true /*f64Bit*/, pEntry->idxLabelElse);
    2122     iemNativeRegFreeTmp(pReNative, idxGstMxcsrReg);
    2123     iemNativeRegFreeTmp(pReNative, idxRegTmp);
    2124 
    2125     iemNativeCondStartIfBlock(pReNative, off);
    2126     return off;
    2127 }
    2128 
    2129 #endif
    21302044
    21312045
  • trunk/src/VBox/VMM/include/IEMMc.h

    r104177 r104183  
    187187            return iemRaiseUndefinedOpcode(pVCpu); \
    188188        } \
    189     } while (0)
    190 #define IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT() \
    191     do { \
    192         if (pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSXMMEEXCPT)\
    193             return iemRaiseSimdFpException(pVCpu); \
    194         return iemRaiseUndefinedOpcode(pVCpu); \
    195189    } while (0)
    196190
     
    31613155#define IEM_MC_IF_FCW_IM() \
    31623156    if (pVCpu->cpum.GstCtx.XState.x87.FCW & X86_FCW_IM) {
    3163 #define IEM_MC_IF_MXCSR_XCPT_PENDING() \
    3164         if ((  ~((pVCpu->cpum.GstCtx.XState.x87.MXCSR & X86_MXCSR_XCPT_MASK) >> X86_MXCSR_XCPT_MASK_SHIFT) \
    3165              & (pVCpu->cpum.GstCtx.XState.x87.MXCSR & X86_MXCSR_XCPT_FLAGS)) != 0) {
    31663157
    31673158#define IEM_MC_ELSE()                                   } else {
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r104177 r104183  
    617617#define IEM_MC_MAYBE_RAISE_NON_CANONICAL_ADDR_GP0(a_u64Addr) do { (void)fMcBegin; } while (0)
    618618#define IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT() do { (void)fMcBegin; } while (0)
    619 #define IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT()       do { (void)fMcBegin; } while (0)
    620619
    621620#define CHK_VAR(a_Name)                                 do { RT_CONCAT(iVarCheck_,a_Name) = 1; } while (0)
     
    11191118    if (g_fRandom != fFpuRead) {
    11201119#define IEM_MC_IF_FCW_IM()                                              (void)fMcBegin; if (g_fRandom != fFpuRead) {
    1121 #define IEM_MC_IF_MXCSR_XCPT_PENDING()                                  (void)fMcBegin; if (g_fRandom != fSseRead) {
    11221120#define IEM_MC_ELSE()                                                   } else {
    11231121#define IEM_MC_ENDIF()                                                  } do { (void)fMcBegin; } while (0)
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