about summary refs log tree commit diff
path: root/math/tgmath.h
diff options
context:
space:
mode:
Diffstat (limited to 'math/tgmath.h')
-rw-r--r--math/tgmath.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/math/tgmath.h b/math/tgmath.h
index 5f19cf4821..5fdc7982b2 100644
--- a/math/tgmath.h
+++ b/math/tgmath.h
@@ -57,15 +57,21 @@
   (F ## l (X))
 # define __TGMATH_2_NARROW_D(F, X, Y)		\
   (F ## l (X, Y))
+# define __TGMATH_3_NARROW_D(F, X, Y, Z)	\
+  (F ## l (X, Y, Z))
 # define __TGMATH_1_NARROW_F64X(F, X)		\
   (F ## f128 (X))
 # define __TGMATH_2_NARROW_F64X(F, X, Y)	\
   (F ## f128 (X, Y))
+# define __TGMATH_3_NARROW_F64X(F, X, Y, Z)	\
+  (F ## f128 (X, Y, Z))
 # if !__HAVE_FLOAT128
 #  define __TGMATH_1_NARROW_F32X(F, X)		\
   (F ## f64 (X))
 #  define __TGMATH_2_NARROW_F32X(F, X, Y)	\
   (F ## f64 (X, Y))
+#  define __TGMATH_3_NARROW_F32X(F, X, Y, Z)	\
+  (F ## f64 (X, Y, Z))
 # endif
 
 # if __HAVE_BUILTIN_TGMATH
@@ -137,23 +143,33 @@
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F (F) (X))
 #  define __TGMATH_2_NARROW_F(F, X, Y)				\
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F (F) (X), (Y))
+#  define __TGMATH_3_NARROW_F(F, X, Y, Z)			\
+  __builtin_tgmath (__TGMATH_NARROW_FUNCS_F (F) (X), (Y), (Z))
 #  define __TGMATH_1_NARROW_F16(F, X)				\
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F16 (F) (X))
 #  define __TGMATH_2_NARROW_F16(F, X, Y)			\
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F16 (F) (X), (Y))
+#  define __TGMATH_3_NARROW_F16(F, X, Y, Z)				\
+  __builtin_tgmath (__TGMATH_NARROW_FUNCS_F16 (F) (X), (Y), (Z))
 #  define __TGMATH_1_NARROW_F32(F, X)				\
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32 (F) (X))
 #  define __TGMATH_2_NARROW_F32(F, X, Y)			\
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32 (F) (X), (Y))
+#  define __TGMATH_3_NARROW_F32(F, X, Y, Z)				\
+  __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32 (F) (X), (Y), (Z))
 #  define __TGMATH_1_NARROW_F64(F, X)				\
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F64 (F) (X))
 #  define __TGMATH_2_NARROW_F64(F, X, Y)			\
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F64 (F) (X), (Y))
+#  define __TGMATH_3_NARROW_F64(F, X, Y, Z)				\
+  __builtin_tgmath (__TGMATH_NARROW_FUNCS_F64 (F) (X), (Y), (Z))
 #  if __HAVE_FLOAT128
 #   define __TGMATH_1_NARROW_F32X(F, X)				\
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32X (F) (X))
 #   define __TGMATH_2_NARROW_F32X(F, X, Y)			\
   __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32X (F) (X), (Y))
+#   define __TGMATH_3_NARROW_F32X(F, X, Y, Z)				\
+  __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32X (F) (X), (Y), (Z))
 #  endif
 
 # else /* !__HAVE_BUILTIN_TGMATH.  */
@@ -565,6 +581,12 @@
 			  + (__tgmath_real_type (Y)) 0) > sizeof (double) \
 		  ? F ## l (X, Y)					\
 		  : F (X, Y)))
+#  define __TGMATH_3_NARROW_F(F, X, Y, Z)				\
+  (__extension__ (sizeof ((__tgmath_real_type (X)) 0			\
+			  + (__tgmath_real_type (Y)) 0			\
+			  + (__tgmath_real_type (Z)) 0) > sizeof (double) \
+		  ? F ## l (X, Y, Z)					\
+		  : F (X, Y, Z)))
 /* In most cases, these narrowing macro definitions based on sizeof
    ensure that the function called has the right argument format, as
    for other <tgmath.h> macros for compilers before GCC 8, but may not
@@ -594,6 +616,13 @@
 		  ? __TGMATH_F128 ((X) + (Y), F, (X, Y))		\
 		  F ## f64x (X, Y)					\
 		  : F ## f64 (X, Y)))
+#   define __TGMATH_3_NARROW_F32(F, X, Y, Z)				\
+  (__extension__ (sizeof ((__tgmath_real_type (X)) 0			\
+			  + (__tgmath_real_type (Y)) 0			\
+			  + (__tgmath_real_type (Z)) 0) > sizeof (_Float64) \
+		  ? __TGMATH_F128 ((X) + (Y) + (Z), F, (X, Y, Z))	\
+		  F ## f64x (X, Y, Z)					\
+		  : F ## f64 (X, Y, Z)))
 #   define __TGMATH_1_NARROW_F64(F, X)					\
   (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (_Float64) \
 		  ? __TGMATH_F128 ((X), F, (X))				\
@@ -605,6 +634,13 @@
 		  ? __TGMATH_F128 ((X) + (Y), F, (X, Y))		\
 		  F ## f64x (X, Y)					\
 		  : F ## f128 (X, Y)))
+#   define __TGMATH_3_NARROW_F64(F, X, Y, Z)				\
+  (__extension__ (sizeof ((__tgmath_real_type (X)) 0			\
+			  + (__tgmath_real_type (Y)) 0			\
+			  + (__tgmath_real_type (Z)) 0) > sizeof (_Float64) \
+		  ? __TGMATH_F128 ((X) + (Y) + (Z), F, (X, Y, Z))	\
+		  F ## f64x (X, Y, Z)					\
+		  : F ## f128 (X, Y, Z)))
 #   define __TGMATH_1_NARROW_F32X(F, X)					\
   (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (_Float64) \
 		  ? __TGMATH_F128 ((X), F, (X))				\
@@ -616,6 +652,13 @@
 		  ? __TGMATH_F128 ((X) + (Y), F, (X, Y))		\
 		  F ## f64x (X, Y)					\
 		  : F ## f64 (X, Y)))
+#   define __TGMATH_3_NARROW_F32X(F, X, Y, Z)				\
+  (__extension__ (sizeof ((__tgmath_real_type (X)) 0			\
+			  + (__tgmath_real_type (Y)) 0			\
+			  + (__tgmath_real_type (Z)) 0) > sizeof (_Float64) \
+		  ? __TGMATH_F128 ((X) + (Y) + (Z), F, (X, Y, Z))	\
+		  F ## f64x (X, Y, Z)					\
+		  : F ## f64 (X, Y, Z)))
 #  elif __HAVE_FLOAT128
 #   define __TGMATH_1_NARROW_F32(F, X)					\
   (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (_Float64) \
@@ -626,10 +669,18 @@
 			  + (__tgmath_real_type (Y)) 0) > sizeof (_Float64) \
 		  ? F ## f128 (X, Y)					\
 		  : F ## f64 (X, Y)))
+#   define __TGMATH_3_NARROW_F32(F, X, Y, Z)				\
+  (__extension__ (sizeof ((__tgmath_real_type (X)) 0			\
+			  + (__tgmath_real_type (Y)) 0			\
+			  + (__tgmath_real_type (Z)) 0) > sizeof (_Float64) \
+		  ? F ## f128 (X, Y, Z)					\
+		  : F ## f64 (X, Y, Z)))
 #   define __TGMATH_1_NARROW_F64(F, X)		\
   (F ## f128 (X))
 #   define __TGMATH_2_NARROW_F64(F, X, Y)	\
   (F ## f128 (X, Y))
+#   define __TGMATH_3_NARROW_F64(F, X, Y, Z)	\
+  (F ## f128 (X, Y, Z))
 #   define __TGMATH_1_NARROW_F32X(F, X)					\
   (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (_Float32x) \
 		  ? F ## f64x (X)					\
@@ -639,11 +690,19 @@
 			  + (__tgmath_real_type (Y)) 0) > sizeof (_Float32x) \
 		  ? F ## f64x (X, Y)					\
 		  : F ## f64 (X, Y)))
+#   define __TGMATH_3_NARROW_F32X(F, X, Y, Z)				\
+  (__extension__ (sizeof ((__tgmath_real_type (X)) 0			\
+			  + (__tgmath_real_type (Y)) 0			\
+			  + (__tgmath_real_type (Z)) 0) > sizeof (_Float32x) \
+		  ? F ## f64x (X, Y, Z)					\
+		  : F ## f64 (X, Y, Z)))
 #  else
 #   define __TGMATH_1_NARROW_F32(F, X)		\
   (F ## f64 (X))
 #   define __TGMATH_2_NARROW_F32(F, X, Y)	\
   (F ## f64 (X, Y))
+#   define __TGMATH_3_NARROW_F32(F, X, Y, Z)	\
+  (F ## f64 (X, Y, Z))
 #  endif
 # endif /* !__HAVE_BUILTIN_TGMATH.  */
 #else
@@ -916,6 +975,10 @@
 # define fsqrt(Val) __TGMATH_1_NARROW_F (fsqrt, Val)
 # define dsqrt(Val) __TGMATH_1_NARROW_D (dsqrt, Val)
 
+/* Fused multiply-add.  */
+# define ffma(Val1, Val2, Val3) __TGMATH_3_NARROW_F (ffma, Val1, Val2, Val3)
+# define dfma(Val1, Val2, Val3) __TGMATH_3_NARROW_D (dfma, Val1, Val2, Val3)
+
 #endif
 
 #if __GLIBC_USE (IEC_60559_TYPES_EXT)
@@ -926,6 +989,8 @@
 #  define f16mul(Val1, Val2) __TGMATH_2_NARROW_F16 (f16mul, Val1, Val2)
 #  define f16sub(Val1, Val2) __TGMATH_2_NARROW_F16 (f16sub, Val1, Val2)
 #  define f16sqrt(Val) __TGMATH_1_NARROW_F16 (f16sqrt, Val)
+#  define f16fma(Val1, Val2, Val3)			\
+  __TGMATH_3_NARROW_F16 (f16fma, Val1, Val2, Val3)
 # endif
 
 # if __HAVE_FLOAT32
@@ -934,6 +999,8 @@
 #  define f32mul(Val1, Val2) __TGMATH_2_NARROW_F32 (f32mul, Val1, Val2)
 #  define f32sub(Val1, Val2) __TGMATH_2_NARROW_F32 (f32sub, Val1, Val2)
 #  define f32sqrt(Val) __TGMATH_1_NARROW_F32 (f32sqrt, Val)
+#  define f32fma(Val1, Val2, Val3)			\
+  __TGMATH_3_NARROW_F32 (f32fma, Val1, Val2, Val3)
 # endif
 
 # if __HAVE_FLOAT64 && (__HAVE_FLOAT64X || __HAVE_FLOAT128)
@@ -942,6 +1009,8 @@
 #  define f64mul(Val1, Val2) __TGMATH_2_NARROW_F64 (f64mul, Val1, Val2)
 #  define f64sub(Val1, Val2) __TGMATH_2_NARROW_F64 (f64sub, Val1, Val2)
 #  define f64sqrt(Val) __TGMATH_1_NARROW_F64 (f64sqrt, Val)
+#  define f64fma(Val1, Val2, Val3)			\
+  __TGMATH_3_NARROW_F64 (f64fma, Val1, Val2, Val3)
 # endif
 
 # if __HAVE_FLOAT32X
@@ -950,6 +1019,8 @@
 #  define f32xmul(Val1, Val2) __TGMATH_2_NARROW_F32X (f32xmul, Val1, Val2)
 #  define f32xsub(Val1, Val2) __TGMATH_2_NARROW_F32X (f32xsub, Val1, Val2)
 #  define f32xsqrt(Val) __TGMATH_1_NARROW_F32X (f32xsqrt, Val)
+#  define f32xfma(Val1, Val2, Val3)			\
+  __TGMATH_3_NARROW_F32X (f32xfma, Val1, Val2, Val3)
 # endif
 
 # if __HAVE_FLOAT64X && (__HAVE_FLOAT128X || __HAVE_FLOAT128)
@@ -958,6 +1029,8 @@
 #  define f64xmul(Val1, Val2) __TGMATH_2_NARROW_F64X (f64xmul, Val1, Val2)
 #  define f64xsub(Val1, Val2) __TGMATH_2_NARROW_F64X (f64xsub, Val1, Val2)
 #  define f64xsqrt(Val) __TGMATH_1_NARROW_F64X (f64xsqrt, Val)
+#  define f64xfma(Val1, Val2, Val3)			\
+  __TGMATH_3_NARROW_F64X (f64xfma, Val1, Val2, Val3)
 # endif
 
 #endif