Changeset 104292 in vbox for trunk/src/VBox/VMM/VMMAll/target-x86
- Timestamp:
- Apr 11, 2024 10:21:57 AM (10 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/target-x86/IEMAllN8veEmit-x86.h
r104279 r104292 2042 2042 return off; 2043 2043 } 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 2095 IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(psrlw, 16, kArmv8InstrShiftSz_U16, 0x71); 2096 IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(psrld, 32, kArmv8InstrShiftSz_U32, 0x72); 2097 IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(psrlq, 64, kArmv8InstrShiftSz_U64, 0x73); 2098 2044 2099 #endif 2045 2100
Note:
See TracChangeset
for help on using the changeset viewer.