alpha.c (alpha_emit_conditional_move): Fail if we discover we need a pseudo and no_ne...
authorRichard Henderson <rth@cygnus.com>
Fri, 7 Apr 2000 09:53:18 +0000 (02:53 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 7 Apr 2000 09:53:18 +0000 (02:53 -0700)
        * config/alpha/alpha.c (alpha_emit_conditional_move): Fail
        if we discover we need a pseudo and no_new_pseudos is true.
        * config/alpha/alpha.md (ne:DI insn): New.
        (trunctfsf2, sne): Emit NE instead of non-canonical LTU.

From-SVN: r32998

gcc/ChangeLog
gcc/config/alpha/alpha.c
gcc/config/alpha/alpha.md

index 75360a0..2ff6711 100644 (file)
@@ -1,5 +1,12 @@
 2000-04-07  Richard Henderson  <rth@cygnus.com>
 
+       * config/alpha/alpha.c (alpha_emit_conditional_move): Fail
+       if we discover we need a pseudo and no_new_pseudos is true.
+       * config/alpha/alpha.md (ne:DI insn): New.
+       (trunctfsf2, sne): Emit NE instead of non-canonical LTU.
+
+2000-04-07  Richard Henderson  <rth@cygnus.com>
+
        * rtl.def (COND_EXEC): New.
        * rtl.h (COND_EXEC_TEST, COND_EXEC_CODE): New.
        * tm.texi (MAX_CONDITIONAL_EXECUTE): Document.
index a547a92..7d82f30 100644 (file)
@@ -1769,11 +1769,14 @@ alpha_emit_conditional_move (cmp, mode)
       && (op0 == CONST0_RTX (cmp_mode) || op1 == CONST0_RTX (cmp_mode)))
     return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
 
-  /* We can't put the comparison insides a conditional move;
+  /* We can't put the comparison inside the conditional move;
      emit a compare instruction and put that inside the
      conditional move.  Make sure we emit only comparisons we have;
      swap or reverse as necessary.  */
 
+  if (no_new_pseudos)
+    return NULL_RTX;
+
   switch (code)
     {
     case EQ:  case LE:  case LT:  case LEU:  case LTU:
index 03c7003..5b9dd8e 100644 (file)
      which prevents rounding error in the final conversion to SFmode.  */
 
   emit_insn (gen_rtx_SET (VOIDmode, sticky, 
-                         gen_rtx_LTU (DImode, const0_rtx, lo)));
+                         gen_rtx_NE (DImode, lo, const0_rtx)));
   emit_insn (gen_iordi3 (hi, hi, sticky));
   emit_insn (gen_trunctfdf2 (tmpf, arg));
   emit_insn (gen_truncdfsf2 (operands[0], tmpf));
 
 (define_insn ""
   [(set (match_operand:DI 0 "register_operand" "=r")
+       (ne:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI")
+              (const_int 0)))]
+  ""
+  "cmpult $31,%1,%0"
+  [(set_attr "type" "icmp")])
+
+(define_insn ""
+  [(set (match_operand:DI 0 "register_operand" "=r")
        (match_operator:DI 1 "alpha_comparison_operator"
                           [(match_operand:DI 2 "reg_or_0_operand" "rJ")
                            (match_operand:DI 3 "reg_or_8bit_operand" "rI")]))]
 
   if (alpha_compare.op1 == const0_rtx)
     {
-      emit_insn (gen_sgtu (operands[0]));
+      operands[1] = gen_rtx_NE (DImode, alpha_compare.op0, alpha_compare.op1);
+      alpha_compare.op0 = alpha_compare.op1 = NULL_RTX;
+      emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
       DONE;
     }