VirtualBox

Changeset 104209 in vbox


Ignore:
Timestamp:
Apr 5, 2024 9:31:16 PM (8 months ago)
Author:
vboxsync
Message:

VMM/IEM: Refactoring assembly helpers to not pass eflags by reference but instead by value and return the updated value (via eax/w0) - fifth chunk: BLSI, BLSR, BLSMSK. bugref:10376

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r104208 r104209  
    10831083; where the 64-bit accesses requires hand coding.
    10841084;
    1085 ; All the functions takes a pointer to the destination memory operand in A0,
    1086 ; the source register operand in A1 and a pointer to eflags in A2.
     1085; All the functions takes a pointer to the destination memory operand in A1,
     1086; the source register operand in A2 and incoming EFLAGS in A0.  Updated EFLAGS
     1087; are returned in EAX.
    10871088;
    10881089; @param        1       The instruction mnemonic.
     
    10941095BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u32, 12
    10951096        PROLOGUE_4_ARGS
    1096         IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, 0 ;; @todo check if any undefined flags are passed thru
    1097         mov     T0_32, [A0]
    1098         %1      T0_32, A1_32
    1099         mov     [A0], T0_32
    1100         IEM_SAVE_FLAGS_OLD                 A2, %2, %3, %4
     1097        IEM_MAYBE_LOAD_FLAGS               A0_32, %2, %3, 0 ;; @todo check if any undefined flags are passed thru
     1098        mov     T0_32, [A1]
     1099        %1      T0_32, A2_32
     1100        mov     [A1], T0_32
     1101        IEM_SAVE_FLAGS_RETVAL              A0_32, %2, %3, %4
    11011102        EPILOGUE_4_ARGS
    11021103ENDPROC iemAImpl_ %+ %1 %+ _u32
     
    11051106BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12
    11061107        PROLOGUE_4_ARGS
    1107         IEM_MAYBE_LOAD_FLAGS_OLD           A2, %2, %3, 0
    1108         mov     T0, [A0]
    1109         %1      T0, A1
    1110         mov     [A0], T0
    1111         IEM_SAVE_FLAGS_OLD                 A2, %2, %3, %4
     1108        IEM_MAYBE_LOAD_FLAGS               A0_32, %2, %3, 0
     1109        mov     T0, [A1]
     1110        %1      T0, A2
     1111        mov     [A1], T0
     1112        IEM_SAVE_FLAGS_RETVAL              A0_32, %2, %3, %4
    11121113        EPILOGUE_4_ARGS
    11131114ENDPROC iemAImpl_ %+ %1 %+ _u64
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r104208 r104209  
    18211821 */
    18221822#define EMIT_BLSR(a_cBits, a_Type, a_Suffix) \
    1823 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_blsr_u,a_cBits,a_Suffix),(a_Type *puDst, a_Type uSrc, uint32_t *pfEFlags)) \
     1823IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_blsr_u,a_cBits,a_Suffix),(uint32_t fEFlags, a_Type *puDst, a_Type uSrc)) \
    18241824{ \
    1825     uint32_t fEfl1 = *pfEFlags; \
    1826     uint32_t fEfl2 = fEfl1; \
    18271825    *puDst = uSrc; \
    1828     fEfl1 = iemAImpl_sub_u ## a_cBits(fEfl1, &uSrc, 1); \
    1829     fEfl2 = iemAImpl_and_u ## a_cBits(fEfl2, puDst, uSrc); \
     1826    uint32_t fEfl1 = iemAImpl_sub_u ## a_cBits(fEFlags, &uSrc, 1); \
     1827    uint32_t fEfl2 = iemAImpl_and_u ## a_cBits(fEFlags, puDst, uSrc); \
    18301828    \
    18311829    /* AMD: The carry flag is from the SUB operation. */ \
     
    18331831    fEfl2 &= ~(X86_EFL_CF | X86_EFL_PF); \
    18341832    fEfl2 |= fEfl1 & X86_EFL_CF; \
    1835     *pfEFlags = fEfl2; \
     1833    return fEfl2; \
    18361834}
    18371835
     
    18491847 */
    18501848#define EMIT_BLSMSK(a_cBits, a_Type, a_Suffix) \
    1851 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_blsmsk_u,a_cBits,a_Suffix),(a_Type *puDst, a_Type uSrc, uint32_t *pfEFlags)) \
     1849IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_blsmsk_u,a_cBits,a_Suffix),(uint32_t fEFlags, a_Type *puDst, a_Type uSrc)) \
    18521850{ \
    1853     uint32_t fEfl1 = *pfEFlags; \
    1854     uint32_t fEfl2 = fEfl1; \
    18551851    *puDst = uSrc; \
    1856     fEfl1 = iemAImpl_sub_u ## a_cBits(fEfl1, &uSrc, 1); \
    1857     fEfl2 = iemAImpl_xor_u ## a_cBits(fEfl2, puDst, uSrc); \
     1852    uint32_t fEfl1 = iemAImpl_sub_u ## a_cBits(fEFlags, &uSrc, 1); \
     1853    uint32_t fEfl2 = iemAImpl_xor_u ## a_cBits(fEFlags, puDst, uSrc); \
    18581854    \
    18591855    /* AMD: The carry flag is from the SUB operation. */ \
     
    18611857    fEfl2 &= ~(X86_EFL_CF | X86_EFL_PF); \
    18621858    fEfl2 |= fEfl1 & X86_EFL_CF; \
    1863     *pfEFlags = fEfl2; \
     1859    return fEfl2; \
    18641860}
    18651861
     
    18771873 */
    18781874#define EMIT_BLSI(a_cBits, a_Type, a_Suffix) \
    1879 IEM_DECL_IMPL_DEF(void, RT_CONCAT3(iemAImpl_blsi_u,a_cBits,a_Suffix),(a_Type *puDst, a_Type uSrc, uint32_t *pfEFlags)) \
     1875IEM_DECL_IMPL_DEF(uint32_t, RT_CONCAT3(iemAImpl_blsi_u,a_cBits,a_Suffix),(uint32_t fEFlags, a_Type *puDst, a_Type uSrc)) \
    18801876{ \
    1881     uint32_t fEfl1 = *pfEFlags; \
    1882     uint32_t fEfl2 = fEfl1; \
     1877    uint32_t fEfl1 = fEFlags; \
    18831878    *puDst = uSrc; \
    18841879    iemAImpl_neg_u ## a_cBits(&uSrc, &fEfl1); \
    1885     fEfl2 = iemAImpl_and_u ## a_cBits(fEfl2, puDst, uSrc); \
     1880    uint32_t fEfl2 = iemAImpl_and_u ## a_cBits(fEFlags, puDst, uSrc); \
    18861881    \
    18871882    /* AMD: The carry flag is from the SUB operation. */ \
     
    18891884    fEfl2 &= ~(X86_EFL_CF | X86_EFL_PF); \
    18901885    fEfl2 |= fEfl1 & X86_EFL_CF; \
    1891     *pfEFlags = fEfl2; \
     1886    return fEfl2; \
    18921887}
    18931888
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap2.cpp.h

    r104192 r104209  
    18221822            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    18231823            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \
    1824             IEM_MC_ARG(uint64_t *,          pDst,    0); \
    1825             IEM_MC_ARG(uint64_t,            uSrc,    1); \
    1826             IEM_MC_ARG(uint32_t *,          pEFlags, 2); \
     1824            IEM_MC_ARG(uint64_t,            uSrc,       2); \
    18271825            IEM_MC_FETCH_GREG_U64(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     1826            IEM_MC_ARG(uint64_t *,          pDst,       1); \
    18281827            IEM_MC_REF_GREG_U64(pDst,   IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
    1829             IEM_MC_REF_EFLAGS(pEFlags); \
    1830             IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u64, \
    1831                                                                  iemAImpl_ ## a_Instr ## _u64_fallback), pDst, uSrc, pEFlags); \
     1828            IEM_MC_ARG_EFLAGS(              fEFlagsIn,  0); \
     1829            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, \
     1830                                IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u64, \
     1831                                                                   iemAImpl_ ## a_Instr ## _u64_fallback), fEFlagsIn, pDst, uSrc); \
     1832            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    18321833            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    18331834            IEM_MC_END(); \
     
    18371838            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); \
    18381839            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \
    1839             IEM_MC_ARG(uint32_t *,          pDst,    0); \
    1840             IEM_MC_ARG(uint32_t,            uSrc,    1); \
    1841             IEM_MC_ARG(uint32_t *,          pEFlags, 2); \
     1840            IEM_MC_ARG(uint32_t,            uSrc,       2); \
    18421841            IEM_MC_FETCH_GREG_U32(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     1842            IEM_MC_ARG(uint32_t *,          pDst,       1); \
    18431843            IEM_MC_REF_GREG_U32(pDst,   IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
    1844             IEM_MC_REF_EFLAGS(pEFlags); \
    1845             IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u32, \
    1846                                                                  iemAImpl_ ## a_Instr ## _u32_fallback), pDst, uSrc, pEFlags); \
     1844            IEM_MC_ARG_EFLAGS(              fEFlagsIn,  0); \
     1845            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, \
     1846                                IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u32, \
     1847                                                                   iemAImpl_ ## a_Instr ## _u32_fallback), fEFlagsIn, pDst, uSrc); \
    18471848            IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     1849            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    18481850            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    18491851            IEM_MC_END(); \
     
    18581860        { \
    18591861            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0); \
    1860             IEM_MC_ARG(uint64_t *,          pDst,    0); \
    1861             IEM_MC_ARG(uint64_t,            uSrc,    1); \
    1862             IEM_MC_ARG(uint32_t *,          pEFlags, 2); \
    18631862            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    18641863            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    18651864            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \
     1865            \
     1866            IEM_MC_ARG(uint64_t,            uSrc,       2); \
    18661867            IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
     1868            IEM_MC_ARG(uint64_t *,          pDst,       1); \
    18671869            IEM_MC_REF_GREG_U64(pDst,  IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
    1868             IEM_MC_REF_EFLAGS(pEFlags); \
    1869             IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u64, \
    1870                                                                  iemAImpl_ ## a_Instr ## _u64_fallback), pDst, uSrc, pEFlags); \
     1870            IEM_MC_ARG_EFLAGS(              fEFlagsIn,  0); \
     1871            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, \
     1872                                IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u64, \
     1873                                                                   iemAImpl_ ## a_Instr ## _u64_fallback), fEFlagsIn, pDst, uSrc); \
     1874            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    18711875            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    18721876            IEM_MC_END(); \
     
    18751879        { \
    18761880            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); \
    1877             IEM_MC_ARG(uint32_t *,          pDst,    0); \
    1878             IEM_MC_ARG(uint32_t,            uSrc,    1); \
    1879             IEM_MC_ARG(uint32_t *,          pEFlags, 2); \
    18801881            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffSrc); \
    18811882            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    18821883            IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fBmi1); \
     1884            \
     1885            IEM_MC_ARG(uint32_t,            uSrc,       2); \
    18831886            IEM_MC_FETCH_MEM_U32(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
     1887            IEM_MC_ARG(uint32_t *,          pDst,       1); \
    18841888            IEM_MC_REF_GREG_U32(pDst,  IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
    1885             IEM_MC_REF_EFLAGS(pEFlags); \
    1886             IEM_MC_CALL_VOID_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u32, \
    1887                                                                  iemAImpl_ ## a_Instr ## _u32_fallback), pDst, uSrc, pEFlags); \
     1889            IEM_MC_ARG_EFLAGS(              fEFlagsIn,  0); \
     1890            IEM_MC_CALL_AIMPL_3(uint32_t, fEFlagsRet, \
     1891                                IEM_SELECT_HOST_OR_FALLBACK(fBmi1, iemAImpl_ ## a_Instr ## _u32, \
     1892                                                                   iemAImpl_ ## a_Instr ## _u32_fallback), fEFlagsIn, pDst, uSrc); \
    18881893            IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_EFFECTIVE_VVVV(pVCpu)); \
     1894            IEM_MC_COMMIT_EFLAGS(fEFlagsRet); \
    18891895            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    18901896            IEM_MC_END(); \
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r104208 r104209  
    26012601FNIEMAIMPLBINU8 iemAImpl_xor_u8, iemAImpl_xor_u8_locked;
    26022602FNIEMAIMPLBINU8 iemAImpl_and_u8, iemAImpl_and_u8_locked;
    2603 
    2604 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOU8, (uint8_t *pu8Dst, uint8_t u8Src, uint32_t *pEFlags));
    2605 typedef FNIEMAIMPLBINTODOU8 *PFNIEMAIMPLBINTODOU8;
    26062603/** @} */
    26072604
     
    26172614FNIEMAIMPLBINU16 iemAImpl_xor_u16, iemAImpl_xor_u16_locked;
    26182615FNIEMAIMPLBINU16 iemAImpl_and_u16, iemAImpl_and_u16_locked;
    2619 
    2620 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOU16, (uint16_t *pu16Dst, uint16_t u16Src, uint32_t *pEFlags));
    2621 typedef FNIEMAIMPLBINTODOU16 *PFNIEMAIMPLBINTODOU16;
    26222616/** @}  */
    26232617
     
    26342628FNIEMAIMPLBINU32 iemAImpl_xor_u32, iemAImpl_xor_u32_locked;
    26352629FNIEMAIMPLBINU32 iemAImpl_and_u32, iemAImpl_and_u32_locked;
    2636 
    2637 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOU32, (uint32_t *pu32Dst, uint32_t u32Src, uint32_t *pEFlags));
    2638 typedef FNIEMAIMPLBINTODOU32 *PFNIEMAIMPLBINTODOU32;
    2639 FNIEMAIMPLBINTODOU32 iemAImpl_blsi_u32, iemAImpl_blsi_u32_fallback;
    2640 FNIEMAIMPLBINTODOU32 iemAImpl_blsr_u32, iemAImpl_blsr_u32_fallback;
    2641 FNIEMAIMPLBINTODOU32 iemAImpl_blsmsk_u32, iemAImpl_blsmsk_u32_fallback;
     2630FNIEMAIMPLBINU32 iemAImpl_blsi_u32, iemAImpl_blsi_u32_fallback;
     2631FNIEMAIMPLBINU32 iemAImpl_blsr_u32, iemAImpl_blsr_u32_fallback;
     2632FNIEMAIMPLBINU32 iemAImpl_blsmsk_u32, iemAImpl_blsmsk_u32_fallback;
    26422633/** @}  */
    26432634
     
    26532644FNIEMAIMPLBINU64 iemAImpl_xor_u64, iemAImpl_xor_u64_locked;
    26542645FNIEMAIMPLBINU64 iemAImpl_and_u64, iemAImpl_and_u64_locked;
    2655 
    2656 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLBINTODOU64, (uint64_t *pu64Dst, uint64_t u64Src, uint32_t *pEFlags));
    2657 typedef FNIEMAIMPLBINTODOU64 *PFNIEMAIMPLBINTODOU64;
    2658 FNIEMAIMPLBINTODOU64 iemAImpl_blsi_u64, iemAImpl_blsi_u64_fallback;
    2659 FNIEMAIMPLBINTODOU64 iemAImpl_blsr_u64, iemAImpl_blsr_u64_fallback;
    2660 FNIEMAIMPLBINTODOU64 iemAImpl_blsmsk_u64, iemAImpl_blsmsk_u64_fallback;
     2646FNIEMAIMPLBINU64 iemAImpl_blsi_u64, iemAImpl_blsi_u64_fallback;
     2647FNIEMAIMPLBINU64 iemAImpl_blsr_u64, iemAImpl_blsr_u64_fallback;
     2648FNIEMAIMPLBINU64 iemAImpl_blsmsk_u64, iemAImpl_blsmsk_u64_fallback;
    26612649/** @}  */
    26622650
     
    39843972/** Pointer to a binary operator function table. */
    39853973typedef IEMOPBINSIZES const *PCIEMOPBINSIZES;
    3986 
    3987 
    3988 /**
    3989  * Function table for a binary operator providing implementation based on
    3990  * operand size.
    3991  */
    3992 typedef struct IEMOPBINTODOSIZES
    3993 {
    3994     PFNIEMAIMPLBINTODOU8  pfnNormalU8,    pfnLockedU8;
    3995     PFNIEMAIMPLBINTODOU16 pfnNormalU16,   pfnLockedU16;
    3996     PFNIEMAIMPLBINTODOU32 pfnNormalU32,   pfnLockedU32;
    3997     PFNIEMAIMPLBINTODOU64 pfnNormalU64,   pfnLockedU64;
    3998 } IEMOPBINTODOSIZES;
    3999 /** Pointer to a binary operator function table. */
    4000 typedef IEMOPBINTODOSIZES const *PCIEMOPBINTODOSIZES;
    40013974
    40023975
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