aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/optabs.c9
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cabd0f3..80bbf2a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-05-17 Richard Sandiford <rsandifo@redhat.com>
+
+ * optabs.c (expand_unop): Try implementing negation using subtraction
+ from zero.
+
2004-05-16 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* pa.md: Fix typo from last change. Remove DFmode move to and from
diff --git a/gcc/optabs.c b/gcc/optabs.c
index f89e053..562eb290 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -2737,6 +2737,15 @@ expand_unop (enum machine_mode mode, optab unoptab, rtx op0, rtx target,
return temp;
}
+ /* If there is no negation pattern, try subtracting from zero. */
+ if (unoptab == neg_optab && class == MODE_INT)
+ {
+ temp = expand_binop (mode, sub_optab, CONST0_RTX (mode), op0,
+ target, unsignedp, OPTAB_DIRECT);
+ if (temp)
+ return temp;
+ }
+
try_libcall:
/* Now try a library call in this mode. */
if (unoptab->handlers[(int) mode].libfunc)