VirtualBox

Ignore:
Timestamp:
Feb 29, 2024 1:01:56 PM (9 months ago)
Author:
vboxsync
Message:

VMM/IEM: Experimental code for emitting native code instead of calling AImpl helper, experimenting on: xor reg32,reg32. bugref:10376

File:
1 edited

Legend:

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

    r103590 r103613  
    15441544        }
    15451545    }
    1546     IEMOP_BODY_BINARY_rv_rm(bRm, iemAImpl_xor_u16, iemAImpl_xor_u32, iemAImpl_xor_u64, 1, 0);
     1546
     1547    //I E M OP_BODY_BINARY_rv_rm(bRm, iemAImpl_xor_u16, iemAImpl_xor_u32, iemAImpl_xor_u64, 1, 0); - restore later.
     1548    /*
     1549     * START TEMP EXPERIMENTAL CODE
     1550     */
     1551    if (IEM_IS_MODRM_REG_MODE(bRm))
     1552    {
     1553        switch (pVCpu->iem.s.enmEffOpSize)
     1554        {
     1555            case IEMMODE_16BIT:
     1556                IEM_MC_BEGIN(3, 0, 0, 0);
     1557                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1558                IEM_MC_ARG(uint16_t *, pu16Dst, 0);
     1559                IEM_MC_ARG(uint16_t,   u16Src,  1);
     1560                IEM_MC_ARG(uint32_t *, pEFlags, 2);
     1561                IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     1562                IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1563                IEM_MC_REF_EFLAGS(pEFlags);
     1564                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u16, pu16Dst, u16Src, pEFlags);
     1565                IEM_MC_ADVANCE_RIP_AND_FINISH();
     1566                IEM_MC_END();
     1567                break;
     1568
     1569            case IEMMODE_32BIT:
     1570                IEM_MC_BEGIN(3, 0, IEM_MC_F_MIN_386, 0);
     1571                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1572                IEM_MC_ARG(uint32_t,   u32Src,  1);
     1573                IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     1574                IEM_MC_NATIVE_IF(RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64) {
     1575                    IEM_MC_LOCAL(uint32_t, u32Dst);
     1576                    IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1577                    /// @todo IEM_MC_LOCAL_EFLAGS(uEFlags);
     1578                    IEM_MC_LOCAL(uint32_t, uEFlags);
     1579                    IEM_MC_FETCH_EFLAGS(uEFlags);
     1580                    IEM_MC_NATIVE_EMIT_4(iemNativeEmit_xor_r_r_efl, u32Dst, u32Src, uEFlags, 32);
     1581                    IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Dst);
     1582                    IEM_MC_COMMIT_EFLAGS(uEFlags);
     1583                } IEM_MC_NATIVE_ELSE() {
     1584                    IEM_MC_ARG(uint32_t *, pu32Dst, 0);
     1585                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1586                    IEM_MC_ARG(uint32_t *, pEFlags, 2);
     1587                    IEM_MC_REF_EFLAGS(pEFlags);
     1588                    IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u32, pu32Dst, u32Src, pEFlags);
     1589                    IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm));
     1590                } IEM_MC_NATIVE_ENDIF();
     1591                IEM_MC_ADVANCE_RIP_AND_FINISH();
     1592                IEM_MC_END();
     1593                break;
     1594
     1595            case IEMMODE_64BIT:
     1596                IEM_MC_BEGIN(3, 0, IEM_MC_F_64BIT, 0);
     1597                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1598                IEM_MC_ARG(uint64_t *, pu64Dst, 0);
     1599                IEM_MC_ARG(uint64_t,   u64Src,  1);
     1600                IEM_MC_ARG(uint32_t *, pEFlags, 2);
     1601
     1602                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     1603                IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1604                IEM_MC_REF_EFLAGS(pEFlags);
     1605                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u64, pu64Dst, u64Src, pEFlags);
     1606
     1607                IEM_MC_ADVANCE_RIP_AND_FINISH();
     1608                IEM_MC_END();
     1609                break;
     1610
     1611            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     1612        }
     1613    }
     1614    else
     1615    {
     1616        /*
     1617         * We're accessing memory.
     1618         */
     1619        switch (pVCpu->iem.s.enmEffOpSize)
     1620        {
     1621            case IEMMODE_16BIT:
     1622                IEM_MC_BEGIN(3, 1, 0, 0);
     1623                IEM_MC_ARG(uint16_t *, pu16Dst, 0);
     1624                IEM_MC_ARG(uint16_t,   u16Src,  1);
     1625                IEM_MC_ARG(uint32_t *, pEFlags, 2);
     1626                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst);
     1627
     1628                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     1629                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1630                IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     1631                IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1632                IEM_MC_REF_EFLAGS(pEFlags);
     1633                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u16, pu16Dst, u16Src, pEFlags);
     1634
     1635                IEM_MC_ADVANCE_RIP_AND_FINISH();
     1636                IEM_MC_END();
     1637                break;
     1638
     1639            case IEMMODE_32BIT:
     1640                IEM_MC_BEGIN(3, 1, IEM_MC_F_MIN_386, 0);
     1641                IEM_MC_ARG(uint32_t *, pu32Dst, 0);
     1642                IEM_MC_ARG(uint32_t,   u32Src,  1);
     1643                IEM_MC_ARG(uint32_t *, pEFlags, 2);
     1644                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst);
     1645
     1646                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     1647                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1648                IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     1649                IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1650                IEM_MC_REF_EFLAGS(pEFlags);
     1651                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u32, pu32Dst, u32Src, pEFlags);
     1652
     1653                IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm));
     1654                IEM_MC_ADVANCE_RIP_AND_FINISH();
     1655                IEM_MC_END();
     1656                break;
     1657
     1658            case IEMMODE_64BIT:
     1659                IEM_MC_BEGIN(3, 1, IEM_MC_F_64BIT, 0);
     1660                IEM_MC_ARG(uint64_t *, pu64Dst, 0);
     1661                IEM_MC_ARG(uint64_t,   u64Src,  1);
     1662                IEM_MC_ARG(uint32_t *, pEFlags, 2);
     1663                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst);
     1664
     1665                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     1666                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1667                IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     1668                IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1669                IEM_MC_REF_EFLAGS(pEFlags);
     1670                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u64, pu64Dst, u64Src, pEFlags);
     1671
     1672                IEM_MC_ADVANCE_RIP_AND_FINISH();
     1673                IEM_MC_END();
     1674                break;
     1675
     1676            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     1677        }
     1678    }
     1679    /* END TEMP EXPERIMENTAL CODE */
    15471680}
    15481681
Note: See TracChangeset for help on using the changeset viewer.

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