Author: aandrejevic
Date: Tue May 19 02:37:17 2015
New Revision: 67827
URL:
http://svn.reactos.org/svn/reactos?rev=67827&view=rev
Log:
[FAST486]
Fix UnsignedDivMod128 (again).
Fix Fast486FpuAdd to handle numbers whose difference of exponents is greater than
the number of bits in the mantissa.
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=6782…
==============================================================================
--- trunk/reactos/lib/fast486/fpu.c [iso-8859-1] (original)
+++ trunk/reactos/lib/fast486/fpu.c [iso-8859-1] Tue May 19 02:37:17 2015
@@ -204,8 +204,15 @@
* divisor has more than the original divisor
*/
Bits = CountLeadingZeros64(Divisor);
- if (CurrentHigh > 0ULL) Bits -= CountLeadingZeros64(CurrentHigh);
+ if (CurrentHigh > 0ULL) Bits += 64 - CountLeadingZeros64(CurrentHigh);
else Bits -= CountLeadingZeros64(CurrentLow);
+
+ if (Bits >= 64)
+ {
+ *QuotientHigh = *QuotientLow;
+ *QuotientLow = 0ULL;
+ Bits -= 64;
+ }
if (Bits)
{
@@ -635,15 +642,33 @@
/* Adjust the first operand to it... */
if (FirstAdjusted.Exponent < TempResult.Exponent)
{
- FirstAdjusted.Mantissa >>= (TempResult.Exponent - FirstAdjusted.Exponent);
- FirstAdjusted.Exponent = TempResult.Exponent;
+ if ((TempResult.Exponent - FirstAdjusted.Exponent) < 64)
+ {
+ FirstAdjusted.Mantissa >>= (TempResult.Exponent -
FirstAdjusted.Exponent);
+ FirstAdjusted.Exponent = TempResult.Exponent;
+ }
+ else
+ {
+ /* The second operand is the result */
+ *Result = *SecondOperand;
+ return TRUE;
+ }
}
/* ... and the second one too */
if (SecondAdjusted.Exponent < TempResult.Exponent)
{
- SecondAdjusted.Mantissa >>= (TempResult.Exponent -
SecondAdjusted.Exponent);
- SecondAdjusted.Exponent = TempResult.Exponent;
+ if ((TempResult.Exponent - FirstAdjusted.Exponent) < 64)
+ {
+ SecondAdjusted.Mantissa >>= (TempResult.Exponent -
SecondAdjusted.Exponent);
+ SecondAdjusted.Exponent = TempResult.Exponent;
+ }
+ else
+ {
+ /* The first operand is the result */
+ *Result = *FirstOperand;
+ return TRUE;
+ }
}
if (FirstAdjusted.Sign == SecondAdjusted.Sign)