+2001-01-05 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * builtins.def (BUILT_IN_CONJ, BUILT_IN_CREAL, BUILT_IN_CIMAG):
+ Define.
+ * builtins.c (expand_builtin): Abort on BUILT_IN_CONJ,
+ BUILT_IN_CREAL and BUILT_IN_CIMAG.
+ * c-common.c (c_common_nodes_and_builtins): Create builtin conjf,
+ conj, conjl, crealf, creal, creall, cimagf, cimag and cimagl.
+ (expand_tree_builtin): Handle BUILT_IN_CONJ, BUILT_IN_CREAL and
+ BUILT_IN_CIMAG.
+ * extend.texi: Document these builtins.
+
2001-01-05 Daniel Berlin <dberlin@redhat.com>
* c-common.c (lang_get_alias_set): Say we know nothing of
/* build_function_call changes these into ABS_EXPR. */
abort ();
+ case BUILT_IN_CONJ:
+ case BUILT_IN_CREAL:
+ case BUILT_IN_CIMAG:
+ /* expand_tree_builtin changes these into CONJ_EXPR, REALPART_EXPR
+ and IMAGPART_EXPR. */
+ abort ();
+
case BUILT_IN_SIN:
case BUILT_IN_COS:
/* Treat these like sqrt, but only if the user asks for them. */
/* This file contains the definitions and documentation for the
builtins used in the GNU compiler.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
DEF_BUILTIN(BUILT_IN_ALLOCA)
DEF_BUILTIN(BUILT_IN_ABS)
DEF_BUILTIN(BUILT_IN_FABS)
+DEF_BUILTIN(BUILT_IN_CONJ)
+DEF_BUILTIN(BUILT_IN_CREAL)
+DEF_BUILTIN(BUILT_IN_CIMAG)
DEF_BUILTIN(BUILT_IN_FFS)
DEF_BUILTIN(BUILT_IN_DIV)
DEF_BUILTIN(BUILT_IN_LDIV)
tree void_ftype_any, void_ftype_int, int_ftype_any;
tree double_ftype_double, double_ftype_double_double;
tree float_ftype_float, ldouble_ftype_ldouble;
+ tree cfloat_ftype_cfloat, cdouble_ftype_cdouble, cldouble_ftype_cldouble;
+ tree float_ftype_cfloat, double_ftype_cdouble, ldouble_ftype_cldouble;
tree int_ftype_cptr_cptr_sizet, sizet_ftype_cstring_cstring;
tree int_ftype_cstring_cstring, string_ftype_string_cstring;
tree string_ftype_cstring_int, string_ftype_cstring_cstring;
tree_cons (NULL_TREE, double_type_node,
double_endlink));
+ cfloat_ftype_cfloat
+ = build_function_type (complex_float_type_node,
+ tree_cons (NULL_TREE, complex_float_type_node,
+ endlink));
+ cdouble_ftype_cdouble
+ = build_function_type (complex_double_type_node,
+ tree_cons (NULL_TREE, complex_double_type_node,
+ endlink));
+ cldouble_ftype_cldouble
+ = build_function_type (complex_long_double_type_node,
+ tree_cons (NULL_TREE, complex_long_double_type_node,
+ endlink));
+
+ float_ftype_cfloat
+ = build_function_type (float_type_node,
+ tree_cons (NULL_TREE, complex_float_type_node,
+ endlink));
+ double_ftype_cdouble
+ = build_function_type (double_type_node,
+ tree_cons (NULL_TREE, complex_double_type_node,
+ endlink));
+ ldouble_ftype_cldouble
+ = build_function_type (long_double_type_node,
+ tree_cons (NULL_TREE, complex_long_double_type_node,
+ endlink));
+
int_ftype_int
= build_function_type (integer_type_node, int_endlink);
builtin_function_2 ("__builtin_cosl", "cosl",
ldouble_ftype_ldouble, ldouble_ftype_ldouble,
BUILT_IN_COS, BUILT_IN_NORMAL, 1, 0, 0);
+
+ /* ISO C99 complex arithmetic functions. */
+ builtin_function_2 ("__builtin_conjf", "conjf",
+ cfloat_ftype_cfloat, cfloat_ftype_cfloat,
+ BUILT_IN_CONJ, BUILT_IN_NORMAL, 0, !flag_isoc99, 0);
+ builtin_function_2 ("__builtin_conj", "conj",
+ cdouble_ftype_cdouble, cdouble_ftype_cdouble,
+ BUILT_IN_CONJ, BUILT_IN_NORMAL, 0, !flag_isoc99, 0);
+ builtin_function_2 ("__builtin_conjl", "conjl",
+ cldouble_ftype_cldouble, cldouble_ftype_cldouble,
+ BUILT_IN_CONJ, BUILT_IN_NORMAL, 0, !flag_isoc99, 0);
+ builtin_function_2 ("__builtin_crealf", "crealf",
+ float_ftype_cfloat, float_ftype_cfloat,
+ BUILT_IN_CREAL, BUILT_IN_NORMAL, 0, !flag_isoc99, 0);
+ builtin_function_2 ("__builtin_creal", "creal",
+ double_ftype_cdouble, double_ftype_cdouble,
+ BUILT_IN_CREAL, BUILT_IN_NORMAL, 0, !flag_isoc99, 0);
+ builtin_function_2 ("__builtin_creall", "creall",
+ ldouble_ftype_cldouble, ldouble_ftype_cldouble,
+ BUILT_IN_CREAL, BUILT_IN_NORMAL, 0, !flag_isoc99, 0);
+ builtin_function_2 ("__builtin_cimagf", "cimagf",
+ float_ftype_cfloat, float_ftype_cfloat,
+ BUILT_IN_CIMAG, BUILT_IN_NORMAL, 0, !flag_isoc99, 0);
+ builtin_function_2 ("__builtin_cimag", "cimag",
+ double_ftype_cdouble, double_ftype_cdouble,
+ BUILT_IN_CIMAG, BUILT_IN_NORMAL, 0, !flag_isoc99, 0);
+ builtin_function_2 ("__builtin_cimagl", "cimagl",
+ ldouble_ftype_cldouble, ldouble_ftype_cldouble,
+ BUILT_IN_CIMAG, BUILT_IN_NORMAL, 0, !flag_isoc99, 0);
+
built_in_decls[BUILT_IN_PUTCHAR] =
builtin_function ("__builtin_putchar", int_ftype_int,
BUILT_IN_PUTCHAR, BUILT_IN_NORMAL, "putchar");
return integer_zero_node;
return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
+ case BUILT_IN_CONJ:
+ if (coerced_params == 0)
+ return integer_zero_node;
+ return build_unary_op (CONJ_EXPR, TREE_VALUE (coerced_params), 0);
+
+ case BUILT_IN_CREAL:
+ if (coerced_params == 0)
+ return integer_zero_node;
+ return build_unary_op (REALPART_EXPR, TREE_VALUE (coerced_params), 0);
+
+ case BUILT_IN_CIMAG:
+ if (coerced_params == 0)
+ return integer_zero_node;
+ return build_unary_op (IMAGPART_EXPR, TREE_VALUE (coerced_params), 0);
+
case BUILT_IN_ISGREATER:
if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
code = UNLE_EXPR;
@findex alloca
@findex bcmp
@findex bzero
+@findex cimag
+@findex cimagf
+@findex cimagl
+@findex conj
+@findex conjf
+@findex conjl
@findex cos
@findex cosf
@findex cosl
+@findex creal
+@findex crealf
+@findex creall
@findex exit
@findex _exit
@findex fabs
@code{__builtin_rindex} and @code{__builtin_ffs} are also recognized in
strict ISO C mode.
-The ISO C99 functions @code{llabs} and @code{imaxabs}
-are handled as builtins except in
-strict ISO C89 mode. There are also builtin versions of the ISO C99
+The ISO C99 functions @code{conj}, @code{conjf}, @code{conjl},
+@code{creal}, @code{crealf}, @code{creall}, @code{cimag}, @code{cimagf},
+@code{cimagl}, @code{llabs} and @code{imaxabs} are handled as builtins
+except in strict ISO C89 mode. There are also builtin versions of the ISO C99
functions @code{cosf}, @code{cosl}, @code{fabsf}, @code{fabsl},
@code{sinf}, @code{sinl}, @code{sqrtf}, and @code{sqrtl}, that are
recognized in any mode since ISO C89 reserves these names for the
+2001-01-05 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * gcc.c-torture/execute/builtin-complex-1.c: New test.
+
2001-01-05 Nathan Sidwell <nathan@codesourcery.com>
* g++.old-deja/g++.pt/crash62.C: New test.
--- /dev/null
+/* Test for builtin conj, creal, cimag. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+
+extern float _Complex conjf (float _Complex);
+extern double _Complex conj (double _Complex);
+extern long double _Complex conjl (long double _Complex);
+
+extern float crealf (float _Complex);
+extern double creal (double _Complex);
+extern long double creall (long double _Complex);
+
+extern float cimagf (float _Complex);
+extern double cimag (double _Complex);
+extern long double cimagl (long double _Complex);
+
+extern void abort (void);
+extern void exit (int);
+
+extern void link_failure (void);
+
+int
+main (void)
+{
+ /* For each type, test both runtime and compile time (constant folding)
+ optimization. */
+ volatile float _Complex fc = 1.0F + 2.0iF;
+ volatile double _Complex dc = 1.0 + 2.0i;
+ volatile long double _Complex ldc = 1.0L + 2.0iL;
+ /* Test floats. */
+ if (conjf (fc) != 1.0F - 2.0iF)
+ abort ();
+ if (__builtin_conjf (fc) != 1.0F - 2.0iF)
+ abort ();
+ if (conjf (1.0F + 2.0iF) != 1.0F - 2.0iF)
+ link_failure ();
+ if (__builtin_conjf (1.0F + 2.0iF) != 1.0F - 2.0iF)
+ link_failure ();
+ if (crealf (fc) != 1.0F)
+ abort ();
+ if (__builtin_crealf (fc) != 1.0F)
+ abort ();
+ if (crealf (1.0F + 2.0iF) != 1.0F)
+ link_failure ();
+ if (__builtin_crealf (1.0F + 2.0iF) != 1.0F)
+ link_failure ();
+ if (cimagf (fc) != 2.0F)
+ abort ();
+ if (__builtin_cimagf (fc) != 2.0F)
+ abort ();
+ if (cimagf (1.0F + 2.0iF) != 2.0F)
+ link_failure ();
+ if (__builtin_cimagf (1.0F + 2.0iF) != 2.0F)
+ link_failure ();
+ /* Test doubles. */
+ if (conj (dc) != 1.0 - 2.0i)
+ abort ();
+ if (__builtin_conj (dc) != 1.0 - 2.0i)
+ abort ();
+ if (conj (1.0 + 2.0i) != 1.0 - 2.0i)
+ link_failure ();
+ if (__builtin_conj (1.0 + 2.0i) != 1.0 - 2.0i)
+ link_failure ();
+ if (creal (dc) != 1.0)
+ abort ();
+ if (__builtin_creal (dc) != 1.0)
+ abort ();
+ if (creal (1.0 + 2.0i) != 1.0)
+ link_failure ();
+ if (__builtin_creal (1.0 + 2.0i) != 1.0)
+ link_failure ();
+ if (cimag (dc) != 2.0)
+ abort ();
+ if (__builtin_cimag (dc) != 2.0)
+ abort ();
+ if (cimag (1.0 + 2.0i) != 2.0)
+ link_failure ();
+ if (__builtin_cimag (1.0 + 2.0i) != 2.0)
+ link_failure ();
+ /* Test long doubles. */
+ if (conjl (ldc) != 1.0L - 2.0iL)
+ abort ();
+ if (__builtin_conjl (ldc) != 1.0L - 2.0iL)
+ abort ();
+ if (conjl (1.0L + 2.0iL) != 1.0L - 2.0iL)
+ link_failure ();
+ if (__builtin_conjl (1.0L + 2.0iL) != 1.0L - 2.0iL)
+ link_failure ();
+ if (creall (ldc) != 1.0L)
+ abort ();
+ if (__builtin_creall (ldc) != 1.0L)
+ abort ();
+ if (creall (1.0L + 2.0iL) != 1.0L)
+ link_failure ();
+ if (__builtin_creall (1.0L + 2.0iL) != 1.0L)
+ link_failure ();
+ if (cimagl (ldc) != 2.0L)
+ abort ();
+ if (__builtin_cimagl (ldc) != 2.0L)
+ abort ();
+ if (cimagl (1.0L + 2.0iL) != 2.0L)
+ link_failure ();
+ if (__builtin_cimagl (1.0L + 2.0iL) != 2.0L)
+ link_failure ();
+ exit (0);
+}
+
+/* All the above cases should have been optimized to something else,
+ even if not optimizing (unless -fno-builtin was specified). So any
+ remaining calls to the original functions should abort. */
+
+static float _Complex
+conjf (float _Complex z)
+{
+ abort ();
+}
+
+static double _Complex
+conj (double _Complex z)
+{
+ abort ();
+}
+
+static long double _Complex
+conjl (long double _Complex z)
+{
+ abort ();
+}
+
+static float
+crealf (float _Complex z)
+{
+ abort ();
+}
+
+static double
+creal (double _Complex z)
+{
+ abort ();
+}
+
+static long double
+creall (long double _Complex z)
+{
+ abort ();
+}
+
+static float
+cimagf (float _Complex z)
+{
+ abort ();
+}
+
+static double
+cimag (double _Complex z)
+{
+ abort ();
+}
+
+static long double
+cimagl (long double _Complex z)
+{
+ abort ();
+}
+
+/* When optimizing, all the constant cases should have been
+ constant folded, so no calls to link_failure should remain. In any case,
+ link_failure should not be called. */
+
+#ifndef __OPTIMIZE__
+void
+link_failure (void)
+{
+ abort ();
+}
+#endif