[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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
diff --git a/ChangeLog b/ChangeLog
index aed1784..4e17454 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2014-10-02 Alexei Podtelezhnikov <apodtele@gmail.com>
+
+ [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 <darnold@adobe.com>
[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 <apodtele@gmail.com>
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index 502beb7..d0c43e0 100644
--- 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 )
{