VirtualBox

儲存庫 vbox 的更動 66966


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

IEM: Implemented vmovlps Mq,Vq (VEX.0F 13 mod!=3).

位置:
trunk/src/VBox/VMM
檔案:
修改 3 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66957 r66966  
    483483    'ignores_op_size':       '',                                ##< Ignores both operand size prefixes (66h + REX.W).
    484484    'ignores_vex_l':         '',                                ##< Ignores VEX.L.
     485    'vex_l_zero':            '',                                ##< VEX.L must be 0.
    485486    'lock_allowed':          '',                                ##< Lock prefix allowed.
    486487};
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r66965 r66966  
    635635         * @note        op3 and op2 are only the 8-byte high XMM register halfs.
    636636         */
    637         IEMOP_MNEMONIC3(VEX_RVM, VMOVHLPS, vmovhlps, Vq_WO, HqHi, UqHi, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     637        IEMOP_MNEMONIC3(VEX_RVM, VMOVHLPS, vmovhlps, Vq_WO, HqHi, UqHi, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_VEX_L_ZERO);
    638638
    639639        IEMOP_HLP_DONE_VEX_DECODING_L0();
     
    665665         * @optest      op2=-1 op3=0x42 -> op1=0xffffffffffffffff0000000000000042
    666666         */
    667         IEMOP_MNEMONIC3(VEX_RVM_MEM, VMOVLPS, vmovlps, Vq_WO, HqHi, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     667        IEMOP_MNEMONIC3(VEX_RVM_MEM, VMOVLPS, vmovlps, Vq_WO, HqHi, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_VEX_L_ZERO);
    668668
    669669        IEM_MC_BEGIN(0, 2);
     
    705705    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
    706706    {
    707         IEMOP_MNEMONIC3(VEX_RVM_MEM, VMOVLPD, vmovlpd, Vq_WO, HqHi, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     707        IEMOP_MNEMONIC3(VEX_RVM_MEM, VMOVLPD, vmovlpd, Vq_WO, HqHi, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_VEX_L_ZERO);
    708708
    709709        IEM_MC_BEGIN(0, 2);
     
    950950
    951951
    952 
    953 /** Opcode VEX.0F 0x13 - vmovlps Mq, Vq */
    954 FNIEMOP_STUB(iemOp_vmovlps_Mq_Vq);
     952/**
     953 * @opcode      0x13
     954 * @opcodesub   !11 mr/reg
     955 * @oppfx       none
     956 * @opcpuid     avx
     957 * @opgroup     og_avx_simdfp_datamove
     958 * @opxcpttype  5
     959 * @optest      op1=1 op2=2 -> op1=2
     960 * @optest      op1=0 op2=-42 -> op1=-42
     961 */
     962FNIEMOP_DEF(iemOp_vmovlps_Mq_Vq)
     963{
     964    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     965    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     966    {
     967        IEMOP_MNEMONIC2(VEX_MR_MEM, VMOVLPS, vmovlps, Mq_WO, Vq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_VEX_L_ZERO);
     968
     969        IEM_MC_BEGIN(0, 2);
     970        IEM_MC_LOCAL(uint64_t,                  uSrc);
     971        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     972
     973        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     974        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     975        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     976        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     977
     978        IEM_MC_FETCH_YREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     979        IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     980
     981        IEM_MC_ADVANCE_RIP();
     982        IEM_MC_END();
     983        return VINF_SUCCESS;
     984    }
     985
     986    /**
     987     * @opdone
     988     * @opmnemonic  udvex0f13m3
     989     * @opcode      0x13
     990     * @opcodesub   11 mr/reg
     991     * @oppfx       none
     992     * @opunused    immediate
     993     * @opcpuid     avx
     994     * @optest      ->
     995     */
     996    return IEMOP_RAISE_INVALID_OPCODE();
     997}
     998
    955999
    9561000/** Opcode VEX.66.0F 0x13 - vmovlpd Mq, Vq */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r66965 r66966  
    960960/** The VEX.L value is ignored (aka LIG). */
    961961#define IEMOPHINT_IGNORES_VEX_L     RT_BIT_32(12)
     962/** The VEX.L value must be zero (i.e. 128-bit width). */
     963#define IEMOPHINT_VEX_L_ZERO        RT_BIT_32(13)
    962964
    963965/** Hint to IEMAllInstructionPython.py that this macro should be skipped.  */
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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