softfloat: Use mulu64 for mul64To128
Via host-utils.h, we use a host widening multiply for 64-bit hosts, and a common subroutine for 32-bit hosts. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: David Hildenbrand <david@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
dedd123c56
commit
b4d09b1794
@ -470,27 +470,10 @@ static inline void sub192(uint64_t a0, uint64_t a1, uint64_t a2,
|
|||||||
| `z0Ptr' and `z1Ptr'.
|
| `z0Ptr' and `z1Ptr'.
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static inline void mul64To128( uint64_t a, uint64_t b, uint64_t *z0Ptr, uint64_t *z1Ptr )
|
static inline void
|
||||||
|
mul64To128(uint64_t a, uint64_t b, uint64_t *z0Ptr, uint64_t *z1Ptr)
|
||||||
{
|
{
|
||||||
uint32_t aHigh, aLow, bHigh, bLow;
|
mulu64(z1Ptr, z0Ptr, a, b);
|
||||||
uint64_t z0, zMiddleA, zMiddleB, z1;
|
|
||||||
|
|
||||||
aLow = a;
|
|
||||||
aHigh = a>>32;
|
|
||||||
bLow = b;
|
|
||||||
bHigh = b>>32;
|
|
||||||
z1 = ( (uint64_t) aLow ) * bLow;
|
|
||||||
zMiddleA = ( (uint64_t) aLow ) * bHigh;
|
|
||||||
zMiddleB = ( (uint64_t) aHigh ) * bLow;
|
|
||||||
z0 = ( (uint64_t) aHigh ) * bHigh;
|
|
||||||
zMiddleA += zMiddleB;
|
|
||||||
z0 += ( ( (uint64_t) ( zMiddleA < zMiddleB ) )<<32 ) + ( zMiddleA>>32 );
|
|
||||||
zMiddleA <<= 32;
|
|
||||||
z1 += zMiddleA;
|
|
||||||
z0 += ( z1 < zMiddleA );
|
|
||||||
*z1Ptr = z1;
|
|
||||||
*z0Ptr = z0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user