VirtualBox

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


Ignore:
Timestamp:
Jan 26, 2023 11:06:50 AM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Take into account the value of Imm8 operand in roundxx SSE instructions, bugref:9898

File:
1 edited

Legend:

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

    r98134 r98311  
    1713217132 */
    1713317133
     17134#define X86_SSE_ROUNDXX_IMM_RC_MASK    UINT32_C(0x0003)
     17135#define X86_SSE_ROUNDXX_IMM_ROUND_SEL  UINT32_C(0x0004)
     17136#define X86_SSE_ROUNDXX_IMM_PRECISION  UINT32_C(0x0008)
     17137
     17138DECLINLINE(softfloat_state_t) iemSseRoundXXMxcsrAndImmToSoftState(uint32_t fMxcsr, uint8_t bImm)
     17139{
     17140    if (bImm & X86_SSE_ROUNDXX_IMM_ROUND_SEL)
     17141        return IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr);
     17142
     17143    fMxcsr &= ~X86_MXCSR_RC_MASK;
     17144    fMxcsr |= (bImm & X86_SSE_ROUNDXX_IMM_RC_MASK) << X86_MXCSR_RC_SHIFT;
     17145    return IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr);
     17146}
     17147
    1713417148static RTFLOAT32U iemAImpl_round_worker_r32(uint32_t *pfMxcsr, PCRTFLOAT32U pr32Src, uint8_t bImm)
    1713517149{
    17136     RT_NOREF(bImm);
    1713717150    RTFLOAT32U r32Src, r32Dst;
    1713817151    float32_t f32Src;
    17139     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     17152    softfloat_state_t SoftState = iemSseRoundXXMxcsrAndImmToSoftState(*pfMxcsr, bImm);
     17153    bool fExact = !RT_BOOL(bImm & X86_SSE_ROUNDXX_IMM_PRECISION);
    1714017154
    1714117155    iemSsePrepareValueR32(&r32Src, *pfMxcsr, pr32Src);
    17142     f32Src = f32_roundToInt(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, true/*exact*/, &SoftState);
     17156    f32Src = f32_roundToInt(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, fExact, &SoftState);
    1714317157
    1714417158    iemFpSoftF32ToIprt(&r32Dst, f32Src);
     
    1714817162static RTFLOAT64U iemAImpl_round_worker_r64(uint32_t *pfMxcsr, PCRTFLOAT64U pr64Src, uint8_t bImm)
    1714917163{
    17150     RT_NOREF(bImm);
    1715117164    RTFLOAT64U r64Src, r64Dst;
    1715217165    float64_t f64Src;
    17153     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     17166    softfloat_state_t SoftState = iemSseRoundXXMxcsrAndImmToSoftState(*pfMxcsr, bImm);
     17167    bool fExact = !RT_BOOL(bImm & X86_SSE_ROUNDXX_IMM_PRECISION);
    1715417168
    1715517169    iemSsePrepareValueR64(&r64Src, *pfMxcsr, pr64Src);
    17156     f64Src = f64_roundToInt(iemFpSoftF64FromIprt(&r64Src), SoftState.roundingMode, true/*exact*/, &SoftState);
     17170    f64Src = f64_roundToInt(iemFpSoftF64FromIprt(&r64Src), SoftState.roundingMode, fExact, &SoftState);
    1715717171
    1715817172    iemFpSoftF64ToIprt(&r64Dst, f64Src);
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