VirtualBox

Changeset 66972 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 19, 2017 11:29:45 AM (8 years ago)
Author:
vboxsync
Message:

IEM: Implemented vmovaps Vps,Wps (VEX.0F 28).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r66968 r66972  
    958958 * @optest      op1=1 op2=2 -> op1=2
    959959 * @optest      op1=0 op2=-42 -> op1=-42
    960  * @oponly
    961960 */
    962961FNIEMOP_DEF(iemOp_vmovlps_Mq_Vq)
     
    993992     * @opcpuid     avx
    994993     * @optest      ->
    995     * @oponly
    996994     */
    997995    return IEMOP_RAISE_INVALID_OPCODE();
     
    10081006 * @optest      op1=1 op2=2 -> op1=2
    10091007 * @optest      op1=0 op2=-42 -> op1=-42
    1010  * @oponly
    10111008 */
    10121009FNIEMOP_DEF(iemOp_vmovlpd_Mq_Vq)
     
    10421039     * @opcpuid     avx
    10431040     * @optest      ->
    1044     * @oponly
    10451041     */
    10461042    return IEMOP_RAISE_INVALID_OPCODE();
     
    10951091/*  Opcode VEX.0F 0x27 - invalid */
    10961092
    1097 /** Opcode VEX.0F 0x28 - vmovaps Vps, Wps */
    1098 FNIEMOP_STUB(iemOp_vmovaps_Vps_Wps);
    1099 //FNIEMOP_DEF(iemOp_vmovaps_Vps_Wps)
    1100 //{
    1101 //    IEMOP_MNEMONIC(vmovaps_Vps_Wps, "vmovaps Vps,Wps");
    1102 //    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1103 //    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1104 //    {
    1105 //        /*
    1106 //         * Register, register.
    1107 //         */
    1108 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1109 //        IEM_MC_BEGIN(0, 0);
    1110 //        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    1111 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1112 //        IEM_MC_COPY_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    1113 //                              (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1114 //        IEM_MC_ADVANCE_RIP();
    1115 //        IEM_MC_END();
    1116 //    }
    1117 //    else
    1118 //    {
    1119 //        /*
    1120 //         * Register, memory.
    1121 //         */
    1122 //        IEM_MC_BEGIN(0, 2);
    1123 //        IEM_MC_LOCAL(RTUINT128U,                uSrc); /** @todo optimize this one day... */
    1124 //        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    1125 //
    1126 //        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1127 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1128 //        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    1129 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1130 //
    1131 //        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1132 //        IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
    1133 //
    1134 //        IEM_MC_ADVANCE_RIP();
    1135 //        IEM_MC_END();
    1136 //    }
    1137 //    return VINF_SUCCESS;
    1138 //}
     1093/**
     1094 * @opcode      0x28
     1095 * @oppfx       none
     1096 * @opcpuid     avx
     1097 * @opgroup     og_avx_pcksclr_datamove
     1098 * @opxcpttype  1
     1099 * @optest      op1=1 op2=2 -> op1=2
     1100 * @optest      op1=0 op2=-42 -> op1=-42
     1101 */
     1102FNIEMOP_DEF(iemOp_vmovaps_Vps_Wps)
     1103{
     1104    IEMOP_MNEMONIC2(VEX_RM, VMOVAPS, vmovaps, Vps_WO, Wps, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     1105    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1106    Assert(pVCpu->iem.s.uVexLength <= 1);
     1107    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     1108    {
     1109        /*
     1110         * Register, register.
     1111         */
     1112        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1113        IEM_MC_BEGIN(1, 0);
     1114
     1115        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1116        IEM_MC_PREPARE_AVX_USAGE();
     1117        if (pVCpu->iem.s.uVexLength == 0)
     1118            IEM_MC_COPY_YREG_U128_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     1119                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     1120        else
     1121            IEM_MC_COPY_YREG_U256_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     1122                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     1123        IEM_MC_ADVANCE_RIP();
     1124        IEM_MC_END();
     1125    }
     1126    else
     1127    {
     1128        /*
     1129         * Register, memory.
     1130         */
     1131        if (pVCpu->iem.s.uVexLength == 0)
     1132        {
     1133            IEM_MC_BEGIN(0, 2);
     1134            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1135            IEM_MC_LOCAL(RTUINT128U,                uSrc);
     1136
     1137            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1138            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1139            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1140            IEM_MC_PREPARE_AVX_USAGE();
     1141
     1142            IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1143            IEM_MC_STORE_YREG_U128_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     1144
     1145            IEM_MC_ADVANCE_RIP();
     1146            IEM_MC_END();
     1147        }
     1148        else
     1149        {
     1150            IEM_MC_BEGIN(0, 2);
     1151            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1152            IEM_MC_LOCAL(RTUINT256U,                uSrc);
     1153
     1154            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1155            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1156            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1157            IEM_MC_PREPARE_AVX_USAGE();
     1158
     1159            IEM_MC_FETCH_MEM_U256_ALIGN_AVX(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1160            IEM_MC_STORE_YREG_U256_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     1161
     1162            IEM_MC_ADVANCE_RIP();
     1163            IEM_MC_END();
     1164        }
     1165    }
     1166    return VINF_SUCCESS;
     1167}
     1168
     1169
    11391170
    11401171/** Opcode VEX.66.0F 0x28 - vmovapd Vpd, Wpd */
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