shithub: freetype+ttf2subf

Download patch

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.

git/fs: mount .git/fs: mount/attach disallowed
--- 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 )
       {