VirtualBox

Changeset 40210 in vbox


Ignore:
Timestamp:
Feb 22, 2012 12:56:53 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76383
Message:

IEM: fst/fstp m64r/m32r.

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

Legend:

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

    r40209 r40210  
    1063810638
    1063910639/** Opcode 0xd9 !11/2 mem32real */
    10640 FNIEMOP_STUB_1(iemOp_fst_m32r, uint8_t, bRm);
     10640FNIEMOP_DEF_1(iemOp_fst_m32r, uint8_t, bRm)
     10641{
     10642    IEMOP_MNEMONIC("fst m32r");
     10643    IEM_MC_BEGIN(3, 2);
     10644    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
     10645    IEM_MC_LOCAL(uint16_t,              u16FSW);
     10646    IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16FSW,    u16FSW, 0);
     10647    IEM_MC_ARG(PRTFLOAT32U,             pr32Dst,            1);
     10648    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
     10649
     10650    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
     10651    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     10652
     10653    IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     10654    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
     10655        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16FSW, pr32Dst, pr80Value);
     10656        IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
     10657        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16FSW, pIemCpu->iEffSeg, GCPtrEffDst);
     10658    IEM_MC_ELSE()
     10659        IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(pr32Dst, IEM_ACCESS_DATA_W, u16FSW);
     10660        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     10661    IEM_MC_ENDIF();
     10662    IEM_MC_ADVANCE_RIP();
     10663    IEM_MC_END();
     10664    return VINF_SUCCESS;
     10665}
     10666
    1064110667
    1064210668/** Opcode 0xd9 !11/3 */
    10643 FNIEMOP_STUB_1(iemOp_fstp_m32r, uint8_t, bRm);
     10669FNIEMOP_DEF_1(iemOp_fstp_m32r, uint8_t, bRm)
     10670{
     10671    IEMOP_MNEMONIC("fstp m32r");
     10672    IEM_MC_BEGIN(3, 2);
     10673    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
     10674    IEM_MC_LOCAL(uint16_t,              u16FSW);
     10675    IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16FSW,    u16FSW, 0);
     10676    IEM_MC_ARG(PRTFLOAT32U,             pr32Dst,            1);
     10677    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
     10678
     10679    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
     10680    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     10681
     10682    IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     10683    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
     10684        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16FSW, pr32Dst, pr80Value);
     10685        IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
     10686        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16FSW, pIemCpu->iEffSeg, GCPtrEffDst);
     10687    IEM_MC_ELSE()
     10688        IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(pr32Dst, IEM_ACCESS_DATA_W, u16FSW);
     10689        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     10690    IEM_MC_ENDIF();
     10691    IEM_MC_ADVANCE_RIP();
     10692    IEM_MC_END();
     10693    return VINF_SUCCESS;
     10694}
     10695
    1064410696
    1064510697/** Opcode 0xd9 !11/4 */
     
    1131111363FNIEMOP_STUB_1(iemOp_fisttp_m64i, uint8_t, bRm);
    1131211364
     11365
    1131311366/** Opcode 0xdd !11/0. */
    11314 FNIEMOP_STUB_1(iemOp_fst_m64r,    uint8_t, bRm);
     11367FNIEMOP_DEF_1(iemOp_fst_m64r,    uint8_t, bRm)
     11368{
     11369    IEMOP_MNEMONIC("fst m64r");
     11370    IEM_MC_BEGIN(3, 2);
     11371    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
     11372    IEM_MC_LOCAL(uint16_t,              u16FSW);
     11373    IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16FSW,    u16FSW, 0);
     11374    IEM_MC_ARG(PRTFLOAT64U,             pr64Dst,            1);
     11375    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
     11376
     11377    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
     11378    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     11379
     11380    IEM_MC_MEM_MAP(pr64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     11381    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
     11382        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16FSW, pr64Dst, pr80Value);
     11383        IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W);
     11384        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16FSW, pIemCpu->iEffSeg, GCPtrEffDst);
     11385    IEM_MC_ELSE()
     11386        IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(pr64Dst, IEM_ACCESS_DATA_W, u16FSW);
     11387        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     11388    IEM_MC_ENDIF();
     11389    IEM_MC_ADVANCE_RIP();
     11390    IEM_MC_END();
     11391    return VINF_SUCCESS;
     11392}
     11393
     11394
     11395
    1131511396
    1131611397/** Opcode 0xdd !11/0. */
    11317 FNIEMOP_STUB_1(iemOp_fstp_m64r,   uint8_t, bRm);
     11398FNIEMOP_DEF_1(iemOp_fstp_m64r,   uint8_t, bRm)
     11399{
     11400    IEMOP_MNEMONIC("fstp m64r");
     11401    IEM_MC_BEGIN(3, 2);
     11402    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
     11403    IEM_MC_LOCAL(uint16_t,              u16FSW);
     11404    IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16FSW,    u16FSW, 0);
     11405    IEM_MC_ARG(PRTFLOAT64U,             pr64Dst,            1);
     11406    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
     11407
     11408    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
     11409    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     11410
     11411    IEM_MC_MEM_MAP(pr64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     11412    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
     11413        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16FSW, pr64Dst, pr80Value);
     11414        IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W);
     11415        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16FSW, pIemCpu->iEffSeg, GCPtrEffDst);
     11416    IEM_MC_ELSE()
     11417        IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(pr64Dst, IEM_ACCESS_DATA_W, u16FSW);
     11418        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     11419    IEM_MC_ENDIF();
     11420    IEM_MC_ADVANCE_RIP();
     11421    IEM_MC_END();
     11422    return VINF_SUCCESS;
     11423}
     11424
    1131811425
    1131911426/** Opcode 0xdd !11/0. */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r40209 r40210  
    728728/** @name FPU operations taking a 32-bit float argument
    729729 * @{ */
    730 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUR32U,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, PCRTFLOAT32U pr32Val));
    731 typedef FNIEMAIMPLFPUR32U  *PFNIEMAIMPLFPUR32U;
    732730typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUR32FSW,(PCX86FXSTATE pFpuState, uint16_t *pFSW,
    733731                                                      PCRTFLOAT80U pr80Val1, PCRTFLOAT32U pr32Val2));
    734732typedef FNIEMAIMPLFPUR32FSW *PFNIEMAIMPLFPUR32FSW;
     733
    735734typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUR32,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes,
    736735                                                   PCRTFLOAT80U pr80Val1, PCRTFLOAT32U pr32Val2));
    737 typedef FNIEMAIMPLFPUR32  *PFNIEMAIMPLFPUR32;
    738 
    739 FNIEMAIMPLFPUR32U   iemAImpl_fld_r32_to_r80;
     736typedef FNIEMAIMPLFPUR32    *PFNIEMAIMPLFPUR32;
     737
    740738FNIEMAIMPLFPUR32FSW iemAImpl_fcom_r80_by_r32;
    741739FNIEMAIMPLFPUR32    iemAImpl_fadd_r80_by_r32;
     
    745743FNIEMAIMPLFPUR32    iemAImpl_fdiv_r80_by_r32;
    746744FNIEMAIMPLFPUR32    iemAImpl_fdivr_r80_by_r32;
     745
     746IEM_DECL_IMPL_DEF(void, iemAImpl_fld_r32_to_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, PCRTFLOAT32U pr32Val));
     747IEM_DECL_IMPL_DEF(void, iemAImpl_fst_r80_to_r32,(PCX86FXSTATE pFpuState, uint16_t *pu16FSW,
     748                                                 PRTFLOAT32U pr32Val, PCRTFLOAT80U pr80Val));
    747749/** @} */
    748750
     
    752754                                                   PCRTFLOAT80U pr80Val1, PCRTFLOAT64U pr64Val2));
    753755typedef FNIEMAIMPLFPUR64   *PFNIEMAIMPLFPUR64;
    754 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUR64U,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, PCRTFLOAT64U pr64Val));
    755 typedef FNIEMAIMPLFPUR64U  *PFNIEMAIMPLFPUR64U;
    756 
    757 FNIEMAIMPLFPUR64U iemAImpl_fld_r64_to_r80;
     756
    758757FNIEMAIMPLFPUR64  iemAImpl_fadd_r80_by_r64;
    759758FNIEMAIMPLFPUR64  iemAImpl_fmul_r80_by_r64;
     
    763762FNIEMAIMPLFPUR64  iemAImpl_fdiv_r80_by_r64;
    764763FNIEMAIMPLFPUR64  iemAImpl_fdivr_r80_by_r64;
     764
     765IEM_DECL_IMPL_DEF(void, iemAImpl_fld_r64_to_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, PCRTFLOAT64U pr64Val));
     766IEM_DECL_IMPL_DEF(void, iemAImpl_fst_r80_to_r64,(PCX86FXSTATE pFpuState, uint16_t *pu16FSW,
     767                                                 PRTFLOAT64U pr32Val, PCRTFLOAT80U pr80Val));
    765768/** @} */
    766769
     
    770773                                                      PCRTFLOAT80U pr80Val1, PCRTFLOAT80U pr80Val2));
    771774typedef FNIEMAIMPLFPUR80FSW *PFNIEMAIMPLFPUR80FSW;
     775
    772776typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUR80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes,
    773777                                                   PCRTFLOAT80U pr80Val1, PCRTFLOAT80U pr80Val2));
Note: See TracChangeset for help on using the changeset viewer.

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