--- /dev/null
+/*===---- tgmath.h - Standard header for type generic math ----------------===*\
+ *
+ * Copyright (c) 2009 Chris Lattner
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+\*===----------------------------------------------------------------------===*/
+
+#ifndef __TGMATH_H
+#define __TGMATH_H
+
+/* C99 7.22 Type-generic math <tgmath.h>. */
+#include <math.h>
+
+/* C++ handles type genericity with overloading in math.h. */
+#ifndef __cplusplus
+#include <complex.h>
+
+/* C99 7.22p4, functions in both math.h and complex.h. */
+#define acos(x) \
+ __builtin_overload(1, x, cacosl, cacos, cacosf, acosl, acos, acosf)
+#define asin(x) \
+ __builtin_overload(1, x, casinl, casin, casinf, asinl, asin, asinf)
+#define atan(x) \
+ __builtin_overload(1, x, catanl, catan, catanf, atanl, atan, atanf)
+#define acosh(x) \
+ __builtin_overload(1, x, cacoshl, cacosh, cacoshf, acoshl, acosh, acoshf)
+#define asinh(x) \
+ __builtin_overload(1, x, casinhl, casinh, casinhf, asinhl, asinh, asinhf)
+#define atanh(x) \
+ __builtin_overload(1, x, catanhl, catanh, catanhf, atanhl, atanh, atanhf)
+#define cos(x) \
+ __builtin_overload(1, x, ccosl, ccos, ccosf, cosl, cos, cosf)
+#define sin(x) \
+ __builtin_overload(1, x, csinl, csin, csinf, sinl, sin, sinf)
+#define tan(x) \
+ __builtin_overload(1, x, ctanl, ctan, ctanf, tanl, tan, tanf)
+#define cosh(x) \
+ __builtin_overload(1, x, ccoshl, ccosh, ccoshf, coshl, cosh, coshf)
+#define sinh(x) \
+ __builtin_overload(1, x, csinhl, csinh, csinhf, sinhl, sinh, sinhf)
+#define tanh(x) \
+ __builtin_overload(1, x, ctanhl, ctanh, ctanhf, tanhl, tanh, tanhf)
+#define exp(x) \
+ __builtin_overload(1, x, cexpl, cexp, cexpf, expl, exp, expf)
+#define log(x) \
+ __builtin_overload(1, x, clogl, clog, clogf, logl, log, logf)
+#define sqrt(x) \
+ __builtin_overload(1, x, csqrtl, csqrt, csqrtf, sqrtl, sqrt, sqrtf)
+#define fabs(x) \
+ __builtin_overload(1, x, cabsl, cabs, cabsf, fabsl, fabs, fabsf)
+// FIXME: POW -> binary operation.
+
+/* C99 7.22p5, functions in just math.h that have no complex counterpart. */
+
+// FIXME: atan2 -> binary operation.
+#define cbrt(x) __builtin_overload(1, x, cbrtl, cbrt, cbrtf)
+#define ceil(x) __builtin_overload(1, x, ceil, ceil, ceilf)
+// FIXME: copysign -> binary operation.
+#define erf(x) __builtin_overload(1, x, erfl, erf, erff)
+#define erfc(x) __builtin_overload(1, x, erfcl, erfc, erfcf)
+#define exp2(x) __builtin_overload(1, x, expl, exp2, exp2f)
+#define expm1(x) __builtin_overload(1, x, expm1l, expm1, expm1f)
+// FIXME: fdim -> binary operation.
+#define floor(x) __builtin_overload(1, x, floorl, floor, floorf)
+// FIXME: fma -> trinary operation.
+// FIXME: fmax -> binary operation.
+// FIXME: fmin -> binary operation.
+// FIXME: fmax -> binary operation.
+// FIXME: fmod -> binary operation.
+// FIXME: frexp -> unary + pointer operation.
+// FIXME: hypot -> binary operation.
+#define ilogb(x) __builtin_overload(1, x, ilogbl, ilogb, ilogbf)
+// FIXME: ldexp -> fp+int.
+#define lgamma(x) __builtin_overload(1, x, lgammal, lgamma, lgammaf)
+#define llrint(x) __builtin_overload(1, x, llrintl, llrint, llrintf)
+#define llround(x) __builtin_overload(1, x, llroundl, llround, llroundf)
+#define log10(x) __builtin_overload(1, x, log10l, log10, log10f)
+#define log1p(x) __builtin_overload(1, x, log1pl, log1p, log1pf)
+#define log2(x) __builtin_overload(1, x, log2l, log2, log2f)
+#define logb(x) __builtin_overload(1, x, logbl, logb, logbf)
+#define lrint(x) __builtin_overload(1, x, lrintl, lrint, lrintf)
+#define lround(x) __builtin_overload(1, x, lroundl, lround, lroundf)
+#define nearbyint(x)__builtin_overload(1, x, nearbyintl, nearbyint, nearbyintf)
+// FIXME: nextafter -> binary operation.
+// FIXME: nexttoward -> binary operation?
+// FIXME: remainder -> binary operation.
+// FIXME: remquo -> fp+fp+ptr
+#define rint(x) __builtin_overload(1, x, rintl, rint, rintf)
+#define round(x) __builtin_overload(1, x, roundl, round, roundf)
+// FIXME: scalbn -> fp+int
+// FIXME: scalbln -> fp+int
+#define tgamma(x) __builtin_overload(1, x, tgammal, tgamma, tgammaf)
+#define trunc(x) __builtin_overload(1, x, truncl, trunc, truncf)
+
+
+// FIXME: carg, cimag, conj, cproj, creal
+
+#endif /* __cplusplus */
+#endif /* __TGMATH_H */