Changeset 104294 in vbox for trunk/src/VBox/VMM/VMMAll/target-x86
- Timestamp:
- Apr 11, 2024 12:28:26 PM (10 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/target-x86/IEMAllN8veEmit-x86.h
r104292 r104294 2057 2057 uint8_t const idxSimdRegDst = iemNativeSimdRegAllocTmpForGuestSimdReg(pReNative, &off, IEMNATIVEGSTSIMDREG_SIMD(idxSimdGstRegDst), \ 2058 2058 kIemNativeGstSimdRegLdStSz_Low128, kIemNativeGstRegUse_ForUpdate); \ 2059 PIEMNATIVEINSTR const pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 5); \2059 PIEMNATIVEINSTR const pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 6); \ 2060 2060 pCodeBuf[off++] = X86_OP_PRF_SIZE_OP; \ 2061 2061 if (idxSimdRegDst >= 8) \ … … 2097 2097 IEMNATIVE_NATIVE_EMIT_SHIFT_RIGHT_IMM_U128(psrlq, 64, kArmv8InstrShiftSz_U64, 0x73); 2098 2098 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 2151 IEMNATIVE_NATIVE_EMIT_SHIFT_LEFT_IMM_U128(psllw, 16, kArmv8InstrShiftSz_U16, 0x71); 2152 IEMNATIVE_NATIVE_EMIT_SHIFT_LEFT_IMM_U128(pslld, 32, kArmv8InstrShiftSz_U32, 0x72); 2153 IEMNATIVE_NATIVE_EMIT_SHIFT_LEFT_IMM_U128(psllq, 64, kArmv8InstrShiftSz_U64, 0x73); 2154 2099 2155 #endif 2100 2156
Note:
See TracChangeset
for help on using the changeset viewer.