VirtualBox

Changeset 103646 in vbox


Ignore:
Timestamp:
Mar 2, 2024 2:24:18 AM (11 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implemented iemNativeEmit_or_r_r_efl and enabled it for AMD64 hosts. bugref:10376

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

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

    r103645 r103646  
    939939    IEMOP_MNEMONIC2(MR, OR, or, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    940940    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    941     IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_or_u8, iemAImpl_or_u8_locked, or, 0, 0);
     941    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_or_u8, iemAImpl_or_u8_locked, or, RT_ARCH_VAL_AMD64, 0);
    942942}
    943943
     
    959959    IEMOP_MNEMONIC2(MR, OR, or, Ev, Gv, DISOPTYPE_HARMLESS, IEMOPHINT_LOCK_ALLOWED);
    960960    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    961     IEMOP_BODY_BINARY_rm_rv_RW(    iemAImpl_or_u16,        iemAImpl_or_u32,        iemAImpl_or_u64,       or, 0, 0);
     961    IEMOP_BODY_BINARY_rm_rv_RW(    iemAImpl_or_u16,        iemAImpl_or_u32,        iemAImpl_or_u64,       or, RT_ARCH_VAL_AMD64, 0);
    962962    IEMOP_BODY_BINARY_rm_rv_LOCKED(iemAImpl_or_u16_locked, iemAImpl_or_u32_locked, iemAImpl_or_u64_locked);
    963963}
     
    974974    IEMOP_MNEMONIC2(RM, OR, or, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    975975    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    976     IEMOP_BODY_BINARY_r8_rm(iemAImpl_or_u8, or, 0);
     976    IEMOP_BODY_BINARY_r8_rm(iemAImpl_or_u8, or, RT_ARCH_VAL_AMD64);
    977977}
    978978
     
    989989    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    990990    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    991     IEMOP_BODY_BINARY_rv_rm(bRm, iemAImpl_or_u16, iemAImpl_or_u32, iemAImpl_or_u64, 1, 0, or, 0);
     991    IEMOP_BODY_BINARY_rv_rm(bRm, iemAImpl_or_u16, iemAImpl_or_u32, iemAImpl_or_u64, 1, 0, or, RT_ARCH_VAL_AMD64);
    992992}
    993993
  • trunk/src/VBox/VMM/VMMAll/target-x86/IEMAllN8veEmit-x86.h

    r103645 r103646  
    201201                         uint8_t idxVarDst, uint8_t idxVarSrc, uint8_t idxVarEfl, uint8_t cOpBits)
    202202{
    203     RT_NOREF(idxVarDst, idxVarSrc, idxVarEfl, cOpBits);
    204     AssertFailed();
    205     return iemNativeEmitBrk(pReNative, off, 0x666);
     203    /*
     204     * The OR instruction will clear OF, CF and AF (latter is off undefined),
     205     * so we don't need the initial destination value.
     206     *
     207     * On AMD64 we must use the correctly sized OR instructions to get the
     208     * right EFLAGS.SF value, while the rest will just lump 16-bit and 8-bit
     209     * in the 32-bit ones.
     210     */
     211    uint8_t const idxRegDst = iemNativeVarRegisterAcquire(pReNative, idxVarDst, &off, true /*fInitialized*/);
     212    uint8_t const idxRegSrc = iemNativeVarRegisterAcquire(pReNative, idxVarSrc, &off, true /*fInitialized*/);
     213    //off = iemNativeEmitBrk(pReNative, off, 0x2222);
     214    switch (cOpBits)
     215    {
     216        case 32:
     217#ifndef RT_ARCH_AMD64
     218        case 16:
     219        case 8:
     220#endif
     221            off = iemNativeEmitOrGpr32ByGpr(pReNative, off, idxRegDst, idxRegSrc);
     222            break;
     223
     224        default: AssertFailed(); RT_FALL_THRU();
     225        case 64:
     226            off = iemNativeEmitOrGprByGpr(pReNative, off, idxRegDst, idxRegSrc);
     227            break;
     228
     229#ifdef RT_ARCH_AMD64
     230        case 16:
     231        {
     232            PIEMNATIVEINSTR pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1);
     233            pCodeBuf[off++] = X86_OP_PRF_SIZE_OP;
     234            off = iemNativeEmitOrGpr32ByGpr(pReNative, off, idxRegDst, idxRegSrc);
     235            break;
     236        }
     237
     238        case 8:
     239        {
     240            PIEMNATIVEINSTR pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 3);
     241            if (idxRegDst >= 8 || idxRegSrc >= 8)
     242                pCodeBuf[off++] = (idxRegDst >= 8 ? X86_OP_REX_R : 0) | (idxRegSrc >= 8 ? X86_OP_REX_B : 0);
     243            else if (idxRegDst >= 4 || idxRegSrc >= 4)
     244                pCodeBuf[off++] = X86_OP_REX;
     245            pCodeBuf[off++] = 0x0a;
     246            pCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, idxRegDst & 7, idxRegSrc & 7);
     247            IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off);
     248            break;
     249        }
     250#endif
     251    }
     252    iemNativeVarRegisterRelease(pReNative, idxVarSrc);
     253
     254    off = iemNativeEmitEFlagsForLogical(pReNative, off, idxVarEfl, cOpBits, idxRegDst);
     255    iemNativeVarRegisterRelease(pReNative, idxVarDst);
     256    return off;
    206257}
    207258
  • trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h

    r103622 r103646  
    43694369
    43704370/**
     4371 * Emits code for OR'ing two 64-bit GPRs.
     4372 */
     4373DECL_INLINE_THROW(uint32_t)
     4374iemNativeEmitOrGprByGpr(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t iGprDst, uint8_t iGprSrc)
     4375{
     4376#if defined(RT_ARCH_AMD64)
     4377    off = iemNativeEmitOrGprByGprEx(iemNativeInstrBufEnsure(pReNative, off, 3), off, iGprDst, iGprSrc);
     4378#elif defined(RT_ARCH_ARM64)
     4379    off = iemNativeEmitOrGprByGprEx(iemNativeInstrBufEnsure(pReNative, off, 1), off, iGprDst, iGprSrc);
     4380#else
     4381# error "Port me"
     4382#endif
     4383    IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off);
     4384    return off;
     4385}
     4386
     4387
     4388/**
    43714389 * Emits code for OR'ing two 32-bit GPRs.
    43724390 * @note Bits 63:32 of the destination GPR will be cleared.
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