Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Jan 2012 16:20:17 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r229704 - head/include
Message-ID:  <201201061620.q06GKHx3097121@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Fri Jan  6 16:20:17 2012
New Revision: 229704
URL: http://svn.freebsd.org/changeset/base/229704

Log:
  Add an even faster implementation of <tgmath.h> for the future.
  
  Instead of using an exponential number of cases with respect to the
  number of arguments, this version only uses a linear number.
  Unfortunately, it works with Clang, GCC 4.6 and GCC 4.7, but not GCC
  4.2. Therefore, leave it commented out.

Modified:
  head/include/tgmath.h

Modified: head/include/tgmath.h
==============================================================================
--- head/include/tgmath.h	Fri Jan  6 15:07:28 2012	(r229703)
+++ head/include/tgmath.h	Fri Jan  6 16:20:17 2012	(r229704)
@@ -59,6 +59,25 @@
 #error "<tgmath.h> not implemented for this compiler"
 #endif
 
+#if 0 /* XXX: Much shorter and faster to compile, but broken with GCC 4.2. */
+#define	__tg_generic(x, cfnl, cfn, cfnf, fnl, fn, fnf)			\
+	__generic(x, long double _Complex, cfnl,			\
+	    __generic(x, double _Complex, cfn,				\
+	        __generic(x, float _Complex, cfnf,			\
+	            __generic(x, long double, fnl,			\
+	                __generic(x, float, fnf, fn)))))
+#define	__tg_type(x)							\
+	__tg_generic(x, (long double _Complex)0, (double _Complex)0,	\
+	    (float _Complex)0, (long double)0, (double)0, (float)0)
+#define	__tg_impl_simple(x, y, z, fnl, fn, fnf, ...)			\
+	__tg_generic(							\
+	    __tg_type(x) + __tg_type(y) + __tg_type(z),			\
+	    fnl, fn, fnf, fnl, fn, fnf)(__VA_ARGS__)
+#define	__tg_impl_full(x, y, cfnl, cfn, cfnf, fnl, fn, fnf, ...)	\
+	__tg_generic(							\
+	    __tg_type(x) + __tg_type(y),				\
+	    cfnl, cfn, cfnf, fnl, fn, fnf)(__VA_ARGS__)
+#else
 #define	__tg_generic_simple(x, fnl, fn, fnf)				\
 	__generic(x, long double _Complex, fnl,				\
 	    __generic(x, double _Complex, fn,				\
@@ -94,6 +113,7 @@
 	    __tg_generic_full(y, cfnl, cfn , cfn , fnl , fn  , fn  ),	\
 	    __tg_generic_full(y, cfnl, cfn , cfnf, fnl , fn  , fnf ))	\
 	    (__VA_ARGS__)
+#endif
 
 /* Macros to save lots of repetition below */
 #define	__tg_simple(x, fn)						\



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201061620.q06GKHx3097121>