VirtualBox

Changeset 40161 in vbox for trunk/src


Ignore:
Timestamp:
Feb 16, 2012 7:10:17 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76314
Message:

IEM: Debugged fdiv, hacked my way around shortcuts in the recompiler FPU implementation.

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

Legend:

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

    r40154 r40161  
    34933493        {
    34943494            /* No unmasked exceptions, just store the result. */
    3495             pCtx->fpu.FSW &= X86_FSW_TOP_MASK | X86_FSW_C0 | X86_FSW_C1 | X86_FSW_C2 | X86_FSW_C3;
    3496             pCtx->fpu.FSW |= (iNewTop << X86_FSW_TOP_SHIFT) | (pResult->FSW & ~(X86_FSW_TOP_MASK | X86_FSW_B | X86_FSW_ES));
     3495            pCtx->fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C0 | X86_FSW_C1 | X86_FSW_C2 | X86_FSW_C3);
     3496            pCtx->fpu.FSW |= pResult->FSW & ~(X86_FSW_TOP_MASK | X86_FSW_B | X86_FSW_ES);
     3497            pCtx->fpu.FSW |= iNewTop << X86_FSW_TOP_SHIFT;
    34973498            pCtx->fpu.FTW |= RT_BIT(iNewTop);
    34983499            pCtx->fpu.aRegs[7].r80 = pResult->r80Result;
     
    35073508    {
    35083509        /* Masked stack overflow. */
    3509         pCtx->fpu.FSW &= X86_FSW_TOP_MASK | X86_FSW_C0 | X86_FSW_C1 | X86_FSW_C2 | X86_FSW_C3;
     3510        pCtx->fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C0 | X86_FSW_C1 | X86_FSW_C2 | X86_FSW_C3);
    35103511        pCtx->fpu.FSW |= (iNewTop << X86_FSW_TOP_SHIFT) | X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF;
    35113512        pCtx->fpu.FTW |= RT_BIT(iNewTop);
     
    35153516    {
    35163517        /* Stack overflow exception. */
    3517         pCtx->fpu.FSW &= X86_FSW_C0 | X86_FSW_C1 | X86_FSW_C2 | X86_FSW_C3;
     3518        pCtx->fpu.FSW &= ~(X86_FSW_C0 | X86_FSW_C1 | X86_FSW_C2 | X86_FSW_C3);
    35183519        pCtx->fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
    35193520        return;
     
    35523553    Assert(iStReg < 8);
    35533554    uint16_t  iReg = (X86_FSW_TOP_GET(pCtx->fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;
    3554     pCtx->fpu.FSW &= X86_FSW_C_MASK;
     3555    pCtx->fpu.FSW &= ~X86_FSW_C_MASK;
    35553556    pCtx->fpu.FSW |= pResult->FSW & ~X86_FSW_TOP_MASK;
    35563557    pCtx->fpu.FTW |= RT_BIT(iReg);
     
    36013602    {
    36023603        /* Masked underflow. */
    3603         pCtx->fpu.FSW &= X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3;
     3604        pCtx->fpu.FSW &= ~(X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3);
    36043605        pCtx->fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF;
    36053606        pCtx->fpu.FTW |= RT_BIT(iReg);
     
    36083609    else
    36093610    {
    3610         pCtx->fpu.FSW &= X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3;
     3611        pCtx->fpu.FSW &= ~(X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3);
    36113612        pCtx->fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
    36123613    }
    36133614}
    36143615
    3615 static void iemFpuStackUnderflow(PIEMCPU pIemCpu, uint8_t iStReg)
     3616DECL_NO_INLINE(static, void) iemFpuStackUnderflow(PIEMCPU pIemCpu, uint8_t iStReg)
    36163617{
    36173618    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     
    36203621}
    36213622
    3622 static void iemFpuStackUnderflowWithMemOp(PIEMCPU pIemCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
     3623
     3624DECL_NO_INLINE(static, void)
     3625iemFpuStackUnderflowWithMemOp(PIEMCPU pIemCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    36233626{
    36243627    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     
    67526755        } while (0)
    67536756
     6757#if 1 /* The recompiler doesn't update these the intel way. */
     6758        pOrgCtx->fpu.FOP        = pDebugCtx->fpu.FOP;
     6759        pOrgCtx->fpu.FPUIP      = pDebugCtx->fpu.FPUIP;
     6760        pOrgCtx->fpu.CS         = pDebugCtx->fpu.CS;
     6761        pOrgCtx->fpu.Rsrvd1     = pDebugCtx->fpu.Rsrvd1;
     6762        pOrgCtx->fpu.FPUDP      = pDebugCtx->fpu.FPUDP;
     6763        pOrgCtx->fpu.DS         = pDebugCtx->fpu.DS;
     6764        pOrgCtx->fpu.Rsrvd2     = pDebugCtx->fpu.Rsrvd2;
     6765        pOrgCtx->fpu.MXCSR_MASK = pDebugCtx->fpu.MXCSR_MASK; /* only for the time being - old snapshots here. */
     6766        if ((pOrgCtx->fpu.FSW & X86_FSW_TOP_MASK) == (pDebugCtx->fpu.FSW & X86_FSW_TOP_MASK))
     6767            pOrgCtx->fpu.FSW = pDebugCtx->fpu.FSW;
     6768#endif
    67546769        if (memcmp(&pOrgCtx->fpu, &pDebugCtx->fpu, sizeof(pDebugCtx->fpu)))
    67556770        {
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r40143 r40161  
    12881288
    12891289;;
    1290 ; Initialize the FPU for x87 operation, loading the guest's status word.
    1291 ;
     1290; Initialize the FPU for the actual instruction being emulated, this means
     1291; loading parts of the guest's control word and status word.
     1292;
     1293; @uses     24 bytes of stack.
    12921294; @param    1       Expression giving the address of the FXSTATE of the guest.
    1293 %macro FPU_INIT 1
    1294         fninit
     1295;
     1296%macro FPU_LD_FXSTATE_FCW_AND_SAFE_FSW 1
     1297        fnstenv [xSP]
     1298
     1299        ; FCW - for exception, precision and rounding control.
    12951300        movzx   T0, word [%1 + X86FXSTATE.FCW]
    12961301        and     T0, X86_FCW_MASK_ALL | X86_FCW_PC_MASK | X86_FCW_RC_MASK
    1297         mov     [xSP], T0
    1298         fldcw   [xSP]
     1302        mov     [xSP + X86FSTENV32P.FCW], T0_16
     1303
     1304        ; FSW - for undefined C0, C1, C2, and C3.
     1305        movzx   T1, word [%1 + X86FXSTATE.FSW]
     1306        and     T1, X86_FSW_C_MASK
     1307        movzx   T0, word [xSP + X86FSTENV32P.FSW]
     1308        and     T0, X86_FSW_TOP_MASK
     1309        or      T0, T1
     1310        mov     [xSP + X86FSTENV32P.FSW], T0_16
     1311
     1312        fldenv  [xSP]
    12991313%endmacro
     1314
    13001315
    13011316;;
     
    13651380        sub     xSP, 20h
    13661381
    1367         FPU_INIT A0
     1382        fninit
     1383        fld     tword [A2]
     1384        FPU_LD_FXSTATE_FCW_AND_SAFE_FSW A0
    13681385        fdiv    qword [A3]
    13691386
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette