VirtualBox

Changeset 105184 in vbox


Ignore:
Timestamp:
Jul 8, 2024 12:27:15 PM (7 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement vaddps instruction emulation, bugref:9898

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

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

    r104521 r105184  
    1593415934
    1593515935
     15936IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vaddps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     15937{
     15938    return   iemAImpl_addps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     15939           | iemAImpl_addps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     15940           | iemAImpl_addps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     15941           | iemAImpl_addps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3]);
     15942}
     15943
     15944
     15945IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vaddps_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG pResult, PCX86YMMREG puSrc1, PCX86YMMREG puSrc2))
     15946{
     15947    return   iemAImpl_addps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     15948           | iemAImpl_addps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     15949           | iemAImpl_addps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     15950           | iemAImpl_addps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3])
     15951           | iemAImpl_addps_u128_worker(&pResult->ar32[4], uMxCsrIn, &puSrc1->ar32[4], &puSrc2->ar32[4])
     15952           | iemAImpl_addps_u128_worker(&pResult->ar32[5], uMxCsrIn, &puSrc1->ar32[5], &puSrc2->ar32[5])
     15953           | iemAImpl_addps_u128_worker(&pResult->ar32[6], uMxCsrIn, &puSrc1->ar32[6], &puSrc2->ar32[6])
     15954           | iemAImpl_addps_u128_worker(&pResult->ar32[7], uMxCsrIn, &puSrc1->ar32[7], &puSrc2->ar32[7]);
     15955}
     15956
     15957
    1593615958/**
    1593715959 * ADDSS
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h

    r104439 r105184  
    3434 */
    3535
    36 #if 0 /*Unused*/
    3736/**
    3837 * Common worker for AVX2 instructions on the forms:
     
    5756            IEM_MC_PREPARE_AVX_USAGE();
    5857
    59             IEM_MC_LOCAL(RTUINT256U,            uSrc1);
    60             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
    61             IEM_MC_FETCH_YREG_U256(uSrc1,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
    62 
    63             IEM_MC_LOCAL(RTUINT256U,            uSrc2);
    64             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
    65             IEM_MC_FETCH_YREG_U256(uSrc2,   IEM_GET_MODRM_RM(pVCpu, bRm));
    66 
    67             IEM_MC_LOCAL(RTUINT256U,            uDst);
    68             IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,  0);
     58            IEM_MC_LOCAL(X86YMMREG,             uSrc1);
     59            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc1, uSrc1, 1);
     60            IEM_MC_FETCH_YREG_YMM(uSrc1,    IEM_GET_EFFECTIVE_VVVV(pVCpu));
     61
     62            IEM_MC_LOCAL(X86YMMREG,             uSrc2);
     63            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc2, uSrc2, 2);
     64            IEM_MC_FETCH_YREG_YMM(uSrc2,    IEM_GET_MODRM_RM(pVCpu, bRm));
     65
     66            IEM_MC_LOCAL(X86YMMREG,             uDst);
     67            IEM_MC_ARG_LOCAL_REF(PX86YMMREG,    puDst,  uDst,  0);
    6968
    7069            IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU256, puDst, puSrc1, puSrc2);
    7170
    72             IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     71            IEM_MC_STORE_YREG_YMM_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
    7372            IEM_MC_ADVANCE_RIP_AND_FINISH();
    7473            IEM_MC_END();
     
    8180            IEM_MC_PREPARE_AVX_USAGE();
    8281
    83             IEM_MC_ARG(PRTUINT128U,          puDst,  0);
    84             IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm));
    85             IEM_MC_ARG(PCRTUINT128U,         puSrc1, 1);
    86             IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu));
    87             IEM_MC_ARG(PCRTUINT128U,         puSrc2, 2);
    88             IEM_MC_REF_XREG_U128_CONST(puSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
     82            IEM_MC_ARG(PX86XMMREG,           puDst,  0);
     83            IEM_MC_REF_XREG_XMM(puDst,         IEM_GET_MODRM_REG(pVCpu, bRm));
     84            IEM_MC_ARG(PCX86XMMREG,          puSrc1, 1);
     85            IEM_MC_REF_XREG_XMM_CONST(puSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu));
     86            IEM_MC_ARG(PCX86XMMREG,          puSrc2, 2);
     87            IEM_MC_REF_XREG_XMM_CONST(puSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
    8988            IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU128, puDst, puSrc1, puSrc2);
    9089            IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     
    107106            IEM_MC_PREPARE_AVX_USAGE();
    108107
    109             IEM_MC_LOCAL(RTUINT256U,            uSrc2);
    110             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
    111             IEM_MC_FETCH_MEM_U256_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    112 
    113             IEM_MC_LOCAL(RTUINT256U,            uSrc1);
    114             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
    115             IEM_MC_FETCH_YREG_U256(uSrc1,      IEM_GET_EFFECTIVE_VVVV(pVCpu));
    116 
    117             IEM_MC_LOCAL(RTUINT256U,            uDst);
    118             IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,  0);
     108            IEM_MC_LOCAL(X86YMMREG,             uSrc2);
     109            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc2, uSrc2, 2);
     110            IEM_MC_FETCH_MEM_YMM_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     111
     112            IEM_MC_LOCAL(X86YMMREG,             uSrc1);
     113            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc1, uSrc1, 1);
     114            IEM_MC_FETCH_YREG_YMM(uSrc1,       IEM_GET_EFFECTIVE_VVVV(pVCpu));
     115
     116            IEM_MC_LOCAL(X86YMMREG,             uDst);
     117            IEM_MC_ARG_LOCAL_REF(PX86YMMREG,    puDst,  uDst,  0);
    119118
    120119            IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU256, puDst, puSrc1, puSrc2);
    121120
    122             IEM_MC_STORE_YREG_U256_ZX_VLMAX(   IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     121            IEM_MC_STORE_YREG_YMM_ZX_VLMAX(    IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
    123122            IEM_MC_ADVANCE_RIP_AND_FINISH();
    124123            IEM_MC_END();
     
    133132            IEM_MC_PREPARE_AVX_USAGE();
    134133
    135             IEM_MC_LOCAL(RTUINT128U,                uSrc2);
    136             IEM_MC_ARG_LOCAL_REF(PCRTUINT128U,      puSrc2, uSrc2, 2);
    137             IEM_MC_FETCH_MEM_U128_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    138 
    139             IEM_MC_ARG(PRTUINT128U,                 puDst,         0);
    140             IEM_MC_REF_XREG_U128(puDst,         IEM_GET_MODRM_REG(pVCpu, bRm));
    141             IEM_MC_ARG(PCRTUINT128U,                puSrc1,        1);
    142             IEM_MC_REF_XREG_U128_CONST(puSrc1,  IEM_GET_EFFECTIVE_VVVV(pVCpu));
     134            IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
     135            IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2, 2);
     136            IEM_MC_FETCH_MEM_XMM_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     137
     138            IEM_MC_ARG(PX86XMMREG,                  puDst,         0);
     139            IEM_MC_REF_XREG_XMM(puDst,          IEM_GET_MODRM_REG(pVCpu, bRm));
     140            IEM_MC_ARG(PCX86XMMREG,                 puSrc1,        1);
     141            IEM_MC_REF_XREG_XMM_CONST(puSrc1,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
    143142
    144143            IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU128, puDst, puSrc1, puSrc2);
     
    150149    }
    151150}
    152 #endif
     151
    153152
    154153/**
     
    28322831/*  Opcode VEX.F2.0F 0x57 - invalid */
    28332832
     2833
    28342834/** Opcode VEX.0F 0x58 - vaddps Vps, Hps, Wps */
    2835 FNIEMOP_STUB(iemOp_vaddps_Vps_Hps_Wps);
     2835FNIEMOP_DEF(iemOp_vaddps_Vps_Hps_Wps)
     2836{
     2837    IEMOP_MNEMONIC3(VEX_RVM, VADDPS, vaddps, Vps, Hps, Wps, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     2838    IEMOPMEDIAF3_INIT_VARS(          vaddps);
     2839    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
     2840}
     2841
     2842
    28362843/** Opcode VEX.66.0F 0x58 - vaddpd Vpd, Hpd, Wpd */
    28372844FNIEMOP_STUB(iemOp_vaddpd_Vpd_Hpd_Wpd);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r105180 r105184  
    34443444typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF2U128,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc));
    34453445typedef FNIEMAIMPLMEDIAF2U128  *PFNIEMAIMPLMEDIAF2U128;
    3446 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF3U128,(PX86XSAVEAREA pExtState, PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2));
     3446typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF3U128,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2));
    34473447typedef FNIEMAIMPLMEDIAF3U128  *PFNIEMAIMPLMEDIAF3U128;
    3448 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF3U256,(PX86XSAVEAREA pExtState, PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2));
     3448typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF3U256,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCX86YMMREG puSrc1, PCX86YMMREG puSrc2));
    34493449typedef FNIEMAIMPLMEDIAF3U256  *PFNIEMAIMPLMEDIAF3U256;
    34503450typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAOPTF2U64,(uint64_t *puDst, uint64_t const *puSrc));
     
    45634563FNIEMAIMPLFPSSEF2U128R32 iemAImpl_rcpss_u128_r32;
    45644564
    4565 FNIEMAIMPLFPAVXF3U128 iemAImpl_vaddps_u128, iemAImpl_vaddps_u128_fallback;
     4565FNIEMAIMPLMEDIAF3U128 iemAImpl_vaddps_u128, iemAImpl_vaddps_u128_fallback;
    45664566FNIEMAIMPLFPAVXF3U128 iemAImpl_vaddpd_u128, iemAImpl_vaddpd_u128_fallback;
    45674567FNIEMAIMPLFPAVXF3U128 iemAImpl_vmulps_u128, iemAImpl_vmulps_u128_fallback;
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