* config/ia64/ia64.c (ia64_expand_vecint_minmax): Use us_minus and
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Jun 2005 22:22:13 +0000 (22:22 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Jun 2005 22:22:13 +0000 (22:22 +0000)
        plus for V4HImode UMAX.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101441 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/ia64/ia64.c

index 91e2631..ea8a5ae 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-29  Richard Henderson  <rth@redhat.com>
+
+       * config/ia64/ia64.c (ia64_expand_vecint_minmax): Use us_minus and
+       plus for V4HImode UMAX.
+
 2005-06-29  Joseph S. Myers  <joseph@codesourcery.com>
 
        * c-tree.h (default_function_array_conversion): Take and return
index 85d0bd2..f8f3463 100644 (file)
@@ -1689,6 +1689,18 @@ ia64_expand_vecint_minmax (enum rtx_code code, enum machine_mode mode,
   if (mode == V4HImode && (code == SMIN || code == SMAX))
     return false;
 
+  /* This combination can be implemented with only saturating subtraction.  */
+  if (mode == V4HImode && code == UMAX)
+    {
+      rtx x, tmp = gen_reg_rtx (mode);
+
+      x = gen_rtx_US_MINUS (mode, operands[1], operands[2]);
+      emit_insn (gen_rtx_SET (VOIDmode, tmp, x));
+
+      emit_insn (gen_addv4hi3 (operands[0], tmp, operands[2]));
+      return true;
+    }
+
   /* Everything else implemented via vector comparisons.  */
   xops[0] = operands[0];
   xops[4] = xops[1] = operands[1];