Changeset 40248 in vbox
- Timestamp:
- Feb 24, 2012 4:12:05 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 76461
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r40247 r40248 6104 6104 #define IEM_MC_STORE_MEM_U8_CONST(a_iSeg, a_GCPtrMem, a_u8C) \ 6105 6105 IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU8(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u8C))) 6106 #define IEM_MC_STORE_MEM_U16_CONST(a_iSeg, a_GCPtrMem, a_u16C) \ 6107 IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU16(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u16C))) 6108 #define IEM_MC_STORE_MEM_U32_CONST(a_iSeg, a_GCPtrMem, a_u32C) \ 6109 IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU32(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u32C))) 6110 #define IEM_MC_STORE_MEM_U64_CONST(a_iSeg, a_GCPtrMem, a_u64C) \ 6111 IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU64(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u64C))) 6112 6113 #define IEM_MC_STORE_MEM_I8_CONST_BY_REF( a_pi8Dst, a_i8C) *(a_pi8Dst) = (a_i8C) 6114 #define IEM_MC_STORE_MEM_I16_CONST_BY_REF(a_pi16Dst, a_i16C) *(a_pi16Dst) = (a_i16C) 6115 #define IEM_MC_STORE_MEM_I32_CONST_BY_REF(a_pi32Dst, a_i32C) *(a_pi32Dst) = (a_i32C) 6116 #define IEM_MC_STORE_MEM_I64_CONST_BY_REF(a_pi64Dst, a_i64C) *(a_pi64Dst) = (a_i64C) 6117 #define IEM_MC_STORE_MEM_NEG_QNAN_R32_BY_REF(a_pr32Dst) (a_pr32Dst)->u32 = UINT32_C(0xffc00000) 6118 #define IEM_MC_STORE_MEM_NEG_QNAN_R64_BY_REF(a_pr64Dst) (a_pr64Dst)->au64[0] = UINT64_C(0xfff8000000000000) 6119 #define IEM_MC_STORE_MEM_NEG_QNAN_R80_BY_REF(a_pr80Dst) \ 6120 do { \ 6121 (a_pr80Dst)->au64[1] = UINT32_C(0xc000000000000000); \ 6122 (a_pr80Dst)->au16[4] = UINT16_C(0xffff); \ 6123 } while (0) 6124 6106 6125 6107 6126 #define IEM_MC_PUSH_U16(a_u16Value) \ … … 6140 6159 6141 6160 /** Commits the memory and unmaps the guest memory unless the FPU status word 6142 * indicates an exception (FSW.ES). 6143 * @remarks May return (for now anyway). 6144 */ 6145 #define IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(a_pvMem, a_fAccess, a_u16FSW) \ 6161 * indicates (@a a_u16FSW) and FPU control word indicates a pending exception 6162 * that would cause FLD not to store. 6163 * 6164 * The current understanding is that \#O, \#U, \#IA and \#IS will prevent a 6165 * store, while \#P will not. 6166 * 6167 * @remarks May in theory return - for now. 6168 */ 6169 #define IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(a_pvMem, a_fAccess, a_u16FSW) \ 6146 6170 do { \ 6147 if (!(a_u16FSW & X86_FSW_ES)) \ 6171 if ( !(a_u16FSW & X86_FSW_ES) \ 6172 || !( (a_u16FSW & (X86_FSW_UE | X86_FSW_OE | X86_FSW_IE)) \ 6173 & ~(pIemCpu->CTX_SUFF(pCtx)->fpu.FCW & X86_FCW_MASK_ALL) ) ) \ 6148 6174 IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pIemCpu, (a_pvMem), (a_fAccess))); \ 6149 6175 } while (0) … … 6441 6467 #define IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(a_pr80Dst0, a_iSt0, a_iSt1) \ 6442 6468 if (iemFpu2StRegsNotEmptyRefFirst(pIemCpu, (a_iSt0), &(a_pr80Dst0), (a_iSt1)) == VINF_SUCCESS) { 6469 #define IEM_MC_IF_FCW_IM() \ 6470 if (pIemCpu->CTX_SUFF(pCtx)->fpu.FCW & X86_FCW_IM) { 6443 6471 6444 6472 #define IEM_MC_ELSE() } else { -
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r40247 r40248 1325 1325 1326 1326 ; 1327 ;---------------------- 16-bit signed integer operations ---------------------- 1328 ; 1329 1330 1331 ;; 1332 ; Converts a 16-bit floating point value to a 80-bit one (fpu register). 1333 ; 1334 ; @param A0 FPU context (fxsave). 1335 ; @param A1 Pointer to a IEMFPURESULT for the output. 1336 ; @param A2 Pointer to the 16-bit floating point value to convert. 1337 ; 1338 BEGINPROC_FASTCALL iemAImpl_fild_i16_to_r80, 12 1339 PROLOGUE_3_ARGS 1340 sub xSP, 20h 1341 1342 fninit 1343 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1344 fild word [A2] 1345 1346 fnstsw word [A1 + IEMFPURESULT.FSW] 1347 fnclex 1348 fstp tword [A1 + IEMFPURESULT.r80Result] 1349 1350 fninit 1351 add xSP, 20h 1352 EPILOGUE_3_ARGS 0 1353 ENDPROC iemAImpl_fild_i16_to_r80 1354 1355 1356 ;; 1357 ; Store a 80-bit floating point value (register) as a 16-bit signed integer (memory). 1358 ; 1359 ; @param A0 FPU context (fxsave). 1360 ; @param A1 Where to return the output FSW. 1361 ; @param A2 Where to store the 16-bit signed integer value. 1362 ; @param A3 Pointer to the 80-bit value. 1363 ; 1364 BEGINPROC_FASTCALL iemAImpl_fist_r80_to_i16, 12 1365 PROLOGUE_3_ARGS 1366 sub xSP, 20h 1367 1368 fninit 1369 fld tword [A3] 1370 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1371 fistp word [A2] 1372 1373 fnstsw word [A1] 1374 1375 fninit 1376 add xSP, 20h 1377 EPILOGUE_3_ARGS 0 1378 ENDPROC iemAImpl_fist_r80_to_i16 1379 1380 1381 ;; 1382 ; Store a 80-bit floating point value (register) as a 16-bit signed integer 1383 ; (memory) with truncation. 1384 ; 1385 ; @param A0 FPU context (fxsave). 1386 ; @param A1 Where to return the output FSW. 1387 ; @param A2 Where to store the 16-bit signed integer value. 1388 ; @param A3 Pointer to the 80-bit value. 1389 ; 1390 BEGINPROC_FASTCALL iemAImpl_fistt_r80_to_i16, 12 1391 PROLOGUE_3_ARGS 1392 sub xSP, 20h 1393 1394 fninit 1395 fld tword [A3] 1396 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1397 fisttp dword [A2] 1398 1399 fnstsw word [A1] 1400 1401 fninit 1402 add xSP, 20h 1403 EPILOGUE_3_ARGS 0 1404 ENDPROC iemAImpl_fistt_r80_to_i16 1405 1406 1407 1408 ; 1327 1409 ;---------------------- 32-bit signed integer operations ---------------------- 1328 1410 ; … … 1330 1412 1331 1413 ;; 1332 ; Converts a 80-bit floating point value to a 32-bit signed integer. 1333 ; 1334 ; @param A0 FPU context (fxsave). 1335 ; @param A1 Pointer to a 16-bit FSW output variable. 1336 ; @param A2 Pointer to the 32-bit signed integer output variable. 1337 ; @param A3 Pointer to the 80-bit floating point value to convert. 1338 ; 1339 BEGINPROC_FASTCALL iemAImpl_fpu_r80_to_i32, 12 1340 PROLOGUE_4_ARGS 1341 sub xSP, 20h 1342 1343 fninit 1344 fld tword [A3] 1345 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1346 fistp dword [A2] 1347 1348 fnstsw word [A1] 1414 ; Converts a 32-bit floating point value to a 80-bit one (fpu register). 1415 ; 1416 ; @param A0 FPU context (fxsave). 1417 ; @param A1 Pointer to a IEMFPURESULT for the output. 1418 ; @param A2 Pointer to the 32-bit floating point value to convert. 1419 ; 1420 BEGINPROC_FASTCALL iemAImpl_fild_i32_to_r80, 12 1421 PROLOGUE_3_ARGS 1422 sub xSP, 20h 1423 1424 fninit 1425 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1426 fild dword [A2] 1427 1428 fnstsw word [A1 + IEMFPURESULT.FSW] 1349 1429 fnclex 1350 1351 add xSP, 20h 1352 EPILOGUE_4_ARGS 0 1353 ENDPROC iemAImpl_fpu_r80_to_i32 1430 fstp tword [A1 + IEMFPURESULT.r80Result] 1431 1432 fninit 1433 add xSP, 20h 1434 EPILOGUE_3_ARGS 0 1435 ENDPROC iemAImpl_fild_i32_to_r80 1354 1436 1355 1437 … … 1362 1444 ; @param A3 Pointer to the 80-bit value. 1363 1445 ; 1364 BEGINPROC_FASTCALL iemAImpl_f st_r80_to_i32, 121446 BEGINPROC_FASTCALL iemAImpl_fist_r80_to_i32, 12 1365 1447 PROLOGUE_3_ARGS 1366 1448 sub xSP, 20h … … 1369 1451 fld tword [A3] 1370 1452 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1371 fist 1453 fistp dword [A2] 1372 1454 1373 1455 fnstsw word [A1] … … 1376 1458 add xSP, 20h 1377 1459 EPILOGUE_3_ARGS 0 1378 ENDPROC iemAImpl_fst_r80_to_i32 1460 ENDPROC iemAImpl_fist_r80_to_i32 1461 1462 1463 ;; 1464 ; Store a 80-bit floating point value (register) as a 32-bit signed integer 1465 ; (memory) with truncation. 1466 ; 1467 ; @param A0 FPU context (fxsave). 1468 ; @param A1 Where to return the output FSW. 1469 ; @param A2 Where to store the 32-bit signed integer value. 1470 ; @param A3 Pointer to the 80-bit value. 1471 ; 1472 BEGINPROC_FASTCALL iemAImpl_fistt_r80_to_i32, 12 1473 PROLOGUE_3_ARGS 1474 sub xSP, 20h 1475 1476 fninit 1477 fld tword [A3] 1478 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1479 fisttp dword [A2] 1480 1481 fnstsw word [A1] 1482 1483 fninit 1484 add xSP, 20h 1485 EPILOGUE_3_ARGS 0 1486 ENDPROC iemAImpl_fistt_r80_to_i32 1379 1487 1380 1488 … … 1447 1555 1448 1556 IEMIMPL_FPU_R80_BY_I32_FSW ficom 1557 1558 1559 1560 ; 1561 ;---------------------- 64-bit signed integer operations ---------------------- 1562 ; 1563 1564 1565 ;; 1566 ; Converts a 64-bit floating point value to a 80-bit one (fpu register). 1567 ; 1568 ; @param A0 FPU context (fxsave). 1569 ; @param A1 Pointer to a IEMFPURESULT for the output. 1570 ; @param A2 Pointer to the 64-bit floating point value to convert. 1571 ; 1572 BEGINPROC_FASTCALL iemAImpl_fild_i64_to_r80, 12 1573 PROLOGUE_3_ARGS 1574 sub xSP, 20h 1575 1576 fninit 1577 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1578 fild qword [A2] 1579 1580 fnstsw word [A1 + IEMFPURESULT.FSW] 1581 fnclex 1582 fstp tword [A1 + IEMFPURESULT.r80Result] 1583 1584 fninit 1585 add xSP, 20h 1586 EPILOGUE_3_ARGS 0 1587 ENDPROC iemAImpl_fild_i64_to_r80 1588 1589 1590 ;; 1591 ; Store a 80-bit floating point value (register) as a 64-bit signed integer (memory). 1592 ; 1593 ; @param A0 FPU context (fxsave). 1594 ; @param A1 Where to return the output FSW. 1595 ; @param A2 Where to store the 64-bit signed integer value. 1596 ; @param A3 Pointer to the 80-bit value. 1597 ; 1598 BEGINPROC_FASTCALL iemAImpl_fist_r80_to_i64, 12 1599 PROLOGUE_3_ARGS 1600 sub xSP, 20h 1601 1602 fninit 1603 fld tword [A3] 1604 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1605 fistp qword [A2] 1606 1607 fnstsw word [A1] 1608 1609 fninit 1610 add xSP, 20h 1611 EPILOGUE_3_ARGS 0 1612 ENDPROC iemAImpl_fist_r80_to_i64 1613 1614 1615 ;; 1616 ; Store a 80-bit floating point value (register) as a 64-bit signed integer 1617 ; (memory) with truncation. 1618 ; 1619 ; @param A0 FPU context (fxsave). 1620 ; @param A1 Where to return the output FSW. 1621 ; @param A2 Where to store the 64-bit signed integer value. 1622 ; @param A3 Pointer to the 80-bit value. 1623 ; 1624 BEGINPROC_FASTCALL iemAImpl_fistt_r80_to_i64, 12 1625 PROLOGUE_3_ARGS 1626 sub xSP, 20h 1627 1628 fninit 1629 fld tword [A3] 1630 FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0 1631 fisttp qword [A2] 1632 1633 fnstsw word [A1] 1634 1635 fninit 1636 add xSP, 20h 1637 EPILOGUE_3_ARGS 0 1638 ENDPROC iemAImpl_fistt_r80_to_i64 1639 1449 1640 1450 1641 -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r40247 r40248 10645 10645 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 10646 10646 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 10647 10648 10647 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 10649 10648 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 10649 10650 10650 IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 10651 10651 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 10652 10652 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value); 10653 IEM_MC_MEM_COMMIT_AND_UNMAP (pr32Dst, IEM_ACCESS_DATA_W);10653 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw); 10654 10654 IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 10655 10655 IEM_MC_ELSE() 10656 IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw); 10656 IEM_MC_IF_FCW_IM() 10657 IEM_MC_STORE_MEM_NEG_QNAN_R32_BY_REF(pr32Dst); 10658 IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W); 10659 IEM_MC_ENDIF(); 10657 10660 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 10658 10661 IEM_MC_ENDIF(); 10659 10662 IEM_MC_ADVANCE_RIP(); 10663 10660 10664 IEM_MC_END(); 10661 10665 return VINF_SUCCESS; … … 10676 10680 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 10677 10681 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 10678 10679 10682 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 10680 10683 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 10684 10681 10685 IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 10682 10686 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 10683 10687 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value); 10684 IEM_MC_MEM_COMMIT_AND_UNMAP (pr32Dst, IEM_ACCESS_DATA_W);10688 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw); 10685 10689 IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 10686 10690 IEM_MC_ELSE() 10687 IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw); 10691 IEM_MC_IF_FCW_IM() 10692 IEM_MC_STORE_MEM_NEG_QNAN_R32_BY_REF(pr32Dst); 10693 IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W); 10694 IEM_MC_ENDIF(); 10688 10695 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 10689 10696 IEM_MC_ENDIF(); 10690 10697 IEM_MC_ADVANCE_RIP(); 10698 10691 10699 IEM_MC_END(); 10692 10700 return VINF_SUCCESS; … … 11650 11658 11651 11659 /** Opcode 0xdb !11/0. */ 11652 FNIEMOP_STUB_1(iemOp_fild_m32i, uint8_t, bRm); 11660 FNIEMOP_DEF_1(iemOp_fild_m32i, uint8_t, bRm) 11661 { 11662 IEMOP_MNEMONIC("fild m32i"); 11663 11664 IEM_MC_BEGIN(2, 3); 11665 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 11666 IEM_MC_LOCAL(IEMFPURESULT, FpuRes); 11667 IEM_MC_LOCAL(int32_t, i32Val); 11668 IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes, FpuRes, 0); 11669 IEM_MC_ARG_LOCAL_REF(int32_t const *, pi32Val, i32Val, 1); 11670 11671 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm); 11672 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 11673 11674 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 11675 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 11676 IEM_MC_FETCH_MEM_I32(i32Val, pIemCpu->iEffSeg, GCPtrEffSrc); 11677 11678 IEM_MC_IF_FPUREG_IS_EMPTY(7) 11679 IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_i32_to_r80, pFpuRes, pi32Val); 11680 IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc); 11681 IEM_MC_ELSE() 11682 IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc); 11683 IEM_MC_ENDIF(); 11684 IEM_MC_ADVANCE_RIP(); 11685 11686 IEM_MC_END(); 11687 return VINF_SUCCESS; 11688 } 11689 11653 11690 11654 11691 /** Opcode 0xdb !11/1. */ 11655 FNIEMOP_STUB_1(iemOp_fisttp_m32i, uint8_t, bRm); 11656 11657 /** Opcode 0xdb !11/2. */ 11658 FNIEMOP_STUB_1(iemOp_fist_m32i, uint8_t, bRm); 11659 11660 11661 /** Opcode 0xdb !11/3. */ 11662 FNIEMOP_DEF_1(iemOp_fistp_m32i, uint8_t, bRm) 11663 { 11664 IEMOP_MNEMONIC("fistp m32i"); 11692 FNIEMOP_DEF_1(iemOp_fisttp_m32i, uint8_t, bRm) 11693 { 11694 IEMOP_MNEMONIC("fisttp m32i"); 11665 11695 IEM_MC_BEGIN(3, 2); 11666 11696 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); … … 11677 11707 IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 11678 11708 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 11679 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_f pu_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);11680 IEM_MC_MEM_COMMIT_AND_UNMAP (pi32Dst, IEM_ACCESS_DATA_W);11709 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i32, pu16Fsw, pi32Dst, pr80Value); 11710 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw); 11681 11711 IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 11682 11712 IEM_MC_ELSE() 11683 IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw); 11713 IEM_MC_IF_FCW_IM() 11714 IEM_MC_STORE_MEM_I32_CONST_BY_REF(pi32Dst, INT32_MIN /* (integer indefinite) */); 11715 IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W); 11716 IEM_MC_ENDIF(); 11684 11717 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 11685 11718 IEM_MC_ENDIF(); 11686 11719 IEM_MC_ADVANCE_RIP(); 11720 11687 11721 IEM_MC_END(); 11688 11722 return VINF_SUCCESS; … … 11690 11724 11691 11725 11726 /** Opcode 0xdb !11/2. */ 11727 FNIEMOP_DEF_1(iemOp_fist_m32i, uint8_t, bRm) 11728 { 11729 IEMOP_MNEMONIC("fist m32i"); 11730 IEM_MC_BEGIN(3, 2); 11731 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 11732 IEM_MC_LOCAL(uint16_t, u16Fsw); 11733 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0); 11734 IEM_MC_ARG(int32_t *, pi32Dst, 1); 11735 IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2); 11736 11737 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 11738 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 11739 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 11740 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 11741 11742 IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 11743 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 11744 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value); 11745 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw); 11746 IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 11747 IEM_MC_ELSE() 11748 IEM_MC_IF_FCW_IM() 11749 IEM_MC_STORE_MEM_I32_CONST_BY_REF(pi32Dst, INT32_MIN /* (integer indefinite) */); 11750 IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W); 11751 IEM_MC_ENDIF(); 11752 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 11753 IEM_MC_ENDIF(); 11754 IEM_MC_ADVANCE_RIP(); 11755 11756 IEM_MC_END(); 11757 return VINF_SUCCESS; 11758 } 11759 11760 11761 /** Opcode 0xdb !11/3. */ 11762 FNIEMOP_DEF_1(iemOp_fistp_m32i, uint8_t, bRm) 11763 { 11764 IEMOP_MNEMONIC("fisttp m32i"); 11765 IEM_MC_BEGIN(3, 2); 11766 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 11767 IEM_MC_LOCAL(uint16_t, u16Fsw); 11768 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0); 11769 IEM_MC_ARG(int32_t *, pi32Dst, 1); 11770 IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2); 11771 11772 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 11773 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 11774 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 11775 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 11776 11777 IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 11778 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 11779 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value); 11780 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw); 11781 IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 11782 IEM_MC_ELSE() 11783 IEM_MC_IF_FCW_IM() 11784 IEM_MC_STORE_MEM_I32_CONST_BY_REF(pi32Dst, INT32_MIN /* (integer indefinite) */); 11785 IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W); 11786 IEM_MC_ENDIF(); 11787 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 11788 IEM_MC_ENDIF(); 11789 IEM_MC_ADVANCE_RIP(); 11790 11791 IEM_MC_END(); 11792 return VINF_SUCCESS; 11793 } 11794 11795 11692 11796 /** Opcode 0xdb !11/5. */ 11693 FNIEMOP_STUB_1(iemOp_fld_ r80, uint8_t, bRm);11797 FNIEMOP_STUB_1(iemOp_fld_m80r, uint8_t, bRm); 11694 11798 11695 11799 11696 11800 /** Opcode 0xdb !11/7. */ 11697 FNIEMOP_STUB_1(iemOp_fstp_ r80, uint8_t, bRm);11801 FNIEMOP_STUB_1(iemOp_fstp_m80r, uint8_t, bRm); 11698 11802 11699 11803 … … 11935 12039 case 3: return FNIEMOP_CALL_1(iemOp_fistp_m32i, bRm); 11936 12040 case 4: return IEMOP_RAISE_INVALID_OPCODE(); 11937 case 5: return FNIEMOP_CALL_1(iemOp_fld_ r80, bRm);12041 case 5: return FNIEMOP_CALL_1(iemOp_fld_m80r, bRm); 11938 12042 case 6: return IEMOP_RAISE_INVALID_OPCODE(); 11939 case 7: return FNIEMOP_CALL_1(iemOp_fstp_ r80, bRm);12043 case 7: return FNIEMOP_CALL_1(iemOp_fstp_m80r, bRm); 11940 12044 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 11941 12045 } … … 12128 12232 12129 12233 /** Opcode 0xdd !11/0. */ 12130 FNIEMOP_STUB_1(iemOp_fisttp_m64i, uint8_t, bRm); 12234 FNIEMOP_DEF_1(iemOp_fisttp_m64i, uint8_t, bRm) 12235 { 12236 IEMOP_MNEMONIC("fisttp m64i"); 12237 IEM_MC_BEGIN(3, 2); 12238 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 12239 IEM_MC_LOCAL(uint16_t, u16Fsw); 12240 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0); 12241 IEM_MC_ARG(int64_t *, pi64Dst, 1); 12242 IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2); 12243 12244 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 12245 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 12246 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 12247 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 12248 12249 IEM_MC_MEM_MAP(pi64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 12250 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 12251 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i64, pu16Fsw, pi64Dst, pr80Value); 12252 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi64Dst, IEM_ACCESS_DATA_W, u16Fsw); 12253 IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 12254 IEM_MC_ELSE() 12255 IEM_MC_IF_FCW_IM() 12256 IEM_MC_STORE_MEM_I64_CONST_BY_REF(pi64Dst, INT64_MIN /* (integer indefinite) */); 12257 IEM_MC_MEM_COMMIT_AND_UNMAP(pi64Dst, IEM_ACCESS_DATA_W); 12258 IEM_MC_ENDIF(); 12259 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 12260 IEM_MC_ENDIF(); 12261 IEM_MC_ADVANCE_RIP(); 12262 12263 IEM_MC_END(); 12264 return VINF_SUCCESS; 12265 } 12131 12266 12132 12267 … … 12150 12285 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 12151 12286 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16Fsw, pr64Dst, pr80Value); 12152 IEM_MC_MEM_COMMIT_AND_UNMAP (pr64Dst, IEM_ACCESS_DATA_W);12287 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw); 12153 12288 IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 12154 12289 IEM_MC_ELSE() 12155 IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw); 12290 IEM_MC_IF_FCW_IM() 12291 IEM_MC_STORE_MEM_NEG_QNAN_R64_BY_REF(pr64Dst); 12292 IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W); 12293 IEM_MC_ENDIF(); 12156 12294 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 12157 12295 IEM_MC_ENDIF(); 12158 12296 IEM_MC_ADVANCE_RIP(); 12297 12159 12298 IEM_MC_END(); 12160 12299 return VINF_SUCCESS; … … 12183 12322 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 12184 12323 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16Fsw, pr64Dst, pr80Value); 12185 IEM_MC_MEM_COMMIT_AND_UNMAP (pr64Dst, IEM_ACCESS_DATA_W);12324 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw); 12186 12325 IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 12187 12326 IEM_MC_ELSE() 12188 IEM_MC_MEM_COMMIT_AND_UNMAP_UNLESS_FPU_XCPT(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw); 12327 IEM_MC_IF_FCW_IM() 12328 IEM_MC_STORE_MEM_NEG_QNAN_R64_BY_REF(pr64Dst); 12329 IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W); 12330 IEM_MC_ENDIF(); 12189 12331 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 12190 12332 IEM_MC_ENDIF(); 12191 12333 IEM_MC_ADVANCE_RIP(); 12334 12192 12335 IEM_MC_END(); 12193 12336 return VINF_SUCCESS; … … 12401 12544 FNIEMOP_STUB_1(iemOp_fild_m16i, uint8_t, bRm); 12402 12545 12546 12403 12547 /** Opcode 0xdf !11/1. */ 12404 FNIEMOP_STUB_1(iemOp_fisttp_m16i, uint8_t, bRm); 12548 FNIEMOP_DEF_1(iemOp_fisttp_m16i, uint8_t, bRm) 12549 { 12550 IEMOP_MNEMONIC("fisttp m16i"); 12551 IEM_MC_BEGIN(3, 2); 12552 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 12553 IEM_MC_LOCAL(uint16_t, u16Fsw); 12554 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0); 12555 IEM_MC_ARG(int16_t *, pi16Dst, 1); 12556 IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2); 12557 12558 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 12559 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 12560 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 12561 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 12562 12563 IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 12564 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 12565 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i16, pu16Fsw, pi16Dst, pr80Value); 12566 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw); 12567 IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 12568 IEM_MC_ELSE() 12569 IEM_MC_IF_FCW_IM() 12570 IEM_MC_STORE_MEM_I16_CONST_BY_REF(pi16Dst, INT16_MIN /* (integer indefinite) */); 12571 IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W); 12572 IEM_MC_ENDIF(); 12573 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 12574 IEM_MC_ENDIF(); 12575 IEM_MC_ADVANCE_RIP(); 12576 12577 IEM_MC_END(); 12578 return VINF_SUCCESS; 12579 } 12580 12405 12581 12406 12582 /** Opcode 0xdf !11/2. */ 12407 FNIEMOP_STUB_1(iemOp_fist_m16i, uint8_t, bRm); 12583 FNIEMOP_DEF_1(iemOp_fist_m16i, uint8_t, bRm) 12584 { 12585 IEMOP_MNEMONIC("fistp m16i"); 12586 IEM_MC_BEGIN(3, 2); 12587 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 12588 IEM_MC_LOCAL(uint16_t, u16Fsw); 12589 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0); 12590 IEM_MC_ARG(int16_t *, pi16Dst, 1); 12591 IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2); 12592 12593 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 12594 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 12595 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 12596 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 12597 12598 IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 12599 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 12600 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value); 12601 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw); 12602 IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 12603 IEM_MC_ELSE() 12604 IEM_MC_IF_FCW_IM() 12605 IEM_MC_STORE_MEM_I16_CONST_BY_REF(pi16Dst, INT16_MIN /* (integer indefinite) */); 12606 IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W); 12607 IEM_MC_ENDIF(); 12608 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 12609 IEM_MC_ENDIF(); 12610 IEM_MC_ADVANCE_RIP(); 12611 12612 IEM_MC_END(); 12613 return VINF_SUCCESS; 12614 } 12615 12408 12616 12409 12617 /** Opcode 0xdf !11/3. */ 12410 FNIEMOP_STUB_1(iemOp_fistp_m16i, uint8_t, bRm); 12618 FNIEMOP_DEF_1(iemOp_fistp_m16i, uint8_t, bRm) 12619 { 12620 IEMOP_MNEMONIC("fistp m16i"); 12621 IEM_MC_BEGIN(3, 2); 12622 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 12623 IEM_MC_LOCAL(uint16_t, u16Fsw); 12624 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0); 12625 IEM_MC_ARG(int16_t *, pi16Dst, 1); 12626 IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2); 12627 12628 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 12629 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 12630 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 12631 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 12632 12633 IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 12634 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 12635 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value); 12636 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw); 12637 IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 12638 IEM_MC_ELSE() 12639 IEM_MC_IF_FCW_IM() 12640 IEM_MC_STORE_MEM_I16_CONST_BY_REF(pi16Dst, INT16_MIN /* (integer indefinite) */); 12641 IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W); 12642 IEM_MC_ENDIF(); 12643 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 12644 IEM_MC_ENDIF(); 12645 IEM_MC_ADVANCE_RIP(); 12646 12647 IEM_MC_END(); 12648 return VINF_SUCCESS; 12649 } 12650 12411 12651 12412 12652 /** Opcode 0xdf !11/4. */ … … 12419 12659 FNIEMOP_STUB_1(iemOp_fbstp_m80d, uint8_t, bRm); 12420 12660 12661 12421 12662 /** Opcode 0xdf !11/7. */ 12422 FNIEMOP_STUB_1(iemOp_fistp_m64i, uint8_t, bRm); 12663 FNIEMOP_DEF_1(iemOp_fistp_m64i, uint8_t, bRm) 12664 { 12665 IEMOP_MNEMONIC("fistp m64i"); 12666 IEM_MC_BEGIN(3, 2); 12667 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 12668 IEM_MC_LOCAL(uint16_t, u16Fsw); 12669 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Fsw, u16Fsw, 0); 12670 IEM_MC_ARG(int64_t *, pi64Dst, 1); 12671 IEM_MC_ARG(PCRTFLOAT80U, pr80Value, 2); 12672 12673 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 12674 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 12675 IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE(); 12676 IEM_MC_MAYBE_RAISE_FPU_XCPT(); 12677 12678 IEM_MC_MEM_MAP(pi64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/); 12679 IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) 12680 IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i64, pu16Fsw, pi64Dst, pr80Value); 12681 IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi64Dst, IEM_ACCESS_DATA_W, u16Fsw); 12682 IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst); 12683 IEM_MC_ELSE() 12684 IEM_MC_IF_FCW_IM() 12685 IEM_MC_STORE_MEM_I64_CONST_BY_REF(pi64Dst, INT64_MIN /* (integer indefinite) */); 12686 IEM_MC_MEM_COMMIT_AND_UNMAP(pi64Dst, IEM_ACCESS_DATA_W); 12687 IEM_MC_ENDIF(); 12688 IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst); 12689 IEM_MC_ENDIF(); 12690 IEM_MC_ADVANCE_RIP(); 12691 12692 IEM_MC_END(); 12693 return VINF_SUCCESS; 12694 } 12423 12695 12424 12696 -
trunk/src/VBox/VMM/include/IEMInternal.h
r40247 r40248 847 847 /** @} */ 848 848 849 /** @name FPU operations taking a 16-bit signed integer argument 850 * @{ */ 851 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUI16,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, 852 PCRTFLOAT80U pr80Val1, int16_t const *pi16Val2)); 853 typedef FNIEMAIMPLFPUI16 *PFNIEMAIMPLFPUI16; 854 855 FNIEMAIMPLFPUI16 iemAImpl_fiadd_r80_by_i16; 856 FNIEMAIMPLFPUI16 iemAImpl_fimul_r80_by_i16; 857 FNIEMAIMPLFPUI16 iemAImpl_fisub_r80_by_i16; 858 FNIEMAIMPLFPUI16 iemAImpl_fisubr_r80_by_i16; 859 FNIEMAIMPLFPUI16 iemAImpl_fidiv_r80_by_i16; 860 FNIEMAIMPLFPUI16 iemAImpl_fidivr_r80_by_i16; 861 862 IEM_DECL_IMPL_DEF(void, iemAImpl_ficom_r80_by_i16,(PCX86FXSTATE pFpuState, uint16_t *pu16Fsw, 863 PCRTFLOAT80U pr80Val1, int16_t const *pi16Val2)); 864 865 IEM_DECL_IMPL_DEF(void, iemAImpl_fild_i16_to_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, int16_t const *pi16Val)); 866 IEM_DECL_IMPL_DEF(void, iemAImpl_fist_r80_to_i16,(PCX86FXSTATE pFpuState, uint16_t *pu16FSW, 867 int16_t *pi16Val, PCRTFLOAT80U pr80Val)); 868 IEM_DECL_IMPL_DEF(void, iemAImpl_fistt_r80_to_i16,(PCX86FXSTATE pFpuState, uint16_t *pu16FSW, 869 int16_t *pi16Val, PCRTFLOAT80U pr80Val)); 870 /** @} */ 871 849 872 /** @name FPU operations taking a 32-bit signed integer argument 850 873 * @{ */ 851 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUI32OUT,(PCX86FXSTATE pFpuState, uint16_t *pu16FSW,852 int32_t *pi32Dst, PCRTFLOAT80U pr80Value));853 typedef FNIEMAIMPLFPUI32OUT *PFNIEMAIMPLFPUI32OUT;854 855 FNIEMAIMPLFPUI32OUT iemAImpl_fpu_r80_to_i32;856 857 874 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUI32,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, 858 875 PCRTFLOAT80U pr80Val1, int32_t const *pi32Val2)); … … 867 884 868 885 IEM_DECL_IMPL_DEF(void, iemAImpl_ficom_r80_by_i32,(PCX86FXSTATE pFpuState, uint16_t *pu16Fsw, 869 PCRTFLOAT80U pr80Val1, int32_t const *pi322Val2)); 886 PCRTFLOAT80U pr80Val1, int32_t const *pi32Val2)); 887 888 IEM_DECL_IMPL_DEF(void, iemAImpl_fild_i32_to_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, int32_t const *pi32Val)); 889 IEM_DECL_IMPL_DEF(void, iemAImpl_fist_r80_to_i32,(PCX86FXSTATE pFpuState, uint16_t *pu16FSW, 890 int32_t *pi32Val, PCRTFLOAT80U pr80Val)); 891 IEM_DECL_IMPL_DEF(void, iemAImpl_fistt_r80_to_i32,(PCX86FXSTATE pFpuState, uint16_t *pu16FSW, 892 int32_t *pi32Val, PCRTFLOAT80U pr80Val)); 893 /** @} */ 894 895 /** @name FPU operations taking a 64-bit signed integer argument 896 * @{ */ 897 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUI64,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, 898 PCRTFLOAT80U pr80Val1, int64_t const *pi64Val2)); 899 typedef FNIEMAIMPLFPUI64 *PFNIEMAIMPLFPUI64; 900 901 FNIEMAIMPLFPUI64 iemAImpl_fiadd_r80_by_i64; 902 FNIEMAIMPLFPUI64 iemAImpl_fimul_r80_by_i64; 903 FNIEMAIMPLFPUI64 iemAImpl_fisub_r80_by_i64; 904 FNIEMAIMPLFPUI64 iemAImpl_fisubr_r80_by_i64; 905 FNIEMAIMPLFPUI64 iemAImpl_fidiv_r80_by_i64; 906 FNIEMAIMPLFPUI64 iemAImpl_fidivr_r80_by_i64; 907 908 IEM_DECL_IMPL_DEF(void, iemAImpl_ficom_r80_by_i64,(PCX86FXSTATE pFpuState, uint16_t *pu16Fsw, 909 PCRTFLOAT80U pr80Val1, int64_t const *pi64Val2)); 910 911 IEM_DECL_IMPL_DEF(void, iemAImpl_fild_i64_to_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, int64_t const *pi64Val)); 912 IEM_DECL_IMPL_DEF(void, iemAImpl_fist_r80_to_i64,(PCX86FXSTATE pFpuState, uint16_t *pu16FSW, 913 int64_t *pi64Val, PCRTFLOAT80U pr80Val)); 914 IEM_DECL_IMPL_DEF(void, iemAImpl_fistt_r80_to_i64,(PCX86FXSTATE pFpuState, uint16_t *pu16FSW, 915 int64_t *pi32Val, PCRTFLOAT80U pr80Val)); 870 916 /** @} */ 871 917 -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r40247 r40248 441 441 #define IEM_MC_FETCH_MEM_U32_SX_U64(a_u64Dst, a_iSeg, a_GCPtrMem) do { CHK_GCPTR(a_GCPtrMem); } while (0) 442 442 #define IEM_MC_STORE_MEM_U8(a_iSeg, a_GCPtrMem, a_u8Value) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint8_t, a_u8Value); CHK_SEG_IDX(a_iSeg); } while (0) 443 #define IEM_MC_STORE_MEM_U16(a_iSeg, a_GCPtrMem, a_u16Value) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint16_t, a_u16Value); } while (0) 444 #define IEM_MC_STORE_MEM_U32(a_iSeg, a_GCPtrMem, a_u32Value) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint32_t, a_u32Value); } while (0) 445 #define IEM_MC_STORE_MEM_U64(a_iSeg, a_GCPtrMem, a_u64Value) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint64_t, a_u64Value); } while (0) 446 #define IEM_MC_STORE_MEM_U8_CONST(a_iSeg, a_GCPtrMem, a_u8C) do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint8_t, a_u8C); } while (0) 443 #define IEM_MC_STORE_MEM_U16(a_iSeg, a_GCPtrMem, a_u16Value) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint16_t, a_u16Value); } while (0) 444 #define IEM_MC_STORE_MEM_U32(a_iSeg, a_GCPtrMem, a_u32Value) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint32_t, a_u32Value); } while (0) 445 #define IEM_MC_STORE_MEM_U64(a_iSeg, a_GCPtrMem, a_u64Value) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(uint64_t, a_u64Value); } while (0) 446 #define IEM_MC_STORE_MEM_U8_CONST(a_iSeg, a_GCPtrMem, a_u8C) do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint8_t, a_u8C); } while (0) 447 #define IEM_MC_STORE_MEM_U16_CONST(a_iSeg, a_GCPtrMem, a_u16C) do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint16_t, a_u16C); } while (0) 448 #define IEM_MC_STORE_MEM_U32_CONST(a_iSeg, a_GCPtrMem, a_u32C) do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint32_t, a_u32C); } while (0) 449 #define IEM_MC_STORE_MEM_U64_CONST(a_iSeg, a_GCPtrMem, a_u64C) do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint64_t, a_u64C); } while (0) 450 #define IEM_MC_STORE_MEM_I8_CONST_BY_REF( a_pi8Dst, a_i8C) do { CHK_TYPE(int8_t *, a_pi8Dst); CHK_CONST(int8_t, a_i8C); } while (0) 451 #define IEM_MC_STORE_MEM_I16_CONST_BY_REF(a_pi16Dst, a_i16C) do { CHK_TYPE(int16_t *, a_pi16Dst); CHK_CONST(int16_t, a_i16C); } while (0) 452 #define IEM_MC_STORE_MEM_I32_CONST_BY_REF(a_pi32Dst, a_i32C) do { CHK_TYPE(int32_t *, a_pi32Dst); CHK_CONST(int32_t, a_i32C); } while (0) 453 #define IEM_MC_STORE_MEM_I64_CONST_BY_REF(a_pi64Dst, a_i64C) do { CHK_TYPE(int64_t *, a_pi64Dst); CHK_CONST(int64_t, a_i64C); } while (0) 454 #define IEM_MC_STORE_MEM_NEG_QNAN_R32_BY_REF(a_pr32Dst) do { CHK_TYPE(PRTFLOAT32U, a_pr32Dst); } while (0) 455 #define IEM_MC_STORE_MEM_NEG_QNAN_R64_BY_REF(a_pr64Dst) do { CHK_TYPE(PRTFLOAT64U, a_pr64Dst); } while (0) 456 #define IEM_MC_STORE_MEM_NEG_QNAN_R80_BY_REF(a_pr80Dst) do { CHK_TYPE(PRTFLOAT80U, a_pr80Dst); } while (0) 447 457 448 458 #define IEM_MC_PUSH_U16(a_u16Value) do {} while (0) … … 454 464 #define IEM_MC_MEM_MAP(a_pMem, a_fAccess, a_iSeg, a_GCPtrMem, a_iArg) do { NOREF(a_fAccess); } while (0) 455 465 #define IEM_MC_MEM_MAP_EX(a_pvMem, a_fAccess, a_cbMem, a_iSeg, a_GCPtrMem, a_iArg) do {} while (0) 456 #define IEM_MC_MEM_COMMIT_AND_UNMAP(a_pvMem, a_fAccess) do {} while (0)457 #define IEM_MC_MEM_COMMIT_AND_UNMAP_ UNLESS_FPU_XCPT(a_pvMem, a_fAccess, a_u16FSW)do {} while (0)466 #define IEM_MC_MEM_COMMIT_AND_UNMAP(a_pvMem, a_fAccess) do {} while (0) 467 #define IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(a_pvMem, a_fAccess, a_u16FSW) do {} while (0) 458 468 #define IEM_MC_CALC_RM_EFF_ADDR(a_GCPtrEff, bRm) do { (a_GCPtrEff) = 0; CHK_GCPTR(a_GCPtrEff); } while (0) 459 469 #define IEM_MC_CALL_VOID_AIMPL_1(a_pfn, a0) do {} while (0) … … 531 541 p0 = NULL; \ 532 542 if (g_fRandom) { 543 #define IEM_MC_IF_FCW_IM() if (g_fRandom) { 533 544 #define IEM_MC_ELSE() } else { 534 545 #define IEM_MC_ENDIF() } do {} while (0) -
trunk/src/VBox/VMM/testcase/tstX86-1A.asm
r40246 r40248 72 72 g_r32_QNaN: dd 07fc00000h 73 73 g_r32_QNaNMax: dd 07fffffffh 74 g_r32_NegQNaN: dd 0ffc00000h 74 75 75 76 g_r64_0dot1: dq 0.1 … … 87 88 g_r64_SNaN: dq 07ff0000000000001h 88 89 g_r64_SNaNMax: dq 07ff7ffffffffffffh 90 g_r64_NegQNaN: dq 0fff8000000000000h 89 91 g_r64_QNaN: dq 07ff8000000000000h 90 92 g_r64_QNaNMax: dq 07fffffffffffffffh … … 179 181 jmp .return 180 182 %%ok: 183 %endmacro 184 185 186 ;; 187 ; Checks if a 32-bit floating point memory value is the same as the specified 188 ; constant (also memory). 189 ; 190 ; @uses eax 191 ; @param 1 Address expression for the 32-bit floating point value 192 ; to be checked. 193 ; @param 2 The address expression of the constant. 194 ; 195 %macro CheckMemoryR32ValueConst 2 196 mov eax, [%2] 197 cmp dword [%1], eax 198 je %%ok 199 %%bad: 200 mov eax, 90000000 + __LINE__ 201 jmp .return 202 %%ok: 203 %endmacro 204 205 206 ;; 207 ; Checks if a 80-bit floating point memory value is the same as the specified 208 ; constant (also memory). 209 ; 210 ; @uses eax 211 ; @param 1 Address expression for the FXSAVE image. 212 ; @param 2 The address expression of the constant. 213 ; 214 %macro CheckMemoryR80ValueConst 2 215 mov eax, [%2] 216 cmp dword [%1], eax 217 je %%ok1 218 %%bad: 219 mov eax, 92000000 + __LINE__ 220 jmp .return 221 %%ok1: 222 mov eax, [4 + %2] 223 cmp dword [%1 + 4], eax 224 jne %%bad 225 mov ax, [8 + %2] 226 cmp word [%1 + 8], ax 227 jne %%bad 181 228 %endmacro 182 229 … … 3064 3111 FxSaveCheckStNValueConst xSP, 1, REF(g_r80_3dot2) 3065 3112 FxSaveCheckStNValueConst xSP, 2, REF(g_r80_0dot1) 3066 3113 %endif 3114 3115 ; 3116 ; FSTP M32R, ST0 3117 ; 3118 SetSubTest "FSTP M32R, ST0" 3119 3120 mov xBX, [REF_EXTERN(g_pbEfExecPage)] 3121 lea xBX, [xBX + PAGE_SIZE - 4] 3122 3123 ; ## Normal operation. ## 3124 FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST 3125 fld dword [REF(g_r32_Ten)] 3126 FpuCheckOpcodeCsIp { fstp dword [xBX] } 3127 FxSaveCheckFSW xSP, 0, 0 3128 FxSaveCheckSt0Empty xSP 3129 CheckMemoryR32ValueConst xBX, REF(g_r32_Ten) 3130 3131 ; ## Masked exceptions. ## 3132 3133 ; Masked stack underflow. 3134 fninit 3135 FpuCheckOpcodeCsIp { fstp dword [xBX] } 3136 FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_SF, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3137 CheckMemoryR32ValueConst xBX, REF(g_r32_NegQNaN) 3138 3139 fninit 3140 fld tword [REF(g_r80_0dot1)] 3141 fld tword [REF(g_r80_3dot2)] 3142 fld tword [REF(g_r80_Ten)] 3143 ffree st0 3144 FpuCheckOpcodeCsIp { fstp dword [xBX] } 3145 FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_SF, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3146 CheckMemoryR32ValueConst xBX, REF(g_r32_NegQNaN) 3147 FxSaveCheckStNValueConst xSP, 0, REF(g_r80_3dot2) 3148 FxSaveCheckStNValueConst xSP, 1, REF(g_r80_0dot1) 3149 3150 ; Masked #IA caused by SNaN. 3151 fninit 3152 fld tword [REF(g_r80_SNaN)] 3153 FpuCheckOpcodeCsIp { fstp dword [xBX] } 3154 FxSaveCheckFSW xSP, X86_FSW_IE, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3155 CheckMemoryR32ValueConst xBX, REF(g_r32_QNaN) 3156 3157 ; Masked #U caused by a denormal value. 3158 fninit 3159 fld tword [REF(g_r80_DnMin)] 3160 FpuCheckOpcodeCsIp { fstp dword [xBX] } 3161 FxSaveCheckFSW xSP, X86_FSW_UE | X86_FSW_PE, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3162 CheckMemoryR32ValueConst xBX, REF(g_r32_Zero) 3163 3164 ; Masked #P caused by a decimal value. 3165 fninit 3166 fld tword [REF(g_r80_3dot2)] 3167 FpuCheckOpcodeCsIp { fstp dword [xBX] } 3168 FxSaveCheckFSW xSP, X86_FSW_C1 | X86_FSW_PE, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3169 CheckMemoryR32ValueConst xBX, REF(g_r32_3dot2) 3170 3171 ; ## Unmasked exceptions. ## 3172 3173 ; Stack underflow - nothing stored or popped. 3174 FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST 3175 mov dword [xBX], 0xffeeddcc 3176 FpuTrapOpcodeCsIp { fstp dword [xBX] } 3177 FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3178 CheckMemoryValue dword, xBX, 0xffeeddcc 3179 3180 FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST 3181 fld tword [REF(g_r80_0dot1)] 3182 fld tword [REF(g_r80_3dot2)] 3183 fld tword [REF(g_r80_Ten)] 3184 ffree st0 3185 mov dword [xBX], 0xffeeddcc 3186 FpuTrapOpcodeCsIp { fstp dword [xBX] } 3187 FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3188 CheckMemoryValue dword, xBX, 0xffeeddcc 3189 FxSaveCheckStNEmpty xSP, 0 3190 FxSaveCheckStNValueConst xSP, 1, REF(g_r80_3dot2) 3191 FxSaveCheckStNValueConst xSP, 2, REF(g_r80_0dot1) 3192 3193 ; #IA caused by SNaN. 3194 FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST 3195 fld tword [REF(g_r80_SNaN)] 3196 mov dword [xBX], 0xffeeddcc 3197 FpuTrapOpcodeCsIp { fstp dword [xBX] } 3198 FxSaveCheckFSW xSP, X86_FSW_IE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3199 CheckMemoryValue dword, xBX, 0xffeeddcc 3200 3201 ; #U caused by a denormal value - nothing written 3202 FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST 3203 fld tword [REF(g_r80_DnMin)] 3204 mov dword [xBX], 0xffeeddcc 3205 FpuTrapOpcodeCsIp { fstp dword [xBX] } 3206 FxSaveCheckFSW xSP, X86_FSW_UE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3207 CheckMemoryValue dword, xBX, 0xffeeddcc 3208 3209 ; #U caused by a small value - nothing written 3210 FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST 3211 fld tword [REF(g_r80_Min)] 3212 mov dword [xBX], 0xffeeddcc 3213 FpuTrapOpcodeCsIp { fstp dword [xBX] } 3214 FxSaveCheckFSW xSP, X86_FSW_UE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3215 CheckMemoryValue dword, xBX, 0xffeeddcc 3216 3217 ; #O caused by a small value - nothing written 3218 FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST 3219 fld tword [REF(g_r80_Max)] 3220 mov dword [xBX], 0xffeeddcc 3221 FpuTrapOpcodeCsIp { fstp dword [xBX] } 3222 FxSaveCheckFSW xSP, X86_FSW_OE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3223 CheckMemoryValue dword, xBX, 0xffeeddcc 3224 3225 ; #P caused by a decimal value - rounded value is written just like if it was masked. 3226 FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST 3227 fld tword [REF(g_r80_3dot2)] 3228 mov dword [xBX], 0xffeeddcc 3229 FpuTrapOpcodeCsIp { fstp dword [xBX] } 3230 FxSaveCheckFSW xSP, X86_FSW_C1 | X86_FSW_PE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 3231 CheckMemoryR32ValueConst xBX, REF(g_r32_3dot2) 3232 3233 %if 0 ;; @todo implement me 3067 3234 ; 3068 3235 ; FISTP M32I, ST0 … … 3115 3282 FxSaveCheckStNValueConst xSP, 1, REF(g_r80_3dot2) 3116 3283 FxSaveCheckStNValueConst xSP, 2, REF(g_r80_0dot1) 3117 3284 %endif 3285 %if 0 3118 3286 ; 3119 3287 ; FPTAN - calc, store ST0, push 1.0. … … 3149 3317 3150 3318 ;; @todo Finish FPTAN testcase. 3151 %endif3152 3319 3153 3320 ; … … 3234 3401 3235 3402 ;; @todo Finish FCMOVB testcase. 3403 %endif 3236 3404 3237 3405
Note:
See TracChangeset
for help on using the changeset viewer.