diff options
Diffstat (limited to 'arch/arm/nwfpe')
-rw-r--r-- | arch/arm/nwfpe/softfloat-macros | 22 | ||||
-rw-r--r-- | arch/arm/nwfpe/softfloat.c | 12 |
2 files changed, 28 insertions, 6 deletions
diff --git a/arch/arm/nwfpe/softfloat-macros b/arch/arm/nwfpe/softfloat-macros index 5469989f2c5e..5a060f95a58f 100644 --- a/arch/arm/nwfpe/softfloat-macros +++ b/arch/arm/nwfpe/softfloat-macros | |||
@@ -563,8 +563,14 @@ static bits64 estimateDiv128To64( bits64 a0, bits64 a1, bits64 b ) | |||
563 | bits64 rem0, rem1, term0, term1; | 563 | bits64 rem0, rem1, term0, term1; |
564 | bits64 z; | 564 | bits64 z; |
565 | if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF ); | 565 | if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF ); |
566 | b0 = b>>32; | 566 | b0 = b>>32; /* hence b0 is 32 bits wide now */ |
567 | z = ( b0<<32 <= a0 ) ? LIT64( 0xFFFFFFFF00000000 ) : ( a0 / b0 )<<32; | 567 | if ( b0<<32 <= a0 ) { |
568 | z = LIT64( 0xFFFFFFFF00000000 ); | ||
569 | } else { | ||
570 | z = a0; | ||
571 | do_div( z, b0 ); | ||
572 | z <<= 32; | ||
573 | } | ||
568 | mul64To128( b, z, &term0, &term1 ); | 574 | mul64To128( b, z, &term0, &term1 ); |
569 | sub128( a0, a1, term0, term1, &rem0, &rem1 ); | 575 | sub128( a0, a1, term0, term1, &rem0, &rem1 ); |
570 | while ( ( (sbits64) rem0 ) < 0 ) { | 576 | while ( ( (sbits64) rem0 ) < 0 ) { |
@@ -573,7 +579,12 @@ static bits64 estimateDiv128To64( bits64 a0, bits64 a1, bits64 b ) | |||
573 | add128( rem0, rem1, b0, b1, &rem0, &rem1 ); | 579 | add128( rem0, rem1, b0, b1, &rem0, &rem1 ); |
574 | } | 580 | } |
575 | rem0 = ( rem0<<32 ) | ( rem1>>32 ); | 581 | rem0 = ( rem0<<32 ) | ( rem1>>32 ); |
576 | z |= ( b0<<32 <= rem0 ) ? 0xFFFFFFFF : rem0 / b0; | 582 | if ( b0<<32 <= rem0 ) { |
583 | z |= 0xFFFFFFFF; | ||
584 | } else { | ||
585 | do_div( rem0, b0 ); | ||
586 | z |= rem0; | ||
587 | } | ||
577 | return z; | 588 | return z; |
578 | 589 | ||
579 | } | 590 | } |
@@ -601,6 +612,7 @@ static bits32 estimateSqrt32( int16 aExp, bits32 a ) | |||
601 | }; | 612 | }; |
602 | int8 index; | 613 | int8 index; |
603 | bits32 z; | 614 | bits32 z; |
615 | bits64 A; | ||
604 | 616 | ||
605 | index = ( a>>27 ) & 15; | 617 | index = ( a>>27 ) & 15; |
606 | if ( aExp & 1 ) { | 618 | if ( aExp & 1 ) { |
@@ -614,7 +626,9 @@ static bits32 estimateSqrt32( int16 aExp, bits32 a ) | |||
614 | z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 ); | 626 | z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 ); |
615 | if ( z <= a ) return (bits32) ( ( (sbits32) a )>>1 ); | 627 | if ( z <= a ) return (bits32) ( ( (sbits32) a )>>1 ); |
616 | } | 628 | } |
617 | return ( (bits32) ( ( ( (bits64) a )<<31 ) / z ) ) + ( z>>1 ); | 629 | A = ( (bits64) a )<<31; |
630 | do_div( A, z ); | ||
631 | return ( (bits32) A ) + ( z>>1 ); | ||
618 | 632 | ||
619 | } | 633 | } |
620 | 634 | ||
diff --git a/arch/arm/nwfpe/softfloat.c b/arch/arm/nwfpe/softfloat.c index 9d743ae29062..e038dd3be9b3 100644 --- a/arch/arm/nwfpe/softfloat.c +++ b/arch/arm/nwfpe/softfloat.c | |||
@@ -28,6 +28,8 @@ this code that are retained. | |||
28 | =============================================================================== | 28 | =============================================================================== |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include <asm/div64.h> | ||
32 | |||
31 | #include "fpa11.h" | 33 | #include "fpa11.h" |
32 | //#include "milieu.h" | 34 | //#include "milieu.h" |
33 | //#include "softfloat.h" | 35 | //#include "softfloat.h" |
@@ -1331,7 +1333,11 @@ float32 float32_div( float32 a, float32 b ) | |||
1331 | aSig >>= 1; | 1333 | aSig >>= 1; |
1332 | ++zExp; | 1334 | ++zExp; |
1333 | } | 1335 | } |
1334 | zSig = ( ( (bits64) aSig )<<32 ) / bSig; | 1336 | { |
1337 | bits64 tmp = ( (bits64) aSig )<<32; | ||
1338 | do_div( tmp, bSig ); | ||
1339 | zSig = tmp; | ||
1340 | } | ||
1335 | if ( ( zSig & 0x3F ) == 0 ) { | 1341 | if ( ( zSig & 0x3F ) == 0 ) { |
1336 | zSig |= ( ( (bits64) bSig ) * zSig != ( (bits64) aSig )<<32 ); | 1342 | zSig |= ( ( (bits64) bSig ) * zSig != ( (bits64) aSig )<<32 ); |
1337 | } | 1343 | } |
@@ -1397,7 +1403,9 @@ float32 float32_rem( float32 a, float32 b ) | |||
1397 | q = ( bSig <= aSig ); | 1403 | q = ( bSig <= aSig ); |
1398 | if ( q ) aSig -= bSig; | 1404 | if ( q ) aSig -= bSig; |
1399 | if ( 0 < expDiff ) { | 1405 | if ( 0 < expDiff ) { |
1400 | q = ( ( (bits64) aSig )<<32 ) / bSig; | 1406 | bits64 tmp = ( (bits64) aSig )<<32; |
1407 | do_div( tmp, bSig ); | ||
1408 | q = tmp; | ||
1401 | q >>= 32 - expDiff; | 1409 | q >>= 32 - expDiff; |
1402 | bSig >>= 2; | 1410 | bSig >>= 2; |
1403 | aSig = ( ( aSig>>1 )<<( expDiff - 1 ) ) - bSig * q; | 1411 | aSig = ( ( aSig>>1 )<<( expDiff - 1 ) ) - bSig * q; |