Changeset 66811 in vbox
- Timestamp:
- May 5, 2017 2:56:34 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 115232
- Location:
- trunk/src/VBox
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r66810 r66811 11148 11148 #define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg) \ 11149 11149 do { (a_u32Value) = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[0]; } while (0) 11150 #define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) \ 11151 do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (a_u64Value); } while (0) 11152 #define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) \ 11153 do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); } while (0) 11154 #define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg) \ 11150 #define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) do { \ 11151 IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (a_u64Value); \ 11152 IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \ 11153 } while (0) 11154 #define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) do { \ 11155 IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); \ 11156 IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \ 11157 } while (0) 11158 #define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg) /** @todo need to set high word to 0xffff on commit (see IEM_MC_STORE_MREG_U64) */ \ 11155 11159 (a_pu64Dst) = (&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx) 11156 11160 #define IEM_MC_REF_MREG_U64_CONST(a_pu64Dst, a_iMReg) \ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py
r66810 r66811 243 243 'Gw': ( 'IDX_UseModRM', 'reg', '%Gw', 'Gw', ), 244 244 'Gv': ( 'IDX_UseModRM', 'reg', '%Gv', 'Gv', ), 245 'Pq': ( 'IDX_UseModRM', 'reg', '%Pq', 'Pq', ), 245 246 'Vss': ( 'IDX_UseModRM', 'reg', '%Vss', 'Vss', ), 246 247 'VssZxReg': ( 'IDX_UseModRM', 'reg', '%Vss', 'Vss', ), -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r66810 r66811 8404 8404 IEMOP_MNEMONIC2(RM_REG, MOVQ2DQ, movq2dq, VqZxReg, Nq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE); 8405 8405 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 8406 IEM_MC_BEGIN(0, 2);8406 IEM_MC_BEGIN(0, 1); 8407 8407 IEM_MC_LOCAL(uint64_t, uSrc); 8408 8408 … … 8410 8410 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 8411 8411 8412 IEM_MC_FETCH_MREG_U64(uSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);8412 IEM_MC_FETCH_MREG_U64(uSrc, bRm & X86_MODRM_RM_MASK); 8413 8413 IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc); 8414 8414 IEM_MC_FPU_TO_MMX_MODE(); … … 8432 8432 } 8433 8433 8434 /** Opcode 0xf2 0x0f 0xd6 - movdq2q Pq, Uq */ 8435 FNIEMOP_STUB(iemOp_movdq2q_Pq_Uq); 8436 #if 0 8437 FNIEMOP_DEF(iemOp_movq_Wq_Vq__movq2dq_Vdq_Nq__movdq2q_Pq_Uq) 8438 { 8439 /* Docs says register only. */ 8440 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 8441 8442 switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ)) 8443 { 8444 case IEM_OP_PRF_SIZE_OP: /* SSE */ 8445 I E M O P _ M N E M O N I C(movq_Wq_Vq, "movq Wq,Vq"); 8446 IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_SSE | DISOPTYPE_HARMLESS); 8447 IEM_MC_BEGIN(2, 0); 8448 IEM_MC_ARG(uint64_t *, pDst, 0); 8449 IEM_MC_ARG(PCRTUINT128U, pSrc, 1); 8450 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 8451 IEM_MC_PREPARE_SSE_USAGE(); 8452 IEM_MC_REF_GREG_U64(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg); 8453 IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB); 8454 IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_pmovmskb_u128, pDst, pSrc); 8455 IEM_MC_ADVANCE_RIP(); 8456 IEM_MC_END(); 8457 return VINF_SUCCESS; 8458 8459 case 0: /* MMX */ 8460 I E M O P _ M N E M O N I C(pmovmskb_Gd_Udq, "pmovmskb Gd,Udq"); 8461 IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_MMX | DISOPTYPE_HARMLESS); 8462 IEM_MC_BEGIN(2, 0); 8463 IEM_MC_ARG(uint64_t *, pDst, 0); 8464 IEM_MC_ARG(uint64_t const *, pSrc, 1); 8465 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT(); 8466 IEM_MC_PREPARE_FPU_USAGE(); 8467 IEM_MC_REF_GREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK); 8468 IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK); 8469 IEM_MC_CALL_MMX_AIMPL_2(iemAImpl_pmovmskb_u64, pDst, pSrc); 8470 IEM_MC_ADVANCE_RIP(); 8471 IEM_MC_END(); 8472 return VINF_SUCCESS; 8473 8474 default: 8475 return IEMOP_RAISE_INVALID_OPCODE(); 8476 } 8477 } 8478 #endif 8479 8434 8435 /** 8436 * @opcode 0xd6 8437 * @opcodesub 11 mr/reg 8438 * @oppfx f2 8439 * @opcpuid sse2 8440 * @opgroup og_sse2_simdint_datamove 8441 * @optest op1=1 op2=2 -> op1=2 ftw=0xff 8442 * @optest op1=0 op2=-42 -> op1=-42 ftw=0xff 8443 * @optest op1=0 op2=0x1123456789abcdef -> op1=0x1123456789abcdef ftw=0xff 8444 * @optest op1=0 op2=0xfedcba9876543210 -> op1=0xfedcba9876543210 ftw=0xff 8445 * @optest op1=-42 op2=0xfedcba9876543210 8446 * -> op1=0xfedcba9876543210 ftw=0xff 8447 */ 8448 FNIEMOP_DEF(iemOp_movdq2q_Pq_Uq) 8449 { 8450 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 8451 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 8452 { 8453 /* 8454 * Register, register. 8455 */ 8456 IEMOP_MNEMONIC2(RM_REG, MOVDQ2Q, movdq2q, Pq, Uq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE); 8457 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 8458 IEM_MC_BEGIN(0, 1); 8459 IEM_MC_LOCAL(uint64_t, uSrc); 8460 8461 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 8462 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 8463 8464 IEM_MC_FETCH_XREG_U64(uSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB); 8465 IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, uSrc); 8466 IEM_MC_FPU_TO_MMX_MODE(); 8467 8468 IEM_MC_ADVANCE_RIP(); 8469 IEM_MC_END(); 8470 return VINF_SUCCESS; 8471 } 8472 8473 /** 8474 * @opdone 8475 * @opmnemonic udf20fd6mem 8476 * @opcode 0xd6 8477 * @opcodesub !11 mr/reg 8478 * @oppfx f2 8479 * @opunused intel-modrm 8480 * @opcpuid sse 8481 * @optest -> 8482 */ 8483 return FNIEMOP_CALL_1(iemOp_InvalidWithRMNeedDecode, bRm); 8484 } 8480 8485 8481 8486 /** Opcode 0x0f 0xd7 - pmovmskb Gd, Nq */ -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c
r66810 r66811 1583 1583 1584 1584 1585 static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_Pq_Uq(PBS3CG1STATE pThis, unsigned iEncoding) 1586 { 1587 unsigned off; 1588 if (iEncoding == 0) 1589 { 1590 off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0)); 1591 pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 1, 0); 1592 pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_XMM0_LO; 1593 pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_MM1; 1594 } 1595 else if (iEncoding == 1) 1596 { 1597 off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0)); 1598 pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 6, 2); 1599 pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_XMM2_LO; 1600 pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_MM6; 1601 } 1602 else 1603 return 0; 1604 pThis->cbCurInstr = off; 1605 return iEncoding + 1; 1606 } 1607 1608 1585 1609 static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_Vq_UqHi(PBS3CG1STATE pThis, unsigned iEncoding) 1586 1610 { … … 2238 2262 case BS3CG1ENC_MODRM_WqZxReg_Vq: 2239 2263 return Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_WqZxReg_Vq(pThis, iEncoding); 2264 2265 case BS3CG1ENC_MODRM_Pq_Uq: 2266 return Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_Pq_Uq(pThis, iEncoding); 2240 2267 2241 2268 case BS3CG1ENC_MODRM_Vq_UqHi: … … 2419 2446 break; 2420 2447 2448 case BS3CG1ENC_MODRM_Pq_Uq: 2421 2449 case BS3CG1ENC_MODRM_Vq_UqHi: 2422 2450 case BS3CG1ENC_MODRM_VqHi_Uq: … … 3119 3147 if ((unsigned)(idxField - BS3CG1DST_XMM0_LO_ZX) <= (unsigned)(BS3CG1DST_XMM15_LO_ZX - BS3CG1DST_XMM0_LO_ZX)) 3120 3148 PtrField.pu64[1] = 0; 3149 else if ((unsigned)(idxField - BS3CG1DST_MM0) <= (unsigned)(BS3CG1DST_MM7 - BS3CG1DST_MM0)) 3150 PtrField.pu32[2] = 0xffff; /* observed on skylake */ 3151 3121 3152 switch (bOpcode & BS3CG1_CTXOP_OPERATOR_MASK) 3122 3153 { -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h
r66810 r66811 55 55 BS3CG1OP_Gv, 56 56 BS3CG1OP_Nq, 57 BS3CG1OP_Pq, 57 58 BS3CG1OP_Uq, 58 59 BS3CG1OP_UqHi, … … 108 109 BS3CG1ENC_MODRM_Gv_Ev, 109 110 BS3CG1ENC_MODRM_Gv_Ma, /**< bound instruction */ 111 BS3CG1ENC_MODRM_Pq_Uq, 110 112 BS3CG1ENC_MODRM_Vq_UqHi, 111 113 BS3CG1ENC_MODRM_Vq_Mq,
Note:
See TracChangeset
for help on using the changeset viewer.