summaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authormatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>2010-03-19 12:37:28 +0000
committermatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>2010-03-19 12:37:28 +0000
commit4e2a2fb45c465c9e0d6e0b010dde4e0678bf915f (patch)
tree750b7bfe08e957981b58a98957f22c84fb66776e /gcc/builtins.c
parent3ec419bfa38623ba4d1e56f82ec2e78d7c53ac93 (diff)
downloadgcc-4e2a2fb45c465c9e0d6e0b010dde4e0678bf915f.tar.gz
PR 43305
* builtins.c (expand_builtin_interclass_mathfn, expand_builtin_signbit): Use maybe_emit_unop_insn, emit libcalls if that fails. testsuite/ * gcc.dg/pr43305.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157567 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 705a25598b0..a68e743b616 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -2312,6 +2312,8 @@ expand_builtin_interclass_mathfn (tree exp, rtx target, rtx subtarget)
if (icode != CODE_FOR_nothing)
{
+ rtx last = get_last_insn ();
+ tree orig_arg = arg;
/* Make a suitable register to place result in. */
if (!target
|| GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp)))
@@ -2332,8 +2334,10 @@ expand_builtin_interclass_mathfn (tree exp, rtx target, rtx subtarget)
/* Compute into TARGET.
Set TARGET to wherever the result comes back. */
- emit_unop_insn (icode, target, op0, UNKNOWN);
- return target;
+ if (maybe_emit_unop_insn (icode, target, op0, UNKNOWN))
+ return target;
+ delete_insns_since (last);
+ CALL_EXPR_ARG (exp, 0) = orig_arg;
}
return NULL_RTX;
@@ -5197,9 +5201,11 @@ expand_builtin_signbit (tree exp, rtx target)
icode = signbit_optab->handlers [(int) fmode].insn_code;
if (icode != CODE_FOR_nothing)
{
+ rtx last = get_last_insn ();
target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
- emit_unop_insn (icode, target, temp, UNKNOWN);
- return target;
+ if (maybe_emit_unop_insn (icode, target, temp, UNKNOWN))
+ return target;
+ delete_insns_since (last);
}
/* For floating point formats without a sign bit, implement signbit