Changeset 104206 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Apr 5, 2024 8:28:19 PM (11 months ago)
- svn:sync-xref-src-repo-rev:
- 162643
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r104195 r104206 473 473 ;; 474 474 ; Calculates the new EFLAGS based on the CPU EFLAGS (%2), a clear mask (%3), 475 ; signed input (%4[%5]) and parity index (%6). 476 ; 477 ; This is used by MUL and IMUL, where we got result (%4 & %6) in xAX which is 478 ; also T0. So, we have to use T1 for the EFLAGS calculation and save T0/xAX 479 ; while we extract the %2 flags from the CPU EFLAGS or use T2 (only AMD64). 480 ; 481 ; @remarks Clobbers T0, T1, stack, %6, EFLAGS. 475 ; signed input (%4[%5]) and parity index (%6), storing the result into EAX (T0). 476 ; 477 ; @note %4 & %6 must not be RAX, EAX, or AX! So, don't use with full MUL/IMUL. 478 479 ; @remarks Clobbers T0, T1, stack, %6, EFLAGS, %1. 482 480 ; @param 1 The parameter (A0..A3) holding the eflags value. 483 481 ; @param 2 The mask of modified flags to save. … … 486 484 ; @param 5 The width of the %4 register in bits (8, 16, 32, or 64). 487 485 ; @param 6 The (full) register containing the parity table index. Will be modified! 488 489 %macro IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF 6 490 %ifdef RT_ARCH_AMD64 491 pushf 492 pop T2 493 %else 494 push T0 486 %macro IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_RETVAL 6 495 487 pushf 496 488 pop T0 497 %endif 498 mov T1_32, %1 ; load flags. 499 and T1_32, ~(%2 | %3 | X86_EFL_PF | X86_EFL_SF) ; clear the modified, always cleared flags and the two flags we calc. 500 %ifdef RT_ARCH_AMD64 501 and T2_32, (%2) ; select the modified flags. 502 or T1_32, T2_32 ; combine the flags. 503 %else 489 and %1, ~(%2 | %3 | X86_EFL_PF | X86_EFL_SF) ; clear the modified, always cleared flags and the two flags we calc. 504 490 and T0_32, (%2) ; select the modified flags. 505 or T1_32, T0_32 ; combine the flags. 506 pop T0 507 %endif 508 509 ; First calculate SF as it's likely to be refereing to the same register as %6 does. 491 or T0_32, %1 ; combine the flags. 492 493 ; First calculate SF as it is the same register as %6 (only %6 is always full width). 510 494 bt %4, %5 - 1 511 495 jnc %%sf_clear 512 or T 1_32, X86_EFL_SF496 or T0_32, X86_EFL_SF 513 497 %%sf_clear: 514 498 … … 516 500 and %6, 0xff 517 501 %ifdef RT_ARCH_AMD64 518 lea T 2, [NAME(g_afParity) xWrtRIP]519 or T 1_8, [T2+ %6]502 lea T1, [NAME(g_afParity) xWrtRIP] 503 or T0_8, [T1 + %6] 520 504 %else 521 or T 1_8, [NAME(g_afParity) + %6]505 or T0_8, [NAME(g_afParity) + %6] 522 506 %endif 523 507 524 mov %1, T1_32 ; save the result. 508 ;mov %1, T0_32 ; save the result. 509 ; ASSUMES T0 = eax! 525 510 %endmacro 526 511 … … 1411 1396 ; system where the 64-bit accesses requires hand coding. 1412 1397 ; 1413 ; All the functions takes a pointer to the destination memory operand in A 0,1414 ; the source register operand in A 1 and a pointer to eflags in A2.1398 ; All the functions takes a pointer to the destination memory operand in A1, 1399 ; the source register operand in A2 and the incoming eflags in A0. 1415 1400 ; 1416 1401 ; In the ZF case the destination register is 'undefined', however it seems that … … 1434 1419 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12 1435 1420 PROLOGUE_3_ARGS 1436 IEM_MAYBE_LOAD_FLAGS _OLD A2, %2, %3, %3 ; Must load undefined flags since AMD passes them thru1437 %1 T0_16, A 1_161421 IEM_MAYBE_LOAD_FLAGS A0_32, %2, %3, %3 ; Must load undefined flags since AMD passes them thru 1422 %1 T0_16, A2_16 1438 1423 %if %4 != 0 1439 1424 jz .unchanged_dst 1440 1425 %endif 1441 mov [A 0], T0_161426 mov [A1], T0_16 1442 1427 .unchanged_dst: 1443 IEM_SAVE_FLAGS_ OLD A2, %2, %3, 01428 IEM_SAVE_FLAGS_RETVAL A0_32, %2, %3, 0 1444 1429 EPILOGUE_3_ARGS 1445 1430 ENDPROC iemAImpl_ %+ %1 %+ _u16 … … 1476 1461 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12 1477 1462 PROLOGUE_3_ARGS 1478 IEM_MAYBE_LOAD_FLAGS _OLD A2, %2, %3, %3 ; Must load undefined flags since AMD passes them thru1479 %1 T0_32, A 1_321463 IEM_MAYBE_LOAD_FLAGS A0_32, %2, %3, %3 ; Must load undefined flags since AMD passes them thru 1464 %1 T0_32, A2_32 1480 1465 %if %4 != 0 1481 1466 jz .unchanged_dst 1482 1467 %endif 1483 mov [A 0], T0_321468 mov [A1], T0_32 1484 1469 .unchanged_dst: 1485 IEM_SAVE_FLAGS_ OLD A2, %2, %3, 01470 IEM_SAVE_FLAGS_RETVAL A0_32, %2, %3, 0 1486 1471 EPILOGUE_3_ARGS 1487 1472 ENDPROC iemAImpl_ %+ %1 %+ _u32 … … 1519 1504 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16 1520 1505 PROLOGUE_3_ARGS 1521 IEM_MAYBE_LOAD_FLAGS _OLD A2, %2, %3, %3 ; Must load undefined flags since AMD passes them thru1522 %1 T0, A 11506 IEM_MAYBE_LOAD_FLAGS A0_32, %2, %3, %3 ; Must load undefined flags since AMD passes them thru 1507 %1 T0, A2 1523 1508 %if %4 != 0 1524 1509 jz .unchanged_dst 1525 1510 %endif 1526 mov [A 0], T01511 mov [A1], T0 1527 1512 .unchanged_dst: 1528 IEM_SAVE_FLAGS_ OLD A2, %2, %3, 01513 IEM_SAVE_FLAGS_RETVAL A0_32, %2, %3, 0 1529 1514 EPILOGUE_3_ARGS_EX 8 1530 1515 ENDPROC iemAImpl_ %+ %1 %+ _u64 … … 1571 1556 ; system where the 64-bit accesses requires hand coding. 1572 1557 ; 1573 ; All the functions takes a pointer to the destination memory operand in A 0,1574 ; the source register operand in A 1 and a pointer to eflags in A2.1558 ; All the functions takes a pointer to the destination memory operand in A1, 1559 ; the source register operand in A2 and eflags in A0. 1575 1560 ; 1576 1561 ; ASSUMES Intel and AMD set EFLAGS the same way. … … 1587 1572 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u16, 12 1588 1573 PROLOGUE_3_ARGS 1589 IEM_MAYBE_LOAD_FLAGS _OLD A2, %2, %3, 01590 %1 T0_16, A 1_161591 mov [A 0], T0_161592 IEM_SAVE_FLAGS_ OLD A2, %2, %3, %41574 IEM_MAYBE_LOAD_FLAGS A0_32, %2, %3, 0 1575 %1 T0_16, A2_16 1576 mov [A1], T0_16 1577 IEM_SAVE_FLAGS_RETVAL A0_32, %2, %3, %4 1593 1578 EPILOGUE_3_ARGS 1594 1579 ENDPROC iemAImpl_ %+ %1 %+ _u16 … … 1596 1581 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12 1597 1582 PROLOGUE_3_ARGS 1598 IEM_MAYBE_LOAD_FLAGS _OLD A2, %2, %3, 01599 %1 T0_32, A 1_321600 mov [A 0], T0_321601 IEM_SAVE_FLAGS_ OLD A2, %2, %3, %41583 IEM_MAYBE_LOAD_FLAGS A0_32, %2, %3, 0 1584 %1 T0_32, A2_32 1585 mov [A1], T0_32 1586 IEM_SAVE_FLAGS_RETVAL A0_32, %2, %3, %4 1602 1587 EPILOGUE_3_ARGS 1603 1588 ENDPROC iemAImpl_ %+ %1 %+ _u32 … … 1606 1591 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 16 1607 1592 PROLOGUE_3_ARGS 1608 IEM_MAYBE_LOAD_FLAGS _OLD A2, %2, %3, 01609 %1 T0, A 11610 mov [A 0], T01611 IEM_SAVE_FLAGS_ OLD A2, %2, %3, %41593 IEM_MAYBE_LOAD_FLAGS A0_32, %2, %3, 0 1594 %1 T0, A2 1595 mov [A1], T0 1596 IEM_SAVE_FLAGS_RETVAL A0_32, %2, %3, %4 1612 1597 EPILOGUE_3_ARGS_EX 8 1613 1598 ENDPROC iemAImpl_ %+ %1 %+ _u64 … … 1630 1615 BEGINPROC_FASTCALL iemAImpl_imul_two_u16 %+ %3, 12 1631 1616 PROLOGUE_3_ARGS 1632 IEM_MAYBE_LOAD_FLAGS _OLD A2, %1, %2, %2 ; Undefined flags may be passed thru (AMD)1633 imul A 1_16, word [A0]1634 mov [A 0], A1_161617 IEM_MAYBE_LOAD_FLAGS A0_32, %1, %2, %2 ; Undefined flags may be passed thru (AMD) 1618 imul A2_16, word [A1] 1619 mov [A1], A2_16 1635 1620 %if %4 != 1 1636 IEM_SAVE_FLAGS_ OLD A2, %1, %2, 01621 IEM_SAVE_FLAGS_RETVAL A0_32, %1, %2, 0 1637 1622 %else 1638 IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_ OLD A2, %1, X86_EFL_AF | X86_EFL_ZF, A1_16, 16, A1; intel1623 IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_RETVAL A0_32, %1, X86_EFL_AF | X86_EFL_ZF, A2_16, 16, A2 ; intel 1639 1624 %endif 1640 1625 EPILOGUE_3_ARGS … … 1643 1628 BEGINPROC_FASTCALL iemAImpl_imul_two_u32 %+ %3, 12 1644 1629 PROLOGUE_3_ARGS 1645 IEM_MAYBE_LOAD_FLAGS _OLD A2, %1, %2, %2 ; Undefined flags may be passed thru (AMD)1646 imul A 1_32, dword [A0]1647 mov [A 0], A1_321630 IEM_MAYBE_LOAD_FLAGS A0_32, %1, %2, %2 ; Undefined flags may be passed thru (AMD) 1631 imul A2_32, dword [A1] 1632 mov [A1], A2_32 1648 1633 %if %4 != 1 1649 IEM_SAVE_FLAGS_ OLD A2, %1, %2, 01634 IEM_SAVE_FLAGS_RETVAL A0_32, %1, %2, 0 1650 1635 %else 1651 IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_ OLD A2, %1, X86_EFL_AF | X86_EFL_ZF, A1_32, 32, A1; intel1636 IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_RETVAL A0_32, %1, X86_EFL_AF | X86_EFL_ZF, A2_32, 32, A2 ; intel 1652 1637 %endif 1653 1638 EPILOGUE_3_ARGS … … 1657 1642 BEGINPROC_FASTCALL iemAImpl_imul_two_u64 %+ %3, 16 1658 1643 PROLOGUE_3_ARGS 1659 IEM_MAYBE_LOAD_FLAGS _OLD A2, %1, %2, %2 ; Undefined flags may be passed thru (AMD)1660 imul A 1, qword [A0]1661 mov [A 0], A11644 IEM_MAYBE_LOAD_FLAGS A0_32, %1, %2, %2 ; Undefined flags may be passed thru (AMD) 1645 imul A2, qword [A1] 1646 mov [A1], A2 1662 1647 %if %4 != 1 1663 IEM_SAVE_FLAGS_ OLD A2, %1, %2, 01648 IEM_SAVE_FLAGS_RETVAL A0_32, %1, %2, 0 1664 1649 %else 1665 IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_ OLD A2, %1, X86_EFL_AF | X86_EFL_ZF, A1, 64, A1; intel1650 IEM_SAVE_FLAGS_ADJUST_AND_CALC_SF_PF_RETVAL A0_32, %1, X86_EFL_AF | X86_EFL_ZF, A2, 64, A2 ; intel 1666 1651 %endif 1667 1652 EPILOGUE_3_ARGS_EX 8 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r104195 r104206 1486 1486 * but we restrict ourselves to emulating these recent marchs. 1487 1487 */ 1488 #define SET_BIT_SEARCH_RESULT_INTEL( puDst, pfEFlag, a_iBit) do { \1488 #define SET_BIT_SEARCH_RESULT_INTEL(a_puDst, a_fEFlagsVar, a_iBit) do { \ 1489 1489 unsigned iBit = (a_iBit); \ 1490 uint32_t fEfl = *pfEFlags &~(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF); \1490 a_fEFlagsVar &= ~(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF); \ 1491 1491 if (iBit) \ 1492 1492 { \ 1493 * puDst= --iBit; \1494 fEfl|= IEM_EFL_CALC_PARITY(iBit); \1493 *(a_puDst) = --iBit; \ 1494 a_fEFlagsVar |= IEM_EFL_CALC_PARITY(iBit); \ 1495 1495 } \ 1496 1496 else \ 1497 fEfl |= X86_EFL_ZF | X86_EFL_PF; \ 1498 *pfEFlags = fEfl; \ 1497 a_fEFlagsVar |= X86_EFL_ZF | X86_EFL_PF; \ 1499 1498 } while (0) 1500 #define SET_BIT_SEARCH_RESULT_AMD( puDst, pfEFlag, a_iBit) do { \1499 #define SET_BIT_SEARCH_RESULT_AMD(a_puDst, a_fEFlagsVar, a_iBit) do { \ 1501 1500 unsigned const iBit = (a_iBit); \ 1502 1501 if (iBit) \ 1503 1502 { \ 1504 * puDst= iBit - 1; \1505 *pfEFlags&= ~X86_EFL_ZF; \1503 *(a_puDst) = iBit - 1; \ 1504 a_fEFlagsVar &= ~X86_EFL_ZF; \ 1506 1505 } \ 1507 1506 else \ 1508 *pfEFlags|= X86_EFL_ZF; \1507 a_fEFlagsVar |= X86_EFL_ZF; \ 1509 1508 } while (0) 1510 1509 … … 1513 1512 */ 1514 1513 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1515 IEM_DECL_IMPL_DEF(void, iemAImpl_bsf_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1516 { 1517 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitFirstSetU64(uSrc)); 1518 } 1519 #endif 1520 1521 IEM_DECL_IMPL_DEF(void, iemAImpl_bsf_u64_intel,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1522 { 1523 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitFirstSetU64(uSrc)); 1524 } 1525 1526 IEM_DECL_IMPL_DEF(void, iemAImpl_bsf_u64_amd,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1527 { 1528 SET_BIT_SEARCH_RESULT_AMD(puDst, pfEFlags, ASMBitFirstSetU64(uSrc)); 1514 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsf_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1515 { 1516 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitFirstSetU64(uSrc)); 1517 return fEFlags; 1518 } 1519 #endif 1520 1521 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsf_u64_intel,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1522 { 1523 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitFirstSetU64(uSrc)); 1524 return fEFlags; 1525 } 1526 1527 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsf_u64_amd,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1528 { 1529 SET_BIT_SEARCH_RESULT_AMD(puDst, fEFlags, ASMBitFirstSetU64(uSrc)); 1530 return fEFlags; 1529 1531 } 1530 1532 1531 1533 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1532 IEM_DECL_IMPL_DEF(void, iemAImpl_bsf_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1533 { 1534 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitFirstSetU32(uSrc)); 1535 } 1536 #endif 1537 1538 IEM_DECL_IMPL_DEF(void, iemAImpl_bsf_u32_intel,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1539 { 1540 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitFirstSetU32(uSrc)); 1541 } 1542 1543 IEM_DECL_IMPL_DEF(void, iemAImpl_bsf_u32_amd,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1544 { 1545 SET_BIT_SEARCH_RESULT_AMD(puDst, pfEFlags, ASMBitFirstSetU32(uSrc)); 1534 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsf_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1535 { 1536 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitFirstSetU32(uSrc)); 1537 return fEFlags; 1538 } 1539 #endif 1540 1541 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsf_u32_intel,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1542 { 1543 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitFirstSetU32(uSrc)); 1544 return fEFlags; 1545 } 1546 1547 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsf_u32_amd,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1548 { 1549 SET_BIT_SEARCH_RESULT_AMD(puDst, fEFlags, ASMBitFirstSetU32(uSrc)); 1550 return fEFlags; 1546 1551 } 1547 1552 1548 1553 1549 1554 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1550 IEM_DECL_IMPL_DEF(void, iemAImpl_bsf_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1551 { 1552 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitFirstSetU16(uSrc)); 1553 } 1554 #endif 1555 1556 IEM_DECL_IMPL_DEF(void, iemAImpl_bsf_u16_intel,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1557 { 1558 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitFirstSetU16(uSrc)); 1559 } 1560 1561 IEM_DECL_IMPL_DEF(void, iemAImpl_bsf_u16_amd,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1562 { 1563 SET_BIT_SEARCH_RESULT_AMD(puDst, pfEFlags, ASMBitFirstSetU16(uSrc)); 1555 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsf_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1556 { 1557 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitFirstSetU16(uSrc)); 1558 return fEFlags; 1559 } 1560 #endif 1561 1562 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsf_u16_intel,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1563 { 1564 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitFirstSetU16(uSrc)); 1565 return fEFlags; 1566 } 1567 1568 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsf_u16_amd,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1569 { 1570 SET_BIT_SEARCH_RESULT_AMD(puDst, fEFlags, ASMBitFirstSetU16(uSrc)); 1571 return fEFlags; 1564 1572 } 1565 1573 … … 1570 1578 */ 1571 1579 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1572 IEM_DECL_IMPL_DEF(void, iemAImpl_bsr_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1573 { 1574 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitLastSetU64(uSrc)); 1575 } 1576 #endif 1577 1578 IEM_DECL_IMPL_DEF(void, iemAImpl_bsr_u64_intel,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1579 { 1580 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitLastSetU64(uSrc)); 1581 } 1582 1583 IEM_DECL_IMPL_DEF(void, iemAImpl_bsr_u64_amd,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1584 { 1585 SET_BIT_SEARCH_RESULT_AMD(puDst, pfEFlags, ASMBitLastSetU64(uSrc)); 1580 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsr_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1581 { 1582 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitLastSetU64(uSrc)); 1583 return fEFlags; 1584 } 1585 #endif 1586 1587 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsr_u64_intel,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1588 { 1589 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitLastSetU64(uSrc)); 1590 return fEFlags; 1591 } 1592 1593 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsr_u64_amd,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1594 { 1595 SET_BIT_SEARCH_RESULT_AMD(puDst, fEFlags, ASMBitLastSetU64(uSrc)); 1596 return fEFlags; 1586 1597 } 1587 1598 1588 1599 1589 1600 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1590 IEM_DECL_IMPL_DEF(void, iemAImpl_bsr_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1591 { 1592 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitLastSetU32(uSrc)); 1593 } 1594 #endif 1595 1596 IEM_DECL_IMPL_DEF(void, iemAImpl_bsr_u32_intel,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1597 { 1598 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitLastSetU32(uSrc)); 1599 } 1600 1601 IEM_DECL_IMPL_DEF(void, iemAImpl_bsr_u32_amd,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1602 { 1603 SET_BIT_SEARCH_RESULT_AMD(puDst, pfEFlags, ASMBitLastSetU32(uSrc)); 1601 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsr_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1602 { 1603 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitLastSetU32(uSrc)); 1604 return fEFlags; 1605 } 1606 #endif 1607 1608 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsr_u32_intel,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1609 { 1610 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitLastSetU32(uSrc)); 1611 return fEFlags; 1612 } 1613 1614 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsr_u32_amd,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1615 { 1616 SET_BIT_SEARCH_RESULT_AMD(puDst, fEFlags, ASMBitLastSetU32(uSrc)); 1617 return fEFlags; 1604 1618 } 1605 1619 1606 1620 1607 1621 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1608 IEM_DECL_IMPL_DEF(void, iemAImpl_bsr_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1609 { 1610 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitLastSetU16(uSrc)); 1611 } 1612 #endif 1613 1614 IEM_DECL_IMPL_DEF(void, iemAImpl_bsr_u16_intel,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1615 { 1616 SET_BIT_SEARCH_RESULT_INTEL(puDst, pfEFlags, ASMBitLastSetU16(uSrc)); 1617 } 1618 1619 IEM_DECL_IMPL_DEF(void, iemAImpl_bsr_u16_amd,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1620 { 1621 SET_BIT_SEARCH_RESULT_AMD(puDst, pfEFlags, ASMBitLastSetU16(uSrc)); 1622 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsr_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1623 { 1624 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitLastSetU16(uSrc)); 1625 return fEFlags; 1626 } 1627 #endif 1628 1629 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsr_u16_intel,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1630 { 1631 SET_BIT_SEARCH_RESULT_INTEL(puDst, fEFlags, ASMBitLastSetU16(uSrc)); 1632 return fEFlags; 1633 } 1634 1635 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_bsr_u16_amd,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1636 { 1637 SET_BIT_SEARCH_RESULT_AMD(puDst, fEFlags, ASMBitLastSetU16(uSrc)); 1638 return fEFlags; 1622 1639 } 1623 1640 … … 1626 1643 * Helpers for LZCNT and TZCNT. 1627 1644 */ 1628 #define SET_BIT_CNT_SEARCH_RESULT_INTEL(a_puDst, a_uSrc, a_ pfEFlags, a_uResult) do { \1645 #define SET_BIT_CNT_SEARCH_RESULT_INTEL(a_puDst, a_uSrc, a_fEFlagsVar, a_uResult) do { \ 1629 1646 unsigned const uResult = (a_uResult); \ 1630 1647 *(a_puDst) = uResult; \ 1631 uint32_t fEfl = *(a_pfEFlags) &~(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF); \1648 a_fEFlagsVar &= ~(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF); \ 1632 1649 if (uResult) \ 1633 fEfl|= IEM_EFL_CALC_PARITY(uResult); \1650 a_fEFlagsVar |= IEM_EFL_CALC_PARITY(uResult); \ 1634 1651 else \ 1635 fEfl|= X86_EFL_ZF | X86_EFL_PF; \1652 a_fEFlagsVar |= X86_EFL_ZF | X86_EFL_PF; \ 1636 1653 if (!a_uSrc) \ 1637 fEfl |= X86_EFL_CF; \ 1638 *(a_pfEFlags) = fEfl; \ 1654 a_fEFlagsVar |= X86_EFL_CF; \ 1639 1655 } while (0) 1640 #define SET_BIT_CNT_SEARCH_RESULT_AMD(a_puDst, a_uSrc, a_ pfEFlags, a_uResult) do { \1656 #define SET_BIT_CNT_SEARCH_RESULT_AMD(a_puDst, a_uSrc, a_fEFlagsVar, a_uResult) do { \ 1641 1657 unsigned const uResult = (a_uResult); \ 1642 1658 *(a_puDst) = uResult; \ 1643 uint32_t fEfl = *(a_pfEFlags) &~(X86_EFL_ZF | X86_EFL_CF); \1659 a_fEFlagsVar &= ~(X86_EFL_ZF | X86_EFL_CF); \ 1644 1660 if (!uResult) \ 1645 fEfl|= X86_EFL_ZF; \1661 a_fEFlagsVar |= X86_EFL_ZF; \ 1646 1662 if (!a_uSrc) \ 1647 fEfl |= X86_EFL_CF; \ 1648 *(a_pfEFlags) = fEfl; \ 1663 a_fEFlagsVar |= X86_EFL_CF; \ 1649 1664 } while (0) 1650 1665 … … 1654 1669 */ 1655 1670 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1656 IEM_DECL_IMPL_DEF(void, iemAImpl_lzcnt_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1657 { 1658 iemAImpl_lzcnt_u64_intel(puDst, uSrc, pfEFlags); 1659 } 1660 #endif 1661 1662 IEM_DECL_IMPL_DEF(void, iemAImpl_lzcnt_u64_intel,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1663 { 1664 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, pfEFlags, ASMCountLeadingZerosU64(uSrc)); 1665 } 1666 1667 IEM_DECL_IMPL_DEF(void, iemAImpl_lzcnt_u64_amd,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1668 { 1669 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, pfEFlags, ASMCountLeadingZerosU64(uSrc)); 1671 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_lzcnt_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1672 { 1673 return iemAImpl_lzcnt_u64_intel(fEFlags, puDst, uSrc); 1674 } 1675 #endif 1676 1677 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_lzcnt_u64_intel,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1678 { 1679 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, fEFlags, ASMCountLeadingZerosU64(uSrc)); 1680 return fEFlags; 1681 } 1682 1683 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_lzcnt_u64_amd,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1684 { 1685 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, fEFlags, ASMCountLeadingZerosU64(uSrc)); 1686 return fEFlags; 1670 1687 } 1671 1688 1672 1689 1673 1690 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1674 IEM_DECL_IMPL_DEF(void, iemAImpl_lzcnt_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1675 { 1676 iemAImpl_lzcnt_u32_intel(puDst, uSrc, pfEFlags); 1677 } 1678 #endif 1679 1680 IEM_DECL_IMPL_DEF(void, iemAImpl_lzcnt_u32_intel,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1681 { 1682 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, pfEFlags, ASMCountLeadingZerosU32(uSrc)); 1683 } 1684 1685 IEM_DECL_IMPL_DEF(void, iemAImpl_lzcnt_u32_amd,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1686 { 1687 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, pfEFlags, ASMCountLeadingZerosU32(uSrc)); 1691 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_lzcnt_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1692 { 1693 return iemAImpl_lzcnt_u32_intel(fEFlags, puDst, uSrc); 1694 } 1695 #endif 1696 1697 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_lzcnt_u32_intel,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1698 { 1699 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, fEFlags, ASMCountLeadingZerosU32(uSrc)); 1700 return fEFlags; 1701 } 1702 1703 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_lzcnt_u32_amd,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1704 { 1705 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, fEFlags, ASMCountLeadingZerosU32(uSrc)); 1706 return fEFlags; 1688 1707 } 1689 1708 1690 1709 1691 1710 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1692 IEM_DECL_IMPL_DEF(void, iemAImpl_lzcnt_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1693 { 1694 iemAImpl_lzcnt_u16_intel(puDst, uSrc, pfEFlags); 1695 } 1696 #endif 1697 1698 IEM_DECL_IMPL_DEF(void, iemAImpl_lzcnt_u16_intel,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1699 { 1700 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, pfEFlags, ASMCountLeadingZerosU16(uSrc)); 1701 } 1702 1703 IEM_DECL_IMPL_DEF(void, iemAImpl_lzcnt_u16_amd,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1704 { 1705 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, pfEFlags, ASMCountLeadingZerosU16(uSrc)); 1711 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_lzcnt_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1712 { 1713 return iemAImpl_lzcnt_u16_intel(fEFlags, puDst, uSrc); 1714 } 1715 #endif 1716 1717 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_lzcnt_u16_intel,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1718 { 1719 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, fEFlags, ASMCountLeadingZerosU16(uSrc)); 1720 return fEFlags; 1721 } 1722 1723 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_lzcnt_u16_amd,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1724 { 1725 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, fEFlags, ASMCountLeadingZerosU16(uSrc)); 1726 return fEFlags; 1706 1727 } 1707 1728 … … 1711 1732 */ 1712 1733 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1713 IEM_DECL_IMPL_DEF(void, iemAImpl_tzcnt_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1714 { 1715 iemAImpl_tzcnt_u64_intel(puDst, uSrc, pfEFlags); 1716 } 1717 #endif 1718 1719 IEM_DECL_IMPL_DEF(void, iemAImpl_tzcnt_u64_intel,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1720 { 1721 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, pfEFlags, ASMCountTrailingZerosU64(uSrc)); 1722 } 1723 1724 IEM_DECL_IMPL_DEF(void, iemAImpl_tzcnt_u64_amd,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags)) 1725 { 1726 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, pfEFlags, ASMCountTrailingZerosU64(uSrc)); 1734 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_tzcnt_u64,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1735 { 1736 return iemAImpl_tzcnt_u64_intel(fEFlags, puDst, uSrc); 1737 } 1738 #endif 1739 1740 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_tzcnt_u64_intel,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1741 { 1742 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, fEFlags, ASMCountTrailingZerosU64(uSrc)); 1743 return fEFlags; 1744 } 1745 1746 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_tzcnt_u64_amd,(uint32_t fEFlags, uint64_t *puDst, uint64_t uSrc)) 1747 { 1748 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, fEFlags, ASMCountTrailingZerosU64(uSrc)); 1749 return fEFlags; 1727 1750 } 1728 1751 1729 1752 1730 1753 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1731 IEM_DECL_IMPL_DEF(void, iemAImpl_tzcnt_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1732 { 1733 iemAImpl_tzcnt_u32_intel(puDst, uSrc, pfEFlags); 1734 } 1735 #endif 1736 1737 IEM_DECL_IMPL_DEF(void, iemAImpl_tzcnt_u32_intel,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1738 { 1739 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, pfEFlags, ASMCountTrailingZerosU32(uSrc)); 1740 } 1741 1742 IEM_DECL_IMPL_DEF(void, iemAImpl_tzcnt_u32_amd,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags)) 1743 { 1744 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, pfEFlags, ASMCountTrailingZerosU32(uSrc)); 1754 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_tzcnt_u32,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1755 { 1756 return iemAImpl_tzcnt_u32_intel(fEFlags, puDst, uSrc); 1757 } 1758 #endif 1759 1760 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_tzcnt_u32_intel,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1761 { 1762 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, fEFlags, ASMCountTrailingZerosU32(uSrc)); 1763 return fEFlags; 1764 } 1765 1766 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_tzcnt_u32_amd,(uint32_t fEFlags, uint32_t *puDst, uint32_t uSrc)) 1767 { 1768 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, fEFlags, ASMCountTrailingZerosU32(uSrc)); 1769 return fEFlags; 1745 1770 } 1746 1771 1747 1772 1748 1773 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 1749 IEM_DECL_IMPL_DEF(void, iemAImpl_tzcnt_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1750 { 1751 iemAImpl_tzcnt_u16_intel(puDst, uSrc, pfEFlags); 1752 } 1753 #endif 1754 1755 IEM_DECL_IMPL_DEF(void, iemAImpl_tzcnt_u16_intel,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1756 { 1757 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, pfEFlags, ASMCountTrailingZerosU16(uSrc)); 1758 } 1759 1760 IEM_DECL_IMPL_DEF(void, iemAImpl_tzcnt_u16_amd,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags)) 1761 { 1762 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, pfEFlags, ASMCountTrailingZerosU16(uSrc)); 1774 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_tzcnt_u16,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1775 { 1776 return iemAImpl_tzcnt_u16_intel(fEFlags, puDst, uSrc); 1777 } 1778 #endif 1779 1780 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_tzcnt_u16_intel,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1781 { 1782 SET_BIT_CNT_SEARCH_RESULT_INTEL(puDst, uSrc, fEFlags, ASMCountTrailingZerosU16(uSrc)); 1783 return fEFlags; 1784 } 1785 1786 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_tzcnt_u16_amd,(uint32_t fEFlags, uint16_t *puDst, uint16_t uSrc)) 1787 { 1788 SET_BIT_CNT_SEARCH_RESULT_AMD(puDst, uSrc, fEFlags, ASMCountTrailingZerosU16(uSrc)); 1789 return fEFlags; 1763 1790 } 1764 1791 … … 1967 1994 1968 1995 #define EMIT_POPCNT(a_cBits, a_Type, a_Suffix) \ 1969 IEM_DECL_IMPL_DEF( void, RT_CONCAT3(iemAImpl_popcnt_u,a_cBits,a_Suffix),(a_Type *puDst, a_Type uSrc, uint32_t *pfEFlags)) \1996 IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_popcnt_u,a_cBits,a_Suffix),(uint32_t fEFlags, a_Type *puDst, a_Type uSrc)) \ 1970 1997 { \ 1971 uint32_t fEfl = *pfEFlags &~(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF); \1998 fEFlags &= ~(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF); \ 1972 1999 a_Type uResult; \ 1973 2000 if (uSrc) \ … … 1975 2002 else \ 1976 2003 { \ 1977 fE fl|= X86_EFL_ZF; \1978 uResult = 0; \2004 fEFlags |= X86_EFL_ZF; \ 2005 uResult = 0; \ 1979 2006 } \ 1980 *puDst 1981 *pfEFlags = fEfl; \2007 *puDst = uResult; \ 2008 return fEFlags; \ 1982 2009 } 1983 2010 … … 2622 2649 */ 2623 2650 # define EMIT_IMUL_TWO(a_cBits, a_uType) \ 2624 IEM_DECL_IMPL_DEF( void, iemAImpl_imul_two_u ## a_cBits,(a_uType *puDst, a_uType uSrc, uint32_t *pfEFlags)) \2651 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_imul_two_u ## a_cBits,(uint32_t fEFlags, a_uType *puDst, a_uType uSrc)) \ 2625 2652 { \ 2626 2653 a_uType uIgn; \ 2627 iemAImpl_imul_u ## a_cBits(puDst, &uIgn, uSrc, pfEFlags); \ 2654 iemAImpl_imul_u ## a_cBits(puDst, &uIgn, uSrc, &fEFlags); \ 2655 return fEFlags; \ 2628 2656 } \ 2629 2657 \ 2630 IEM_DECL_IMPL_DEF( void, iemAImpl_imul_two_u ## a_cBits ## _intel,(a_uType *puDst, a_uType uSrc, uint32_t *pfEFlags)) \2658 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_imul_two_u ## a_cBits ## _intel,(uint32_t fEFlags, a_uType *puDst, a_uType uSrc)) \ 2631 2659 { \ 2632 2660 a_uType uIgn; \ 2633 iemAImpl_imul_u ## a_cBits ## _intel(puDst, &uIgn, uSrc, pfEFlags); \ 2661 iemAImpl_imul_u ## a_cBits ## _intel(puDst, &uIgn, uSrc, &fEFlags); \ 2662 return fEFlags; \ 2634 2663 } \ 2635 2664 \ 2636 IEM_DECL_IMPL_DEF( void, iemAImpl_imul_two_u ## a_cBits ## _amd,(a_uType *puDst, a_uType uSrc, uint32_t *pfEFlags)) \2665 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_imul_two_u ## a_cBits ## _amd,(uint32_t fEFlags, a_uType *puDst, a_uType uSrc)) \ 2637 2666 { \ 2638 2667 a_uType uIgn; \ 2639 iemAImpl_imul_u ## a_cBits ## _amd(puDst, &uIgn, uSrc, pfEFlags); \ 2668 iemAImpl_imul_u ## a_cBits ## _amd(puDst, &uIgn, uSrc, &fEFlags); \ 2669 return fEFlags; \ 2640 2670 } 2641 2671 -
trunk/src/VBox/VMM/VMMAll/IEMAllInstCommon.cpp.h
r104195 r104206 46 46 47 47 /** Function table for the BSF instruction. */ 48 IEM_STATIC const IEMOPBIN TODOSIZES g_iemAImpl_bsf =48 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsf = 49 49 { 50 50 NULL, NULL, … … 55 55 56 56 /** Function table for the BSF instruction, AMD EFLAGS variant. */ 57 IEM_STATIC const IEMOPBIN TODOSIZES g_iemAImpl_bsf_amd =57 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsf_amd = 58 58 { 59 59 NULL, NULL, … … 64 64 65 65 /** Function table for the BSF instruction, Intel EFLAGS variant. */ 66 IEM_STATIC const IEMOPBIN TODOSIZES g_iemAImpl_bsf_intel =66 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsf_intel = 67 67 { 68 68 NULL, NULL, … … 73 73 74 74 /** EFLAGS variation selection table for the BSF instruction. */ 75 IEM_STATIC const IEMOPBIN TODOSIZES * const g_iemAImpl_bsf_eflags[] =75 IEM_STATIC const IEMOPBINSIZES * const g_iemAImpl_bsf_eflags[] = 76 76 { 77 77 &g_iemAImpl_bsf, … … 82 82 83 83 /** Function table for the BSR instruction. */ 84 IEM_STATIC const IEMOPBIN TODOSIZES g_iemAImpl_bsr =84 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsr = 85 85 { 86 86 NULL, NULL, … … 91 91 92 92 /** Function table for the BSR instruction, AMD EFLAGS variant. */ 93 IEM_STATIC const IEMOPBIN TODOSIZES g_iemAImpl_bsr_amd =93 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsr_amd = 94 94 { 95 95 NULL, NULL, … … 100 100 101 101 /** Function table for the BSR instruction, Intel EFLAGS variant. */ 102 IEM_STATIC const IEMOPBIN TODOSIZES g_iemAImpl_bsr_intel =102 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsr_intel = 103 103 { 104 104 NULL, NULL, … … 109 109 110 110 /** EFLAGS variation selection table for the BSR instruction. */ 111 IEM_STATIC const IEMOPBIN TODOSIZES * const g_iemAImpl_bsr_eflags[] =111 IEM_STATIC const IEMOPBINSIZES * const g_iemAImpl_bsr_eflags[] = 112 112 { 113 113 &g_iemAImpl_bsr, … … 118 118 119 119 /** Function table for the IMUL instruction. */ 120 IEM_STATIC const IEMOPBIN TODOSIZES g_iemAImpl_imul_two =120 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_imul_two = 121 121 { 122 122 NULL, NULL, … … 127 127 128 128 /** Function table for the IMUL instruction, AMD EFLAGS variant. */ 129 IEM_STATIC const IEMOPBIN TODOSIZES g_iemAImpl_imul_two_amd =129 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_imul_two_amd = 130 130 { 131 131 NULL, NULL, … … 136 136 137 137 /** Function table for the IMUL instruction, Intel EFLAGS variant. */ 138 IEM_STATIC const IEMOPBIN TODOSIZES g_iemAImpl_imul_two_intel =138 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_imul_two_intel = 139 139 { 140 140 NULL, NULL, … … 145 145 146 146 /** EFLAGS variation selection table for the IMUL instruction. */ 147 IEM_STATIC const IEMOPBIN TODOSIZES * const g_iemAImpl_imul_two_eflags[] =147 IEM_STATIC const IEMOPBINSIZES * const g_iemAImpl_imul_two_eflags[] = 148 148 { 149 149 &g_iemAImpl_imul_two, … … 154 154 155 155 /** EFLAGS variation selection table for the 16-bit IMUL instruction. */ 156 IEM_STATIC PFNIEMAIMPLBIN TODOU16 const g_iemAImpl_imul_two_u16_eflags[] =156 IEM_STATIC PFNIEMAIMPLBINU16 const g_iemAImpl_imul_two_u16_eflags[] = 157 157 { 158 158 iemAImpl_imul_two_u16, … … 163 163 164 164 /** EFLAGS variation selection table for the 32-bit IMUL instruction. */ 165 IEM_STATIC PFNIEMAIMPLBIN TODOU32 const g_iemAImpl_imul_two_u32_eflags[] =165 IEM_STATIC PFNIEMAIMPLBINU32 const g_iemAImpl_imul_two_u32_eflags[] = 166 166 { 167 167 iemAImpl_imul_two_u32, … … 172 172 173 173 /** EFLAGS variation selection table for the 64-bit IMUL instruction. */ 174 IEM_STATIC PFNIEMAIMPLBIN TODOU64 const g_iemAImpl_imul_two_u64_eflags[] =174 IEM_STATIC PFNIEMAIMPLBINU64 const g_iemAImpl_imul_two_u64_eflags[] = 175 175 { 176 176 iemAImpl_imul_two_u64, -
trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h
r104195 r104206 3386 3386 case IEMMODE_16BIT: 3387 3387 { 3388 PFNIEMAIMPLBIN TODOU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags);3388 PFNIEMAIMPLBINU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags); 3389 3389 if (IEM_IS_MODRM_REG_MODE(bRm)) 3390 3390 { … … 3395 3395 IEM_MC_LOCAL(uint16_t, u16Tmp); 3396 3396 IEM_MC_FETCH_GREG_U16(u16Tmp, IEM_GET_MODRM_RM(pVCpu, bRm)); 3397 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Tmp, 0); 3398 IEM_MC_ARG_ CONST(uint16_t, u16Src,/*=*/ u16Imm,1);3399 IEM_MC_ARG (uint32_t *, pEFlags, 2);3400 IEM_MC_ REF_EFLAGS(pEFlags);3401 IEM_MC_CALL_ VOID_AIMPL_3(pfnAImplU16, pu16Dst, u16Src, pEFlags);3397 3398 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Tmp, 1); 3399 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3400 IEM_MC_ARG_CONST(uint16_t, u16Src,/*=*/ u16Imm, 2); 3401 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU16, fEFlagsIn, pu16Dst, u16Src); 3402 3402 IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Tmp); 3403 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3403 3404 3404 3405 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3418 3419 IEM_MC_FETCH_MEM_U16(u16Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 3419 3420 3420 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Tmp, 0); 3421 IEM_MC_ARG_CONST(uint16_t, u16Src, u16Imm, 1); 3422 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3423 IEM_MC_REF_EFLAGS(pEFlags); 3424 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU16, pu16Dst, u16Src, pEFlags); 3421 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Tmp, 1); 3422 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3423 IEM_MC_ARG_CONST(uint16_t, u16Src, u16Imm, 2); 3424 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU16, fEFlagsIn, pu16Dst, u16Src); 3425 3425 IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Tmp); 3426 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3426 3427 3427 3428 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3433 3434 case IEMMODE_32BIT: 3434 3435 { 3435 PFNIEMAIMPLBIN TODOU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags);3436 PFNIEMAIMPLBINU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags); 3436 3437 if (IEM_IS_MODRM_REG_MODE(bRm)) 3437 3438 { … … 3443 3444 IEM_MC_FETCH_GREG_U32(u32Tmp, IEM_GET_MODRM_RM(pVCpu, bRm)); 3444 3445 3445 IEM_MC_ARG_LOCAL_REF(uint32_t *, pu32Dst, u32Tmp, 0); 3446 IEM_MC_ARG_CONST(uint32_t, u32Src,/*=*/ u32Imm, 1); 3447 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3448 IEM_MC_REF_EFLAGS(pEFlags); 3449 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU32, pu32Dst, u32Src, pEFlags); 3446 IEM_MC_ARG_LOCAL_REF(uint32_t *, pu32Dst, u32Tmp, 1); 3447 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3448 IEM_MC_ARG_CONST(uint32_t, u32Src,/*=*/ u32Imm, 2); 3449 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU32, fEFlagsIn, pu32Dst, u32Src); 3450 3450 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Tmp); 3451 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3451 3452 3452 3453 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3466 3467 IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 3467 3468 3468 IEM_MC_ARG_LOCAL_REF(uint32_t *, pu32Dst, u32Tmp, 0); 3469 IEM_MC_ARG_CONST(uint32_t, u32Src, u32Imm, 1); 3470 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3471 IEM_MC_REF_EFLAGS(pEFlags); 3472 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU32, pu32Dst, u32Src, pEFlags); 3469 IEM_MC_ARG_LOCAL_REF(uint32_t *, pu32Dst, u32Tmp, 1); 3470 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3471 IEM_MC_ARG_CONST(uint32_t, u32Src, u32Imm, 2); 3472 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU32, fEFlagsIn, pu32Dst, u32Src); 3473 3473 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Tmp); 3474 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3474 3475 3475 3476 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3481 3482 case IEMMODE_64BIT: 3482 3483 { 3483 PFNIEMAIMPLBIN TODOU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags);3484 PFNIEMAIMPLBINU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags); 3484 3485 if (IEM_IS_MODRM_REG_MODE(bRm)) 3485 3486 { … … 3491 3492 IEM_MC_FETCH_GREG_U64(u64Tmp, IEM_GET_MODRM_RM(pVCpu, bRm)); 3492 3493 3493 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Tmp, 0); 3494 IEM_MC_ARG_CONST(uint64_t, u64Src,/*=*/ u64Imm, 1); 3495 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3496 IEM_MC_REF_EFLAGS(pEFlags); 3497 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU64, pu64Dst, u64Src, pEFlags); 3494 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Tmp, 1); 3495 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3496 IEM_MC_ARG_CONST(uint64_t, u64Src,/*=*/ u64Imm, 2); 3497 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU64, fEFlagsIn, pu64Dst, u64Src); 3498 3498 IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Tmp); 3499 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3499 3500 3500 3501 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3514 3515 IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 3515 3516 3516 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Tmp, 0); 3517 IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ (int64_t)(int32_t)u32Imm, 1); 3518 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3519 IEM_MC_REF_EFLAGS(pEFlags); 3520 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU64, pu64Dst, u64Src, pEFlags); 3517 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Tmp, 1); 3518 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3519 IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ (int64_t)(int32_t)u32Imm, 2); 3520 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU64, fEFlagsIn, pu64Dst, u64Src); 3521 3521 IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Tmp); 3522 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3522 3523 3523 3524 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3588 3589 case IEMMODE_16BIT: 3589 3590 { 3590 PFNIEMAIMPLBIN TODOU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags);3591 PFNIEMAIMPLBINU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags); 3591 3592 if (IEM_IS_MODRM_REG_MODE(bRm)) 3592 3593 { … … 3599 3600 IEM_MC_FETCH_GREG_U16(u16Tmp, IEM_GET_MODRM_RM(pVCpu, bRm)); 3600 3601 3601 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Tmp, 0); 3602 IEM_MC_ARG_CONST(uint16_t, u16Src,/*=*/ (int8_t)u8Imm, 1); 3603 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3604 IEM_MC_REF_EFLAGS(pEFlags); 3605 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU16, pu16Dst, u16Src, pEFlags); 3602 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Tmp, 1); 3603 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3604 IEM_MC_ARG_CONST(uint16_t, u16Src,/*=*/ (int8_t)u8Imm, 2); 3605 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU16, fEFlagsIn, pu16Dst, u16Src); 3606 3606 IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Tmp); 3607 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3607 3608 3608 3609 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3623 3624 IEM_MC_FETCH_MEM_U16(u16Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 3624 3625 3625 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Tmp, 0); 3626 IEM_MC_ARG_CONST(uint16_t, u16Src, u16Imm, 1); 3627 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3628 IEM_MC_REF_EFLAGS(pEFlags); 3629 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU16, pu16Dst, u16Src, pEFlags); 3626 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Tmp, 1); 3627 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3628 IEM_MC_ARG_CONST(uint16_t, u16Src, u16Imm, 2); 3629 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU16, fEFlagsIn, pu16Dst, u16Src); 3630 3630 IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Tmp); 3631 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3631 3632 3632 3633 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3638 3639 case IEMMODE_32BIT: 3639 3640 { 3640 PFNIEMAIMPLBIN TODOU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags);3641 PFNIEMAIMPLBINU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags); 3641 3642 if (IEM_IS_MODRM_REG_MODE(bRm)) 3642 3643 { … … 3648 3649 IEM_MC_FETCH_GREG_U32(u32Tmp, IEM_GET_MODRM_RM(pVCpu, bRm)); 3649 3650 3650 IEM_MC_ARG_LOCAL_REF(uint32_t *, pu32Dst, u32Tmp, 0); 3651 IEM_MC_ARG_CONST(uint32_t, u32Src,/*=*/ (int8_t)u8Imm, 1); 3652 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3653 IEM_MC_REF_EFLAGS(pEFlags); 3654 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU32, pu32Dst, u32Src, pEFlags); 3651 IEM_MC_ARG_LOCAL_REF(uint32_t *, pu32Dst, u32Tmp, 1); 3652 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3653 IEM_MC_ARG_CONST(uint32_t, u32Src,/*=*/ (int8_t)u8Imm, 2); 3654 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU32, fEFlagsIn, pu32Dst, u32Src); 3655 3655 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Tmp); 3656 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3656 3657 3657 3658 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3671 3672 IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 3672 3673 3673 IEM_MC_ARG_LOCAL_REF(uint32_t *, pu32Dst, u32Tmp, 0); 3674 IEM_MC_ARG_CONST(uint32_t, u32Src, u32Imm, 1); 3675 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3676 IEM_MC_REF_EFLAGS(pEFlags); 3677 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU32, pu32Dst, u32Src, pEFlags); 3674 IEM_MC_ARG_LOCAL_REF(uint32_t *, pu32Dst, u32Tmp, 1); 3675 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3676 IEM_MC_ARG_CONST(uint32_t, u32Src, u32Imm, 2); 3677 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU32, fEFlagsIn, pu32Dst, u32Src); 3678 3678 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Tmp); 3679 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3679 3680 3680 3681 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3686 3687 case IEMMODE_64BIT: 3687 3688 { 3688 PFNIEMAIMPLBIN TODOU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags);3689 PFNIEMAIMPLBINU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags); 3689 3690 if (IEM_IS_MODRM_REG_MODE(bRm)) 3690 3691 { … … 3696 3697 IEM_MC_FETCH_GREG_U64(u64Tmp, IEM_GET_MODRM_RM(pVCpu, bRm)); 3697 3698 3698 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Tmp, 0); 3699 IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ (int64_t)(int8_t)u8Imm, 1); 3700 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3701 IEM_MC_REF_EFLAGS(pEFlags); 3702 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU64, pu64Dst, u64Src, pEFlags); 3699 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Tmp, 1); 3700 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3701 IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ (int64_t)(int8_t)u8Imm, 2); 3702 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU64, fEFlagsIn, pu64Dst, u64Src); 3703 3703 IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Tmp); 3704 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3704 3705 3705 3706 IEM_MC_ADVANCE_RIP_AND_FINISH(); … … 3719 3720 IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 3720 3721 3721 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Tmp, 0); 3722 IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ (int64_t)(int8_t)u8Imm, 1); 3723 IEM_MC_ARG(uint32_t *, pEFlags, 2); 3724 IEM_MC_REF_EFLAGS(pEFlags); 3725 IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU64, pu64Dst, u64Src, pEFlags); 3722 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Tmp, 1); 3723 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); 3724 IEM_MC_ARG_CONST(uint64_t, u64Src, /*=*/ (int64_t)(int8_t)u8Imm, 2); 3725 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pfnAImplU64, fEFlagsIn, pu64Dst, u64Src); 3726 3726 IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Tmp); 3727 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); 3727 3728 3728 3729 IEM_MC_ADVANCE_RIP_AND_FINISH(); -
trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h
r104195 r104206 10004 10004 IEMOP_HLP_MIN_386(); 10005 10005 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF); 10006 const IEMOPBIN TODOSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_eflags);10006 const IEMOPBINSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_eflags); 10007 10007 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 10008 IEMOP_BODY_BINARY_ TODO_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_MIN_386, imul, 0);10008 IEMOP_BODY_BINARY_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_MIN_386, imul, 0); 10009 10009 } 10010 10010 … … 10501 10501 #ifndef TST_IEM_CHECK_MC 10502 10502 # if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY) 10503 static const IEMOPBIN TODOSIZES s_Native =10503 static const IEMOPBINSIZES s_Native = 10504 10504 { NULL, NULL, iemAImpl_popcnt_u16, NULL, iemAImpl_popcnt_u32, NULL, iemAImpl_popcnt_u64, NULL }; 10505 10505 # endif 10506 static const IEMOPBIN TODOSIZES s_Fallback =10506 static const IEMOPBINSIZES s_Fallback = 10507 10507 { NULL, NULL, iemAImpl_popcnt_u16_fallback, NULL, iemAImpl_popcnt_u32_fallback, NULL, iemAImpl_popcnt_u64_fallback, NULL }; 10508 10508 #endif 10509 const IEMOPBIN TODOSIZES * const pImpl = IEM_SELECT_HOST_OR_FALLBACK(fPopCnt, &s_Native, &s_Fallback);10509 const IEMOPBINSIZES * const pImpl = IEM_SELECT_HOST_OR_FALLBACK(fPopCnt, &s_Native, &s_Fallback); 10510 10510 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 10511 IEMOP_BODY_BINARY_ TODO_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, popcnt, 0);10511 IEMOP_BODY_BINARY_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, popcnt, 0); 10512 10512 } 10513 10513 … … 11005 11005 IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \ 11006 11006 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 11007 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \11008 IEM_MC_ARG(uint16_t, u16Src, 1); \11009 IEM_MC_ARG(uint32_t *, pEFlags, 2); \11010 11007 \ 11008 IEM_MC_ARG(uint16_t, u16Src, 2); \ 11011 11009 IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 11010 IEM_MC_ARG(uint16_t *, pu16Dst, 1); \ 11012 11011 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 11013 IEM_MC_REF_EFLAGS(pEFlags); \ 11014 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags); \ 11012 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); \ 11013 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU16, fEFlagsIn, pu16Dst, u16Src); \ 11014 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \ 11015 11015 \ 11016 11016 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 11017 11017 IEM_MC_END(); \ 11018 11018 break; \ 11019 11019 \ 11020 11020 case IEMMODE_32BIT: \ 11021 11021 IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \ 11022 11022 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 11023 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \11024 IEM_MC_ARG(uint32_t, u32Src, 1); \11025 IEM_MC_ARG(uint32_t *, pEFlags, 2); \11026 11023 \ 11024 IEM_MC_ARG(uint32_t, u32Src, 2); \ 11027 11025 IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 11026 IEM_MC_ARG(uint32_t *, pu32Dst, 1); \ 11028 11027 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 11029 IEM_MC_REF_EFLAGS(pEFlags); \ 11030 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags); \ 11028 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); \ 11029 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU32, fEFlagsIn, pu32Dst, u32Src); \ 11030 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \ 11031 11031 IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_ZF) { \ 11032 11032 IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm)); \ … … 11035 11035 IEM_MC_END(); \ 11036 11036 break; \ 11037 11037 \ 11038 11038 case IEMMODE_64BIT: \ 11039 11039 IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \ 11040 11040 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 11041 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \11042 IEM_MC_ARG(uint64_t, u64Src, 1); \11043 IEM_MC_ARG(uint32_t *, pEFlags, 2); \11044 11041 \ 11042 IEM_MC_ARG(uint64_t, u64Src, 2); \ 11045 11043 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 11044 IEM_MC_ARG(uint64_t *, pu64Dst, 1); \ 11046 11045 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 11047 IEM_MC_REF_EFLAGS(pEFlags); \ 11048 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags); \ 11046 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); \ 11047 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU64, fEFlagsIn, pu64Dst, u64Src); \ 11048 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \ 11049 11049 \ 11050 11050 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ … … 11064 11064 case IEMMODE_16BIT: \ 11065 11065 IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \ 11066 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \ 11067 IEM_MC_ARG(uint16_t, u16Src, 1); \ 11068 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 11069 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 11070 \ 11066 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 11071 11067 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \ 11072 11068 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 11069 \ 11070 IEM_MC_ARG(uint16_t, u16Src, 2); \ 11073 11071 IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \ 11072 IEM_MC_ARG(uint16_t *, pu16Dst, 1); \ 11074 11073 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 11075 IEM_MC_REF_EFLAGS(pEFlags); \ 11076 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags); \ 11074 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); \ 11075 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU16, fEFlagsIn, pu16Dst, u16Src); \ 11076 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \ 11077 11077 \ 11078 11078 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ … … 11082 11082 case IEMMODE_32BIT: \ 11083 11083 IEM_MC_BEGIN(IEM_MC_F_MIN_386, 0); \ 11084 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \ 11085 IEM_MC_ARG(uint32_t, u32Src, 1); \ 11086 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 11087 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 11088 \ 11084 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 11089 11085 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \ 11090 11086 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 11087 \ 11088 IEM_MC_ARG(uint32_t, u32Src, 2); \ 11091 11089 IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \ 11090 IEM_MC_ARG(uint32_t *, pu32Dst, 1); \ 11092 11091 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 11093 IEM_MC_REF_EFLAGS(pEFlags); \ 11094 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags); \ 11092 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); \ 11093 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU32, fEFlagsIn, pu32Dst, u32Src); \ 11094 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \ 11095 11095 \ 11096 11096 IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_ZF) { \ … … 11103 11103 case IEMMODE_64BIT: \ 11104 11104 IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \ 11105 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \ 11106 IEM_MC_ARG(uint64_t, u64Src, 1); \ 11107 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 11108 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 11109 \ 11105 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 11110 11106 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \ 11111 11107 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 11108 \ 11109 IEM_MC_ARG(uint64_t, u64Src, 2); \ 11112 11110 IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \ 11111 IEM_MC_ARG(uint64_t *, pu64Dst, 1); \ 11113 11112 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 11114 IEM_MC_REF_EFLAGS(pEFlags); \ 11115 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags); \ 11113 IEM_MC_ARG_EFLAGS( fEFlagsIn, 0); \ 11114 IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, pImpl->pfnNormalU64, fEFlagsIn, pu64Dst, u64Src); \ 11115 IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \ 11116 11116 \ 11117 11117 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ … … 11138 11138 IEMOP_HLP_MIN_386(); 11139 11139 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF); 11140 PCIEMOPBIN TODOSIZES const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_bsf_eflags);11140 PCIEMOPBINSIZES const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_bsf_eflags); 11141 11141 IEMOP_BODY_BIT_SCAN_OPERATOR_RV_RM(pImpl); 11142 11142 } … … 11159 11159 11160 11160 #ifndef TST_IEM_CHECK_MC 11161 static const IEMOPBIN TODOSIZES s_iemAImpl_tzcnt =11161 static const IEMOPBINSIZES s_iemAImpl_tzcnt = 11162 11162 { NULL, NULL, iemAImpl_tzcnt_u16, NULL, iemAImpl_tzcnt_u32, NULL, iemAImpl_tzcnt_u64, NULL }; 11163 static const IEMOPBIN TODOSIZES s_iemAImpl_tzcnt_amd =11163 static const IEMOPBINSIZES s_iemAImpl_tzcnt_amd = 11164 11164 { NULL, NULL, iemAImpl_tzcnt_u16_amd, NULL, iemAImpl_tzcnt_u32_amd, NULL, iemAImpl_tzcnt_u64_amd, NULL }; 11165 static const IEMOPBIN TODOSIZES s_iemAImpl_tzcnt_intel =11165 static const IEMOPBINSIZES s_iemAImpl_tzcnt_intel = 11166 11166 { NULL, NULL, iemAImpl_tzcnt_u16_intel, NULL, iemAImpl_tzcnt_u32_intel, NULL, iemAImpl_tzcnt_u64_intel, NULL }; 11167 static const IEMOPBIN TODOSIZES * const s_iemAImpl_tzcnt_eflags[2][4] =11167 static const IEMOPBINSIZES * const s_iemAImpl_tzcnt_eflags[2][4] = 11168 11168 { 11169 11169 { &s_iemAImpl_tzcnt_intel, &s_iemAImpl_tzcnt_intel, &s_iemAImpl_tzcnt_amd, &s_iemAImpl_tzcnt_intel }, … … 11172 11172 #endif 11173 11173 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF); 11174 const IEMOPBIN TODOSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT_EX(s_iemAImpl_tzcnt_eflags,11174 const IEMOPBINSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT_EX(s_iemAImpl_tzcnt_eflags, 11175 11175 IEM_GET_HOST_CPU_FEATURES(pVCpu)->fBmi1); 11176 11176 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 11177 IEMOP_BODY_BINARY_ TODO_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, tzcnt, 0);11177 IEMOP_BODY_BINARY_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, tzcnt, 0); 11178 11178 } 11179 11179 … … 11193 11193 IEMOP_HLP_MIN_386(); 11194 11194 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF); 11195 PCIEMOPBIN TODOSIZES const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_bsr_eflags);11195 PCIEMOPBINSIZES const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_bsr_eflags); 11196 11196 IEMOP_BODY_BIT_SCAN_OPERATOR_RV_RM(pImpl); 11197 11197 } … … 11214 11214 11215 11215 #ifndef TST_IEM_CHECK_MC 11216 static const IEMOPBIN TODOSIZES s_iemAImpl_lzcnt =11216 static const IEMOPBINSIZES s_iemAImpl_lzcnt = 11217 11217 { NULL, NULL, iemAImpl_lzcnt_u16, NULL, iemAImpl_lzcnt_u32, NULL, iemAImpl_lzcnt_u64, NULL }; 11218 static const IEMOPBIN TODOSIZES s_iemAImpl_lzcnt_amd =11218 static const IEMOPBINSIZES s_iemAImpl_lzcnt_amd = 11219 11219 { NULL, NULL, iemAImpl_lzcnt_u16_amd, NULL, iemAImpl_lzcnt_u32_amd, NULL, iemAImpl_lzcnt_u64_amd, NULL }; 11220 static const IEMOPBIN TODOSIZES s_iemAImpl_lzcnt_intel =11220 static const IEMOPBINSIZES s_iemAImpl_lzcnt_intel = 11221 11221 { NULL, NULL, iemAImpl_lzcnt_u16_intel, NULL, iemAImpl_lzcnt_u32_intel, NULL, iemAImpl_lzcnt_u64_intel, NULL }; 11222 static const IEMOPBIN TODOSIZES * const s_iemAImpl_lzcnt_eflags[2][4] =11222 static const IEMOPBINSIZES * const s_iemAImpl_lzcnt_eflags[2][4] = 11223 11223 { 11224 11224 { &s_iemAImpl_lzcnt_intel, &s_iemAImpl_lzcnt_intel, &s_iemAImpl_lzcnt_amd, &s_iemAImpl_lzcnt_intel }, … … 11227 11227 #endif 11228 11228 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_PF); 11229 const IEMOPBIN TODOSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT_EX(s_iemAImpl_lzcnt_eflags,11229 const IEMOPBINSIZES * const pImpl = IEMTARGETCPU_EFL_BEHAVIOR_SELECT_EX(s_iemAImpl_lzcnt_eflags, 11230 11230 IEM_GET_HOST_CPU_FEATURES(pVCpu)->fBmi1); 11231 11231 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 11232 IEMOP_BODY_BINARY_ TODO_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, lzcnt, 0);11232 IEMOP_BODY_BINARY_rv_rm(bRm, pImpl->pfnNormalU16, pImpl->pfnNormalU32, pImpl->pfnNormalU64, IEM_MC_F_NOT_286_OR_OLDER, lzcnt, 0); 11233 11233 } 11234 11234
Note:
See TracChangeset
for help on using the changeset viewer.