|
|
|
@ -69,13 +69,15 @@ |
|
|
|
|
|
|
|
|
|
/* transfer sign, leaving a positive number; */ |
|
|
|
|
/* we need an unsigned value to safely negate INT_MIN (or LONG_MIN) */ |
|
|
|
|
#define FT_MOVE_SIGN( x, x_unsigned, s ) \ |
|
|
|
|
FT_BEGIN_STMNT \
|
|
|
|
|
if ( x < 0 ) \
|
|
|
|
|
{ \
|
|
|
|
|
x_unsigned = 0U - (x_unsigned); \
|
|
|
|
|
s = -s; \
|
|
|
|
|
} \
|
|
|
|
|
#define FT_MOVE_SIGN( utype, x, x_unsigned, s ) \ |
|
|
|
|
FT_BEGIN_STMNT \
|
|
|
|
|
if ( x < 0 ) \
|
|
|
|
|
{ \
|
|
|
|
|
x_unsigned = 0U - (utype)x; \
|
|
|
|
|
s = -s; \
|
|
|
|
|
} \
|
|
|
|
|
else \
|
|
|
|
|
x_unsigned = (utype)x; \
|
|
|
|
|
FT_END_STMNT |
|
|
|
|
|
|
|
|
|
/* The following three functions are available regardless of whether */ |
|
|
|
@ -179,13 +181,9 @@ |
|
|
|
|
FT_Long d_; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a = (FT_UInt64)a_; |
|
|
|
|
b = (FT_UInt64)b_; |
|
|
|
|
c = (FT_UInt64)c_; |
|
|
|
|
|
|
|
|
|
FT_MOVE_SIGN( a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( c_, c, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt64, a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt64, b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt64, c_, c, s ); |
|
|
|
|
|
|
|
|
|
d = c > 0 ? ( a * b + ( c >> 1 ) ) / c |
|
|
|
|
: 0x7FFFFFFFUL; |
|
|
|
@ -208,13 +206,9 @@ |
|
|
|
|
FT_Long d_; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a = (FT_UInt64)a_; |
|
|
|
|
b = (FT_UInt64)b_; |
|
|
|
|
c = (FT_UInt64)c_; |
|
|
|
|
|
|
|
|
|
FT_MOVE_SIGN( a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( c_, c, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt64, a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt64, b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt64, c_, c, s ); |
|
|
|
|
|
|
|
|
|
d = c > 0 ? a * b / c |
|
|
|
|
: 0x7FFFFFFFUL; |
|
|
|
@ -257,11 +251,8 @@ |
|
|
|
|
FT_Long q_; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a = (FT_UInt64)a_; |
|
|
|
|
b = (FT_UInt64)b_; |
|
|
|
|
|
|
|
|
|
FT_MOVE_SIGN( a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt64, a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt64, b_, b, s ); |
|
|
|
|
|
|
|
|
|
q = b > 0 ? ( ( a << 16 ) + ( b >> 1 ) ) / b |
|
|
|
|
: 0x7FFFFFFFUL; |
|
|
|
@ -422,13 +413,9 @@ |
|
|
|
|
|
|
|
|
|
/* XXX: this function does not allow 64-bit arguments */ |
|
|
|
|
|
|
|
|
|
a = (FT_UInt32)a_; |
|
|
|
|
b = (FT_UInt32)b_; |
|
|
|
|
c = (FT_UInt32)c_; |
|
|
|
|
|
|
|
|
|
FT_MOVE_SIGN( a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( c_, c, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, c_, c, s ); |
|
|
|
|
|
|
|
|
|
if ( c == 0 ) |
|
|
|
|
a = 0x7FFFFFFFUL; |
|
|
|
@ -470,13 +457,9 @@ |
|
|
|
|
|
|
|
|
|
/* XXX: this function does not allow 64-bit arguments */ |
|
|
|
|
|
|
|
|
|
a = (FT_UInt32)a_; |
|
|
|
|
b = (FT_UInt32)b_; |
|
|
|
|
c = (FT_UInt32)c_; |
|
|
|
|
|
|
|
|
|
FT_MOVE_SIGN( a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( c_, c, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, c_, c, s ); |
|
|
|
|
|
|
|
|
|
if ( c == 0 ) |
|
|
|
|
a = 0x7FFFFFFFUL; |
|
|
|
@ -575,11 +558,8 @@ |
|
|
|
|
|
|
|
|
|
/* XXX: this function does not allow 64-bit arguments */ |
|
|
|
|
|
|
|
|
|
a = (FT_UInt32)a_; |
|
|
|
|
b = (FT_UInt32)b_; |
|
|
|
|
|
|
|
|
|
FT_MOVE_SIGN( a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, b_, b, s ); |
|
|
|
|
|
|
|
|
|
if ( a + ( b >> 8 ) <= 8190UL ) |
|
|
|
|
a = ( a * b + 0x8000UL ) >> 16; |
|
|
|
@ -614,11 +594,8 @@ |
|
|
|
|
|
|
|
|
|
/* XXX: this function does not allow 64-bit arguments */ |
|
|
|
|
|
|
|
|
|
a = (FT_UInt32)a_; |
|
|
|
|
b = (FT_UInt32)b_; |
|
|
|
|
|
|
|
|
|
FT_MOVE_SIGN( a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( b_, b, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, a_, a, s ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, b_, b, s ); |
|
|
|
|
|
|
|
|
|
if ( b == 0 ) |
|
|
|
|
{ |
|
|
|
@ -829,11 +806,8 @@ |
|
|
|
|
FT_Int sx = 1, sy = 1, shift; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x = (FT_UInt32)x_; |
|
|
|
|
y = (FT_UInt32)y_; |
|
|
|
|
|
|
|
|
|
FT_MOVE_SIGN( x_, x, sx ); |
|
|
|
|
FT_MOVE_SIGN( y_, y, sy ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, x_, x, sx ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, y_, y, sy ); |
|
|
|
|
|
|
|
|
|
/* trivial cases */ |
|
|
|
|
if ( x == 0 ) |
|
|
|
@ -1122,11 +1096,8 @@ |
|
|
|
|
FT_UInt32 factor; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scalar = (FT_UInt32)s[i]; |
|
|
|
|
factor = (FT_UInt32)f[i]; |
|
|
|
|
|
|
|
|
|
FT_MOVE_SIGN( s[i], scalar, sign ); |
|
|
|
|
FT_MOVE_SIGN( f[i], factor, sign ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, s[i], scalar, sign ); |
|
|
|
|
FT_MOVE_SIGN( FT_UInt32, f[i], factor, sign ); |
|
|
|
|
|
|
|
|
|
ft_multo64( scalar, factor, &multResult ); |
|
|
|
|
|
|
|
|
|