VirtualBox

Ignore:
Timestamp:
Apr 11, 2024 12:28:26 PM (10 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement native emitters for psllw,pslld,psllq, bugref:10652

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/target-x86/IEMAllN8veEmit-x86.h

    r104292 r104294  
    20572057            uint8_t const idxSimdRegDst = iemNativeSimdRegAllocTmpForGuestSimdReg(pReNative, &off, IEMNATIVEGSTSIMDREG_SIMD(idxSimdGstRegDst), \
    20582058                                                                                  kIemNativeGstSimdRegLdStSz_Low128, kIemNativeGstRegUse_ForUpdate); \
    2059             PIEMNATIVEINSTR const pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 5); \
     2059            PIEMNATIVEINSTR const pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 6); \
    20602060            pCodeBuf[off++] = X86_OP_PRF_SIZE_OP; \
    20612061            if (idxSimdRegDst >= 8) \
     
    20972097IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(psrlq, 64, kArmv8InstrShiftSz_U64, 0x73);
    20982098
     2099
     2100/**
     2101 * Common emitter for the shift left with immediate instructions.
     2102 */
     2103#ifdef RT_ARCH_AMD64
     2104# define IEMNATIVE_NATIVE_EMIT_SHIFT_LEFT_IMM_U128(a_Instr, a_cShiftMax, a_ArmElemSz, a_bOpcX86) \
     2105    DECL_INLINE_THROW(uint32_t) \
     2106    RT_CONCAT3(iemNativeEmit_,a_Instr,_ri_u128)(PIEMRECOMPILERSTATE pReNative, uint32_t off, \
     2107                                                uint8_t const idxSimdGstRegDst, uint8_t const bImm) \
     2108    { \
     2109        if (bImm) \
     2110        { \
     2111            uint8_t const idxSimdRegDst = iemNativeSimdRegAllocTmpForGuestSimdReg(pReNative, &off, IEMNATIVEGSTSIMDREG_SIMD(idxSimdGstRegDst), \
     2112                                                                                  kIemNativeGstSimdRegLdStSz_Low128, kIemNativeGstRegUse_ForUpdate); \
     2113            PIEMNATIVEINSTR const pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 6); \
     2114            pCodeBuf[off++] = X86_OP_PRF_SIZE_OP; \
     2115            if (idxSimdRegDst >= 8) \
     2116                pCodeBuf[off++] = X86_OP_REX_B; \
     2117            pCodeBuf[off++] = 0x0f; \
     2118            pCodeBuf[off++] = (a_bOpcX86); \
     2119            pCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, 6, idxSimdRegDst & 7); \
     2120            pCodeBuf[off++] = bImm; \
     2121            iemNativeSimdRegFreeTmp(pReNative, idxSimdRegDst); \
     2122            IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); \
     2123        } \
     2124        /* Immediate 0 is a nop. */ \
     2125        return off; \
     2126    }
     2127#elif defined(RT_ARCH_ARM64)
     2128# define IEMNATIVE_NATIVE_EMIT_SHIFT_LEFT_IMM_U128(a_Instr, a_cShiftMax, a_ArmElemSz, a_bOpcX86) \
     2129    DECL_INLINE_THROW(uint32_t) \
     2130    RT_CONCAT3(iemNativeEmit_,a_Instr,_ri_u128)(PIEMRECOMPILERSTATE pReNative, uint32_t off, \
     2131                                                uint8_t const idxSimdGstRegDst, uint8_t const bImm) \
     2132    { \
     2133        if (bImm) /* bImm == 0 is a nop */ \
     2134        { \
     2135            uint8_t const idxSimdRegDst = iemNativeSimdRegAllocTmpForGuestSimdReg(pReNative, &off, IEMNATIVEGSTSIMDREG_SIMD(idxSimdGstRegDst), \
     2136                                                                                  kIemNativeGstSimdRegLdStSz_Low128, kIemNativeGstRegUse_ForUpdate); \
     2137            PIEMNATIVEINSTR const pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1); \
     2138            if (bImm < (a_cShiftMax)) \
     2139                pCodeBuf[off++] = Armv8A64MkVecInstrShlImm(idxSimdRegDst, idxSimdRegDst, bImm, (a_ArmElemSz)); \
     2140            else /* Everything >= a_cShiftMax sets the register to zero. */ \
     2141                pCodeBuf[off++] = Armv8A64MkVecInstrEor(idxSimdRegDst, idxSimdRegDst, idxSimdRegDst); \
     2142            iemNativeSimdRegFreeTmp(pReNative, idxSimdRegDst); \
     2143            IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); \
     2144        } \
     2145        return off; \
     2146    }
     2147#else
     2148# error "Port me"
     2149#endif
     2150
     2151IEMNATIVE_NATIVE_EMIT_SHIFT_LEFT_IMM_U128(psllw, 16, kArmv8InstrShiftSz_U16, 0x71);
     2152IEMNATIVE_NATIVE_EMIT_SHIFT_LEFT_IMM_U128(pslld, 32, kArmv8InstrShiftSz_U32, 0x72);
     2153IEMNATIVE_NATIVE_EMIT_SHIFT_LEFT_IMM_U128(psllq, 64, kArmv8InstrShiftSz_U64, 0x73);
     2154
    20992155#endif
    21002156
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