VirtualBox

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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