return NULL_TREE;
}
+/* Fold a call to builtin carg(a+bi) -> atan2(b,a). */
+
+static tree
+fold_builtin_carg(tree arglist, tree type)
+{
+ if (validate_arglist (arglist, COMPLEX_TYPE, VOID_TYPE))
+ {
+ tree atan2_fn = mathfn_built_in (type, BUILT_IN_ATAN2);
+
+ if (atan2_fn)
+ {
+ tree arg = builtin_save_expr (TREE_VALUE (arglist));
+ tree r_arg = fold_build1 (REALPART_EXPR, type, arg);
+ tree i_arg = fold_build1 (IMAGPART_EXPR, type, arg);
+ tree newarglist = tree_cons (NULL_TREE, i_arg,
+ build_tree_list (NULL_TREE, r_arg));
+ return build_function_call_expr (atan2_fn, newarglist);
+ }
+ }
+
+ return NULL_TREE;
+}
+
/* Fold a call to __builtin_isnan(), __builtin_isinf, __builtin_finite.
EXP is the CALL_EXPR for the call. */
CASE_FLT_FN (BUILT_IN_CABS):
return fold_builtin_cabs (arglist, type, fndecl);
+ CASE_FLT_FN (BUILT_IN_CARG):
+ return fold_builtin_carg (arglist, type);
+
CASE_FLT_FN (BUILT_IN_SQRT):
return fold_builtin_sqrt (arglist, type);
extern double sin (double);
extern double tan (double);
extern double fabs (double);
+extern double atan2 (double, double);
extern double copysign (double, double);
extern double fmin (double, double);
extern double fmax (double, double);
extern double hypot (double, double);
extern double pure (double) __attribute__ ((__pure__));
+extern double carg (__complex__ double);
extern float cosf (float);
extern float sinf (float);
extern float tanf (float);
extern float fabsf (float);
+extern float atan2f (float, float);
extern float copysignf (float, float);
extern float fminf (float, float);
extern float fmaxf (float, float);
extern float hypotf (float, float);
extern float puref (float) __attribute__ ((__pure__));
+extern float cargf (__complex__ float);
extern long double cosl (long double);
extern long double sinl (long double);
extern long double tanl (long double);
extern long double fabsl (long double);
+extern long double atan2l (long double, long double);
extern long double copysignl (long double, long double);
extern long double fminl (long double, long double);
extern long double fmaxl (long double, long double);
extern long double hypotl (long double, long double);
extern long double purel (long double) __attribute__ ((__pure__));
+extern long double cargl (__complex__ long double);
extern void link_error(void);
link_error ();
}
+void test3(__complex__ double z)
+{
+ if (carg(z) != atan2(__imag__ z, __real__ z))
+ link_error ();
+}
+
void test1f(float x)
{
if (cosf(x) != cosf(-x))
link_error ();
}
+void test3f(__complex__ float z)
+{
+ if (cargf(z) != atan2f(__imag__ z, __real__ z))
+ link_error ();
+}
void test1l(long double x)
{
link_error ();
}
+void test3l(__complex__ long double z)
+{
+ if (cargl(z) != atan2l(__imag__ z, __real__ z))
+ link_error ();
+}
+
int main()
{
test1 (1.0);