Author: aandrejevic Date: Tue May 19 16:57:46 2015 New Revision: 67828
URL: http://svn.reactos.org/svn/reactos?rev=67828&view=rev Log: [FAST486] Fix Fast486FpuArithmeticOperation. It doesn't really matter for the operation itself which operand is the source/destination, because the FPU actually always performs the operation on ST0 and something else. So, FDIV/FDIVR were never really reversed here, it's just that FDIV always divides ST0 by something and FDIVR always divides something by ST0.
Modified: trunk/reactos/lib/fast486/fpu.c
Modified: trunk/reactos/lib/fast486/fpu.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fast486/fpu.c?rev=67828... ============================================================================== --- trunk/reactos/lib/fast486/fpu.c [iso-8859-1] (original) +++ trunk/reactos/lib/fast486/fpu.c [iso-8859-1] Tue May 19 16:57:46 2015 @@ -1273,9 +1273,11 @@ static inline VOID FASTCALL Fast486FpuArithmeticOperation(PFAST486_STATE State, INT Operation, - PFAST486_FPU_DATA_REG SourceOperand, - PFAST486_FPU_DATA_REG DestOperand) + PFAST486_FPU_DATA_REG Operand, + BOOLEAN TopDestination) { + PFAST486_FPU_DATA_REG DestOperand = TopDestination ? &FPU_ST(0) : Operand; + ASSERT(!(Operation & ~7));
/* Check the operation */ @@ -1284,14 +1286,14 @@ /* FADD */ case 0: { - Fast486FpuAdd(State, DestOperand, SourceOperand, DestOperand); + Fast486FpuAdd(State, &FPU_ST(0), Operand, DestOperand); break; }
/* FMUL */ case 1: { - Fast486FpuMultiply(State, DestOperand, SourceOperand, DestOperand); + Fast486FpuMultiply(State, &FPU_ST(0), Operand, DestOperand); break; }
@@ -1300,7 +1302,7 @@ /* FCOMP */ case 3: { - Fast486FpuCompare(State, DestOperand, SourceOperand); + Fast486FpuCompare(State, &FPU_ST(0), Operand); if (Operation == 3) Fast486FpuPop(State);
break; @@ -1309,28 +1311,28 @@ /* FSUB */ case 4: { - Fast486FpuSubtract(State, DestOperand, SourceOperand, DestOperand); + Fast486FpuSubtract(State, &FPU_ST(0), Operand, DestOperand); break; }
/* FSUBR */ case 5: { - Fast486FpuSubtract(State, SourceOperand, DestOperand, DestOperand); + Fast486FpuSubtract(State, Operand, &FPU_ST(0), DestOperand); break; }
/* FDIV */ case 6: { - Fast486FpuDivide(State, SourceOperand, DestOperand, DestOperand); + Fast486FpuDivide(State, &FPU_ST(0), Operand, DestOperand); break; }
/* FDIVR */ case 7: { - Fast486FpuDivide(State, DestOperand, SourceOperand, DestOperand); + Fast486FpuDivide(State, Operand, &FPU_ST(0), DestOperand); break; } } @@ -1425,7 +1427,7 @@ FAST486_MOD_REG_RM ModRegRm; BOOLEAN AddressSize = State->SegmentRegs[FAST486_REG_CS].Size; #ifndef FAST486_NO_FPU - PFAST486_FPU_DATA_REG SourceOperand, DestOperand; + PFAST486_FPU_DATA_REG Operand; FAST486_FPU_DATA_REG MemoryData; #endif
@@ -1444,9 +1446,6 @@
FPU_SAVE_LAST_INST();
- /* The destination operand is ST0 */ - DestOperand = &FPU_ST(0); - if (FPU_GET_TAG(0) == FPU_TAG_EMPTY) { /* Raise the invalid operation exception */ @@ -1455,9 +1454,9 @@ if (State->FpuControl.Im) { /* Return the indefinite NaN */ - DestOperand->Sign = TRUE; - DestOperand->Exponent = FPU_MAX_EXPONENT + 1; - DestOperand->Mantissa = FPU_INDEFINITE_MANTISSA; + FPU_ST(0).Sign = TRUE; + FPU_ST(0).Exponent = FPU_MAX_EXPONENT + 1; + FPU_ST(0).Mantissa = FPU_INDEFINITE_MANTISSA;
FPU_SET_TAG(0, FPU_TAG_SPECIAL); } @@ -1478,7 +1477,7 @@ }
Fast486FpuFromSingleReal(State, Value, &MemoryData); - SourceOperand = &MemoryData; + Operand = &MemoryData;
FPU_SAVE_LAST_OPERAND(); } @@ -1492,9 +1491,9 @@ if (State->FpuControl.Im) { /* Return the indefinite NaN */ - DestOperand->Sign = TRUE; - DestOperand->Exponent = FPU_MAX_EXPONENT + 1; - DestOperand->Mantissa = FPU_INDEFINITE_MANTISSA; + FPU_ST(0).Sign = TRUE; + FPU_ST(0).Exponent = FPU_MAX_EXPONENT + 1; + FPU_ST(0).Mantissa = FPU_INDEFINITE_MANTISSA;
FPU_SET_TAG(0, FPU_TAG_SPECIAL); } @@ -1504,11 +1503,11 @@ }
/* Load the source operand from an FPU register */ - SourceOperand = &FPU_ST(ModRegRm.SecondRegister); + Operand = &FPU_ST(ModRegRm.SecondRegister); }
/* Perform the requested operation */ - Fast486FpuArithmeticOperation(State, ModRegRm.Register, SourceOperand, DestOperand); + Fast486FpuArithmeticOperation(State, ModRegRm.Register, Operand, TRUE);
#endif } @@ -2291,7 +2290,6 @@ FAST486_MOD_REG_RM ModRegRm; BOOLEAN AddressSize = State->SegmentRegs[FAST486_REG_CS].Size; #ifndef FAST486_NO_FPU - PFAST486_FPU_DATA_REG SourceOperand, DestOperand; LONG Value; FAST486_FPU_DATA_REG MemoryData; #endif @@ -2348,9 +2346,6 @@ return; }
- /* The destination operand is always ST0 */ - DestOperand = &FPU_ST(0); - if (FPU_GET_TAG(0) == FPU_TAG_EMPTY) { /* Raise the invalid operation exception */ @@ -2359,9 +2354,9 @@ if (State->FpuControl.Im) { /* Return the indefinite NaN */ - DestOperand->Sign = TRUE; - DestOperand->Exponent = FPU_MAX_EXPONENT + 1; - DestOperand->Mantissa = FPU_INDEFINITE_MANTISSA; + FPU_ST(0).Sign = TRUE; + FPU_ST(0).Exponent = FPU_MAX_EXPONENT + 1; + FPU_ST(0).Mantissa = FPU_INDEFINITE_MANTISSA;
FPU_SET_TAG(0, FPU_TAG_SPECIAL); } @@ -2371,10 +2366,9 @@ }
Fast486FpuFromInteger(State, (LONGLONG)Value, &MemoryData); - SourceOperand = &MemoryData;
/* Perform the requested operation */ - Fast486FpuArithmeticOperation(State, ModRegRm.Register, SourceOperand, DestOperand); + Fast486FpuArithmeticOperation(State, ModRegRm.Register, &MemoryData, TRUE);
#endif } @@ -2614,7 +2608,7 @@ FAST486_MOD_REG_RM ModRegRm; BOOLEAN AddressSize = State->SegmentRegs[FAST486_REG_CS].Size; #ifndef FAST486_NO_FPU - PFAST486_FPU_DATA_REG SourceOperand, DestOperand; + PFAST486_FPU_DATA_REG Operand; FAST486_FPU_DATA_REG MemoryData; #endif
@@ -2637,9 +2631,6 @@ { ULONGLONG Value;
- /* The destination operand is ST0 */ - DestOperand = &FPU_ST(0); - if (FPU_GET_TAG(0) == FPU_TAG_EMPTY) { /* Raise the invalid operation exception */ @@ -2648,9 +2639,9 @@ if (State->FpuControl.Im) { /* Return the indefinite NaN */ - DestOperand->Sign = TRUE; - DestOperand->Exponent = FPU_MAX_EXPONENT + 1; - DestOperand->Mantissa = FPU_INDEFINITE_MANTISSA; + FPU_ST(0).Sign = TRUE; + FPU_ST(0).Exponent = FPU_MAX_EXPONENT + 1; + FPU_ST(0).Mantissa = FPU_INDEFINITE_MANTISSA;
FPU_SET_TAG(0, FPU_TAG_SPECIAL); } @@ -2673,17 +2664,14 @@ }
Fast486FpuFromDoubleReal(State, Value, &MemoryData); - SourceOperand = &MemoryData; + Operand = &MemoryData;
FPU_SAVE_LAST_OPERAND(); } else { - /* The source operand is ST0 */ - SourceOperand = &FPU_ST(0); - /* Load the destination operand from an FPU register */ - DestOperand = &FPU_ST(ModRegRm.SecondRegister); + Operand = &FPU_ST(ModRegRm.SecondRegister);
if ((FPU_GET_TAG(0) == FPU_TAG_EMPTY) || (FPU_GET_TAG(ModRegRm.SecondRegister) == FPU_TAG_EMPTY)) @@ -2694,9 +2682,9 @@ if (State->FpuControl.Im) { /* Return the indefinite NaN */ - DestOperand->Sign = TRUE; - DestOperand->Exponent = FPU_MAX_EXPONENT + 1; - DestOperand->Mantissa = FPU_INDEFINITE_MANTISSA; + Operand->Sign = TRUE; + Operand->Exponent = FPU_MAX_EXPONENT + 1; + Operand->Mantissa = FPU_INDEFINITE_MANTISSA;
FPU_SET_TAG(ModRegRm.SecondRegister, FPU_TAG_SPECIAL); } @@ -2707,7 +2695,7 @@ }
/* Perform the requested operation */ - Fast486FpuArithmeticOperation(State, ModRegRm.Register, SourceOperand, DestOperand); + Fast486FpuArithmeticOperation(State, ModRegRm.Register, Operand, ModRegRm.Memory);
#endif } @@ -2992,7 +2980,7 @@ FAST486_MOD_REG_RM ModRegRm; BOOLEAN AddressSize = State->SegmentRegs[FAST486_REG_CS].Size; #ifndef FAST486_NO_FPU - PFAST486_FPU_DATA_REG SourceOperand, DestOperand; + PFAST486_FPU_DATA_REG Operand; FAST486_FPU_DATA_REG MemoryData; #endif
@@ -3015,9 +3003,6 @@ { SHORT Value;
- /* The destination operand is ST0 */ - DestOperand = &FPU_ST(0); - if (FPU_GET_TAG(0) == FPU_TAG_EMPTY) { /* Raise the invalid operation exception */ @@ -3026,9 +3011,9 @@ if (State->FpuControl.Im) { /* Return the indefinite NaN */ - DestOperand->Sign = TRUE; - DestOperand->Exponent = FPU_MAX_EXPONENT + 1; - DestOperand->Mantissa = FPU_INDEFINITE_MANTISSA; + FPU_ST(0).Sign = TRUE; + FPU_ST(0).Exponent = FPU_MAX_EXPONENT + 1; + FPU_ST(0).Mantissa = FPU_INDEFINITE_MANTISSA;
FPU_SET_TAG(0, FPU_TAG_SPECIAL); } @@ -3045,7 +3030,7 @@ }
Fast486FpuFromInteger(State, (LONGLONG)Value, &MemoryData); - SourceOperand = &MemoryData; + Operand = &MemoryData;
FPU_SAVE_LAST_OPERAND(); } @@ -3059,11 +3044,8 @@ return; }
- /* The source operand is ST0 */ - SourceOperand = &FPU_ST(0); - /* Load the destination operand from a register */ - DestOperand = &FPU_ST(ModRegRm.SecondRegister); + Operand = &FPU_ST(ModRegRm.SecondRegister);
if ((FPU_GET_TAG(0) == FPU_TAG_EMPTY) || (FPU_GET_TAG(ModRegRm.SecondRegister) == FPU_TAG_EMPTY)) @@ -3077,7 +3059,7 @@ }
/* Perform the requested operation */ - Fast486FpuArithmeticOperation(State, ModRegRm.Register, SourceOperand, DestOperand); + Fast486FpuArithmeticOperation(State, ModRegRm.Register, Operand, ModRegRm.Memory); if (!ModRegRm.Memory) Fast486FpuPop(State);
#endif