aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2005-06-23 16:56:46 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2005-06-23 16:56:46 -0400
commitc1241c4c3a1507d76c7b987130f2f02f53ecc09f (patch)
tree8b34e8bd30c94c279a3cdabf8b13e05d1ef3dc77
parentbf1b8ab6f21e1adbab1abd1b4e71c35fe65dc5fe (diff)
[PATCH] ARM: 2722/1: remove reliance on udivdi3 for nwfpe
Patch from Nicolas Pitre Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--arch/arm/nwfpe/softfloat-macros22
-rw-r--r--arch/arm/nwfpe/softfloat.c12
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;