VirtualBox

Changeset 104292 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Apr 11, 2024 10:21:57 AM (10 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement native emitters for psrlw,psrld,psrlq, bugref:10652

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

Legend:

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

    r104288 r104292  
    65806580{
    65816581//    IEMOP_MNEMONIC2(RI, PSRLW, psrlw, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_SSE, 0);
    6582     SSE2_SHIFT_BODY_Imm(psrlw, bRm, 0);
     6582    SSE2_SHIFT_BODY_Imm(psrlw, bRm, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64);
    65836583}
    65846584
     
    66576657{
    66586658//    IEMOP_MNEMONIC2(RI, PSRLD, psrld, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_SSE, 0);
    6659     SSE2_SHIFT_BODY_Imm(psrld, bRm, 0);
     6659    SSE2_SHIFT_BODY_Imm(psrld, bRm, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64);
    66606660}
    66616661
     
    67326732{
    67336733//    IEMOP_MNEMONIC2(RI, PSRLQ, psrlq, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_SSE, 0);
    6734     SSE2_SHIFT_BODY_Imm(psrlq, bRm, 0);
     6734    SSE2_SHIFT_BODY_Imm(psrlq, bRm, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64);
    67356735}
    67366736
  • trunk/src/VBox/VMM/VMMAll/target-x86/IEMAllN8veEmit-x86.h

    r104279 r104292  
    20422042    return off;
    20432043}
     2044
     2045
     2046/**
     2047 * Common emitter for the shift right with immediate instructions.
     2048 */
     2049#ifdef RT_ARCH_AMD64
     2050# define IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(a_Instr, a_cShiftMax, a_ArmElemSz, a_bOpcX86) \
     2051    DECL_INLINE_THROW(uint32_t) \
     2052    RT_CONCAT3(iemNativeEmit_,a_Instr,_ri_u128)(PIEMRECOMPILERSTATE pReNative, uint32_t off, \
     2053                                                uint8_t const idxSimdGstRegDst, uint8_t const bImm) \
     2054    { \
     2055        if (bImm) \
     2056        { \
     2057            uint8_t const idxSimdRegDst = iemNativeSimdRegAllocTmpForGuestSimdReg(pReNative, &off, IEMNATIVEGSTSIMDREG_SIMD(idxSimdGstRegDst), \
     2058                                                                                  kIemNativeGstSimdRegLdStSz_Low128, kIemNativeGstRegUse_ForUpdate); \
     2059            PIEMNATIVEINSTR const pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 5); \
     2060            pCodeBuf[off++] = X86_OP_PRF_SIZE_OP; \
     2061            if (idxSimdRegDst >= 8) \
     2062                pCodeBuf[off++] = X86_OP_REX_B; \
     2063            pCodeBuf[off++] = 0x0f; \
     2064            pCodeBuf[off++] = (a_bOpcX86); \
     2065            pCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, 2, idxSimdRegDst & 7); \
     2066            pCodeBuf[off++] = bImm; \
     2067            iemNativeSimdRegFreeTmp(pReNative, idxSimdRegDst); \
     2068            IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); \
     2069        } \
     2070        /* Immediate 0 is a nop. */ \
     2071        return off; \
     2072    }
     2073#elif defined(RT_ARCH_ARM64)
     2074# define IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(a_Instr, a_cShiftMax, a_ArmElemSz, a_bOpcX86) \
     2075    DECL_INLINE_THROW(uint32_t) \
     2076    RT_CONCAT3(iemNativeEmit_,a_Instr,_ri_u128)(PIEMRECOMPILERSTATE pReNative, uint32_t off, \
     2077                                                uint8_t const idxSimdGstRegDst, uint8_t const bImm) \
     2078    { \
     2079        if (bImm) \
     2080        { \
     2081            uint8_t const idxSimdRegDst = iemNativeSimdRegAllocTmpForGuestSimdReg(pReNative, &off, IEMNATIVEGSTSIMDREG_SIMD(idxSimdGstRegDst), \
     2082                                                                                  kIemNativeGstSimdRegLdStSz_Low128, kIemNativeGstRegUse_ForUpdate); \
     2083            PIEMNATIVEINSTR const pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1); \
     2084            pCodeBuf[off++] = Armv8A64MkVecInstrShrImm(idxSimdRegDst, idxSimdRegDst, RT_MIN(bImm, (a_cShiftMax)), (a_ArmElemSz)); \
     2085            iemNativeSimdRegFreeTmp(pReNative, idxSimdRegDst); \
     2086            IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); \
     2087        } \
     2088        /* Immediate 0 is a nop. */ \
     2089        return off; \
     2090    }
     2091#else
     2092# error "Port me"
     2093#endif
     2094
     2095IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(psrlw, 16, kArmv8InstrShiftSz_U16, 0x71);
     2096IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(psrld, 32, kArmv8InstrShiftSz_U32, 0x72);
     2097IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(psrlq, 64, kArmv8InstrShiftSz_U64, 0x73);
     2098
    20442099#endif
    20452100
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