builtins.c (expand_builtin_cexpi): Fall back to expanding via cexp in case sincos is not available.

2007-01-19  Richard Guenther  <rguenther@suse.de>

	* builtins.c (expand_builtin_cexpi): Fall back to expanding
	via cexp in case sincos is not available.

From-SVN: r120953
This commit is contained in:
Richard Guenther 2007-01-19 11:13:24 +00:00 committed by Richard Biener
parent 006339cde4
commit b54c5497e5
2 changed files with 26 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2007-01-19 Richard Guenther <rguenther@suse.de>
* builtins.c (expand_builtin_cexpi): Fall back to expanding
via cexp in case sincos is not available.
2007-01-19 Richard Guenther <rguenther@suse.de>
* doc/tm.texi (TARGET_HAS_SINCOS): Document new target macro.

View File

@ -2240,8 +2240,8 @@ expand_builtin_cexpi (tree exp, rtx target, rtx subtarget)
mode = TYPE_MODE (TREE_TYPE (arg));
/* Try expanding via a sincos optab, fall back to emitting a libcall
to sincos. We are sure we have sincos either way because cexpi
is only generated from sincos. */
to sincos or cexp. We are sure we have sincos or cexp because cexpi
is only generated from sincos, cexp or if we have either of them. */
if (sincos_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
{
op1 = gen_reg_rtx (mode);
@ -2252,7 +2252,7 @@ expand_builtin_cexpi (tree exp, rtx target, rtx subtarget)
/* Compute into op1 and op2. */
expand_twoval_unop (sincos_optab, op0, op2, op1, 0);
}
else
else if (TARGET_HAS_SINCOS)
{
tree call, narglist, fn = NULL_TREE;
tree top1, top2;
@ -2264,7 +2264,6 @@ expand_builtin_cexpi (tree exp, rtx target, rtx subtarget)
fn = built_in_decls[BUILT_IN_SINCOS];
else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
fn = built_in_decls[BUILT_IN_SINCOSL];
gcc_assert (fn);
op1 = assign_temp (TREE_TYPE (arg), 0, 1, 1);
op2 = assign_temp (TREE_TYPE (arg), 0, 1, 1);
@ -2282,6 +2281,24 @@ expand_builtin_cexpi (tree exp, rtx target, rtx subtarget)
expand_normal (build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
call, narglist, NULL_TREE));
}
else
{
tree call, fn, narg;
tree ctype = build_complex_type (type);
/* We can expand via the C99 cexp function. */
gcc_assert (TARGET_C99_FUNCTIONS);
fn = mathfn_built_in (ctype, BUILT_IN_CEXP);
narg = fold_build2 (COMPLEX_EXPR, ctype,
build_real (type, dconst0), arg);
/* Make sure not to fold the cexp call again. */
call = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
return expand_expr (build3 (CALL_EXPR, ctype, call,
build_tree_list (NULL_TREE, narg),
NULL_TREE), target, VOIDmode, 0);
}
/* Now build the proper return type. */
return expand_expr (build2 (COMPLEX_EXPR, build_complex_type (type),