* src/base/ftcalc.c (FT_MSB): Utilize gcc builtins.
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 3f5b6b1..04e456f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2014-07-15 Alexei Podtelezhnikov <apodtele@gmail.com>
+ * src/base/ftcalc.c (FT_MSB): Utilize gcc builtins.
+
+2014-07-15 Alexei Podtelezhnikov <apodtele@gmail.com>
+
[base] Move assembler code back in the source file.
FT_MulFix assembler used to reside in ftcalc.c before f47d263f1b.
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index 4845acf..3523132 100644
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -243,6 +243,22 @@
#endif /* __GNUC__ && __x86_64__ */
+#if defined( __GNUC__ )
+#if ( __GNUC__ > 3 ) || ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 4 ) )
+
+#if FT_SIZEOF_INT == 4
+
+#define FT_MSB_BUILTIN( x ) ( 31 - __builtin_clz( x ) )
+
+#elif FT_SIZEOF_LONG == 4
+
+#define FT_MSB_BUILTIN( x ) ( 31 - __builtin_clzl( x ) )
+
+#endif
+
+#endif
+#endif /* __GNUC__ */
+
#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
@@ -316,6 +332,12 @@
FT_BASE_DEF ( FT_Int )
FT_MSB( FT_UInt32 z )
{
+#ifdef FT_MSB_BUILTIN
+
+ return FT_MSB_BUILTIN( z );
+
+#else
+
FT_Int shift = 0;
/* determine msb bit index in `shift' */
@@ -346,6 +368,8 @@
}
return shift;
+
+#endif /* FT_MSB_BUILTIN */
}