Please consider pulling the master branch of:

git://anongit.freedesktop.org/~cloos/freetype2.git

to receive the patch below.

I tested a wide array of gcc cross compilers as well as clang/llvm.
In each case the machine code this version produces is as good as
the hand-tuned assembly and uses the trick that adding 0x7FFF when
the product is negative causes the same round-away-from-zero that
the current code does.

commit 94dc0c20554f3a3d709711f2c43ac65ab7c68afe
Author: James Cloos <[email protected]>
Date:   Mon Apr 4 11:35:39 2011 -0400

Improve the version of FT_MulFix() which is used when a sixty-four bit
interger type is available.

Signed-off-by: James Cloos <[email protected]>
---
 ChangeLog         |    4 ++++
 src/base/ftcalc.c |   20 +++-----------------
 2 files changed, 7 insertions(+), 17 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0744fa5..af3c908 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-04-04  James Cloos  <[email protected]>
+       * src/base/ftcalc.c (FT_MulFix): Produce more efficient
+       assembly.
+
 2011-04-04  Werner Lemberg  <[email protected]>
 
        Fix formatting of autofit debug dumps.
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index 3892fab..b7866ab 100644
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -202,25 +202,11 @@
 
 #else
 
-    FT_Int   s = 1;
-    FT_Long  c;
+    FT_Int64  c;
 
+    c = (FT_Int64)a * b;
 
-    if ( a < 0 )
-    {
-      a = -a;
-      s = -1;
-    }
-
-    if ( b < 0 )
-    {
-      b = -b;
-      s = -s;
-    }
-
-    c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );
-
-    return ( s > 0 ) ? c : -c;
+    return (FT_Long)((c + 0x8000 - (c < 0)) >> 16);
 
 #endif /* FT_MULFIX_ASSEMBLER */
   }
-- 
1.7.4.1

_______________________________________________
Freetype-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/freetype-devel

Reply via email to