VirtualBox

Changeset 67015 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 22, 2017 12:56:18 PM (8 years ago)
Author:
vboxsync
Message:

IEM: Implemented vmovdqa Wx,Vx (VEX.66.0F 0x7f).

Location:
trunk/src/VBox
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r67012 r67015  
    235235    'WqZxReg_WO':   ( 'IDX_UseModRM',       'rm',     '%Wq',  'Wq',      ),
    236236    'Wx':           ( 'IDX_UseModRM',       'rm',     '%Wx',  'Wx',      ),
     237    'Wx_WO':        ( 'IDX_UseModRM',       'rm',     '%Wx',  'Wx',      ),
    237238
    238239    # ModR/M.rm - register only.
     
    286287    'VqHi_WO':      ( 'IDX_UseModRM',       'reg',    '%Vdq', 'VdqHi',   ),
    287288    'VqZx_WO':      ( 'IDX_UseModRM',       'reg',    '%Vq',  'VqZx',    ),
     289    'Vx':           ( 'IDX_UseModRM',       'reg',    '%Vx',  'Vx',      ),
    288290    'Vx_WO':        ( 'IDX_UseModRM',       'reg',    '%Vx',  'Vx',      ),
    289291
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r67014 r67015  
    45084508         * @optest      64-bit / op1=1 op2=2   -> op1=2
    45094509         * @optest      64-bit / op1=0 op2=-42 -> op1=-42
    4510         * @oponly
    45114510         */
    45124511        IEMOP_MNEMONIC2(MR, MOVQ, movq, Eq_WO, Vq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     
    45594558         * @optest      op1=1 op2=2   -> op1=2
    45604559         * @optest      op1=0 op2=-42 -> op1=-42
    4561          * @oponly
    45624560         */
    45634561        IEMOP_MNEMONIC2(MR, MOVD, movd, Ed_WO, Vd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r67012 r67015  
    27492749         * @optest      64-bit / op1=1 op2=2   -> op1=2
    27502750         * @optest      64-bit / op1=0 op2=-42 -> op1=-42
    2751         * @oponly
    27522751         */
    27532752        IEMOP_MNEMONIC2(VEX_MR, VMOVQ, vmovq, Eq_WO, Vq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     
    28002799         * @optest      op1=1 op2=2   -> op1=2
    28012800         * @optest      op1=0 op2=-42 -> op1=-42
    2802          * @oponly
    28032801         */
    28042802        IEMOP_MNEMONIC2(VEX_MR, VMOVD, vmovd, Ed_WO, Vd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     
    28482846/*  Opcode VEX.0F 0x7f - invalid */
    28492847
    2850 /** Opcode VEX.66.0F 0x7f - vmovdqa Wx,Vx */
    2851 FNIEMOP_STUB(iemOp_vmovdqa_Wx_Vx);
    2852 //FNIEMOP_DEF(iemOp_vmovdqa_Wx_Vx)
    2853 //{
    2854 //    IEMOP_MNEMONIC(vmovdqa_Wdq_Vdq, "vmovdqa Wx,Vx");
    2855 //    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    2856 //    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    2857 //    {
    2858 //        /*
    2859 //         * Register, register.
    2860 //         */
    2861 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    2862 //        IEM_MC_BEGIN(0, 0);
    2863 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    2864 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    2865 //        IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
    2866 //                              ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    2867 //        IEM_MC_ADVANCE_RIP();
    2868 //        IEM_MC_END();
    2869 //    }
    2870 //    else
    2871 //    {
    2872 //        /*
    2873 //         * Register, memory.
    2874 //         */
    2875 //        IEM_MC_BEGIN(0, 2);
    2876 //        IEM_MC_LOCAL(RTUINT128U, u128Tmp);
    2877 //        IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
    2878 //
    2879 //        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2880 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    2881 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    2882 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    2883 //
    2884 //        IEM_MC_FETCH_XREG_U128(u128Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    2885 //        IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u128Tmp);
    2886 //
    2887 //        IEM_MC_ADVANCE_RIP();
    2888 //        IEM_MC_END();
    2889 //    }
    2890 //    return VINF_SUCCESS;
    2891 //}
     2848/**
     2849 * @opcode      0x7f
     2850 * @oppfx       0x66
     2851 * @opcpuid     avx
     2852 * @opgroup     og_avx_simdint_datamove
     2853 * @opxcpttype  1
     2854 * @optest      op1=1 op2=2   -> op1=2
     2855 * @optest      op1=0 op2=-42 -> op1=-42
     2856 * @oponly
     2857 */
     2858FNIEMOP_DEF(iemOp_vmovdqa_Wx_Vx)
     2859{
     2860    IEMOP_MNEMONIC2(VEX_MR, VMOVDQA, vmovdqa, Wx_WO, Vx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     2861    Assert(pVCpu->iem.s.uVexLength <= 1);
     2862    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     2863    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     2864    {
     2865        /*
     2866         * Register, register.
     2867         */
     2868        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2869        IEM_MC_BEGIN(0, 0);
     2870
     2871        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2872        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     2873        if (pVCpu->iem.s.uVexLength == 0)
     2874            IEM_MC_COPY_YREG_U128_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     2875                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     2876        else
     2877            IEM_MC_COPY_YREG_U256_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     2878                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     2879        IEM_MC_ADVANCE_RIP();
     2880        IEM_MC_END();
     2881    }
     2882    else if (pVCpu->iem.s.uVexLength == 0)
     2883    {
     2884        /*
     2885         * Register, memory128.
     2886         */
     2887        IEM_MC_BEGIN(0, 2);
     2888        IEM_MC_LOCAL(RTUINT128U, u128Tmp);
     2889        IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
     2890
     2891        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     2892        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2893        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2894        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     2895
     2896        IEM_MC_FETCH_YREG_U128(u128Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     2897        IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u128Tmp);
     2898
     2899        IEM_MC_ADVANCE_RIP();
     2900        IEM_MC_END();
     2901    }
     2902    else
     2903    {
     2904        /*
     2905         * Register, memory256.
     2906         */
     2907        IEM_MC_BEGIN(0, 2);
     2908        IEM_MC_LOCAL(RTUINT256U, u256Tmp);
     2909        IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
     2910
     2911        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     2912        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2913        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     2914        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     2915
     2916        IEM_MC_FETCH_YREG_U256(u256Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     2917        IEM_MC_STORE_MEM_U256_ALIGN_AVX(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u256Tmp);
     2918
     2919        IEM_MC_ADVANCE_RIP();
     2920        IEM_MC_END();
     2921    }
     2922    return VINF_SUCCESS;
     2923}
    28922924
    28932925/** Opcode VEX.F3.0F 0x7f - vmovdqu Wx,Vx */
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r67014 r67015  
    47584758            break;
    47594759
     4760        case BS3CG1ENC_VEX_MODRM_Wx_WO_Vx:
     4761            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_WsomethingWO_Vsomething_Wip_OR_ViceVersa;
     4762            pThis->iRmOp             = 0;
     4763            pThis->iRegOp            = 1;
     4764            pThis->aOperands[0].cbOp = 16;
     4765            pThis->aOperands[1].cbOp = 16;
     4766            pThis->aOperands[0].enmLocation     = BS3CG1OPLOC_CTX_ZX_VLMAX;
     4767            pThis->aOperands[0].enmLocationReg  = BS3CG1OPLOC_CTX_ZX_VLMAX;
     4768            pThis->aOperands[0].enmLocationMem  = BS3CG1OPLOC_MEM_WO;
     4769            pThis->aOperands[1].enmLocation     = BS3CG1OPLOC_CTX;
     4770            pThis->aOperands[0].idxFieldBase    = BS3CG1DST_XMM0;
     4771            pThis->aOperands[1].idxFieldBase    = BS3CG1DST_XMM0;
     4772            break;
     4773
    47604774
    47614775            /* Unused or invalid instructions mostly. */
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r67014 r67015  
    6464    BS3CG1OP_WqZxReg_WO,
    6565    BS3CG1OP_Wx,
     66    BS3CG1OP_Wx_WO,
    6667
    6768    BS3CG1OP_Gb,
     
    102103    BS3CG1OP_VqHi_WO,
    103104    BS3CG1OP_VqZx_WO,
     105    BS3CG1OP_Vx,
    104106    BS3CG1OP_Vx_WO,
    105107
     
    199201    BS3CG1ENC_VEX_MODRM_Wps_WO_Vps,
    200202    BS3CG1ENC_VEX_MODRM_Wpd_WO_Vpd,
     203    BS3CG1ENC_VEX_MODRM_Wx_WO_Vx,
    201204
    202205    BS3CG1ENC_FIXED,
Note: See TracChangeset for help on using the changeset viewer.

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