VirtualBox

Changeset 103635 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 1, 2024 2:43:15 PM (11 months ago)
Author:
vboxsync
Message:

VMM/IEM: Emit native code for 64-bit and 16-bit xor reg/reg variants as well. bugref:10376

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r103613 r103635  
    15561556                IEM_MC_BEGIN(3, 0, 0, 0);
    15571557                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1558                 IEM_MC_ARG(uint16_t *, pu16Dst, 0);
    15591558                IEM_MC_ARG(uint16_t,   u16Src,  1);
    1560                 IEM_MC_ARG(uint32_t *, pEFlags, 2);
    15611559                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);
     1560                IEM_MC_NATIVE_IF(RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64) {
     1561                    IEM_MC_LOCAL(uint16_t, u16Dst);
     1562                    IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1563                    /// @todo IEM_MC_LOCAL_EFLAGS(uEFlags);
     1564                    IEM_MC_LOCAL(uint32_t, uEFlags);
     1565                    IEM_MC_FETCH_EFLAGS(uEFlags);
     1566                    IEM_MC_NATIVE_EMIT_4(iemNativeEmit_xor_r_r_efl, u16Dst, u16Src, uEFlags, 16);
     1567                    IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst);
     1568                    IEM_MC_COMMIT_EFLAGS(uEFlags);
     1569                } IEM_MC_NATIVE_ELSE() {
     1570                    IEM_MC_ARG(uint16_t *, pu16Dst, 0);
     1571                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1572                    IEM_MC_ARG(uint32_t *, pEFlags, 2);
     1573                    IEM_MC_REF_EFLAGS(pEFlags);
     1574                    IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u16, pu16Dst, u16Src, pEFlags);
     1575                } IEM_MC_NATIVE_ENDIF();
    15651576                IEM_MC_ADVANCE_RIP_AND_FINISH();
    15661577                IEM_MC_END();
     
    15961607                IEM_MC_BEGIN(3, 0, IEM_MC_F_64BIT, 0);
    15971608                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1598                 IEM_MC_ARG(uint64_t *, pu64Dst, 0);
    15991609                IEM_MC_ARG(uint64_t,   u64Src,  1);
    1600                 IEM_MC_ARG(uint32_t *, pEFlags, 2);
    1601 
    16021610                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 
     1611                IEM_MC_NATIVE_IF(RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64) {
     1612                    IEM_MC_LOCAL(uint64_t, u64Dst);
     1613                    IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1614                    /// @todo IEM_MC_LOCAL_EFLAGS(uEFlags);
     1615                    IEM_MC_LOCAL(uint32_t, uEFlags);
     1616                    IEM_MC_FETCH_EFLAGS(uEFlags);
     1617                    IEM_MC_NATIVE_EMIT_4(iemNativeEmit_xor_r_r_efl, u64Dst, u64Src, uEFlags, 64);
     1618                    IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Dst);
     1619                    IEM_MC_COMMIT_EFLAGS(uEFlags);
     1620                } IEM_MC_NATIVE_ELSE() {
     1621                    IEM_MC_ARG(uint64_t *, pu64Dst, 0);
     1622                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     1623                    IEM_MC_ARG(uint32_t *, pEFlags, 2);
     1624                    IEM_MC_REF_EFLAGS(pEFlags);
     1625                    IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u64, pu64Dst, u64Src, pEFlags);
     1626                } IEM_MC_NATIVE_ENDIF();
    16071627                IEM_MC_ADVANCE_RIP_AND_FINISH();
    16081628                IEM_MC_END();
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp

    r103627 r103635  
    62466246        else
    62476247            off = iemNativeEmitCmpGpr32WithGprEx(pCodeBuf, off, idxRegResult, ARMV8_A64_REG_XZR);
    6248 # if 0
    6249         off = iemNativeEmitLoadGpr32ImmEx(pCodeBuf, off, idxTmpReg, X86_EFL_ZF);
    6250         pCodeBuf[off++] = Armv8A64MkInstrCSel(idxTmpReg, idxTmpReg, ARMV8_A64_REG_XZR, kArmv8InstrCond_Eq, false /*f64Bit*/);
    6251         pCodeBuf[off++] = Armv8A64MkInstrOrr(idxRegEfl, idxRegEfl, idxTmpReg, false /*f64Bit*/);
    6252 # else
    62536248        pCodeBuf[off++] = Armv8A64MkInstrCSet(idxTmpReg, kArmv8InstrCond_Eq, false /*f64Bit*/);
    62546249        pCodeBuf[off++] = Armv8A64MkInstrOrr(idxRegEfl, idxRegEfl, idxTmpReg, false /*f64Bit*/, X86_EFL_ZF_BIT);
    6255 # endif
    62566250
    62576251        /* Calculate signed: We could use the native SF flag, but it's just as simple to calculate it by shifting. */
    62586252        pCodeBuf[off++] = Armv8A64MkInstrLsrImm(idxTmpReg, idxRegResult, cOpBits - 1, cOpBits > 32 /*f64Bit*/);
     6253# if 0 /* BFI and ORR hsould have the same performance characteristics, so use BFI like we'll have to do for SUB/ADD/++. */
    62596254        pCodeBuf[off++] = Armv8A64MkInstrOrr(idxRegEfl, idxRegEfl, idxTmpReg, false /*f64Bit*/, X86_EFL_SF_BIT);
     6255# else
     6256        pCodeBuf[off++] = Armv8A64MkInstrBfi(idxRegEfl, idxTmpReg, X86_EFL_SF_BIT, 1, false /*f64Bit*/);
     6257# endif
    62606258
    62616259        /* Calculate 8-bit parity of the result. */
     
    62886286     * The XOR instruction will clear OF, CF and AF (latter is off undefined),
    62896287     * so we don't need the initial destination value.
     6288     *
     6289     * On AMD64 we must use the correctly sizeed XOR instructions to get the
     6290     * right EFLAGS.SF value, while the rest will just lump 16-bit and 8-bit
     6291     * in the 32-bit ones.
    62906292     */
    62916293    uint8_t const idxRegDst = iemNativeVarRegisterAcquire(pReNative, idxVarDst, &off, true /*fInitialized*/);
    62926294    uint8_t const idxRegSrc = iemNativeVarRegisterAcquire(pReNative, idxVarSrc, &off, true /*fInitialized*/);
    62936295    //off = iemNativeEmitBrk(pReNative, off, 0x2222);
    6294     if (cOpBits > 32)
    6295         off = iemNativeEmitXorGprByGpr(pReNative, off, idxRegDst, idxRegSrc);
    6296     else
    6297         off = iemNativeEmitXorGpr32ByGpr32(pReNative, off, idxRegDst, idxRegSrc);
     6296    switch (cOpBits)
     6297    {
     6298        case 32:
     6299#ifndef RT_ARCH_AMD64
     6300        case 16:
     6301        case 8:
     6302#endif
     6303            off = iemNativeEmitXorGpr32ByGpr32(pReNative, off, idxRegDst, idxRegSrc);
     6304            break;
     6305
     6306        default: AssertFailed(); RT_FALL_THRU();
     6307        case 64:
     6308            off = iemNativeEmitXorGprByGpr(pReNative, off, idxRegDst, idxRegSrc);
     6309            break;
     6310
     6311#ifdef RT_ARCH_AMD64
     6312        case 16:
     6313        {
     6314            PIEMNATIVEINSTR pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1);
     6315            pCodeBuf[off++] = X86_OP_PRF_SIZE_OP;
     6316            off = iemNativeEmitXorGpr32ByGpr32(pReNative, off, idxRegDst, idxRegSrc);
     6317            break;
     6318        }
     6319
     6320        case 8:
     6321        {
     6322            PIEMNATIVEINSTR pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 3);
     6323            if (idxRegDst >= 8 || idxRegSrc >= 8)
     6324                pCodeBuf[off++] = (idxRegDst >= 8 ? X86_OP_REX_R : 0) | (idxRegSrc >= 8 ? X86_OP_REX_B : 0);
     6325            else if (idxRegDst >= 4 || idxRegSrc >= 4)
     6326                pCodeBuf[off++] = X86_OP_REX;
     6327            pCodeBuf[off++] = 0x32;
     6328            pCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, idxRegDst & 7, idxRegSrc & 7);
     6329            IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off);
     6330            break;
     6331        }
     6332#endif
     6333    }
    62986334    iemNativeVarRegisterRelease(pReNative, idxVarSrc);
    62996335
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