VirtualBox

Changeset 62092 in vbox


Ignore:
Timestamp:
Jul 7, 2016 12:41:23 AM (8 years ago)
Author:
vboxsync
Message:

IEM: Saved 1K (except 32-bit) by doing full+unaligned imm16, imme32 and imm64 loads instead of byte by byte.

File:
1 edited

Legend:

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

    r62091 r62092  
    348348 */
    349349#define IEM_IS_CANONICAL(a_u64Addr)         X86_IS_CANONICAL(a_u64Addr)
     350
     351/** @def IEM_USE_UNALIGNED_DATA_ACCESS
     352 * Use unaligned accesses instead of elaborate byte assembly. */
     353#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86) || defined(DOXYGEN_RUNNING)
     354# define IEM_USE_UNALIGNED_DATA_ACCESS
     355#endif
    350356
    351357
     
    17071713    {
    17081714        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     1715# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     1716        *pu16 = (uint16_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     1717# else
    17091718        *pu16 = RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1719# endif
    17101720        pVCpu->iem.s.offOpcode = offOpcode + 2;
    17111721    }
     
    17291739    {
    17301740        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 2;
     1741# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     1742        *pu16 = (uint16_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     1743# else
    17311744        *pu16 = RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1745# endif
    17321746        return VINF_SUCCESS;
    17331747    }
     
    17501764        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
    17511765        pVCpu->iem.s.offOpcode += 2;
     1766# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     1767        return *(uint16_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     1768# else
    17521769        return RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1770# endif
    17531771    }
    17541772    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     
    17681786    {
    17691787        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 2;
     1788# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     1789        return *(uint16_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     1790# else
    17701791        return RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1792# endif
    17711793    }
    17721794    return iemOpcodeGetNextU16SlowJmp(pVCpu);
     
    19711993    {
    19721994        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     1995# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     1996        *pu32 = *(uint32_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     1997# else
    19731998        *pu32 = RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    19741999                                    pVCpu->iem.s.abOpcode[offOpcode + 1],
    19752000                                    pVCpu->iem.s.abOpcode[offOpcode + 2],
    19762001                                    pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2002# endif
    19772003        pVCpu->iem.s.offOpcode = offOpcode + 4;
    19782004    }
     
    19962022    {
    19972023        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 4;
     2024# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2025        *pu32 = *(uint32_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     2026# else
    19982027        *pu32 = RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    19992028                                    pVCpu->iem.s.abOpcode[offOpcode + 1],
    20002029                                    pVCpu->iem.s.abOpcode[offOpcode + 2],
    20012030                                    pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2031# endif
    20022032        return VINF_SUCCESS;
    20032033    }
     
    20202050        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
    20212051        pVCpu->iem.s.offOpcode = offOpcode + 4;
     2052# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2053        return *(uint32_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     2054# else
    20222055        return RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    20232056                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
    20242057                                   pVCpu->iem.s.abOpcode[offOpcode + 2],
    20252058                                   pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2059# endif
    20262060    }
    20272061    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     
    20412075    {
    20422076        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 4;
     2077# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2078        return *(uint32_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     2079# else
    20432080        return RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    20442081                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
    20452082                                   pVCpu->iem.s.abOpcode[offOpcode + 2],
    20462083                                   pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2084# endif
    20472085    }
    20482086    return iemOpcodeGetNextU32SlowJmp(pVCpu);
     
    22602298    {
    22612299        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     2300# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2301        *pu64 = *(uint64_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     2302# else
    22622303        *pu64 = RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    22632304                                    pVCpu->iem.s.abOpcode[offOpcode + 1],
     
    22682309                                    pVCpu->iem.s.abOpcode[offOpcode + 6],
    22692310                                    pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2311# endif
    22702312        pVCpu->iem.s.offOpcode = offOpcode + 8;
    22712313    }
     
    22882330    if (RT_LIKELY((uint8_t)offOpcode + 8 <= pVCpu->iem.s.cbOpcode))
    22892331    {
     2332# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2333        *pu64 = *(uint64_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     2334# else
    22902335        *pu64 = RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    22912336                                    pVCpu->iem.s.abOpcode[offOpcode + 1],
     
    22962341                                    pVCpu->iem.s.abOpcode[offOpcode + 6],
    22972342                                    pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2343# endif
    22982344        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 8;
    22992345        return VINF_SUCCESS;
     
    23172363        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
    23182364        pVCpu->iem.s.offOpcode = offOpcode + 8;
     2365# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2366        return *(uint64_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     2367# else
    23192368        return RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    23202369                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
     
    23252374                                   pVCpu->iem.s.abOpcode[offOpcode + 6],
    23262375                                   pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2376# endif
    23272377    }
    23282378    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     
    23422392    {
    23432393        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 8;
     2394# ifdef IEM_USE_UNALIGNED_DATA_ACCESS
     2395        return *(uint64_t const *)&pVCpu->iem.s.abOpcode[offOpcode];
     2396# else
    23442397        return RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
    23452398                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
     
    23502403                                   pVCpu->iem.s.abOpcode[offOpcode + 6],
    23512404                                   pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2405# endif
    23522406    }
    23532407    return iemOpcodeGetNextU64SlowJmp(pVCpu);
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