Changeset 103556 in vbox for trunk/src/VBox
- Timestamp:
- Feb 24, 2024 11:04:39 AM (12 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r103267 r103556 4426 4426 IEMIMPL_MEDIA_OPT_F3 vpaddsb 4427 4427 IEMIMPL_MEDIA_OPT_F3 vpaddsw 4428 IEMIMPL_MEDIA_OPT_F3 vpermilps 4428 4429 4429 4430 ;; … … 5506 5507 5507 5508 ;; 5509 ; AVX instructions with 8-bit immediates of the form 5510 ; xxx {x,y}mm1, {x,y}mm2, imm8. 5511 ; where the instruction encoding takes up 6 bytes. 5512 ; 5513 ; @param 1 The instruction name. 5514 ; @param 2 Whether the instruction has a 128-bit variant (1) or not (0). 5515 ; @param 3 Whether the instruction has a 256-bit variant (1) or not (0). 5516 ; 5517 ; @param A0 Pointer to the destination media register size operand (output). 5518 ; @param A1 Pointer to the first source media register size operand (input). 5519 ; @param A2 The 8-bit immediate 5520 ; 5521 %macro IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP_6 3 5522 %if %2 == 1 5523 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _imm_u128, 16 5524 PROLOGUE_4_ARGS 5525 IEMIMPL_AVX_PROLOGUE 5526 5527 movzx A2, A2_8 ; must clear top bits 5528 movdqu xmm1, [A1] 5529 lea T1, [.imm0 xWrtRIP] 5530 %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK 5531 lea T0, [A2 + A2*2] ; sizeof(endbrxx+insnX+ret+int3) == 12: A2 * 12 = (A2 * 3) * 4 5532 lea T1, [T1 + T0*4] 5533 %else 5534 lea T1, [T1 + A2*8] ; sizeof(insnX+ret+int3) == 8: A2 * 8 5535 %endif 5536 IBT_NOTRACK 5537 call T1 5538 movdqu [A0], xmm0 5539 5540 IEMIMPL_AVX_EPILOGUE 5541 EPILOGUE_4_ARGS 5542 %assign bImm 0 5543 %rep 256 5544 .imm %+ bImm: 5545 IBT_ENDBRxx_WITHOUT_NOTRACK 5546 %1 xmm0, xmm1, bImm 5547 ret 5548 int3 5549 %assign bImm bImm + 1 5550 %endrep 5551 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800 5552 ENDPROC iemAImpl_ %+ %1 %+ _imm_u128 5553 %endif 5554 5555 %if %3 == 1 5556 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _imm_u256, 16 5557 PROLOGUE_4_ARGS 5558 IEMIMPL_AVX_PROLOGUE 5559 5560 movzx A2, A2_8 ; must clear top bits 5561 vmovdqu ymm1, [A1] 5562 lea T1, [.imm0 xWrtRIP] 5563 %ifdef RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK 5564 lea T0, [A2 + A2*2] ; sizeof(endbrxx+insnX+ret+int3) == 12: A2 * 12 = (A2 * 3) * 4 5565 lea T1, [T1 + T0*4] 5566 %else 5567 lea T1, [T1 + A2*8] ; sizeof(insnX+ret+int3) == 8: A2 * 8 5568 %endif 5569 IBT_NOTRACK 5570 call T1 5571 vmovdqu [A0], ymm0 5572 5573 IEMIMPL_AVX_EPILOGUE 5574 EPILOGUE_4_ARGS 5575 %assign bImm 0 5576 %rep 256 5577 .imm %+ bImm: 5578 IBT_ENDBRxx_WITHOUT_NOTRACK 5579 %1 ymm0, ymm1, bImm 5580 ret 5581 int3 5582 %assign bImm bImm + 1 5583 %endrep 5584 .immEnd: IEMCHECK_256_JUMP_ARRAY_SIZE (.immEnd - .imm0), 0x800 5585 ENDPROC iemAImpl_ %+ %1 %+ _imm_u256 5586 %endif 5587 %endmacro 5588 5589 IEMIMPL_MEDIA_AVX_INSN_IMM8_2OP_6 vpermilps, 1, 1 5590 5591 5592 ;; 5508 5593 ; Need to move this as well somewhere better? 5509 5594 ; -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r103361 r103556 16990 16990 16991 16991 16992 /** 16993 * VPERMILPS 16994 */ 16995 #ifdef IEM_WITHOUT_ASSEMBLY 16996 IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_imm_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t bEvil)) 16997 { 16998 RTUINT128U const uSrc = *puSrc; 16999 ASMCompilerBarrier(); 17000 17001 puDst->au32[0] = uSrc.au32[bEvil & 0x3]; 17002 puDst->au32[1] = uSrc.au32[(bEvil >> 2) & 0x3]; 17003 puDst->au32[2] = uSrc.au32[(bEvil >> 4) & 0x3]; 17004 puDst->au32[3] = uSrc.au32[(bEvil >> 6) & 0x3]; 17005 } 17006 17007 17008 IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_imm_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t bEvil)) 17009 { 17010 RTUINT256U const uSrc = *puSrc; 17011 ASMCompilerBarrier(); 17012 17013 puDst->au32[0] = uSrc.au32[bEvil & 0x3]; 17014 puDst->au32[1] = uSrc.au32[(bEvil >> 2) & 0x3]; 17015 puDst->au32[2] = uSrc.au32[(bEvil >> 4) & 0x3]; 17016 puDst->au32[3] = uSrc.au32[(bEvil >> 6) & 0x3]; 17017 17018 puDst->au32[4] = uSrc.au32[4 + (bEvil & 0x3)]; 17019 puDst->au32[5] = uSrc.au32[4 + ((bEvil >> 2) & 0x3)]; 17020 puDst->au32[6] = uSrc.au32[4 + ((bEvil >> 4) & 0x3)]; 17021 puDst->au32[7] = uSrc.au32[4 + ((bEvil >> 6) & 0x3)]; 17022 } 17023 17024 IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 17025 { 17026 RTUINT128U const uSrc1 = *puSrc1; 17027 RTUINT128U const uSrc2 = *puSrc2; 17028 ASMCompilerBarrier(); 17029 17030 puDst->au32[0] = uSrc1.au32[uSrc2.au8[0] & 0x3]; 17031 puDst->au32[1] = uSrc1.au32[uSrc2.au8[4] & 0x3]; 17032 puDst->au32[2] = uSrc1.au32[uSrc2.au8[8] & 0x3]; 17033 puDst->au32[3] = uSrc1.au32[uSrc2.au8[12] & 0x3]; 17034 } 17035 17036 IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_u256,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 17037 { 17038 RTUINT256U const uSrc1 = *puSrc1; 17039 RTUINT256U const uSrc2 = *puSrc2; 17040 ASMCompilerBarrier(); 17041 17042 puDst->au32[0] = uSrc1.au32[uSrc2.au8[0] & 0x3]; 17043 puDst->au32[1] = uSrc1.au32[uSrc2.au8[4] & 0x3]; 17044 puDst->au32[2] = uSrc1.au32[uSrc2.au8[8] & 0x3]; 17045 puDst->au32[3] = uSrc1.au32[uSrc2.au8[12] & 0x3]; 17046 17047 puDst->au32[4] = uSrc1.au32[4 + (uSrc2.au8[16] & 0x3)]; 17048 puDst->au32[5] = uSrc1.au32[4 + (uSrc2.au8[20] & 0x3)]; 17049 puDst->au32[6] = uSrc1.au32[4 + (uSrc2.au8[24] & 0x3)]; 17050 puDst->au32[7] = uSrc1.au32[4 + (uSrc2.au8[28] & 0x3)]; 17051 } 17052 #endif 17053 17054 17055 IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_imm_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t bEvil)) 17056 { 17057 RTUINT128U const uSrc = *puSrc; 17058 ASMCompilerBarrier(); 17059 17060 puDst->au32[0] = uSrc.au32[bEvil & 0x3]; 17061 puDst->au32[1] = uSrc.au32[(bEvil >> 2) & 0x3]; 17062 puDst->au32[2] = uSrc.au32[(bEvil >> 4) & 0x3]; 17063 puDst->au32[3] = uSrc.au32[(bEvil >> 6) & 0x3]; 17064 } 17065 17066 17067 IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_imm_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t bEvil)) 17068 { 17069 RTUINT256U const uSrc = *puSrc; 17070 ASMCompilerBarrier(); 17071 17072 puDst->au32[0] = uSrc.au32[bEvil & 0x3]; 17073 puDst->au32[1] = uSrc.au32[(bEvil >> 2) & 0x3]; 17074 puDst->au32[2] = uSrc.au32[(bEvil >> 4) & 0x3]; 17075 puDst->au32[3] = uSrc.au32[(bEvil >> 6) & 0x3]; 17076 17077 puDst->au32[4] = uSrc.au32[4 + (bEvil & 0x3)]; 17078 puDst->au32[5] = uSrc.au32[4 + ((bEvil >> 2) & 0x3)]; 17079 puDst->au32[6] = uSrc.au32[4 + ((bEvil >> 4) & 0x3)]; 17080 puDst->au32[7] = uSrc.au32[4 + ((bEvil >> 6) & 0x3)]; 17081 } 17082 17083 IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 17084 { 17085 RTUINT128U const uSrc1 = *puSrc1; 17086 RTUINT128U const uSrc2 = *puSrc2; 17087 ASMCompilerBarrier(); 17088 17089 puDst->au32[0] = uSrc1.au32[uSrc2.au8[0] & 0x3]; 17090 puDst->au32[1] = uSrc1.au32[uSrc2.au8[4] & 0x3]; 17091 puDst->au32[2] = uSrc1.au32[uSrc2.au8[8] & 0x3]; 17092 puDst->au32[3] = uSrc1.au32[uSrc2.au8[12] & 0x3]; 17093 } 17094 17095 IEM_DECL_IMPL_DEF(void, iemAImpl_vpermilps_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 17096 { 17097 RTUINT256U const uSrc1 = *puSrc1; 17098 RTUINT256U const uSrc2 = *puSrc2; 17099 ASMCompilerBarrier(); 17100 17101 puDst->au32[0] = uSrc1.au32[uSrc2.au8[0] & 0x3]; 17102 puDst->au32[1] = uSrc1.au32[uSrc2.au8[4] & 0x3]; 17103 puDst->au32[2] = uSrc1.au32[uSrc2.au8[8] & 0x3]; 17104 puDst->au32[3] = uSrc1.au32[uSrc2.au8[12] & 0x3]; 17105 17106 puDst->au32[4] = uSrc1.au32[4 + (uSrc2.au8[16] & 0x3)]; 17107 puDst->au32[5] = uSrc1.au32[4 + (uSrc2.au8[20] & 0x3)]; 17108 puDst->au32[6] = uSrc1.au32[4 + (uSrc2.au8[24] & 0x3)]; 17109 puDst->au32[7] = uSrc1.au32[4 + (uSrc2.au8[28] & 0x3)]; 17110 } 17111 17112 16992 17113 /* 16993 17114 * [V]PBLENDVB -
trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap2.cpp.h
r103256 r103556 179 179 180 180 /* Opcode VEX.0F38 0x0c - invalid. */ 181 /** Opcode VEX.66.0F38 0x0c. */ 182 FNIEMOP_STUB(iemOp_vpermilps_Vx_Hx_Wx); 181 182 183 /** Opcode VEX.66.0F38 0x0c. 184 * AVX,AVX */ 185 FNIEMOP_DEF(iemOp_vpermilps_Vx_Hx_Wx) 186 { 187 IEMOP_MNEMONIC3(VEX_RVM, VPERMILPS, vpermilps, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0); /* @todo */ 188 IEMOPMEDIAOPTF3_INIT_VARS(vpermilps); 189 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 190 } 191 192 183 193 /* Opcode VEX.0F38 0x0d - invalid. */ 184 194 /** Opcode VEX.66.0F38 0x0d. */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h
r103256 r103556 154 154 /** 155 155 * Common worker for AVX instructions on the forms: 156 * - vpermilps/d xmm0, xmm1/mem128, imm8 157 * - vpermilps/d ymm0, ymm1/mem256, imm8 158 * 159 * Takes function table for function w/o implicit state parameter. 160 * 161 * Exceptions type 4. AVX cpuid check for both 128-bit and 256-bit operation. 162 */ 163 FNIEMOP_DEF_1(iemOpCommonAvxAvx_Vx_Wx_Ib_Opt, PCIEMOPMEDIAOPTF2IMM8, pImpl) 164 { 165 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 166 if (IEM_IS_MODRM_REG_MODE(bRm)) 167 { 168 /* 169 * Register, register. 170 */ 171 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 172 if (pVCpu->iem.s.uVexLength) 173 { 174 IEM_MC_BEGIN(3, 2, IEM_MC_F_NOT_286_OR_OLDER, 0); 175 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 176 IEM_MC_LOCAL(RTUINT256U, uDst); 177 IEM_MC_LOCAL(RTUINT256U, uSrc); 178 IEM_MC_ARG_LOCAL_REF(PRTUINT256U, puDst, uDst, 0); 179 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc, uSrc, 1); 180 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 181 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 182 IEM_MC_PREPARE_AVX_USAGE(); 183 IEM_MC_FETCH_YREG_U256(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 184 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU256, puDst, puSrc, bImmArg); 185 IEM_MC_STORE_YREG_U256_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 186 IEM_MC_ADVANCE_RIP_AND_FINISH(); 187 IEM_MC_END(); 188 } 189 else 190 { 191 IEM_MC_BEGIN(3, 0, IEM_MC_F_NOT_286_OR_OLDER, 0); 192 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 193 IEM_MC_ARG(PRTUINT128U, puDst, 0); 194 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 195 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 196 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 197 IEM_MC_PREPARE_AVX_USAGE(); 198 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 199 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 200 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU128, puDst, puSrc, bImmArg); 201 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 202 IEM_MC_ADVANCE_RIP_AND_FINISH(); 203 IEM_MC_END(); 204 } 205 } 206 else 207 { 208 /* 209 * Register, memory. 210 */ 211 if (pVCpu->iem.s.uVexLength) 212 { 213 IEM_MC_BEGIN(3, 3, IEM_MC_F_NOT_286_OR_OLDER, 0); 214 IEM_MC_LOCAL(RTUINT256U, uDst); 215 IEM_MC_LOCAL(RTUINT256U, uSrc); 216 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 217 IEM_MC_ARG_LOCAL_REF(PRTUINT256U, puDst, uDst, 0); 218 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc, uSrc, 1); 219 220 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 221 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 222 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 223 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 224 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 225 IEM_MC_PREPARE_AVX_USAGE(); 226 227 IEM_MC_FETCH_MEM_U256_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 228 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU256, puDst, puSrc, bImmArg); 229 IEM_MC_STORE_YREG_U256_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 230 231 IEM_MC_ADVANCE_RIP_AND_FINISH(); 232 IEM_MC_END(); 233 } 234 else 235 { 236 IEM_MC_BEGIN(3, 2, IEM_MC_F_NOT_286_OR_OLDER, 0); 237 IEM_MC_LOCAL(RTUINT128U, uSrc); 238 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 239 IEM_MC_ARG(PRTUINT128U, puDst, 0); 240 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1); 241 242 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 243 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 244 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 245 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 246 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 247 IEM_MC_PREPARE_AVX_USAGE(); 248 249 IEM_MC_FETCH_MEM_U128_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 250 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 251 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU128, puDst, puSrc, bImmArg); 252 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 253 254 IEM_MC_ADVANCE_RIP_AND_FINISH(); 255 IEM_MC_END(); 256 } 257 } 258 } 259 260 261 /** 262 * Common worker for AVX instructions on the forms: 156 263 * - vblendps/d xmm0, xmm1, xmm2/mem128, imm8 157 264 * - vblendps/d ymm0, ymm1, ymm2/mem256, imm8 … … 276 383 FNIEMOP_STUB(iemOp_vpblendd_Vx_Wx_Ib); 277 384 /* Opcode VEX.66.0F3A 0x03 - invalid */ 278 /** Opcode VEX.66.0F3A 0x04. */ 279 FNIEMOP_STUB(iemOp_vpermilps_Vx_Wx_Ib); 385 386 387 /** Opcode VEX.66.0F3A 0x04. 388 * AVX,AVX */ 389 FNIEMOP_DEF(iemOp_vpermilps_Vx_Wx_Ib) 390 { 391 IEMOP_MNEMONIC3(VEX_RMI, VPERMILPS, vpermilps, Vx, Wx, Ib, DISOPTYPE_HARMLESS, 0); /* @todo */ 392 IEMOPMEDIAOPTF2IMM8_INIT_VARS(vpermilps); 393 return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Wx_Ib_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback)); 394 } 395 396 280 397 /** Opcode VEX.66.0F3A 0x05. */ 281 398 FNIEMOP_STUB(iemOp_vpermilpd_Vx_Wx_Ib); -
trunk/src/VBox/VMM/include/IEMInternal.h
r103554 r103556 3537 3537 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAOPTF2U128IMM8,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint8_t bEvil)); 3538 3538 typedef FNIEMAIMPLMEDIAOPTF2U128IMM8 *PFNIEMAIMPLMEDIAOPTF2U128IMM8; 3539 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAOPTF2U256IMM8,(PRTUINT256U puDst, PCRTUINT256U puSrc, uint8_t bEvil)); 3540 typedef FNIEMAIMPLMEDIAOPTF2U256IMM8 *PFNIEMAIMPLMEDIAOPTF2U256IMM8; 3539 3541 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAOPTF3U128IMM8,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2, uint8_t bEvil)); 3540 3542 typedef FNIEMAIMPLMEDIAOPTF3U128IMM8 *PFNIEMAIMPLMEDIAOPTF3U128IMM8; … … 3642 3644 FNIEMAIMPLMEDIAPSHUFU128 iemAImpl_vpsrlq_imm_u128, iemAImpl_vpsrlq_imm_u128_fallback; 3643 3645 FNIEMAIMPLMEDIAPSHUFU256 iemAImpl_vpsrlq_imm_u256, iemAImpl_vpsrlq_imm_u256_fallback; 3646 3647 FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpermilps_u128, iemAImpl_vpermilps_u128_fallback; 3648 FNIEMAIMPLMEDIAOPTF2U128IMM8 iemAImpl_vpermilps_imm_u128, iemAImpl_vpermilps_imm_u128_fallback; 3649 FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpermilps_u256, iemAImpl_vpermilps_u256_fallback; 3650 FNIEMAIMPLMEDIAOPTF2U256IMM8 iemAImpl_vpermilps_imm_u256, iemAImpl_vpermilps_imm_u256_fallback; 3644 3651 /** @} */ 3645 3652 … … 3942 3949 IEMOPMEDIAOPTF2_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_u128), RT_CONCAT3(iemAImpl_,a_InstrNm,_u256),\ 3943 3950 RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback), RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback)) 3951 3952 /** 3953 * Function table for media instruction taking one full sized media source 3954 * register and one full sized destination register and an 8-bit immediate, but no additional state 3955 * (AVX). 3956 */ 3957 typedef struct IEMOPMEDIAOPTF2IMM8 3958 { 3959 PFNIEMAIMPLMEDIAOPTF2U128IMM8 pfnU128; 3960 PFNIEMAIMPLMEDIAOPTF2U256IMM8 pfnU256; 3961 } IEMOPMEDIAOPTF2IMM8; 3962 /** Pointer to a media operation function table for 2 full sized ops (AVX). */ 3963 typedef IEMOPMEDIAOPTF2IMM8 const *PCIEMOPMEDIAOPTF2IMM8; 3964 3965 /** @def IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX 3966 * Declares a s_Host (x86 & amd64 only) and a s_Fallback variable with the 3967 * given functions as initializers. For use in AVX functions where a pair of 3968 * functions are only used once and the function table need not be public. */ 3969 #ifndef TST_IEM_CHECK_MC 3970 # if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY) 3971 # define IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX(a_pfnHostU128, a_pfnHostU256, a_pfnFallbackU128, a_pfnFallbackU256) \ 3972 static IEMOPMEDIAOPTF2IMM8 const s_Host = { a_pfnHostU128, a_pfnHostU256 }; \ 3973 static IEMOPMEDIAOPTF2IMM8 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 } 3974 # else 3975 # define IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) \ 3976 static IEMOPMEDIAOPTF2IMM8 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 } 3977 # endif 3978 #else 3979 # define IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) (void)0 3980 #endif 3981 /** @def IEMOPMEDIAOPTF2IMM8_INIT_VARS 3982 * Generate AVX function tables for the @a a_InstrNm instruction. 3983 * @sa IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX */ 3984 #define IEMOPMEDIAOPTF2IMM8_INIT_VARS(a_InstrNm) \ 3985 IEMOPMEDIAOPTF2IMM8_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_imm_u128), RT_CONCAT3(iemAImpl_,a_InstrNm,_imm_u256),\ 3986 RT_CONCAT3(iemAImpl_,a_InstrNm,_imm_u128_fallback), RT_CONCAT3(iemAImpl_,a_InstrNm,_imm_u256_fallback)) 3987 /** @} */ 3944 3988 3945 3989 /**
Note:
See TracChangeset
for help on using the changeset viewer.