VirtualBox

Ignore:
Timestamp:
Oct 18, 2024 12:27:52 AM (4 months ago)
Author:
vboxsync
Message:

VMM/IEM: Added iemNativeEmitLoadGprWithGstReg[Ex]T and iemNativeEmitStoreGprToGstReg[Ex]T as better way of explictly loading & storing standard guest registers. bugref:10720

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h

    r106453 r106465  
    935935 */
    936936DECL_INLINE_THROW(uint32_t)
    937 iemNativeEmitStoreGprToVCpuU32Ex(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iGpr, uint32_t offVCpu)
     937iemNativeEmitStoreGprToVCpuU32Ex(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iGpr, uint32_t offVCpu,
     938                                 uint8_t iGprTmp = UINT8_MAX)
    938939{
    939940#ifdef RT_ARCH_AMD64
     
    943944    pCodeBuf[off++] = 0x89;
    944945    off = iemNativeEmitGprByVCpuDisp(pCodeBuf, off, iGpr, offVCpu);
    945 
    946 #elif defined(RT_ARCH_ARM64)
    947     off = iemNativeEmitGprByVCpuLdStEx(pCodeBuf, off, iGpr, offVCpu, kArmv8A64InstrLdStType_St_Word, sizeof(uint32_t));
     946    RT_NOREF(iGprTmp);
     947
     948#elif defined(RT_ARCH_ARM64)
     949    off = iemNativeEmitGprByVCpuLdStEx(pCodeBuf, off, iGpr, offVCpu, kArmv8A64InstrLdStType_St_Word, sizeof(uint32_t), iGprTmp);
    948950
    949951#else
     
    971973#elif defined(RT_ARCH_ARM64)
    972974    off = iemNativeEmitGprByVCpuLdSt(pReNative, off, iGpr, offVCpu, kArmv8A64InstrLdStType_St_Word, sizeof(uint32_t));
     975
     976#else
     977# error "port me"
     978#endif
     979    return off;
     980}
     981
     982
     983/**
     984 * Emits a store of a GPR value to a 16-bit VCpu field.
     985 *
     986 * @note Limited range on ARM64.
     987 */
     988DECL_INLINE_THROW(uint32_t)
     989iemNativeEmitStoreGprToVCpuU16Ex(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iGpr, uint32_t offVCpu,
     990                                 uint8_t iGprTmp = UINT8_MAX)
     991{
     992#ifdef RT_ARCH_AMD64
     993    /* mov mem16, reg16 */
     994    pCodeBuf[off++] = X86_OP_PRF_SIZE_OP;
     995    if (iGpr >= 8)
     996        pCodeBuf[off++] = X86_OP_REX_R;
     997    pCodeBuf[off++] = 0x89;
     998    off = iemNativeEmitGprByVCpuDisp(pCodeBuf, off, iGpr, offVCpu);
     999    RT_NOREF(iGprTmp);
     1000
     1001#elif defined(RT_ARCH_ARM64)
     1002    off = iemNativeEmitGprByVCpuLdStEx(pCodeBuf, off, iGpr, offVCpu, kArmv8A64InstrLdStType_St_Half, sizeof(uint16_t), iGprTmp);
    9731003
    9741004#else
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