Commit 70f7db113e1e659cae950ec7d9f2a99c30383e7b

Bradley Grainger 2011-02-12T12:51:36

Add inline assembly version of FT_MulFix for MSVC. * include/freetype/config/ftconfig.h: Ported the FT_MulFix_i386 function from GNU inline assembly syntax (see #ifdef __GNUC__ block above) to MASM syntax for Microsoft Visual C++.

diff --git a/ChangeLog b/ChangeLog
index b53cda3..35bf2af 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2011-02-13  Bradley Grainger  <bgrainger@logos.com>
 
+	Add inline assembly version of FT_MulFix for MSVC.
+
+	* include/freetype/config/ftconfig.h: Ported the FT_MulFix_i386
+	function from GNU inline assembly syntax (see #ifdef __GNUC__ block
+	above) to MASM syntax for Microsoft Visual C++.
+
+2011-02-13  Bradley Grainger  <bgrainger@logos.com>
+
 	Add project and solution files in Visual Studio 2010 format.
 
 	* builds/win32/.gitignore: Ignore user-specific cache files.
diff --git a/include/freetype/config/ftconfig.h b/include/freetype/config/ftconfig.h
index bcbcd6f..dd9d10c 100644
--- a/include/freetype/config/ftconfig.h
+++ b/include/freetype/config/ftconfig.h
@@ -395,6 +395,43 @@ FT_BEGIN_HEADER
 
 #endif /* __GNUC__ */
 
+
+#ifdef _MSC_VER /* Visual C++ */
+
+#ifdef _M_IX86
+
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
+
+  /* documentation is in freetype.h */
+
+  static __inline FT_Int32
+  FT_MulFix_i386( FT_Int32  a,
+                  FT_Int32  b )
+  {
+    register FT_Int32  result;
+
+    __asm
+    {
+      mov eax, a
+      mov edx, b
+      imul edx
+      mov ecx, edx
+      sar ecx, 31
+      add ecx, 8000h
+      add eax, ecx
+      adc edx, 0
+      shr eax, 16
+      shl edx, 16
+      add eax, edx
+      mov result, eax
+    }
+    return result;
+  }
+
+#endif /* _M_IX86 */
+
+#endif /* _MSC_VER */
+
 #endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */