VirtualBox

儲存庫 vbox 的更動 66906


忽略:
時間撮記:
2017-5-16 上午09:58:00 (8 年 以前)
作者:
vboxsync
訊息:

IEM: Implemented vmovsd Vsd,Hsd,Usd (VEX.F2.0F 10 mod=3), vmovsd Vsd,Mq (VEX.F2.0F 10 mod!=3).

位置:
trunk
檔案:
修改 7 筆資料

圖例:

未更動
新增
刪除
  • trunk/include/VBox/disopcode.h

    r66901 r66906  
    740740    OP_UD1,
    741741    OP_UD2,
    742 /** @name AVX instructions
    743  * @{ */
    744     OP_VLDMXCSR,
    745     OP_VSTMXCSR,
    746     OP_VMOVUPS,
    747     OP_VMOVUPD,
    748     OP_VMOVSS,
    749 /** @} */
    750742/** @name VT-x instructions
    751743 * @{ */
     
    778770/** @name 64 bits instruction
    779771 * @{ */
    780     OP_MOVSXD
     772    OP_MOVSXD,
    781773/** @} */
     774/** @name AVX instructions
     775 * @{ */
     776    OP_VLDMXCSR,
     777    OP_VSTMXCSR,
     778    OP_VMOVUPS,
     779    OP_VMOVUPD,
     780    OP_VMOVSS,
     781    OP_VMOVSD,
     782/** @} */
     783    OP_END_OF_OPCODES
    782784};
    783785AssertCompile(OP_LOCK == 7);
     
    10801082#define OP_PARM_Uq              (OP_PARM_U+OP_PARM_q)
    10811083#define OP_PARM_UqHi            (OP_PARM_U+OP_PARM_dq)
     1084#define OP_PARM_Uss             (OP_PARM_U+OP_PARM_ss)
     1085#define OP_PARM_Usd             (OP_PARM_U+OP_PARM_sd)
    10821086#define OP_PARM_Vdq_WO          OP_PARM_Vdq             /**< Annotates that only YMM/XMM[127:64] are accessed. */
    10831087#define OP_PARM_Vpd_WO          OP_PARM_Vpd             /**< Annotates write only operand. */
     
    10901094#define OP_PARM_VssZx_WO        OP_PARM_Vss             /**< Annotates that the registers get their upper bits cleared. */
    10911095#define OP_PARM_Vss_WO          OP_PARM_Vss             /**< Annotates write only operand. */
     1096#define OP_PARM_Vsd_WO          OP_PARM_Vsd             /**< Annotates write only operand. */
    10921097#define OP_PARM_Wpd_WO          OP_PARM_Wpd             /**< Annotates write only operand. */
    10931098#define OP_PARM_Wps_WO          OP_PARM_Wps             /**< Annotates write only operand. */
     
    10961101#define OP_PARM_Wsd_WO          OP_PARM_Wsd             /**< Annotates write only operand. */
    10971102
    1098 
    10991103/** @} */
    11001104
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r66901 r66906  
    1143911439         IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, a_iYRegDst); \
    1144011440    } while (0)
    11441 #define IEM_MC_COPY2_YREG_U32_U96_ZX_VLMAX(a_iYRegDst, a_iYRegSrc32, a_iYRegSrcHx) \
     11441#define IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX(a_iYRegDst, a_iYRegSrc32, a_iYRegSrcHx) \
    1144211442    do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
    1144311443         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     
    1144611446         pXStateTmp->x87.aXMM[iYRegDstTmp].au32[0]       = pXStateTmp->x87.aXMM[iYRegSrc32Tmp].au32[0]; \
    1144711447         pXStateTmp->x87.aXMM[iYRegDstTmp].au32[1]       = pXStateTmp->x87.aXMM[iYRegSrcHxTmp].au32[1]; \
     11448         pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = pXStateTmp->x87.aXMM[iYRegSrcHxTmp].au64[1]; \
     11449         pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11450         pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11451         IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, a_iYRegDst); \
     11452    } while (0)
     11453#define IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX(a_iYRegDst, a_iYRegSrc64, a_iYRegSrcHx) \
     11454    do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11455         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11456         uintptr_t const iYRegSrc64Tmp  = (a_iYRegSrc64); \
     11457         uintptr_t const iYRegSrcHxTmp  = (a_iYRegSrcHx); \
     11458         pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = pXStateTmp->x87.aXMM[iYRegSrc64Tmp].au64[0]; \
    1144811459         pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = pXStateTmp->x87.aXMM[iYRegSrcHxTmp].au64[1]; \
    1144911460         pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66901 r66906  
    232232    'Uq':           ( 'IDX_UseModRM',       'rm',     '%Uq',  'Uq',      ),
    233233    'UqHi':         ( 'IDX_UseModRM',       'rm',     '%Uq',  'UqHi',    ),
     234    'Uss':          ( 'IDX_UseModRM',       'rm',     '%Uss', 'Uss',     ),
     235    'Usd':          ( 'IDX_UseModRM',       'rm',     '%Usd', 'Usd',     ),
    234236    'Nq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Nq',      ),
    235237
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r66901 r66906  
    214214         * @opcodesub   11 mr/reg
    215215         * @opcpuid     avx
    216          * @opgroup     og_avx_simdfp_datamove
     216         * @opgroup     og_avx_simdfp_datamerge
    217217         * @opxcpttype  5
    218218         * @optest      op1=1 op2=0  op3=2    -> op1=2
    219219         * @optest      op1=0 op2=0  op3=-22  -> op1=0xffffffea
    220220         * @optest      op1=3 op2=-1 op3=0x77 -> op1=-4294967177
    221          * @oponly
     221        * @oponly
    222222         */
    223         IEMOP_MNEMONIC3(VEX_RVM, VMOVSS, vmovss, Vss_WO, HdqCss, Wss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     223        IEMOP_MNEMONIC3(VEX_RVM, VMOVSS, vmovss, Vss_WO, HdqCss, Uss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    224224        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
    225225        IEM_MC_BEGIN(0, 0);
     
    227227        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    228228        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
    229         IEM_MC_COPY2_YREG_U32_U96_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     229        IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    230230                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB /*U32*/,
    231231                                           pVCpu->iem.s.uVex3rdReg /*Hss*/);
     
    246246         * @optest      op1=1 op2=2 -> op1=2
    247247         * @optest      op1=0 op2=-22 -> op1=-22
    248          * @oponly
     248        * @oponly
    249249         */
    250250        IEMOP_MNEMONIC2(VEX_XM, VMOVSS, vmovss, VssZx_WO, Wss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     
    268268}
    269269
    270 /** Opcode VEX.F2.0F 0x10 - vmovsd Vx, Hx, Wsd */
    271 FNIEMOP_STUB(iemOp_vmovsd_Vx_Hx_Wsd);
    272 
     270
     271FNIEMOP_DEF(iemOp_vmovsd_Vsd_Hsd_Wsd)
     272{
     273    Assert(pVCpu->iem.s.uVexLength <= 1);
     274    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     275    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     276    {
     277        /**
     278         * @opcode      0x10
     279         * @oppfx       0xf2
     280         * @opcodesub   11 mr/reg
     281         * @opcpuid     avx
     282         * @opgroup     og_avx_simdfp_datamerge
     283         * @opxcpttype  5
     284         * @optest      op1=1 op2=0  op3=2    -> op1=2
     285         * @optest      op1=0 op2=0  op3=-22  -> op1=0xffffffffffffffea
     286         * @optest      op1=3 op2=-1 op3=0x77 ->
     287         *              op1=0xffffffffffffffff0000000000000077
     288        * @oponly
     289         */
     290        IEMOP_MNEMONIC3(VEX_RVM, VMOVSD, vmovsd, Vsd_WO, HdqCsd, Usd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     291        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     292        IEM_MC_BEGIN(0, 0);
     293
     294        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     295        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     296        IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     297                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB /*U32*/,
     298                                           pVCpu->iem.s.uVex3rdReg /*Hss*/);
     299        IEM_MC_ADVANCE_RIP();
     300        IEM_MC_END();
     301    }
     302    else
     303    {
     304        /**
     305         * @opdone
     306         * @opcode      0x10
     307         * @oppfx       0xf2
     308         * @opcodesub   11 mr/reg
     309         * @opcpuid     avx
     310         * @opgroup     og_avx_simdfp_datamove
     311         * @opxcpttype  5
     312         * @opfunction  iemOp_vmovss_Vss_Hss_Wss
     313         * @optest      op1=1 op2=2 -> op1=2
     314         * @optest      op1=0 op2=-22 -> op1=-22
     315         * @oponly
     316         */
     317        IEMOP_MNEMONIC2(VEX_XM, VMOVSD, vmovsd, VsdZx_WO, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     318        IEM_MC_BEGIN(0, 2);
     319        IEM_MC_LOCAL(uint64_t,                  uSrc);
     320        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     321
     322        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     323        IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     324        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     325        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     326
     327        IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     328        IEM_MC_STORE_YREG_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     329
     330        IEM_MC_ADVANCE_RIP();
     331        IEM_MC_END();
     332    }
     333
     334    return VINF_SUCCESS;
     335}
    273336
    274337/**
     
    29613024    /* 0x0f */  IEMOP_X4(iemOp_InvalidNeedRM),
    29623025
    2963     /* 0x10 */  iemOp_vmovups_Vps_Wps,      iemOp_vmovupd_Vpd_Wpd,      iemOp_vmovss_Vss_Hss_Wss,     iemOp_vmovsd_Vx_Hx_Wsd,
     3026    /* 0x10 */  iemOp_vmovups_Vps_Wps,      iemOp_vmovupd_Vpd_Wpd,      iemOp_vmovss_Vss_Hss_Wss,   iemOp_vmovsd_Vsd_Hsd_Wsd,
    29643027    /* 0x11 */  iemOp_vmovups_Wps_Vps,      iemOp_vmovupd_Wpd_Vpd,      iemOp_vmovss_Wss_Hx_Vss,    iemOp_vmovsd_Wsd_Hx_Vsd,
    29653028    /* 0x12 */  iemOp_vmovlps_Vq_Hq_Mq__vmovhlps, iemOp_vmovlpd_Vq_Hq_Mq, iemOp_vmovsldup_Vx_Wx,    iemOp_vmovddup_Vx_Wx,
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r66901 r66906  
    528528#define IEM_MC_COPY_YREG_U256_ZX_VLMAX(a_iYRegDst, a_iYRegSrc)    do { (void)fAvxWrite; } while (0)
    529529#define IEM_MC_COPY_YREG_U128_ZX_VLMAX(a_iYRegDst, a_iYRegSrc)    do { (void)fAvxWrite; } while (0)
    530 #define IEM_MC_COPY2_YREG_U32_U96_ZX_VLMAX(a_iYRegDst, a_iYRegSrc32, a_iYRegSrcHx)  do { (void)fAvxWrite; } while (0)
     530#define IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX(a_iYRegDst, a_iYRegSrc32, a_iYRegSrcHx)  do { (void)fAvxWrite; } while (0)
     531#define IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX(a_iYRegDst, a_iYRegSrc64, a_iYRegSrcHx)  do { (void)fAvxWrite; } while (0)
    531532
    532533#define IEM_MC_FETCH_MEM_U8(a_u8Dst, a_iSeg, a_GCPtrMem)                do { CHK_GCPTR(a_GCPtrMem); } while (0)
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66901 r66906  
    197197         * Set to BS3CG1DST_INVALID if memory or immediate.  */
    198198        uint8_t             idxField;
     199        /** The base BS3CG1DST value for this field.
     200         * Used only by some generalized encoders when dealing with
     201         * registers. */
     202        uint8_t             idxFieldBase;
    199203        /** Depends on enmLocation.
    200204         * - BS3CG1OPLOC_IMM:       offset relative to start of the instruction.
     
    23862390
    23872391
    2388 static unsigned Bs3Cg1EncodeNext_VEX_MODRM_Vss_WO_HdqCss_Wss(PBS3CG1STATE pThis, unsigned iEncoding)
     2392static unsigned Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_HdqCsomething_Usomething(PBS3CG1STATE pThis, unsigned iEncoding)
    23892393{
    23902394    unsigned off;
     
    23952399            off = Bs3Cg1InsertOpcodes(pThis, off);
    23962400            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 2, 1);
    2397             pThis->aOperands[0].idxField = BS3CG1DST_XMM2;
    2398             pThis->aOperands[1].idxField = BS3CG1DST_XMM0;
    2399             pThis->aOperands[2].idxField = BS3CG1DST_XMM1_DW0;
     2401            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 2;
     2402            pThis->aOperands[1].idxField = pThis->aOperands[1].idxFieldBase + 0;
     2403            pThis->aOperands[2].idxField = pThis->aOperands[2].idxFieldBase + 1;
    24002404            break;
    24012405        case 1:
     
    24032407            off = Bs3Cg1InsertOpcodes(pThis, off);
    24042408            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 3, 1);
    2405             pThis->aOperands[0].idxField = BS3CG1DST_XMM3;
    2406             pThis->aOperands[1].idxField = BS3CG1DST_XMM7;
    2407             pThis->aOperands[2].idxField = BS3CG1DST_XMM1_DW0;
     2409            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 3;
     2410            pThis->aOperands[1].idxField = pThis->aOperands[1].idxFieldBase + 7;
     2411            pThis->aOperands[2].idxField = pThis->aOperands[2].idxFieldBase + 1;
    24082412            break;
    24092413        case 2:
     
    24142418                off = Bs3Cg1InsertOpcodes(pThis, off);
    24152419                pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 3, 2);
    2416                 pThis->aOperands[0].idxField = BS3CG1DST_XMM11;
    2417                 pThis->aOperands[1].idxField = BS3CG1DST_XMM15;
    2418                 pThis->aOperands[2].idxField = BS3CG1DST_XMM2_DW0;
     2420                pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 11;
     2421                pThis->aOperands[1].idxField = pThis->aOperands[1].idxFieldBase + 15;
     2422                pThis->aOperands[2].idxField = pThis->aOperands[2].idxFieldBase + 2;
    24192423                break;
    24202424            }
     
    24252429            off = Bs3Cg1InsertOpcodes(pThis, off);
    24262430            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 2, 1);
    2427             pThis->aOperands[0].idxField = BS3CG1DST_XMM2;
    2428             pThis->aOperands[1].idxField = BS3CG1DST_XMM0;
    2429             pThis->aOperands[2].idxField = BS3CG1DST_XMM1_DW0;
     2431            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 2;
     2432            pThis->aOperands[1].idxField = pThis->aOperands[1].idxFieldBase + 0;
     2433            pThis->aOperands[2].idxField = pThis->aOperands[2].idxFieldBase + 1;
    24302434            break;
    24312435        case 4:
     
    24332437            off = Bs3Cg1InsertOpcodes(pThis, off);
    24342438            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 2, 1);
    2435             pThis->aOperands[0].idxField = BS3CG1DST_XMM2;
    2436             pThis->aOperands[1].idxField = BS3CG1DST_XMM0;
    2437             pThis->aOperands[2].idxField = BS3CG1DST_XMM1_DW0;
     2439            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 2;
     2440            pThis->aOperands[1].idxField = pThis->aOperands[1].idxFieldBase + 0;
     2441            pThis->aOperands[2].idxField = pThis->aOperands[2].idxFieldBase + 1;
    24382442            break;
    24392443        case 5:
     
    24412445            off = Bs3Cg1InsertOpcodes(pThis, off);
    24422446            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 2, 1);
    2443             pThis->aOperands[0].idxField = BS3CG1DST_XMM2;
    2444             pThis->aOperands[1].idxField = BS3CG1DST_XMM3;
    2445             pThis->aOperands[2].idxField = BS3CG1DST_XMM1_DW0;
     2447            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 2;
     2448            pThis->aOperands[1].idxField = pThis->aOperands[1].idxFieldBase + 3;
     2449            pThis->aOperands[2].idxField = pThis->aOperands[2].idxFieldBase + 1;
    24462450            break;
    24472451        case 6:
     
    24492453            off = Bs3Cg1InsertOpcodes(pThis, off);
    24502454            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 2, 1);
    2451             pThis->aOperands[0].idxField = BS3CG1DST_XMM2;
    2452             pThis->aOperands[1].idxField = BS3_MODE_IS_64BIT_CODE(pThis->bMode) ? BS3CG1DST_XMM15 : BS3CG1DST_XMM7;
    2453             pThis->aOperands[2].idxField = BS3CG1DST_XMM1_DW0;
     2455            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 2;
     2456            pThis->aOperands[1].idxField = pThis->aOperands[1].idxFieldBase + (BS3_MODE_IS_64BIT_CODE(pThis->bMode) ? 15 : 7);
     2457            pThis->aOperands[2].idxField = pThis->aOperands[2].idxFieldBase + 1;
     2458            break;
     2459        case 7:
     2460            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0 /*~V*/, 0 /*L*/, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
     2461            off = Bs3Cg1InsertOpcodes(pThis, off);
     2462            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 2, 1);
     2463            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 2;
     2464            pThis->aOperands[1].idxField = pThis->aOperands[1].idxFieldBase + (BS3_MODE_IS_64BIT_CODE(pThis->bMode) ? 15 : 7);
     2465            pThis->aOperands[2].idxField = pThis->aOperands[2].idxFieldBase + 1;
    24542466            break;
    24552467        default:
     
    24612473
    24622474
    2463 static unsigned Bs3Cg1EncodeNext_VEX_MODRM_VssZx_WO_Wss(PBS3CG1STATE pThis, unsigned iEncoding)
     2475static unsigned Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lig(PBS3CG1STATE pThis, unsigned iEncoding)
    24642476{
    24652477    unsigned off;
     
    24692481            off = Bs3Cg1InsertVex2bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 0 /*L*/, 1 /*~R*/);
    24702482            off = Bs3Cg1InsertOpcodes(pThis, off);
    2471             off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 0, 4, 0, BS3CG1OPLOC_MEM);
    2472             pThis->aOperands[0].idxField = BS3CG1DST_XMM0_DW0;
     2483            off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 0, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2484            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 0;
    24732485            break;
    24742486        case 1:
    24752487            off = Bs3Cg1InsertVex2bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 1 /*L - ignored*/, 1 /*~R*/);
    24762488            off = Bs3Cg1InsertOpcodes(pThis, off);
    2477             off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 7, 4, 0, BS3CG1OPLOC_MEM);
    2478             pThis->aOperands[0].idxField = BS3CG1DST_XMM7_DW0;
     2489            off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 7, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2490            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 7;
    24792491            break;
    24802492        case 2:
     
    24842496                off = Bs3Cg1InsertVex2bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 1 /*L - ignored*/, 0 /*~R*/);
    24852497                off = Bs3Cg1InsertOpcodes(pThis, off);
    2486                 off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 7, 4, 0, BS3CG1OPLOC_MEM);
    2487                 pThis->aOperands[0].idxField = BS3CG1DST_XMM15_DW0;
     2498                off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 7, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2499                pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 15;
    24882500                break;
    24892501            }
     
    24942506            off = Bs3Cg1InsertVex2bPrefix(pThis, 0 /*offDst*/, 0xe /*~V*/, 0 /*L*/, 1 /*~R*/);
    24952507            off = Bs3Cg1InsertOpcodes(pThis, off);
    2496             off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 0, 4, 0, BS3CG1OPLOC_MEM);
    2497             pThis->aOperands[0].idxField = BS3CG1DST_XMM0_DW0;
     2508            off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 0, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2509            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 0;
    24982510            pThis->fInvalidEncoding = true;
    24992511            break;
     
    25012513            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 0 /*L*/, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
    25022514            off = Bs3Cg1InsertOpcodes(pThis, off);
    2503             off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 1, 4, 0, BS3CG1OPLOC_MEM);
    2504             pThis->aOperands[0].idxField = BS3CG1DST_XMM1_DW0;
     2515            off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 1, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2516            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 1;
    25052517            break;
    25062518        case 5:
    25072519            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 1 /*L-ignored*/, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
    25082520            off = Bs3Cg1InsertOpcodes(pThis, off);
    2509             off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 1, 4, 0, BS3CG1OPLOC_MEM);
    2510             pThis->aOperands[0].idxField = BS3CG1DST_XMM1_DW0;
     2521            off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 1, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2522            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 1;
    25112523            break;
    25122524        case 6:
    25132525            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 0 /*L*/, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 1 /*W-ignored*/);
    25142526            off = Bs3Cg1InsertOpcodes(pThis, off);
    2515             off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 5, 4, 0, BS3CG1OPLOC_MEM);
    2516             pThis->aOperands[0].idxField = BS3CG1DST_XMM5_DW0;
     2527            off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 5, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2528            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 5;
    25172529            break;
    25182530        case 7:
     
    25222534                off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 0 /*L*/, 0 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
    25232535                off = Bs3Cg1InsertOpcodes(pThis, off);
    2524                 off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 5, 4, 0, BS3CG1OPLOC_MEM);
    2525                 pThis->aOperands[0].idxField = BS3CG1DST_XMM13_DW0;
     2536                off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 5, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2537                pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 13;
    25262538                break;
    25272539            }
     
    25342546                off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 0 /*L*/, 1 /*~R*/, 1 /*~X*/, 0 /*~B-ignored*/, 0 /*W*/);
    25352547                off = Bs3Cg1InsertOpcodes(pThis, off);
    2536                 off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 1, 4, 0, BS3CG1OPLOC_MEM);
    2537                 pThis->aOperands[0].idxField = BS3CG1DST_XMM1_DW0;
     2548                off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 1, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2549                pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 1;
    25382550                break;
    25392551            }
     
    25462558                off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 0 /*L*/, 1 /*~R*/, 0 /*~X-ignored*/, 1 /*~B*/, 0 /*W*/);
    25472559                off = Bs3Cg1InsertOpcodes(pThis, off);
    2548                 off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 2, 4, 0, BS3CG1OPLOC_MEM);
    2549                 pThis->aOperands[0].idxField = BS3CG1DST_XMM2_DW0;
     2560                off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 2, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2561                pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 2;
    25502562                break;
    25512563            }
     
    25562568            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0 /*~V*/, 0 /*L*/, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
    25572569            off = Bs3Cg1InsertOpcodes(pThis, off);
    2558             off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 5, 4, 0, BS3CG1OPLOC_MEM);
    2559             pThis->aOperands[0].idxField = BS3CG1DST_XMM5_DW0;
     2570            off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 5, pThis->aOperands[1].cbOp, 0, BS3CG1OPLOC_MEM);
     2571            pThis->aOperands[0].idxField = pThis->aOperands[0].idxFieldBase + 5;
    25602572            pThis->fInvalidEncoding = true;
    25612573            break;
     
    27632775            return Bs3Cg1EncodeNext_VEX_MODRM_Vps_WO_Wps__OR__VEX_MODRM_Vpd_WO_Wpd(pThis, iEncoding);
    27642776
    2765         case BS3CG1ENC_VEX_MODRM_Vss_WO_HdqCss_Wss:
    2766             return Bs3Cg1EncodeNext_VEX_MODRM_Vss_WO_HdqCss_Wss(pThis, iEncoding);
    2767 
     2777        case BS3CG1ENC_VEX_MODRM_Vss_WO_HdqCss_Uss:
     2778        case BS3CG1ENC_VEX_MODRM_Vsd_WO_HdqCsd_Usd:
     2779            return Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_HdqCsomething_Usomething(pThis, iEncoding);
     2780
     2781        case BS3CG1ENC_VEX_MODRM_VsdZx_WO_Mq:
    27682782        case BS3CG1ENC_VEX_MODRM_VssZx_WO_Wss:
    2769             return Bs3Cg1EncodeNext_VEX_MODRM_VssZx_WO_Wss(pThis, iEncoding);
     2783            return Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lig(pThis, iEncoding);
    27702784
    27712785        case BS3CG1ENC_VEX_MODRM_Md_WO:
     
    30193033            pThis->aOperands[0].cbOp = 4;
    30203034            pThis->aOperands[1].cbOp = 4;
    3021             pThis->aOperands[0].enmLocation = BS3CG1OPLOC_CTX_ZX_VLMAX;
    3022             pThis->aOperands[1].enmLocation = BS3CG1OPLOC_MEM;
     3035            pThis->aOperands[0].enmLocation  = BS3CG1OPLOC_CTX_ZX_VLMAX;
     3036            pThis->aOperands[1].enmLocation  = BS3CG1OPLOC_MEM;
     3037            pThis->aOperands[0].idxFieldBase = BS3CG1DST_XMM0_DW0;
     3038            pThis->aOperands[1].idxFieldBase = BS3CG1DST_INVALID;
    30233039            break;
    30243040
    3025         case BS3CG1ENC_VEX_MODRM_Vss_WO_HdqCss_Wss:
     3041        case BS3CG1ENC_VEX_MODRM_Vss_WO_HdqCss_Uss:
    30263042            pThis->iRegOp            = 0;
    30273043            pThis->iRmOp             = 2;
     
    30293045            pThis->aOperands[1].cbOp = 16;
    30303046            pThis->aOperands[2].cbOp = 4;
    3031             pThis->aOperands[0].enmLocation = BS3CG1OPLOC_CTX_ZX_VLMAX;
    3032             pThis->aOperands[1].enmLocation = BS3CG1OPLOC_CTX;
    3033             pThis->aOperands[2].enmLocation = BS3CG1OPLOC_CTX;
     3047            pThis->aOperands[0].enmLocation  = BS3CG1OPLOC_CTX_ZX_VLMAX;
     3048            pThis->aOperands[1].enmLocation  = BS3CG1OPLOC_CTX;
     3049            pThis->aOperands[2].enmLocation  = BS3CG1OPLOC_CTX;
     3050            pThis->aOperands[0].idxFieldBase = BS3CG1DST_XMM0;
     3051            pThis->aOperands[1].idxFieldBase = BS3CG1DST_XMM0;
     3052            pThis->aOperands[2].idxFieldBase = BS3CG1DST_XMM0_DW0;
     3053            break;
     3054
     3055        case BS3CG1ENC_VEX_MODRM_VsdZx_WO_Mq:
     3056            pThis->iRmOp             = 1;
     3057            pThis->iRegOp            = 0;
     3058            pThis->aOperands[0].cbOp = 8;
     3059            pThis->aOperands[1].cbOp = 8;
     3060            pThis->aOperands[0].enmLocation  = BS3CG1OPLOC_CTX_ZX_VLMAX;
     3061            pThis->aOperands[1].enmLocation  = BS3CG1OPLOC_MEM;
     3062            pThis->aOperands[0].idxFieldBase = BS3CG1DST_XMM0_LO;
     3063            pThis->aOperands[1].idxFieldBase = BS3CG1DST_INVALID;
     3064            break;
     3065
     3066        case BS3CG1ENC_VEX_MODRM_Vsd_WO_HdqCsd_Usd:
     3067            pThis->iRegOp            = 0;
     3068            pThis->iRmOp             = 2;
     3069            pThis->aOperands[0].cbOp = 16;
     3070            pThis->aOperands[1].cbOp = 16;
     3071            pThis->aOperands[2].cbOp = 8;
     3072            pThis->aOperands[0].enmLocation  = BS3CG1OPLOC_CTX_ZX_VLMAX;
     3073            pThis->aOperands[1].enmLocation  = BS3CG1OPLOC_CTX;
     3074            pThis->aOperands[2].enmLocation  = BS3CG1OPLOC_CTX;
     3075            pThis->aOperands[0].idxFieldBase = BS3CG1DST_XMM0;
     3076            pThis->aOperands[1].idxFieldBase = BS3CG1DST_XMM0;
     3077            pThis->aOperands[2].idxFieldBase = BS3CG1DST_XMM0_LO;
    30343078            break;
    30353079
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r66901 r66906  
    6262    BS3CG1OP_Gv_RO,
    6363    BS3CG1OP_HdqCss,
     64    BS3CG1OP_HdqCsd,
    6465    BS3CG1OP_Nq,
    6566    BS3CG1OP_Pq_WO,
    6667    BS3CG1OP_Uq,
    6768    BS3CG1OP_UqHi,
     69    BS3CG1OP_Uss,
     70    BS3CG1OP_Usd,
    6871    BS3CG1OP_Vss,
    6972    BS3CG1OP_Vss_WO,
     
    144147    BS3CG1ENC_VEX_MODRM_Vps_WO_Wps,
    145148    BS3CG1ENC_VEX_MODRM_Vpd_WO_Wpd,
    146     BS3CG1ENC_VEX_MODRM_Vss_WO_HdqCss_Wss,
     149    BS3CG1ENC_VEX_MODRM_Vss_WO_HdqCss_Uss,
    147150    BS3CG1ENC_VEX_MODRM_VssZx_WO_Wss,
     151    BS3CG1ENC_VEX_MODRM_Vsd_WO_HdqCsd_Usd,
     152    BS3CG1ENC_VEX_MODRM_VsdZx_WO_Mq,
    148153    BS3CG1ENC_VEX_MODRM_Md_WO,
    149154
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette