- Timestamp:
- Feb 25, 2012 12:38:51 AM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 76469
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r40254 r40255 6019 6019 #define IEM_MC_FETCH_MEM_U16_DISP(a_u16Dst, a_iSeg, a_GCPtrMem, a_offDisp) \ 6020 6020 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))) 6021 6023 6022 6024 #define IEM_MC_FETCH_MEM_U32(a_u32Dst, a_iSeg, a_GCPtrMem) \ -
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r40251 r40255 1405 1405 1406 1406 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 1418 BEGINPROC_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 1434 ENDPROC iemAImpl_ %+ %1 %+ _r80_by_i16 1435 %endmacro 1436 1437 IEMIMPL_FPU_R80_BY_I16 fiadd 1438 IEMIMPL_FPU_R80_BY_I16 fimul 1439 IEMIMPL_FPU_R80_BY_I16 fisub 1440 IEMIMPL_FPU_R80_BY_I16 fisubr 1441 IEMIMPL_FPU_R80_BY_I16 fidiv 1442 IEMIMPL_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 1457 BEGINPROC_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 1471 ENDPROC iemAImpl_ %+ %1 %+ _r80_by_i16 1472 %endmacro 1473 1474 IEMIMPL_FPU_R80_BY_I16_FSW ficom 1475 1476 1407 1477 1408 1478 ; -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r40253 r40255 12680 12680 12681 12681 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 */ 12688 FNIEMOP_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 12682 12718 /** Opcode 0xde !11/0. */ 12683 FNIEMOP_STUB_1(iemOp_fiadd_m16i, uint8_t, bRm); 12719 FNIEMOP_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 12684 12725 12685 12726 /** Opcode 0xde !11/1. */ 12686 FNIEMOP_STUB_1(iemOp_fimul_m16i, uint8_t, bRm); 12727 FNIEMOP_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 12687 12733 12688 12734 /** Opcode 0xde !11/2. */ 12689 FNIEMOP_STUB_1(iemOp_ficom_m16i, uint8_t, bRm); 12735 FNIEMOP_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 12690 12766 12691 12767 /** Opcode 0xde !11/3. */ 12692 FNIEMOP_STUB_1(iemOp_ficomp_m16i, uint8_t, bRm); 12768 FNIEMOP_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 12693 12799 12694 12800 /** Opcode 0xde !11/4. */ 12695 FNIEMOP_STUB_1(iemOp_fisub_m16i, uint8_t, bRm); 12801 FNIEMOP_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 12696 12807 12697 12808 /** Opcode 0xde !11/5. */ 12698 FNIEMOP_STUB_1(iemOp_fisubr_m16i, uint8_t, bRm); 12809 FNIEMOP_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 12699 12815 12700 12816 /** Opcode 0xde !11/6. */ 12701 FNIEMOP_STUB_1(iemOp_fidiv_m16i, uint8_t, bRm); 12817 FNIEMOP_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 12702 12823 12703 12824 /** Opcode 0xde !11/7. */ 12704 FNIEMOP_STUB_1(iemOp_fidivr_m16i, uint8_t, bRm); 12825 FNIEMOP_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 } 12705 12830 12706 12831 -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r40248 r40255 216 216 #define iemAImpl_fxtract_r80_r80 NULL 217 217 #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 218 225 219 226 #define iemAImpl_fiadd_r80_by_i32 NULL … … 410 417 #define IEM_MC_FETCH_MEM32_U8(a_u8Dst, a_iSeg, a_GCPtrMem32) do { CHK_TYPE(uint32_t, a_GCPtrMem32); } while (0) 411 418 #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) 412 420 #define IEM_MC_FETCH_MEM_U32(a_u32Dst, a_iSeg, a_GCPtrMem) do { CHK_GCPTR(a_GCPtrMem); } while (0) 413 421 #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.