Changeset 96707 in vbox
- Timestamp:
- Sep 12, 2022 4:57:18 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 153591
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r96701 r96707 5337 5337 dw 0x105ff - (.immEnd - .imm0) ; will cause warning if entries are too small. 5338 5338 ENDPROC iemAImpl_vpinsrw_u128 5339 5340 5341 ;; 5342 ; pextrw instruction. 5343 ; 5344 ; @param A0 Pointer to the 16bit output operand (output). 5345 ; @param A1 Pointer to the media register size operand (input). 5346 ; @param A2 The 8-bit immediate 5347 ; 5348 BEGINPROC_FASTCALL iemAImpl_pextrw_u64, 16 5349 PROLOGUE_3_ARGS 5350 IEMIMPL_SSE_PROLOGUE 5351 5352 movq mm0, A1 5353 lea T0, [A2 + A2*4] ; sizeof(pextrw+ret) == 5 5354 lea T1, [.imm0 xWrtRIP] 5355 lea T1, [T1 + T0] 5356 call T1 5357 mov word [A0], T0_16 5358 5359 IEMIMPL_SSE_EPILOGUE 5360 EPILOGUE_3_ARGS 5361 %assign bImm 0 5362 %rep 256 5363 .imm %+ bImm: 5364 pextrw T0_32, mm0, bImm 5365 ret 5366 %assign bImm bImm + 1 5367 %endrep 5368 .immEnd: ; 256*5 == 0x500 5369 dw 0xfaff + (.immEnd - .imm0) ; will cause warning if entries are too big. 5370 dw 0x104ff - (.immEnd - .imm0) ; will cause warning if entries are too small. 5371 ENDPROC iemAImpl_pextrw_u64 5372 5373 BEGINPROC_FASTCALL iemAImpl_pextrw_u128, 16 5374 PROLOGUE_3_ARGS 5375 IEMIMPL_SSE_PROLOGUE 5376 5377 movdqu xmm0, [A1] 5378 lea T1, [.imm0 xWrtRIP] 5379 lea T0, [A2 + A2*2] ; sizeof(pextrw+ret) == 6: (A2 * 3) *2 5380 lea T1, [T1 + T0*2] 5381 call T1 5382 mov word [A0], T0_16 5383 5384 IEMIMPL_SSE_EPILOGUE 5385 EPILOGUE_3_ARGS 5386 %assign bImm 0 5387 %rep 256 5388 .imm %+ bImm: 5389 pextrw T0_32, xmm0, bImm 5390 ret 5391 %assign bImm bImm + 1 5392 %endrep 5393 .immEnd: ; 256*6 == 0x600 5394 dw 0xf9ff + (.immEnd - .imm0) ; will cause warning if entries are too big. 5395 dw 0x105ff - (.immEnd - .imm0) ; will cause warning if entries are too small. 5396 ENDPROC iemAImpl_pextrw_u128 5397 5398 ;; 5399 ; vpextrw instruction. 5400 ; 5401 ; @param A0 Pointer to the 16bit output operand (output). 5402 ; @param A1 Pointer to the source media register size operand (input). 5403 ; @param A2 The 8-bit immediate 5404 ; 5405 BEGINPROC_FASTCALL iemAImpl_vpextrw_u128, 16 5406 PROLOGUE_3_ARGS 5407 IEMIMPL_SSE_PROLOGUE 5408 5409 movdqu xmm0, [A1] 5410 lea T1, [.imm0 xWrtRIP] 5411 lea T0, [A2 + A2*2] ; sizeof(vpextrw+ret) == 6: (A2 * 3) *2 5412 lea T1, [T1 + T0*2] 5413 call T1 5414 mov word [A0], T0_16 5415 5416 IEMIMPL_SSE_EPILOGUE 5417 EPILOGUE_3_ARGS 5418 %assign bImm 0 5419 %rep 256 5420 .imm %+ bImm: 5421 vpextrw T0_32, xmm0, bImm 5422 ret 5423 %assign bImm bImm + 1 5424 %endrep 5425 .immEnd: ; 256*6 == 0x600 5426 dw 0xf9ff + (.immEnd - .imm0) ; will cause warning if entries are too big. 5427 dw 0x105ff - (.immEnd - .imm0) ; will cause warning if entries are too small. 5428 ENDPROC iemAImpl_vpextrw_u128 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96701 r96707 15912 15912 puDst->au16[bEvil & 0x7] = u16Src; 15913 15913 } 15914 15915 15916 /** 15917 * [V]PEXTRW 15918 */ 15919 #ifdef IEM_WITHOUT_ASSEMBLY 15920 IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u64,(uint16_t *pu16Dst, uint64_t u64Src, uint8_t bEvil)) 15921 { 15922 *pu16Dst = (uint16_t)(u64Src >> ((bEvil & 0x3) * 16)); 15923 } 15924 15925 15926 IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u128,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil)) 15927 { 15928 *pu16Dst = puSrc->au16[bEvil & 0x7]; 15929 } 15930 15931 #endif 15932 15933 IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128_fallback,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil)) 15934 { 15935 *pu16Dst = puSrc->au16[bEvil & 0x7]; 15936 } -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r96701 r96707 10061 10061 /* Opcode 0xf2 0x0f 0xc4 - invalid */ 10062 10062 10063 10063 10064 /** Opcode 0x0f 0xc5 - pextrw Gd, Nq, Ib */ 10064 FNIEMOP_STUB(iemOp_pextrw_Gd_Nq_Ib); 10065 FNIEMOP_DEF(iemOp_pextrw_Gd_Nq_Ib) 10066 { 10067 /*IEMOP_MNEMONIC3(RMI_REG, PEXTRW, pinsrw, Gd, Nq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0);*/ /** @todo */ 10068 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 10069 if (IEM_IS_MODRM_REG_MODE(bRm)) 10070 { 10071 /* 10072 * Register, register. 10073 */ 10074 uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil); 10075 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 10076 IEM_MC_BEGIN(3, 1); 10077 IEM_MC_LOCAL(uint16_t, u16Dst); 10078 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Dst, 0); 10079 IEM_MC_ARG(uint64_t, u64Src, 1); 10080 IEM_MC_ARG_CONST(uint8_t, bEvilArg, /*=*/ bEvil, 2); 10081 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT(); 10082 IEM_MC_PREPARE_FPU_USAGE(); 10083 IEM_MC_FETCH_MREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm)); 10084 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pextrw_u64, pu16Dst, u64Src, bEvilArg); 10085 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst); 10086 IEM_MC_FPU_TO_MMX_MODE(); 10087 IEM_MC_ADVANCE_RIP(); 10088 IEM_MC_END(); 10089 return VINF_SUCCESS; 10090 } 10091 10092 /* No memory operand. */ 10093 return IEMOP_RAISE_INVALID_OPCODE(); 10094 } 10095 10096 10065 10097 /** Opcode 0x66 0x0f 0xc5 - pextrw Gd, Udq, Ib */ 10066 FNIEMOP_STUB(iemOp_pextrw_Gd_Udq_Ib); 10098 FNIEMOP_DEF(iemOp_pextrw_Gd_Udq_Ib) 10099 { 10100 IEMOP_MNEMONIC3(RMI_REG, PEXTRW, pextrw, Gd, Ux, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); 10101 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 10102 if (IEM_IS_MODRM_REG_MODE(bRm)) 10103 { 10104 /* 10105 * Register, register. 10106 */ 10107 uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil); 10108 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 10109 IEM_MC_BEGIN(3, 1); 10110 IEM_MC_LOCAL(uint16_t, u16Dst); 10111 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Dst, 0); 10112 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 10113 IEM_MC_ARG_CONST(uint8_t, bEvilArg, /*=*/ bEvil, 2); 10114 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 10115 IEM_MC_PREPARE_SSE_USAGE(); 10116 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 10117 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pextrw_u128, pu16Dst, puSrc, bEvilArg); 10118 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst); 10119 IEM_MC_ADVANCE_RIP(); 10120 IEM_MC_END(); 10121 return VINF_SUCCESS; 10122 } 10123 10124 /* No memory operand. */ 10125 return IEMOP_RAISE_INVALID_OPCODE(); 10126 } 10127 10128 10067 10129 /* Opcode 0xf3 0x0f 0xc5 - invalid */ 10068 10130 /* Opcode 0xf2 0x0f 0xc5 - invalid */ 10131 10069 10132 10070 10133 /** Opcode 0x0f 0xc6 - shufps Vps, Wps, Ib */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h
r96701 r96707 4036 4036 4037 4037 /* Opcode VEX.0F 0xc5 - invlid */ 4038 4039 4038 4040 /** Opcode VEX.66.0F 0xc5 - vpextrw Gd, Udq, Ib */ 4039 FNIEMOP_STUB(iemOp_vpextrw_Gd_Udq_Ib); 4041 FNIEMOP_DEF(iemOp_vpextrw_Gd_Udq_Ib) 4042 { 4043 IEMOP_MNEMONIC3(VEX_RMI_REG, VPEXTRW, vpextrw, Gd, Ux, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO); 4044 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 4045 if (IEM_IS_MODRM_REG_MODE(bRm)) 4046 { 4047 /* 4048 * Register, register. 4049 */ 4050 uint8_t bEvil; IEM_OPCODE_GET_NEXT_U8(&bEvil); 4051 IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx); 4052 IEM_MC_BEGIN(3, 1); 4053 IEM_MC_LOCAL(uint16_t, u16Dst); 4054 IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Dst, u16Dst, 0); 4055 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 4056 IEM_MC_ARG_CONST(uint8_t, bEvilArg, /*=*/ bEvil, 2); 4057 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 4058 IEM_MC_PREPARE_AVX_USAGE(); 4059 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 4060 IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vpextrw_u128, iemAImpl_vpextrw_u128_fallback), 4061 pu16Dst, puSrc, bEvilArg); 4062 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst); 4063 IEM_MC_ADVANCE_RIP(); 4064 IEM_MC_END(); 4065 return VINF_SUCCESS; 4066 } 4067 4068 /* No memory operand. */ 4069 return IEMOP_RAISE_INVALID_OPCODE(); 4070 } 4071 4072 4040 4073 /* Opcode VEX.F3.0F 0xc5 - invalid */ 4041 4074 /* Opcode VEX.F2.0F 0xc5 - invalid */ -
trunk/src/VBox/VMM/include/IEMInternal.h
r96701 r96707 2221 2221 IEM_DECL_IMPL_DEF(void, iemAImpl_vpinsrw_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint16_t u16Src, uint8_t bEvil)); 2222 2222 IEM_DECL_IMPL_DEF(void, iemAImpl_vpinsrw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc, uint16_t u16Src, uint8_t bEvil)); 2223 2224 IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u64,(uint16_t *pu16Dst, uint64_t u64Src, uint8_t bEvil)); 2225 IEM_DECL_IMPL_DEF(void, iemAImpl_pextrw_u128,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil)); 2226 IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil)); 2227 IEM_DECL_IMPL_DEF(void, iemAImpl_vpextrw_u128_fallback,(uint16_t *pu16Dst, PCRTUINT128U puSrc, uint8_t bEvil)); 2223 2228 2224 2229
Note:
See TracChangeset
for help on using the changeset viewer.