VirtualBox

Changeset 66323 in vbox


Ignore:
Timestamp:
Mar 29, 2017 8:03:19 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
114252
Message:

IEM: Implemented movq Wq,Vq (66 0f d6).

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/disopcode.h

    r66310 r66323  
    10521052#define OP_PARM_Lx              (OP_PARM_L+OP_PARM_x)
    10531053
    1054 /* For making IEM happy: */
     1054/* For making IEM / bs3-cpu-generated-1 happy: */
    10551055#define OP_PARM_Uq              (OP_PARM_U+OP_PARM_q)
    10561056#define OP_PARM_UqHi            OP_PARM_Uq
     1057#define OP_PARM_WqZxReg         OP_PARM_Wq              /**< Annotates that register targets get their upper bits cleared. */
    10571058
    10581059/** @} */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66314 r66323  
    166166    'Wpd':  ( 'IDX_UseModRM',       'rm',     '%Wpd', 'Wpd',     ),
    167167    'Wdq':  ( 'IDX_UseModRM',       'rm',     '%Wdq', 'Wdq',     ),
     168    'WqZxReg': ( 'IDX_UseModRM',    'rm',     '%Wq',  'Wq',      ),
    168169
    169170    # ModR/M.rm - register only.
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r66321 r66323  
    75487548
    75497549/*  Opcode      0x0f 0xd6 - invalid */
    7550 /** Opcode 0x66 0x0f 0xd6 - vmovq Wq, Vq */
    7551 FNIEMOP_STUB(iemOp_vmovq_Wq_Vq); // NEXT!
     7550
     7551/**
     7552 * @opcode      0xd6
     7553 * @oppfx       0x66
     7554 * @opcpuid     sse2
     7555 * @opgroup     og_sse2_pcksclr_datamove
     7556 * @opxcpttype  none
     7557 * @optest      op1=-1 op2=2 -> op1=2
     7558 * @optest      op1=0 op2=-42 -> op1=-42
     7559 */
     7560FNIEMOP_DEF(iemOp_vmovq_Wq_Vq)
     7561{
     7562    IEMOP_MNEMONIC2(MR, MOVQ, movq, WqZxReg, Vq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     7563    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     7564    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     7565    {
     7566        /*
     7567         * Register, register.
     7568         */
     7569        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     7570        IEM_MC_BEGIN(0, 2);
     7571        IEM_MC_LOCAL(uint64_t,                  uSrc);
     7572
     7573        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     7574        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
     7575
     7576        IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     7577        IEM_MC_STORE_XREG_U64_ZX_U128((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, uSrc);
     7578
     7579        IEM_MC_ADVANCE_RIP();
     7580        IEM_MC_END();
     7581    }
     7582    else
     7583    {
     7584        /*
     7585         * Register, memory.
     7586         */
     7587        IEM_MC_BEGIN(0, 2);
     7588        IEM_MC_LOCAL(uint64_t,                  uSrc);
     7589        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     7590
     7591        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     7592        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     7593        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     7594        IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
     7595
     7596        IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     7597        IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     7598
     7599        IEM_MC_ADVANCE_RIP();
     7600        IEM_MC_END();
     7601    }
     7602    return VINF_SUCCESS;
     7603}
     7604
     7605
    75527606/** Opcode 0xf3 0x0f 0xd6 - movq2dq Vdq, Nq */
    75537607FNIEMOP_STUB(iemOp_movq2dq_Vdq_Nq);
     
    75637617    {
    75647618        case IEM_OP_PRF_SIZE_OP: /* SSE */
    7565             IEMOP_MNEMONIC(movq_Wq_Vq, "movq Wq,Vq");
     7619            I E M O P _ M N E M O N I C(movq_Wq_Vq, "movq Wq,Vq");
    75667620            IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_SSE | DISOPTYPE_HARMLESS);
    75677621            IEM_MC_BEGIN(2, 0);
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66317 r66323  
    470470    /* [BS3CG1DST_XMM14_HI] = */    8,
    471471    /* [BS3CG1DST_XMM15_HI] = */    8,
     472    /* [BS3CG1DST_XMM0_LO_ZX] = */  8,
     473    /* [BS3CG1DST_XMM1_LO_ZX] = */  8,
     474    /* [BS3CG1DST_XMM2_LO_ZX] = */  8,
     475    /* [BS3CG1DST_XMM3_LO_ZX] = */  8,
     476    /* [BS3CG1DST_XMM4_LO_ZX] = */  8,
     477    /* [BS3CG1DST_XMM5_LO_ZX] = */  8,
     478    /* [BS3CG1DST_XMM6_LO_ZX] = */  8,
     479    /* [BS3CG1DST_XMM7_LO_ZX] = */  8,
     480    /* [BS3CG1DST_XMM8_LO_ZX] = */  8,
     481    /* [BS3CG1DST_XMM9_LO_ZX] = */  8,
     482    /* [BS3CG1DST_XMM10_LO_ZX] = */ 8,
     483    /* [BS3CG1DST_XMM11_LO_ZX] = */ 8,
     484    /* [BS3CG1DST_XMM12_LO_ZX] = */ 8,
     485    /* [BS3CG1DST_XMM13_LO_ZX] = */ 8,
     486    /* [BS3CG1DST_XMM14_LO_ZX] = */ 8,
     487    /* [BS3CG1DST_XMM15_LO_ZX] = */ 8,
    472488    /* [BS3CG1DST_XMM0_DW0] = */    4,
    473489    /* [BS3CG1DST_XMM1_DW0] = */    4,
     
    683699    /* [BS3CG1DST_XMM14_HI] = */    sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[14]) + sizeof(uint64_t),
    684700    /* [BS3CG1DST_XMM15_HI] = */    sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[15]) + sizeof(uint64_t),
     701    /* [BS3CG1DST_XMM0_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[0]),
     702    /* [BS3CG1DST_XMM1_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[1]),
     703    /* [BS3CG1DST_XMM2_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[2]),
     704    /* [BS3CG1DST_XMM3_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[3]),
     705    /* [BS3CG1DST_XMM4_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[4]),
     706    /* [BS3CG1DST_XMM5_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[5]),
     707    /* [BS3CG1DST_XMM6_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[6]),
     708    /* [BS3CG1DST_XMM7_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[7]),
     709    /* [BS3CG1DST_XMM8_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[8]),
     710    /* [BS3CG1DST_XMM9_LO_ZX] = */  sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[9]),
     711    /* [BS3CG1DST_XMM10_LO_ZX] = */ sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[10]),
     712    /* [BS3CG1DST_XMM11_LO_ZX] = */ sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[11]),
     713    /* [BS3CG1DST_XMM12_LO_ZX] = */ sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[12]),
     714    /* [BS3CG1DST_XMM13_LO_ZX] = */ sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[13]),
     715    /* [BS3CG1DST_XMM14_LO_ZX] = */ sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[14]),
     716    /* [BS3CG1DST_XMM15_LO_ZX] = */ sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[15]),
    685717    /* [BS3CG1DST_XMM0_DW0] = */    sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[0]),
    686718    /* [BS3CG1DST_XMM1_DW0] = */    sizeof(BS3REGCTX) + RT_OFFSETOF(BS3EXTCTX, Ctx.x87.aXMM[1]),
     
    723755#ifdef BS3CG1_DEBUG_CTX_MOD
    724756/** Destination field names. */
    725 static const struct { char sz[10]; } g_aszBs3Cg1DstFields[] =
     757static const struct { char sz[12]; } g_aszBs3Cg1DstFields[] =
    726758{
    727759    { "INVALID" },
     
    896928    { "XMM14_HI" },
    897929    { "XMM15_HI" },
     930    { "XMM0_LO_ZX" },
     931    { "XMM1_LO_ZX" },
     932    { "XMM2_LO_ZX" },
     933    { "XMM3_LO_ZX" },
     934    { "XMM4_LO_ZX" },
     935    { "XMM5_LO_ZX" },
     936    { "XMM6_LO_ZX" },
     937    { "XMM7_LO_ZX" },
     938    { "XMM8_LO_ZX" },
     939    { "XMM9_LO_ZX" },
     940    { "XMM10_LO_ZX" },
     941    { "XMM11_LO_ZX" },
     942    { "XMM12_LO_ZX" },
     943    { "XMM13_LO_ZX" },
     944    { "XMM14_LO_ZX" },
     945    { "XMM15_LO_ZX" },
    898946    { "XMM0_DW0" },
    899947    { "XMM1_DW0" },
     
    13621410            break;
    13631411
     1412        case BS3CG1ENC_MODRM_WqZxReg_Vq:
     1413            if (iEncoding == 0)
     1414            {
     1415                off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1416                pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 1, 0);
     1417                pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_XMM0_LO_ZX;
     1418                pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_XMM1_LO;
     1419            }
     1420            else if (iEncoding == 1)
     1421            {
     1422                pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_XMM2_LO;
     1423                off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1424                off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 2 /*iReg*/, 8, 0, BS3CG1OPLOC_MEM_RW);
     1425            }
     1426            else if (iEncoding == 2)
     1427            {
     1428                pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_XMM3_LO;
     1429                off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1430                off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 3 /*iReg*/, 8, 1 /*cbMissalign*/, BS3CG1OPLOC_MEM_RW);
     1431            }
     1432            else
     1433                break;
     1434            pThis->cbCurInstr = off;
     1435            iEncoding++;
     1436            break;
     1437
    13641438        case BS3CG1ENC_MODRM_Vq_UqHi:
    13651439            if (iEncoding == 0)
     
    16871761
    16881762        case BS3CG1ENC_MODRM_Wsd_Vsd:
     1763        case BS3CG1ENC_MODRM_WqZxReg_Vq:
    16891764            pThis->iRmOp             = 0;
    16901765            pThis->iRegOp            = 1;
     
    23082383
    23092384                case 8:
     2385                    if ((unsigned)(idxField - BS3CG1DST_XMM0_LO_ZX) <= (unsigned)(BS3CG1DST_XMM15_LO_ZX - BS3CG1DST_XMM0_LO_ZX))
     2386                        PtrField.pu64[1] = 0;
    23102387                    switch (bOpcode & BS3CG1_CTXOP_OPERATOR_MASK)
    23112388                    {
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r66315 r66323  
    4949    BS3CG1OP_Wpd,
    5050    BS3CG1OP_Wdq,
     51    BS3CG1OP_WqZxReg,
    5152
    5253    BS3CG1OP_Gb,
     
    9293    BS3CG1ENC_MODRM_Wps_Vps,
    9394    BS3CG1ENC_MODRM_Wpd_Vpd,
     95    BS3CG1ENC_MODRM_WqZxReg_Vq,
    9496
    9597    BS3CG1ENC_MODRM_Gb_Eb,
     
    478480    BS3CG1DST_XMM14_HI,
    479481    BS3CG1DST_XMM15_HI,
     482    BS3CG1DST_XMM0_LO_ZX,
     483    BS3CG1DST_XMM1_LO_ZX,
     484    BS3CG1DST_XMM2_LO_ZX,
     485    BS3CG1DST_XMM3_LO_ZX,
     486    BS3CG1DST_XMM4_LO_ZX,
     487    BS3CG1DST_XMM5_LO_ZX,
     488    BS3CG1DST_XMM6_LO_ZX,
     489    BS3CG1DST_XMM7_LO_ZX,
     490    BS3CG1DST_XMM8_LO_ZX,
     491    BS3CG1DST_XMM9_LO_ZX,
     492    BS3CG1DST_XMM10_LO_ZX,
     493    BS3CG1DST_XMM11_LO_ZX,
     494    BS3CG1DST_XMM12_LO_ZX,
     495    BS3CG1DST_XMM13_LO_ZX,
     496    BS3CG1DST_XMM14_LO_ZX,
     497    BS3CG1DST_XMM15_LO_ZX,
    480498    BS3CG1DST_XMM0_DW0,
    481499    BS3CG1DST_XMM1_DW0,
     
    518536    BS3CG1DST_END
    519537} BS3CG1DST;
     538AssertCompile(BS3CG1DST_END <= 256);
    520539
    521540/** @name Selector opcode definitions.
Note: See TracChangeset for help on using the changeset viewer.

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