]> gcc.gnu.org Git - gcc.git/commitdiff
(tablejump): Rework to look like normal add but verify that label is for next insn...
authorRichard Kenner <kenner@gcc.gnu.org>
Sat, 30 Jul 1994 16:54:26 +0000 (12:54 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 30 Jul 1994 16:54:26 +0000 (12:54 -0400)
(tablejump): Rework to look like normal add but verify that label is
for next insn and is tablejump; look for ADDR_DIFF_ELT.

From-SVN: r7831

gcc/config/alpha/alpha.md

index fc9a5b8c6d5ea8fdb742e2b03178287965e74eea..93dec2c12d99d6418c321862081c58bcfade7bb3 100644 (file)
 (define_expand "tablejump"
   [(set (match_dup 3)
        (sign_extend:DI (match_operand:SI 0 "register_operand" "")))
-   (parallel [(set (pc) (plus:DI (match_dup 3) (reg:DI 29)))
-             (use (label_ref (match_operand 1 "" "")))
+   (parallel [(set (pc)
+                  (plus:DI (match_dup 3)
+                           (label_ref:DI (match_operand 1 "" ""))))
              (clobber (match_scratch:DI 2 "=r"))])]
   ""
   "
 (define_insn ""
   [(set (pc)
        (plus:DI (match_operand:DI 0 "register_operand" "r")
-                (reg:DI 29)))
-   (use (label_ref (match_operand 1 "" "")))
+                (label_ref:DI (match_operand 1 "" ""))))
    (clobber (match_scratch:DI 2 "=r"))]
-  ""
+  "next_active_insn (insn) != 0
+   && GET_CODE (PATTERN (next_active_insn (insn))) == ADDR_DIFF_VEC
+   && PREV_INSN (next_active_insn (insn)) == operands[1]"
   "*
 { rtx best_label = 0;
   rtx jump_table_insn = next_active_insn (operands[1]);
 
   if (GET_CODE (jump_table_insn) == JUMP_INSN
-      && GET_CODE (PATTERN (jump_table_insn)) == ADDR_VEC)
+      && GET_CODE (PATTERN (jump_table_insn)) == ADDR_DIFF_VEC)
     {
       rtx jump_table = PATTERN (jump_table_insn);
-      int n_labels = XVECLEN (jump_table, 0);
+      int n_labels = XVECLEN (jump_table, 1);
       int best_count = -1;
       int i, j;
 
          int count = 1;
 
          for (j = i + 1; j < n_labels; j++)
-           if (XEXP (XVECEXP (jump_table, 0, i), 0)
-               == XEXP (XVECEXP (jump_table, 0, j), 0))
+           if (XEXP (XVECEXP (jump_table, 1, i), 0)
+               == XEXP (XVECEXP (jump_table, 1, j), 0))
              count++;
 
          if (count > best_count)
-           best_count = count, best_label = XVECEXP (jump_table, 0, i);
+           best_count = count, best_label = XVECEXP (jump_table, 1, i);
        }
     }
 
This page took 0.079018 seconds and 5 git commands to generate.