VirtualBox

Changeset 105234 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jul 9, 2024 11:11:15 AM (7 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement vaddsubp{s,d} instruction emulations, bugref:9898

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r105232 r105234  
    1718217182
    1718317183/**
    17184  * ADDSUBPS
     17184 * [V]ADDSUBPS
    1718517185 */
    1718617186#ifdef IEM_WITHOUT_ASSEMBLY
    1718717187IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_addsubps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1718817188{
    17189     RT_NOREF(puSrc1);
    17190 
    1719117189    return   iemAImpl_subps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
    1719217190           | iemAImpl_addps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     
    1719717195
    1719817196
     17197IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vaddsubps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     17198{
     17199    return   iemAImpl_subps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     17200           | iemAImpl_addps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     17201           | iemAImpl_subps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     17202           | iemAImpl_addps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3]);
     17203}
     17204
     17205
     17206IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vaddsubps_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG pResult, PCX86YMMREG puSrc1, PCX86YMMREG puSrc2))
     17207{
     17208    return   iemAImpl_subps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     17209           | iemAImpl_addps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     17210           | iemAImpl_subps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     17211           | iemAImpl_addps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3])
     17212           | iemAImpl_subps_u128_worker(&pResult->ar32[4], uMxCsrIn, &puSrc1->ar32[4], &puSrc2->ar32[4])
     17213           | iemAImpl_addps_u128_worker(&pResult->ar32[5], uMxCsrIn, &puSrc1->ar32[5], &puSrc2->ar32[5])
     17214           | iemAImpl_subps_u128_worker(&pResult->ar32[6], uMxCsrIn, &puSrc1->ar32[6], &puSrc2->ar32[6])
     17215           | iemAImpl_addps_u128_worker(&pResult->ar32[7], uMxCsrIn, &puSrc1->ar32[7], &puSrc2->ar32[7]);
     17216}
     17217
     17218
    1719917219/**
    17200  * ADDSUBPD
     17220 * [V]ADDSUBPD
    1720117221 */
    1720217222#ifdef IEM_WITHOUT_ASSEMBLY
    1720317223IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_addsubpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1720417224{
    17205     RT_NOREF(puSrc1);
    17206 
    1720717225    return   iemAImpl_subpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
    1720817226           | iemAImpl_addpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1]);
    1720917227}
    1721017228#endif
     17229
     17230
     17231IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vaddsubpd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     17232{
     17233    return   iemAImpl_subpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
     17234           | iemAImpl_addpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1]);
     17235}
     17236
     17237
     17238IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vaddsubpd_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG pResult, PCX86YMMREG puSrc1, PCX86YMMREG puSrc2))
     17239{
     17240    return   iemAImpl_subpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
     17241           | iemAImpl_addpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1])
     17242           | iemAImpl_subpd_u128_worker(&pResult->ar64[2], uMxCsrIn, &puSrc1->ar64[2], &puSrc2->ar64[2])
     17243           | iemAImpl_addpd_u128_worker(&pResult->ar64[3], uMxCsrIn, &puSrc1->ar64[3], &puSrc2->ar64[3]);
     17244}
    1721117245
    1721217246
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h

    r105232 r105234  
    51555155
    51565156/*  Opcode VEX.0F 0xd0 - invalid */
     5157
     5158
    51575159/** Opcode VEX.66.0F 0xd0 - vaddsubpd Vpd, Hpd, Wpd */
    5158 FNIEMOP_STUB(iemOp_vaddsubpd_Vpd_Hpd_Wpd);
     5160FNIEMOP_DEF(iemOp_vaddsubpd_Vpd_Hpd_Wpd)
     5161{
     5162    IEMOP_MNEMONIC3(VEX_RVM, VADDSUBPD, vaddsubpd, Vpd, Hpd, Wpd, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     5163    IEMOPMEDIAF3_INIT_VARS(             vaddsubpd);
     5164    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
     5165}
     5166
     5167
    51595168/*  Opcode VEX.F3.0F 0xd0 - invalid */
     5169
     5170
    51605171/** Opcode VEX.F2.0F 0xd0 - vaddsubps Vps, Hps, Wps */
    5161 FNIEMOP_STUB(iemOp_vaddsubps_Vps_Hps_Wps);
     5172FNIEMOP_DEF(iemOp_vaddsubps_Vps_Hps_Wps)
     5173{
     5174    IEMOP_MNEMONIC3(VEX_RVM, VADDSUBPS, vaddsubps, Vps, Hps, Wps, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     5175    IEMOPMEDIAF3_INIT_VARS(             vaddsubps);
     5176    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
     5177}
     5178
    51625179
    51635180/*  Opcode VEX.0F 0xd1 - invalid */
     5181
     5182
    51645183/** Opcode VEX.66.0F 0xd1 - vpsrlw Vx, Hx, W */
    51655184FNIEMOP_DEF(iemOp_vpsrlw_Vx_Hx_W)
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