optabs.c (expand_unop): Try implementing negation using subtraction from zero.
authorRichard Sandiford <rsandifo@redhat.com>
Mon, 17 May 2004 06:50:51 +0000 (06:50 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 17 May 2004 06:50:51 +0000 (06:50 +0000)
* optabs.c (expand_unop): Try implementing negation using subtraction
from zero.

From-SVN: r81933

gcc/ChangeLog
gcc/optabs.c

index cabd0f3fd77d5711e5712734529da659c8b1d093..80bbf2a57ada725aa7f45733f200d5e7f82e8244 100644 (file)
@@ -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
index f89e053c456d975341d86b06942cd98baa94fad8..562eb2902f9b21d0e48829e94f1eac7255a48be3 100644 (file)
@@ -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)