VirtualBox

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


Ignore:
Timestamp:
Sep 15, 2022 5:32:44 PM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Implement [v]comiss/[v]ucomiss/[v]comisd/[v]ucomisd instructions, bugref:9898

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r96741 r96748  
    57615761        EPILOGUE_4_ARGS
    57625762ENDPROC iemAImpl_cvtsi2sd_r64_i64
     5763
     5764
     5765;;
     5766; Initialize the SSE MXCSR register using the guest value partially to
     5767; account for rounding mode.
     5768;
     5769; @uses     4 bytes of stack to save the original value, T0.
     5770; @param    1       Expression giving the address of the MXCSR register of the guest.
     5771;
     5772%macro SSE_LD_FXSTATE_MXCSR_ONLY 1
     5773        sub     xSP, 4
     5774
     5775        stmxcsr [xSP]
     5776        mov     T0_32, [%1]
     5777        and     T0_32, X86_MXCSR_FZ | X86_MXCSR_RC_MASK | X86_MXCSR_DAZ
     5778        or      T0_32, X86_MXCSR_XCPT_MASK
     5779        sub     xSP, 4
     5780        mov     [xSP], T0_32
     5781        ldmxcsr [xSP]
     5782        add     xSP, 4
     5783%endmacro
     5784
     5785
     5786;;
     5787; Restores the SSE MXCSR register with the original value.
     5788;
     5789; @uses     4 bytes of stack to save the content of MXCSR value, T0, T1.
     5790; @param    1       Expression giving the address where to return the MXCSR value - only the MXCSR is stored, no IEMSSERESULT is used.
     5791;
     5792; @note Restores the stack pointer.
     5793;
     5794%macro SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE 1
     5795        sub     xSP, 4
     5796        stmxcsr [xSP]
     5797        mov     T0_32, [xSP]
     5798        add     xSP, 4
     5799        ; Merge the status bits into the original MXCSR value.
     5800        mov     T1_32, [%1]
     5801        and     T0_32, X86_MXCSR_XCPT_FLAGS
     5802        or      T0_32, T1_32
     5803        mov     [%1], T0_32
     5804
     5805        ldmxcsr [xSP]
     5806        add     xSP, 4
     5807%endmacro
     5808
     5809
     5810;
     5811; UCOMISS (SSE)
     5812;
     5813; @param    A0      Pointer to the MXCSR value (input/output).
     5814; @param    A1      Pointer to the EFLAGS value (input/output).
     5815; @param    A2      Pointer to the first source operand (aka readonly destination).
     5816; @param    A3      Pointer to the second source operand.
     5817;
     5818BEGINPROC_FASTCALL  iemAImpl_ucomiss_u128, 12
     5819        PROLOGUE_3_ARGS
     5820        IEMIMPL_SSE_PROLOGUE
     5821        SSE_LD_FXSTATE_MXCSR_ONLY A0
     5822
     5823        movdqu  xmm0, [A2]
     5824        movdqu  xmm1, [A3]
     5825        ucomiss xmm0, xmm1
     5826        IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0
     5827
     5828        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     5829        IEMIMPL_SSE_EPILOGUE
     5830        EPILOGUE_3_ARGS
     5831ENDPROC             iemAImpl_ucomiss_u128
     5832
     5833BEGINPROC_FASTCALL  iemAImpl_vucomiss_u128, 12
     5834        PROLOGUE_3_ARGS
     5835        IEMIMPL_SSE_PROLOGUE
     5836        SSE_LD_FXSTATE_MXCSR_ONLY A0
     5837
     5838        movdqu  xmm0, [A2]
     5839        movdqu  xmm1, [A3]
     5840        vucomiss xmm0, xmm1
     5841        IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0
     5842
     5843        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     5844        IEMIMPL_SSE_EPILOGUE
     5845        EPILOGUE_3_ARGS
     5846ENDPROC             iemAImpl_vucomiss_u128
     5847
     5848
     5849;
     5850; UCOMISD (SSE)
     5851;
     5852; @param    A0      Pointer to the MXCSR value (input/output).
     5853; @param    A1      Pointer to the EFLAGS value (input/output).
     5854; @param    A2      Pointer to the first source operand (aka readonly destination).
     5855; @param    A3      Pointer to the second source operand.
     5856;
     5857BEGINPROC_FASTCALL  iemAImpl_ucomisd_u128, 12
     5858        PROLOGUE_3_ARGS
     5859        IEMIMPL_SSE_PROLOGUE
     5860        SSE_LD_FXSTATE_MXCSR_ONLY A0
     5861
     5862        movdqu  xmm0, [A2]
     5863        movdqu  xmm1, [A3]
     5864        ucomisd xmm0, xmm1
     5865        IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0
     5866
     5867        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     5868        IEMIMPL_SSE_EPILOGUE
     5869        EPILOGUE_3_ARGS
     5870ENDPROC             iemAImpl_ucomisd_u128
     5871
     5872BEGINPROC_FASTCALL  iemAImpl_vucomisd_u128, 12
     5873        PROLOGUE_3_ARGS
     5874        IEMIMPL_SSE_PROLOGUE
     5875        SSE_LD_FXSTATE_MXCSR_ONLY A0
     5876
     5877        movdqu  xmm0, [A2]
     5878        movdqu  xmm1, [A3]
     5879        vucomisd xmm0, xmm1
     5880        IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0
     5881
     5882        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     5883        IEMIMPL_SSE_EPILOGUE
     5884        EPILOGUE_3_ARGS
     5885ENDPROC             iemAImpl_vucomisd_u128
     5886
     5887;
     5888; COMISS (SSE)
     5889;
     5890; @param    A0      Pointer to the MXCSR value (input/output).
     5891; @param    A1      Pointer to the EFLAGS value (input/output).
     5892; @param    A2      Pointer to the first source operand (aka readonly destination).
     5893; @param    A3      Pointer to the second source operand.
     5894;
     5895BEGINPROC_FASTCALL  iemAImpl_comiss_u128, 12
     5896        PROLOGUE_3_ARGS
     5897        IEMIMPL_SSE_PROLOGUE
     5898        SSE_LD_FXSTATE_MXCSR_ONLY A0
     5899
     5900        movdqu  xmm0, [A2]
     5901        movdqu  xmm1, [A3]
     5902        comiss xmm0, xmm1
     5903        IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0
     5904
     5905        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     5906        IEMIMPL_SSE_EPILOGUE
     5907        EPILOGUE_3_ARGS
     5908ENDPROC             iemAImpl_comiss_u128
     5909
     5910BEGINPROC_FASTCALL  iemAImpl_vcomiss_u128, 12
     5911        PROLOGUE_3_ARGS
     5912        IEMIMPL_SSE_PROLOGUE
     5913        SSE_LD_FXSTATE_MXCSR_ONLY A0
     5914
     5915        movdqu  xmm0, [A2]
     5916        movdqu  xmm1, [A3]
     5917        vcomiss xmm0, xmm1
     5918        IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0
     5919
     5920        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     5921        IEMIMPL_SSE_EPILOGUE
     5922        EPILOGUE_3_ARGS
     5923ENDPROC             iemAImpl_vcomiss_u128
     5924
     5925
     5926;
     5927; COMISD (SSE)
     5928;
     5929; @param    A0      Pointer to the MXCSR value (input/output).
     5930; @param    A1      Pointer to the EFLAGS value (input/output).
     5931; @param    A2      Pointer to the first source operand (aka readonly destination).
     5932; @param    A3      Pointer to the second source operand.
     5933;
     5934BEGINPROC_FASTCALL  iemAImpl_comisd_u128, 12
     5935        PROLOGUE_3_ARGS
     5936        IEMIMPL_SSE_PROLOGUE
     5937        SSE_LD_FXSTATE_MXCSR_ONLY A0
     5938
     5939        movdqu  xmm0, [A2]
     5940        movdqu  xmm1, [A3]
     5941        comisd xmm0, xmm1
     5942        IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0
     5943
     5944        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     5945        IEMIMPL_SSE_EPILOGUE
     5946        EPILOGUE_3_ARGS
     5947ENDPROC             iemAImpl_comisd_u128
     5948
     5949BEGINPROC_FASTCALL  iemAImpl_vcomisd_u128, 12
     5950        PROLOGUE_3_ARGS
     5951        IEMIMPL_SSE_PROLOGUE
     5952        SSE_LD_FXSTATE_MXCSR_ONLY A0
     5953
     5954        movdqu  xmm0, [A2]
     5955        movdqu  xmm1, [A3]
     5956        vcomisd xmm0, xmm1
     5957        IEM_SAVE_FLAGS A1, X86_EFL_STATUS_BITS, 0
     5958
     5959        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     5960        IEMIMPL_SSE_EPILOGUE
     5961        EPILOGUE_3_ARGS
     5962ENDPROC             iemAImpl_vcomisd_u128
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96741 r96748  
    1616516165}
    1616616166#endif
     16167
     16168
     16169/**
     16170 * [V]UCOMISS
     16171 */
     16172#ifdef IEM_WITHOUT_ASSEMBLY
     16173IEM_DECL_IMPL_DEF(void, iemAImpl_ucomiss_u128,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16174{
     16175    uint32_t fEFlagsNew = *pfEFlags & ~X86_EFL_STATUS_BITS;
     16176
     16177    if (RTFLOAT32U_IS_SIGNALLING_NAN(&puSrc1->ar32[0]) || RTFLOAT32U_IS_SIGNALLING_NAN(&puSrc2->ar32[0]))
     16178    {
     16179        *pfMxcsr   |= X86_MXCSR_IE;
     16180        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
     16181    }
     16182    else if (RTFLOAT32U_IS_QUIET_NAN(&puSrc1->ar32[0]) || RTFLOAT32U_IS_QUIET_NAN(&puSrc2->ar32[0]))
     16183    {
     16184        /* ucomiss doesn't raise \#IE for quiet NaNs. */
     16185        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
     16186    }
     16187    else
     16188    {
     16189        softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     16190
     16191        RTFLOAT32U r32Src1, r32Src2;
     16192        uint32_t fDe  = iemSsePrepareValueR32(&r32Src1, *pfMxcsr, &puSrc1->ar32[0]);
     16193                 fDe |= iemSsePrepareValueR32(&r32Src2, *pfMxcsr, &puSrc2->ar32[0]);
     16194
     16195        float32_t f32Src1 = iemFpSoftF32FromIprt(&r32Src1);
     16196        float32_t f32Src2 = iemFpSoftF32FromIprt(&r32Src2);
     16197        if (f32_eq(f32Src1, f32Src2, &SoftState))
     16198            fEFlagsNew |= X86_EFL_ZF; /* EQUAL        100 */
     16199        else if (f32_lt(f32Src1, f32Src2, &SoftState))
     16200            fEFlagsNew |= X86_EFL_CF; /* LESS_THAN    001 */
     16201        /* else:                         GREATER_THAN 000 */
     16202
     16203        *pfMxcsr |= fDe;
     16204    }
     16205
     16206    *pfEFlags = fEFlagsNew;
     16207}
     16208#endif
     16209
     16210IEM_DECL_IMPL_DEF(void, iemAImpl_vucomiss_u128_fallback,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16211{
     16212    iemAImpl_ucomiss_u128(pfMxcsr, pfEFlags, puSrc1, puSrc2);
     16213}
     16214
     16215
     16216/**
     16217 * [V]UCOMISD
     16218 */
     16219#ifdef IEM_WITHOUT_ASSEMBLY
     16220IEM_DECL_IMPL_DEF(void, iemAImpl_ucomisd_u128,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16221{
     16222    uint32_t fEFlagsNew = *pfEFlags & ~X86_EFL_STATUS_BITS;
     16223
     16224    if (RTFLOAT64U_IS_SIGNALLING_NAN(&puSrc1->ar64[0]) || RTFLOAT64U_IS_SIGNALLING_NAN(&puSrc2->ar64[0]))
     16225    {
     16226        *pfMxcsr   |= X86_MXCSR_IE;
     16227        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
     16228    }
     16229    else if (RTFLOAT64U_IS_QUIET_NAN(&puSrc1->ar64[0]) || RTFLOAT64U_IS_QUIET_NAN(&puSrc2->ar64[0]))
     16230    {
     16231        /* ucomiss doesn't raise \#IE for quiet NaNs. */
     16232        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
     16233    }
     16234    else
     16235    {
     16236        softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     16237
     16238        RTFLOAT64U r64Src1, r64Src2;
     16239        uint32_t fDe  = iemSsePrepareValueR64(&r64Src1, *pfMxcsr, &puSrc1->ar64[0]);
     16240                 fDe |= iemSsePrepareValueR64(&r64Src2, *pfMxcsr, &puSrc2->ar64[0]);
     16241
     16242        float64_t f64Src1 = iemFpSoftF64FromIprt(&r64Src1);
     16243        float64_t f64Src2 = iemFpSoftF64FromIprt(&r64Src2);
     16244        if (f64_eq(f64Src1, f64Src2, &SoftState))
     16245            fEFlagsNew |= X86_EFL_ZF; /* EQUAL        100 */
     16246        else if (f64_lt(f64Src1, f64Src2, &SoftState))
     16247            fEFlagsNew |= X86_EFL_CF; /* LESS_THAN    001 */
     16248        /* else:                         GREATER_THAN 000 */
     16249
     16250        *pfMxcsr |= fDe;
     16251    }
     16252
     16253    *pfEFlags = fEFlagsNew;
     16254}
     16255#endif
     16256
     16257IEM_DECL_IMPL_DEF(void, iemAImpl_vucomisd_u128_fallback,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16258{
     16259    iemAImpl_ucomisd_u128(pfMxcsr, pfEFlags, puSrc1, puSrc2);
     16260}
     16261
     16262
     16263/**
     16264 * [V]COMISS
     16265 */
     16266#ifdef IEM_WITHOUT_ASSEMBLY
     16267IEM_DECL_IMPL_DEF(void, iemAImpl_comiss_u128,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16268{
     16269    uint32_t fEFlagsNew = *pfEFlags & ~X86_EFL_STATUS_BITS;
     16270
     16271    if (   RTFLOAT32U_IS_SIGNALLING_NAN(&puSrc1->ar32[0]) || RTFLOAT32U_IS_SIGNALLING_NAN(&puSrc2->ar32[0])
     16272        || RTFLOAT32U_IS_QUIET_NAN(&puSrc1->ar32[0]) || RTFLOAT32U_IS_QUIET_NAN(&puSrc2->ar32[0]))
     16273    {
     16274        *pfMxcsr   |= X86_MXCSR_IE;
     16275        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
     16276    }
     16277    else
     16278    {
     16279        softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     16280
     16281        RTFLOAT32U r32Src1, r32Src2;
     16282        uint32_t fDe  = iemSsePrepareValueR32(&r32Src1, *pfMxcsr, &puSrc1->ar32[0]);
     16283                 fDe |= iemSsePrepareValueR32(&r32Src2, *pfMxcsr, &puSrc2->ar32[0]);
     16284
     16285        float32_t f32Src1 = iemFpSoftF32FromIprt(&r32Src1);
     16286        float32_t f32Src2 = iemFpSoftF32FromIprt(&r32Src2);
     16287        if (f32_eq(f32Src1, f32Src2, &SoftState))
     16288            fEFlagsNew |= X86_EFL_ZF; /* EQUAL        100 */
     16289        else if (f32_lt(f32Src1, f32Src2, &SoftState))
     16290            fEFlagsNew |= X86_EFL_CF; /* LESS_THAN    001 */
     16291        /* else:                         GREATER_THAN 000 */
     16292
     16293        *pfMxcsr |= fDe;
     16294    }
     16295
     16296    *pfEFlags = fEFlagsNew;
     16297}
     16298#endif
     16299
     16300
     16301IEM_DECL_IMPL_DEF(void, iemAImpl_vcomiss_u128_fallback,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16302{
     16303    iemAImpl_comiss_u128(pfMxcsr, pfEFlags, puSrc1, puSrc2);
     16304}
     16305
     16306
     16307/**
     16308 * [V]COMISD
     16309 */
     16310#ifdef IEM_WITHOUT_ASSEMBLY
     16311IEM_DECL_IMPL_DEF(void, iemAImpl_comisd_u128,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16312{
     16313    uint32_t fEFlagsNew = *pfEFlags & ~X86_EFL_STATUS_BITS;
     16314
     16315    if (   RTFLOAT64U_IS_SIGNALLING_NAN(&puSrc1->ar64[0]) || RTFLOAT64U_IS_SIGNALLING_NAN(&puSrc2->ar64[0])
     16316        || RTFLOAT64U_IS_QUIET_NAN(&puSrc1->ar64[0]) || RTFLOAT64U_IS_QUIET_NAN(&puSrc2->ar64[0]))
     16317    {
     16318        *pfMxcsr   |= X86_MXCSR_IE;
     16319        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
     16320    }
     16321    else
     16322    {
     16323        softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     16324
     16325        RTFLOAT64U r64Src1, r64Src2;
     16326        uint32_t fDe  = iemSsePrepareValueR64(&r64Src1, *pfMxcsr, &puSrc1->ar64[0]);
     16327                 fDe |= iemSsePrepareValueR64(&r64Src2, *pfMxcsr, &puSrc2->ar64[0]);
     16328
     16329        float64_t f64Src1 = iemFpSoftF64FromIprt(&r64Src1);
     16330        float64_t f64Src2 = iemFpSoftF64FromIprt(&r64Src2);
     16331        if (f64_eq(f64Src1, f64Src2, &SoftState))
     16332            fEFlagsNew |= X86_EFL_ZF; /* EQUAL        100 */
     16333        else if (f64_lt(f64Src1, f64Src2, &SoftState))
     16334            fEFlagsNew |= X86_EFL_CF; /* LESS_THAN    001 */
     16335        /* else:                         GREATER_THAN 000 */
     16336
     16337        *pfMxcsr |= fDe;
     16338    }
     16339
     16340    *pfEFlags = fEFlagsNew;
     16341}
     16342#endif
     16343
     16344IEM_DECL_IMPL_DEF(void, iemAImpl_vcomisd_u128_fallback,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16345{
     16346    iemAImpl_comisd_u128(pfMxcsr, pfEFlags, puSrc1, puSrc2);
     16347}
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96741 r96748  
    44354435}
    44364436
     4437
    44374438/** Opcode      0x0f 0x2e - ucomiss Vss, Wss */
    4438 FNIEMOP_STUB(iemOp_ucomiss_Vss_Wss); // NEXT
     4439FNIEMOP_DEF(iemOp_ucomiss_Vss_Wss)
     4440{
     4441    IEMOP_MNEMONIC2(RM, UCOMISS, ucomiss, Vss, Wss, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     4442    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4443    if (IEM_IS_MODRM_REG_MODE(bRm))
     4444    {
     4445        /*
     4446         * Register, register.
     4447         */
     4448        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4449        IEM_MC_BEGIN(4, 1);
     4450        IEM_MC_LOCAL(uint32_t, fEFlags);
     4451        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     4452        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     4453        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4454        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     4455        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4456        IEM_MC_PREPARE_SSE_USAGE();
     4457        IEM_MC_FETCH_EFLAGS(fEFlags);
     4458        IEM_MC_REF_MXCSR(pfMxcsr);
     4459        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
     4460        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
     4461        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_ucomiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4462        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4463            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4464        IEM_MC_ELSE()
     4465            IEM_MC_STORE_EFLAGS(fEFlags);
     4466        IEM_MC_ENDIF();
     4467
     4468        IEM_MC_ADVANCE_RIP();
     4469        IEM_MC_END();
     4470    }
     4471    else
     4472    {
     4473        /*
     4474         * Register, memory.
     4475         */
     4476        IEM_MC_BEGIN(4, 3);
     4477        IEM_MC_LOCAL(uint32_t, fEFlags);
     4478        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     4479        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     4480        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4481        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
     4482        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     4483        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     4484
     4485        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4486        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4487        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4488        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4489
     4490        IEM_MC_PREPARE_SSE_USAGE();
     4491        IEM_MC_REF_MXCSR(pfMxcsr);
     4492        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
     4493        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_ucomiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4494        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4495            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4496        IEM_MC_ELSE()
     4497            IEM_MC_STORE_EFLAGS(fEFlags);
     4498        IEM_MC_ENDIF();
     4499
     4500        IEM_MC_ADVANCE_RIP();
     4501        IEM_MC_END();
     4502    }
     4503    return VINF_SUCCESS;
     4504}
     4505
     4506
    44394507/** Opcode 0x66 0x0f 0x2e - ucomisd Vsd, Wsd */
    4440 FNIEMOP_STUB(iemOp_ucomisd_Vsd_Wsd); // NEXT
     4508FNIEMOP_DEF(iemOp_ucomisd_Vsd_Wsd)
     4509{
     4510    IEMOP_MNEMONIC2(RM, UCOMISD, ucomisd, Vsd, Wsd, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     4511    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4512    if (IEM_IS_MODRM_REG_MODE(bRm))
     4513    {
     4514        /*
     4515         * Register, register.
     4516         */
     4517        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4518        IEM_MC_BEGIN(4, 1);
     4519        IEM_MC_LOCAL(uint32_t, fEFlags);
     4520        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     4521        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     4522        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4523        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     4524        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4525        IEM_MC_PREPARE_SSE_USAGE();
     4526        IEM_MC_FETCH_EFLAGS(fEFlags);
     4527        IEM_MC_REF_MXCSR(pfMxcsr);
     4528        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
     4529        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
     4530        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_ucomisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4531        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4532            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4533        IEM_MC_ELSE()
     4534            IEM_MC_STORE_EFLAGS(fEFlags);
     4535        IEM_MC_ENDIF();
     4536
     4537        IEM_MC_ADVANCE_RIP();
     4538        IEM_MC_END();
     4539    }
     4540    else
     4541    {
     4542        /*
     4543         * Register, memory.
     4544         */
     4545        IEM_MC_BEGIN(4, 3);
     4546        IEM_MC_LOCAL(uint32_t, fEFlags);
     4547        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     4548        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     4549        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4550        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
     4551        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     4552        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     4553
     4554        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4555        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4556        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4557        IEM_MC_FETCH_MEM_XMM_U64(uSrc2, 0 /*a_QWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4558
     4559        IEM_MC_PREPARE_SSE_USAGE();
     4560        IEM_MC_REF_MXCSR(pfMxcsr);
     4561        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
     4562        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_ucomisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4563        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4564            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4565        IEM_MC_ELSE()
     4566            IEM_MC_STORE_EFLAGS(fEFlags);
     4567        IEM_MC_ENDIF();
     4568
     4569        IEM_MC_ADVANCE_RIP();
     4570        IEM_MC_END();
     4571    }
     4572    return VINF_SUCCESS;
     4573}
     4574
     4575
    44414576/*  Opcode 0xf3 0x0f 0x2e - invalid */
    44424577/*  Opcode 0xf2 0x0f 0x2e - invalid */
    44434578
     4579
    44444580/** Opcode      0x0f 0x2f - comiss Vss, Wss */
    4445 FNIEMOP_STUB(iemOp_comiss_Vss_Wss);
     4581FNIEMOP_DEF(iemOp_comiss_Vss_Wss)
     4582{
     4583    IEMOP_MNEMONIC2(RM, COMISS, comiss, Vss, Wss, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     4584    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4585    if (IEM_IS_MODRM_REG_MODE(bRm))
     4586    {
     4587        /*
     4588         * Register, register.
     4589         */
     4590        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4591        IEM_MC_BEGIN(4, 1);
     4592        IEM_MC_LOCAL(uint32_t, fEFlags);
     4593        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     4594        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     4595        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4596        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     4597        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4598        IEM_MC_PREPARE_SSE_USAGE();
     4599        IEM_MC_FETCH_EFLAGS(fEFlags);
     4600        IEM_MC_REF_MXCSR(pfMxcsr);
     4601        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
     4602        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
     4603        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_comiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4604        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4605            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4606        IEM_MC_ELSE()
     4607            IEM_MC_STORE_EFLAGS(fEFlags);
     4608        IEM_MC_ENDIF();
     4609
     4610        IEM_MC_ADVANCE_RIP();
     4611        IEM_MC_END();
     4612    }
     4613    else
     4614    {
     4615        /*
     4616         * Register, memory.
     4617         */
     4618        IEM_MC_BEGIN(4, 3);
     4619        IEM_MC_LOCAL(uint32_t, fEFlags);
     4620        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     4621        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     4622        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4623        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
     4624        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     4625        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     4626
     4627        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4628        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4629        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4630        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4631
     4632        IEM_MC_PREPARE_SSE_USAGE();
     4633        IEM_MC_REF_MXCSR(pfMxcsr);
     4634        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
     4635        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_comiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4636        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4637            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4638        IEM_MC_ELSE()
     4639            IEM_MC_STORE_EFLAGS(fEFlags);
     4640        IEM_MC_ENDIF();
     4641
     4642        IEM_MC_ADVANCE_RIP();
     4643        IEM_MC_END();
     4644    }
     4645    return VINF_SUCCESS;
     4646}
     4647
     4648
    44464649/** Opcode 0x66 0x0f 0x2f - comisd Vsd, Wsd */
    4447 FNIEMOP_STUB(iemOp_comisd_Vsd_Wsd);
     4650FNIEMOP_DEF(iemOp_comisd_Vsd_Wsd)
     4651{
     4652    IEMOP_MNEMONIC2(RM, COMISD, comisd, Vsd, Wsd, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     4653    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4654    if (IEM_IS_MODRM_REG_MODE(bRm))
     4655    {
     4656        /*
     4657         * Register, register.
     4658         */
     4659        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4660        IEM_MC_BEGIN(4, 1);
     4661        IEM_MC_LOCAL(uint32_t, fEFlags);
     4662        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     4663        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     4664        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4665        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     4666        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4667        IEM_MC_PREPARE_SSE_USAGE();
     4668        IEM_MC_FETCH_EFLAGS(fEFlags);
     4669        IEM_MC_REF_MXCSR(pfMxcsr);
     4670        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
     4671        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
     4672        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_comisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4673        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4674            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4675        IEM_MC_ELSE()
     4676            IEM_MC_STORE_EFLAGS(fEFlags);
     4677        IEM_MC_ENDIF();
     4678
     4679        IEM_MC_ADVANCE_RIP();
     4680        IEM_MC_END();
     4681    }
     4682    else
     4683    {
     4684        /*
     4685         * Register, memory.
     4686         */
     4687        IEM_MC_BEGIN(4, 3);
     4688        IEM_MC_LOCAL(uint32_t, fEFlags);
     4689        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     4690        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     4691        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4692        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
     4693        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     4694        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     4695
     4696        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4697        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4698        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4699        IEM_MC_FETCH_MEM_XMM_U64(uSrc2, 0 /*a_QWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4700
     4701        IEM_MC_PREPARE_SSE_USAGE();
     4702        IEM_MC_REF_MXCSR(pfMxcsr);
     4703        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
     4704        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_comisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4705        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4706            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4707        IEM_MC_ELSE()
     4708            IEM_MC_STORE_EFLAGS(fEFlags);
     4709        IEM_MC_ENDIF();
     4710
     4711        IEM_MC_ADVANCE_RIP();
     4712        IEM_MC_END();
     4713    }
     4714    return VINF_SUCCESS;
     4715}
     4716
     4717
    44484718/*  Opcode 0xf3 0x0f 0x2f - invalid */
    44494719/*  Opcode 0xf2 0x0f 0x2f - invalid */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r96713 r96748  
    23022302FNIEMOP_STUB(iemOp_vcvtsd2si_Gy_Wsd);
    23032303
     2304
    23042305/** Opcode VEX.0F 0x2e - vucomiss Vss, Wss */
    2305 FNIEMOP_STUB(iemOp_vucomiss_Vss_Wss);
     2306FNIEMOP_DEF(iemOp_vucomiss_Vss_Wss)
     2307{
     2308    IEMOP_MNEMONIC2(RM, VUCOMISS, vucomiss, Vss, Wss, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
     2309    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     2310    if (IEM_IS_MODRM_REG_MODE(bRm))
     2311    {
     2312        /*
     2313         * Register, register.
     2314         */
     2315        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2316        IEM_MC_BEGIN(4, 1);
     2317        IEM_MC_LOCAL(uint32_t, fEFlags);
     2318        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     2319        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     2320        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2321        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     2322        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2323        IEM_MC_PREPARE_AVX_USAGE();
     2324        IEM_MC_FETCH_EFLAGS(fEFlags);
     2325        IEM_MC_REF_MXCSR(pfMxcsr);
     2326        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
     2327        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
     2328        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_vucomiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     2329        IEM_MC_IF_MXCSR_XCPT_PENDING()
     2330            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     2331        IEM_MC_ELSE()
     2332            IEM_MC_STORE_EFLAGS(fEFlags);
     2333        IEM_MC_ENDIF();
     2334
     2335        IEM_MC_ADVANCE_RIP();
     2336        IEM_MC_END();
     2337    }
     2338    else
     2339    {
     2340        /*
     2341         * Register, memory.
     2342         */
     2343        IEM_MC_BEGIN(4, 3);
     2344        IEM_MC_LOCAL(uint32_t, fEFlags);
     2345        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     2346        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     2347        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2348        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
     2349        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     2350        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     2351
     2352        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     2353        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2354        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2355        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     2356
     2357        IEM_MC_PREPARE_AVX_USAGE();
     2358        IEM_MC_REF_MXCSR(pfMxcsr);
     2359        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
     2360        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_vucomiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     2361        IEM_MC_IF_MXCSR_XCPT_PENDING()
     2362            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     2363        IEM_MC_ELSE()
     2364            IEM_MC_STORE_EFLAGS(fEFlags);
     2365        IEM_MC_ENDIF();
     2366
     2367        IEM_MC_ADVANCE_RIP();
     2368        IEM_MC_END();
     2369    }
     2370    return VINF_SUCCESS;
     2371}
     2372
     2373
    23062374/** Opcode VEX.66.0F 0x2e - vucomisd Vsd, Wsd */
    2307 FNIEMOP_STUB(iemOp_vucomisd_Vsd_Wsd);
     2375FNIEMOP_DEF(iemOp_vucomisd_Vsd_Wsd)
     2376{
     2377    IEMOP_MNEMONIC2(RM, VUCOMISD, vucomisd, Vsd, Wsd, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
     2378    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     2379    if (IEM_IS_MODRM_REG_MODE(bRm))
     2380    {
     2381        /*
     2382         * Register, register.
     2383         */
     2384        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2385        IEM_MC_BEGIN(4, 1);
     2386        IEM_MC_LOCAL(uint32_t, fEFlags);
     2387        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     2388        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     2389        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2390        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     2391        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2392        IEM_MC_PREPARE_AVX_USAGE();
     2393        IEM_MC_FETCH_EFLAGS(fEFlags);
     2394        IEM_MC_REF_MXCSR(pfMxcsr);
     2395        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
     2396        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
     2397        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_vucomisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     2398        IEM_MC_IF_MXCSR_XCPT_PENDING()
     2399            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     2400        IEM_MC_ELSE()
     2401            IEM_MC_STORE_EFLAGS(fEFlags);
     2402        IEM_MC_ENDIF();
     2403
     2404        IEM_MC_ADVANCE_RIP();
     2405        IEM_MC_END();
     2406    }
     2407    else
     2408    {
     2409        /*
     2410         * Register, memory.
     2411         */
     2412        IEM_MC_BEGIN(4, 3);
     2413        IEM_MC_LOCAL(uint32_t, fEFlags);
     2414        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     2415        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     2416        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2417        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
     2418        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     2419        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     2420
     2421        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     2422        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2423        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2424        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     2425
     2426        IEM_MC_PREPARE_AVX_USAGE();
     2427        IEM_MC_REF_MXCSR(pfMxcsr);
     2428        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
     2429        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_vucomisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     2430        IEM_MC_IF_MXCSR_XCPT_PENDING()
     2431            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     2432        IEM_MC_ELSE()
     2433            IEM_MC_STORE_EFLAGS(fEFlags);
     2434        IEM_MC_ENDIF();
     2435
     2436        IEM_MC_ADVANCE_RIP();
     2437        IEM_MC_END();
     2438    }
     2439    return VINF_SUCCESS;
     2440}
     2441
     2442
    23082443/*  Opcode VEX.F3.0F 0x2e - invalid */
    23092444/*  Opcode VEX.F2.0F 0x2e - invalid */
    23102445
    23112446/** Opcode VEX.0F 0x2f - vcomiss Vss, Wss */
    2312 FNIEMOP_STUB(iemOp_vcomiss_Vss_Wss);
     2447FNIEMOP_DEF(iemOp_vcomiss_Vss_Wss)
     2448{
     2449    IEMOP_MNEMONIC2(RM, VCOMISS, vcomiss, Vss, Wss, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
     2450    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     2451    if (IEM_IS_MODRM_REG_MODE(bRm))
     2452    {
     2453        /*
     2454         * Register, register.
     2455         */
     2456        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2457        IEM_MC_BEGIN(4, 1);
     2458        IEM_MC_LOCAL(uint32_t, fEFlags);
     2459        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     2460        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     2461        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2462        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     2463        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2464        IEM_MC_PREPARE_AVX_USAGE();
     2465        IEM_MC_FETCH_EFLAGS(fEFlags);
     2466        IEM_MC_REF_MXCSR(pfMxcsr);
     2467        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
     2468        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
     2469        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_vcomiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     2470        IEM_MC_IF_MXCSR_XCPT_PENDING()
     2471            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     2472        IEM_MC_ELSE()
     2473            IEM_MC_STORE_EFLAGS(fEFlags);
     2474        IEM_MC_ENDIF();
     2475
     2476        IEM_MC_ADVANCE_RIP();
     2477        IEM_MC_END();
     2478    }
     2479    else
     2480    {
     2481        /*
     2482         * Register, memory.
     2483         */
     2484        IEM_MC_BEGIN(4, 3);
     2485        IEM_MC_LOCAL(uint32_t, fEFlags);
     2486        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     2487        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     2488        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2489        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
     2490        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     2491        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     2492
     2493        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     2494        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2495        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2496        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     2497
     2498        IEM_MC_PREPARE_AVX_USAGE();
     2499        IEM_MC_REF_MXCSR(pfMxcsr);
     2500        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
     2501        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_vcomiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     2502        IEM_MC_IF_MXCSR_XCPT_PENDING()
     2503            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     2504        IEM_MC_ELSE()
     2505            IEM_MC_STORE_EFLAGS(fEFlags);
     2506        IEM_MC_ENDIF();
     2507
     2508        IEM_MC_ADVANCE_RIP();
     2509        IEM_MC_END();
     2510    }
     2511    return VINF_SUCCESS;
     2512}
     2513
     2514
    23132515/** Opcode VEX.66.0F 0x2f - vcomisd Vsd, Wsd */
    2314 FNIEMOP_STUB(iemOp_vcomisd_Vsd_Wsd);
     2516FNIEMOP_DEF(iemOp_vcomisd_Vsd_Wsd)
     2517{
     2518    IEMOP_MNEMONIC2(RM, VCOMISD, vcomisd, Vsd, Wsd, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
     2519    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     2520    if (IEM_IS_MODRM_REG_MODE(bRm))
     2521    {
     2522        /*
     2523         * Register, register.
     2524         */
     2525        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2526        IEM_MC_BEGIN(4, 1);
     2527        IEM_MC_LOCAL(uint32_t, fEFlags);
     2528        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     2529        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     2530        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2531        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     2532        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2533        IEM_MC_PREPARE_AVX_USAGE();
     2534        IEM_MC_FETCH_EFLAGS(fEFlags);
     2535        IEM_MC_REF_MXCSR(pfMxcsr);
     2536        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
     2537        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
     2538        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_vcomisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     2539        IEM_MC_IF_MXCSR_XCPT_PENDING()
     2540            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     2541        IEM_MC_ELSE()
     2542            IEM_MC_STORE_EFLAGS(fEFlags);
     2543        IEM_MC_ENDIF();
     2544
     2545        IEM_MC_ADVANCE_RIP();
     2546        IEM_MC_END();
     2547    }
     2548    else
     2549    {
     2550        /*
     2551         * Register, memory.
     2552         */
     2553        IEM_MC_BEGIN(4, 3);
     2554        IEM_MC_LOCAL(uint32_t, fEFlags);
     2555        IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
     2556        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
     2557        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2558        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
     2559        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     2560        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     2561
     2562        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     2563        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2564        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2565        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     2566
     2567        IEM_MC_PREPARE_AVX_USAGE();
     2568        IEM_MC_REF_MXCSR(pfMxcsr);
     2569        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
     2570        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_vcomisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     2571        IEM_MC_IF_MXCSR_XCPT_PENDING()
     2572            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     2573        IEM_MC_ELSE()
     2574            IEM_MC_STORE_EFLAGS(fEFlags);
     2575        IEM_MC_ENDIF();
     2576
     2577        IEM_MC_ADVANCE_RIP();
     2578        IEM_MC_END();
     2579    }
     2580    return VINF_SUCCESS;
     2581}
     2582
     2583
    23152584/*  Opcode VEX.F3.0F 0x2f - invalid */
    23162585/*  Opcode VEX.F2.0F 0x2f - invalid */
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