Commit c1241c4c authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Russell King

[PATCH] ARM: 2722/1: remove reliance on udivdi3 for nwfpe

Patch from Nicolas Pitre
Signed-off-by: default avatarNicolas Pitre <nico@cam.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent bf1b8ab6
...@@ -563,8 +563,14 @@ static bits64 estimateDiv128To64( bits64 a0, bits64 a1, bits64 b ) ...@@ -563,8 +563,14 @@ static bits64 estimateDiv128To64( bits64 a0, bits64 a1, bits64 b )
bits64 rem0, rem1, term0, term1; bits64 rem0, rem1, term0, term1;
bits64 z; bits64 z;
if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF ); if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF );
b0 = b>>32; b0 = b>>32; /* hence b0 is 32 bits wide now */
z = ( b0<<32 <= a0 ) ? LIT64( 0xFFFFFFFF00000000 ) : ( a0 / b0 )<<32; if ( b0<<32 <= a0 ) {
z = LIT64( 0xFFFFFFFF00000000 );
} else {
z = a0;
do_div( z, b0 );
z <<= 32;
}
mul64To128( b, z, &term0, &term1 ); mul64To128( b, z, &term0, &term1 );
sub128( a0, a1, term0, term1, &rem0, &rem1 ); sub128( a0, a1, term0, term1, &rem0, &rem1 );
while ( ( (sbits64) rem0 ) < 0 ) { while ( ( (sbits64) rem0 ) < 0 ) {
...@@ -573,7 +579,12 @@ static bits64 estimateDiv128To64( bits64 a0, bits64 a1, bits64 b ) ...@@ -573,7 +579,12 @@ static bits64 estimateDiv128To64( bits64 a0, bits64 a1, bits64 b )
add128( rem0, rem1, b0, b1, &rem0, &rem1 ); add128( rem0, rem1, b0, b1, &rem0, &rem1 );
} }
rem0 = ( rem0<<32 ) | ( rem1>>32 ); rem0 = ( rem0<<32 ) | ( rem1>>32 );
z |= ( b0<<32 <= rem0 ) ? 0xFFFFFFFF : rem0 / b0; if ( b0<<32 <= rem0 ) {
z |= 0xFFFFFFFF;
} else {
do_div( rem0, b0 );
z |= rem0;
}
return z; return z;
} }
...@@ -601,6 +612,7 @@ static bits32 estimateSqrt32( int16 aExp, bits32 a ) ...@@ -601,6 +612,7 @@ static bits32 estimateSqrt32( int16 aExp, bits32 a )
}; };
int8 index; int8 index;
bits32 z; bits32 z;
bits64 A;
index = ( a>>27 ) & 15; index = ( a>>27 ) & 15;
if ( aExp & 1 ) { if ( aExp & 1 ) {
...@@ -614,7 +626,9 @@ static bits32 estimateSqrt32( int16 aExp, bits32 a ) ...@@ -614,7 +626,9 @@ static bits32 estimateSqrt32( int16 aExp, bits32 a )
z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 ); z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 );
if ( z <= a ) return (bits32) ( ( (sbits32) a )>>1 ); if ( z <= a ) return (bits32) ( ( (sbits32) a )>>1 );
} }
return ( (bits32) ( ( ( (bits64) a )<<31 ) / z ) ) + ( z>>1 ); A = ( (bits64) a )<<31;
do_div( A, z );
return ( (bits32) A ) + ( z>>1 );
} }
......
...@@ -28,6 +28,8 @@ this code that are retained. ...@@ -28,6 +28,8 @@ this code that are retained.
=============================================================================== ===============================================================================
*/ */
#include <asm/div64.h>
#include "fpa11.h" #include "fpa11.h"
//#include "milieu.h" //#include "milieu.h"
//#include "softfloat.h" //#include "softfloat.h"
...@@ -1331,7 +1333,11 @@ float32 float32_div( float32 a, float32 b ) ...@@ -1331,7 +1333,11 @@ float32 float32_div( float32 a, float32 b )
aSig >>= 1; aSig >>= 1;
++zExp; ++zExp;
} }
zSig = ( ( (bits64) aSig )<<32 ) / bSig; {
bits64 tmp = ( (bits64) aSig )<<32;
do_div( tmp, bSig );
zSig = tmp;
}
if ( ( zSig & 0x3F ) == 0 ) { if ( ( zSig & 0x3F ) == 0 ) {
zSig |= ( ( (bits64) bSig ) * zSig != ( (bits64) aSig )<<32 ); zSig |= ( ( (bits64) bSig ) * zSig != ( (bits64) aSig )<<32 );
} }
...@@ -1397,7 +1403,9 @@ float32 float32_rem( float32 a, float32 b ) ...@@ -1397,7 +1403,9 @@ float32 float32_rem( float32 a, float32 b )
q = ( bSig <= aSig ); q = ( bSig <= aSig );
if ( q ) aSig -= bSig; if ( q ) aSig -= bSig;
if ( 0 < expDiff ) { if ( 0 < expDiff ) {
q = ( ( (bits64) aSig )<<32 ) / bSig; bits64 tmp = ( (bits64) aSig )<<32;
do_div( tmp, bSig );
q = tmp;
q >>= 32 - expDiff; q >>= 32 - expDiff;
bSig >>= 2; bSig >>= 2;
aSig = ( ( aSig>>1 )<<( expDiff - 1 ) ) - bSig * q; aSig = ( ( aSig>>1 )<<( expDiff - 1 ) ) - bSig * q;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment