VirtualBox

Changeset 40255 in vbox for trunk/src


Ignore:
Timestamp:
Feb 25, 2012 12:38:51 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76469
Message:

Implemented fpu instruction stubs starting with 0xdd (fiadd m32i ++).

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

Legend:

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

    r40254 r40255  
    60196019#define IEM_MC_FETCH_MEM_U16_DISP(a_u16Dst, a_iSeg, a_GCPtrMem, a_offDisp) \
    60206020    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pIemCpu, &(a_u16Dst), (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
     6021#define IEM_MC_FETCH_MEM_I16(a_i16Dst, a_iSeg, a_GCPtrMem) \
     6022    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pIemCpu, (uint16_t *)&(a_i16Dst), (a_iSeg), (a_GCPtrMem)))
    60216023
    60226024#define IEM_MC_FETCH_MEM_U32(a_u32Dst, a_iSeg, a_GCPtrMem) \
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r40251 r40255  
    14051405
    14061406
     1407;;
     1408; FPU instruction working on one 80-bit and one 16-bit signed integer value.
     1409;
     1410; @param    1       The instruction
     1411;
     1412; @param    A0      FPU context (fxsave).
     1413; @param    A1      Pointer to a IEMFPURESULT for the output.
     1414; @param    A2      Pointer to the 80-bit value.
     1415; @param    A3      Pointer to the 16-bit value.
     1416;
     1417%macro IEMIMPL_FPU_R80_BY_I16 1
     1418BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _r80_by_i16, 16
     1419        PROLOGUE_4_ARGS
     1420        sub     xSP, 20h
     1421
     1422        fninit
     1423        fld     tword [A2]
     1424        FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0
     1425        %1      word [A3]
     1426
     1427        fnstsw  word  [A1 + IEMFPURESULT.FSW]
     1428        fnclex
     1429        fstp    tword [A1 + IEMFPURESULT.r80Result]
     1430
     1431        fninit
     1432        add     xSP, 20h
     1433        EPILOGUE_4_ARGS 8
     1434ENDPROC iemAImpl_ %+ %1 %+ _r80_by_i16
     1435%endmacro
     1436
     1437IEMIMPL_FPU_R80_BY_I16 fiadd
     1438IEMIMPL_FPU_R80_BY_I16 fimul
     1439IEMIMPL_FPU_R80_BY_I16 fisub
     1440IEMIMPL_FPU_R80_BY_I16 fisubr
     1441IEMIMPL_FPU_R80_BY_I16 fidiv
     1442IEMIMPL_FPU_R80_BY_I16 fidivr
     1443
     1444
     1445;;
     1446; FPU instruction working on one 80-bit and one 16-bit signed integer value,
     1447; only returning FSW.
     1448;
     1449; @param    1       The instruction
     1450;
     1451; @param    A0      FPU context (fxsave).
     1452; @param    A1      Where to store the output FSW.
     1453; @param    A2      Pointer to the 80-bit value.
     1454; @param    A3      Pointer to the 64-bit value.
     1455;
     1456%macro IEMIMPL_FPU_R80_BY_I16_FSW 1
     1457BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _r80_by_i16, 16
     1458        PROLOGUE_4_ARGS
     1459        sub     xSP, 20h
     1460
     1461        fninit
     1462        fld     tword [A2]
     1463        FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0
     1464        %1      word [A3]
     1465
     1466        fnstsw  word  [A1]
     1467
     1468        fninit
     1469        add     xSP, 20h
     1470        EPILOGUE_4_ARGS 8
     1471ENDPROC iemAImpl_ %+ %1 %+ _r80_by_i16
     1472%endmacro
     1473
     1474IEMIMPL_FPU_R80_BY_I16_FSW ficom
     1475
     1476
    14071477
    14081478;
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r40253 r40255  
    1268012680
    1268112681
     12682/**
     12683 * Common worker for FPU instructions working on ST0 and an m16i, and storing
     12684 * the result in ST0.
     12685 *
     12686 * @param   pfnAImpl    Pointer to the instruction implementation (assembly).
     12687 */
     12688FNIEMOP_DEF_2(iemOpHlpFpu_st0_m16i, uint8_t, bRm, PFNIEMAIMPLFPUI16, pfnAImpl)
     12689{
     12690    IEM_MC_BEGIN(3, 3);
     12691    IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     12692    IEM_MC_LOCAL(IEMFPURESULT,              FpuRes);
     12693    IEM_MC_LOCAL(int16_t,                   i16Val2);
     12694    IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT,     pFpuRes,        FpuRes,     0);
     12695    IEM_MC_ARG(PCRTFLOAT80U,                pr80Value1,                 1);
     12696    IEM_MC_ARG_LOCAL_REF(int16_t const *,   pi16Val2,       i16Val2,    2);
     12697
     12698    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm);
     12699    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     12700
     12701    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     12702    IEM_MC_MAYBE_RAISE_FPU_XCPT();
     12703    IEM_MC_FETCH_MEM_I16(i16Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     12704
     12705    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
     12706        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pi16Val2);
     12707        IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
     12708    IEM_MC_ELSE()
     12709        IEM_MC_FPU_STACK_UNDERFLOW(0);
     12710    IEM_MC_ENDIF();
     12711    IEM_MC_ADVANCE_RIP();
     12712
     12713    IEM_MC_END();
     12714    return VINF_SUCCESS;
     12715}
     12716
     12717
    1268212718/** Opcode 0xde !11/0. */
    12683 FNIEMOP_STUB_1(iemOp_fiadd_m16i,  uint8_t, bRm);
     12719FNIEMOP_DEF_1(iemOp_fiadd_m16i,  uint8_t, bRm)
     12720{
     12721    IEMOP_MNEMONIC("fiadd m16i");
     12722    return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fiadd_r80_by_i16);
     12723}
     12724
    1268412725
    1268512726/** Opcode 0xde !11/1. */
    12686 FNIEMOP_STUB_1(iemOp_fimul_m16i,  uint8_t, bRm);
     12727FNIEMOP_DEF_1(iemOp_fimul_m16i,  uint8_t, bRm)
     12728{
     12729    IEMOP_MNEMONIC("fimul m16i");
     12730    return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fimul_r80_by_i16);
     12731}
     12732
    1268712733
    1268812734/** Opcode 0xde !11/2. */
    12689 FNIEMOP_STUB_1(iemOp_ficom_m16i,  uint8_t, bRm);
     12735FNIEMOP_DEF_1(iemOp_ficom_m16i,  uint8_t, bRm)
     12736{
     12737    IEMOP_MNEMONIC("ficom st0,m16i");
     12738
     12739    IEM_MC_BEGIN(3, 3);
     12740    IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     12741    IEM_MC_LOCAL(uint16_t,                  u16Fsw);
     12742    IEM_MC_LOCAL(int16_t,                   i16Val2);
     12743    IEM_MC_ARG_LOCAL_REF(uint16_t *,        pu16Fsw,        u16Fsw,     0);
     12744    IEM_MC_ARG(PCRTFLOAT80U,                pr80Value1,                 1);
     12745    IEM_MC_ARG_LOCAL_REF(int16_t const *,   pi16Val2,       i16Val2,    2);
     12746
     12747    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm);
     12748    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     12749
     12750    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     12751    IEM_MC_MAYBE_RAISE_FPU_XCPT();
     12752    IEM_MC_FETCH_MEM_I16(i16Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     12753
     12754    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
     12755        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i16, pu16Fsw, pr80Value1, pi16Val2);
     12756        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     12757    IEM_MC_ELSE()
     12758        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     12759    IEM_MC_ENDIF();
     12760    IEM_MC_ADVANCE_RIP();
     12761
     12762    IEM_MC_END();
     12763    return VINF_SUCCESS;
     12764}
     12765
    1269012766
    1269112767/** Opcode 0xde !11/3. */
    12692 FNIEMOP_STUB_1(iemOp_ficomp_m16i, uint8_t, bRm);
     12768FNIEMOP_DEF_1(iemOp_ficomp_m16i, uint8_t, bRm)
     12769{
     12770    IEMOP_MNEMONIC("ficomp st0,m16i");
     12771
     12772    IEM_MC_BEGIN(3, 3);
     12773    IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     12774    IEM_MC_LOCAL(uint16_t,                  u16Fsw);
     12775    IEM_MC_LOCAL(int16_t,                   i16Val2);
     12776    IEM_MC_ARG_LOCAL_REF(uint16_t *,        pu16Fsw,        u16Fsw,     0);
     12777    IEM_MC_ARG(PCRTFLOAT80U,                pr80Value1,                 1);
     12778    IEM_MC_ARG_LOCAL_REF(int16_t const *,   pi16Val2,       i16Val2,    2);
     12779
     12780    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm);
     12781    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     12782
     12783    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
     12784    IEM_MC_MAYBE_RAISE_FPU_XCPT();
     12785    IEM_MC_FETCH_MEM_I16(i16Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     12786
     12787    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
     12788        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i16, pu16Fsw, pr80Value1, pi16Val2);
     12789        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     12790    IEM_MC_ELSE()
     12791        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     12792    IEM_MC_ENDIF();
     12793    IEM_MC_ADVANCE_RIP();
     12794
     12795    IEM_MC_END();
     12796    return VINF_SUCCESS;
     12797}
     12798
    1269312799
    1269412800/** Opcode 0xde !11/4. */
    12695 FNIEMOP_STUB_1(iemOp_fisub_m16i,  uint8_t, bRm);
     12801FNIEMOP_DEF_1(iemOp_fisub_m16i,  uint8_t, bRm)
     12802{
     12803    IEMOP_MNEMONIC("fisub m16i");
     12804    return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fisub_r80_by_i16);
     12805}
     12806
    1269612807
    1269712808/** Opcode 0xde !11/5. */
    12698 FNIEMOP_STUB_1(iemOp_fisubr_m16i, uint8_t, bRm);
     12809FNIEMOP_DEF_1(iemOp_fisubr_m16i, uint8_t, bRm)
     12810{
     12811    IEMOP_MNEMONIC("fisubr m16i");
     12812    return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fisubr_r80_by_i16);
     12813}
     12814
    1269912815
    1270012816/** Opcode 0xde !11/6. */
    12701 FNIEMOP_STUB_1(iemOp_fidiv_m16i,  uint8_t, bRm);
     12817FNIEMOP_DEF_1(iemOp_fidiv_m16i,  uint8_t, bRm)
     12818{
     12819    IEMOP_MNEMONIC("fiadd m16i");
     12820    return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fidiv_r80_by_i16);
     12821}
     12822
    1270212823
    1270312824/** Opcode 0xde !11/7. */
    12704 FNIEMOP_STUB_1(iemOp_fidivr_m16i, uint8_t, bRm);
     12825FNIEMOP_DEF_1(iemOp_fidivr_m16i, uint8_t, bRm)
     12826{
     12827    IEMOP_MNEMONIC("fiadd m16i");
     12828    return FNIEMOP_CALL_2(iemOpHlpFpu_st0_m16i, bRm, iemAImpl_fidivr_r80_by_i16);
     12829}
    1270512830
    1270612831
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r40248 r40255  
    216216#define iemAImpl_fxtract_r80_r80        NULL
    217217#define iemAImpl_fsincos_r80_r80        NULL
     218
     219#define iemAImpl_fiadd_r80_by_i16       NULL
     220#define iemAImpl_fimul_r80_by_i16       NULL
     221#define iemAImpl_fisub_r80_by_i16       NULL
     222#define iemAImpl_fisubr_r80_by_i16      NULL
     223#define iemAImpl_fidiv_r80_by_i16       NULL
     224#define iemAImpl_fidivr_r80_by_i16      NULL
    218225
    219226#define iemAImpl_fiadd_r80_by_i32       NULL
     
    410417#define IEM_MC_FETCH_MEM32_U8(a_u8Dst, a_iSeg, a_GCPtrMem32)            do { CHK_TYPE(uint32_t, a_GCPtrMem32); } while (0)
    411418#define IEM_MC_FETCH_MEM_U16(a_u16Dst, a_iSeg, a_GCPtrMem)              do { CHK_GCPTR(a_GCPtrMem); } while (0)
     419#define IEM_MC_FETCH_MEM_I16(a_i16Dst, a_iSeg, a_GCPtrMem)              do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(int16_t, a_i16Dst); } while (0)
    412420#define IEM_MC_FETCH_MEM_U32(a_u32Dst, a_iSeg, a_GCPtrMem)              do { CHK_GCPTR(a_GCPtrMem); } while (0)
    413421#define IEM_MC_FETCH_MEM_I32(a_i32Dst, a_iSeg, a_GCPtrMem)              do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(int32_t, a_i32Dst); } while (0)
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