VirtualBox

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


Ignore:
Timestamp:
Jul 17, 2024 11:33:48 AM (7 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement fallbacks for dpps/dppd instructions, bugref:9898

File:
1 edited

Legend:

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

    r105359 r105371  
    3737#include <iprt/uint256.h>
    3838#include <iprt/crc.h>
     39#include <iprt/string.h>
    3940
    4041RT_C_DECLS_BEGIN
     
    2069820699 * [V]DPPS
    2069920700 */
     20701static uint32_t iemAImpl_dpps_u128_worker(PRTFLOAT32U par32Dst, uint32_t fMxcsr, PCRTFLOAT32U par32Src1, PCRTFLOAT32U par32Src2, uint8_t bImm)
     20702{
     20703    uint32_t fMxcsrOut = 0;
     20704
     20705    RTFLOAT32U ar32Tmp[4]; RT_ZERO(ar32Tmp); /* This will set the values to 0.0 */
     20706    if (bImm & RT_BIT(4))
     20707        fMxcsrOut |= iemAImpl_mulps_u128_worker(&ar32Tmp[0], fMxcsr, &par32Src1[0], &par32Src2[0]);
     20708    if (bImm & RT_BIT(5))
     20709        fMxcsrOut |= iemAImpl_mulps_u128_worker(&ar32Tmp[1], fMxcsr, &par32Src1[1], &par32Src2[1]);
     20710    if (bImm & RT_BIT(6))
     20711        fMxcsrOut |= iemAImpl_mulps_u128_worker(&ar32Tmp[2], fMxcsr, &par32Src1[2], &par32Src2[2]);
     20712    if (bImm & RT_BIT(7))
     20713        fMxcsrOut |= iemAImpl_mulps_u128_worker(&ar32Tmp[3], fMxcsr, &par32Src1[3], &par32Src2[3]);
     20714
     20715    RTFLOAT32U ar32TmpRes[2];
     20716    fMxcsrOut |= iemAImpl_addps_u128_worker(&ar32TmpRes[0], fMxcsr, &ar32Tmp[0], &ar32Tmp[1]);
     20717    fMxcsrOut |= iemAImpl_addps_u128_worker(&ar32TmpRes[1], fMxcsr, &ar32Tmp[2], &ar32Tmp[3]);
     20718
     20719    RTFLOAT32U r32Res;
     20720    fMxcsrOut |= iemAImpl_addps_u128_worker(&r32Res, fMxcsr, &ar32TmpRes[0], &ar32TmpRes[1]);
     20721
     20722    if (bImm & RT_BIT(0))
     20723        par32Dst[0] = r32Res;
     20724    else
     20725        par32Dst[0] = RTFLOAT32U_INIT_ZERO(0);
     20726
     20727    if (bImm & RT_BIT(1))
     20728        par32Dst[1] = r32Res;
     20729    else
     20730        par32Dst[1] = RTFLOAT32U_INIT_ZERO(0);
     20731
     20732    if (bImm & RT_BIT(2))
     20733        par32Dst[2] = r32Res;
     20734    else
     20735        par32Dst[2] = RTFLOAT32U_INIT_ZERO(0);
     20736
     20737    if (bImm & RT_BIT(3))
     20738        par32Dst[3] = r32Res;
     20739    else
     20740        par32Dst[3] = RTFLOAT32U_INIT_ZERO(0);
     20741
     20742    return fMxcsrOut;
     20743}
     20744
     20745
    2070020746IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_dpps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm))
    2070120747{
    20702     RT_NOREF(puDst, pSrc, bImm);
    20703     AssertReleaseFailed();
    20704     return uMxCsrIn;
     20748    return iemAImpl_dpps_u128_worker(&puDst->ar32[0], uMxCsrIn, &pSrc->uSrc1.ar32[0], &pSrc->uSrc2.ar32[0], bImm);
    2070520749}
    2070620750
     
    2070820752IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vdpps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm))
    2070920753{
    20710     RT_NOREF(puDst, pSrc, bImm);
    20711     AssertReleaseFailed();
    20712     return uMxCsrIn;
     20754    return iemAImpl_dpps_u128_worker(&puDst->ar32[0], uMxCsrIn, &pSrc->uSrc1.ar32[0], &pSrc->uSrc2.ar32[0], bImm);
    2071320755}
    2071420756
     
    2071620758IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vdpps_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCIEMMEDIAF2YMMSRC pSrc, uint8_t bImm))
    2071720759{
    20718     RT_NOREF(puDst, pSrc, bImm);
    20719     AssertReleaseFailed();
    20720     return uMxCsrIn;
     20760    uint32_t fMxcsrOut =  iemAImpl_dpps_u128_worker(&puDst->ar32[0], uMxCsrIn, &pSrc->uSrc1.ar32[0], &pSrc->uSrc2.ar32[0], bImm);
     20761             fMxcsrOut |= iemAImpl_dpps_u128_worker(&puDst->ar32[4], uMxCsrIn, &pSrc->uSrc1.ar32[4], &pSrc->uSrc2.ar32[4], bImm);
     20762    return fMxcsrOut;
    2072120763}
    2072220764
     
    2072520767 * [V]DPPD
    2072620768 */
     20769static uint32_t iemAImpl_dppd_u128_worker(PRTFLOAT64U par64Dst, uint32_t fMxcsr, PCRTFLOAT64U par64Src1, PCRTFLOAT64U par64Src2, uint8_t bImm)
     20770{
     20771    uint32_t fMxcsrOut = 0;
     20772
     20773    RTFLOAT64U ar64Tmp[2]; RT_ZERO(ar64Tmp); /* This will set the values to 0.0 */
     20774    if (bImm & RT_BIT(4))
     20775        fMxcsrOut |= iemAImpl_mulpd_u128_worker(&ar64Tmp[0], fMxcsr, &par64Src1[0], &par64Src2[0]);
     20776    if (bImm & RT_BIT(5))
     20777        fMxcsrOut |= iemAImpl_mulpd_u128_worker(&ar64Tmp[1], fMxcsr, &par64Src1[1], &par64Src2[1]);
     20778
     20779    RTFLOAT64U r64Res;
     20780    fMxcsrOut |= iemAImpl_addpd_u128_worker(&r64Res, fMxcsr, &ar64Tmp[0], &ar64Tmp[1]);
     20781
     20782    if (bImm & RT_BIT(0))
     20783        par64Dst[0] = r64Res;
     20784    else
     20785        par64Dst[0] = RTFLOAT64U_INIT_ZERO(0);
     20786
     20787    if (bImm & RT_BIT(1))
     20788        par64Dst[1] = r64Res;
     20789    else
     20790        par64Dst[1] = RTFLOAT64U_INIT_ZERO(0);
     20791
     20792    return fMxcsrOut;
     20793}
     20794
     20795
    2072720796IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_dppd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm))
    2072820797{
    20729     RT_NOREF(puDst, pSrc, bImm);
    20730     AssertReleaseFailed();
    20731     return uMxCsrIn;
     20798    return iemAImpl_dppd_u128_worker(&puDst->ar64[0], uMxCsrIn, &pSrc->uSrc1.ar64[0], &pSrc->uSrc2.ar64[0], bImm);
    2073220799}
    2073320800
     
    2073520802IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vdppd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm))
    2073620803{
    20737     RT_NOREF(puDst, pSrc, bImm);
    20738     AssertReleaseFailed();
    20739     return uMxCsrIn;
     20804    return iemAImpl_dppd_u128_worker(&puDst->ar64[0], uMxCsrIn, &pSrc->uSrc1.ar64[0], &pSrc->uSrc2.ar64[0], bImm);
    2074020805}
    2074120806
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