ref: 7abdb8cceab1b8855548548c16e0ecc2136c3c33
parent: c0ce72a6de47e481b3b360101073327bed7d1dc2
author: Alexei Podtelezhnikov <[email protected]>
date: Thu Oct 2 19:13:33 EDT 2014
[base] Significant optimization of `ft_div64by32' We shift as many bits as we can into the high register, perform 32-bit division with modulo there, then work through the remaining bits with long division. This optimization is especially noticeable for smaller dividends that barely use the high register. * src/base/ftcalc.c (ft_div64by32): Updated.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2014-10-02 Alexei Podtelezhnikov <[email protected]>
+
+ [base] Significant optimization of `ft_div64by32'
+
+ We shift as many bits as we can into the high register, perform
+ 32-bit division with modulo there, then work through the remaining
+ bits with long division. This optimization is especially noticeable
+ for smaller dividends that barely use the high register.
+
+ * src/base/ftcalc.c (ft_div64by32): Updated.
+
2014-10-02 Dave Arnold <[email protected]>
[cff] Fix Savannah bug #43271.
@@ -70,7 +81,7 @@
Fix Savannah bug #43153.
* src/psaux/psconv.c (PS_Conv_ToFixed): Add protection against
- overflow in `divider'.
+ overflow in `divider'.
2014-09-03 Alexei Podtelezhnikov <[email protected]>
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -304,17 +304,24 @@
FT_Int i;
- q = 0;
- r = hi;
-
- if ( r >= y )
+ if ( hi >= y )
return (FT_UInt32)0x7FFFFFFFL;
- i = 32;
+ /* We shift as many bits as we can into the high register, perform */
+ /* 32-bit division with modulo there, then work through the remaining */
+ /* bits with long division. This optimization is especially noticeable */
+ /* for smaller dividends that barely use the high register. */
+
+ i = 31 - FT_MSB( hi );
+ r = ( hi << i ) | ( lo >> ( 32 - i ) ); lo <<= i; /* left 64-bit shift */
+ q = r / y;
+ r -= q * y; /* remainder */
+
+ i = 32 - i; /* bits remaining in low register */
do
{
q <<= 1;
- r = ( r << 1 ) | ( lo >> 31 ); lo <<= 1; /* left 64-bit shift */
+ r = ( r << 1 ) | ( lo >> 31 ); lo <<= 1;
if ( r >= y )
{