diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 44b45aadad0..801149af860 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2004-08-12 David Edelsohn + + * config/rs6000/rs6000.c (any_parallel_operand): New predicate. + * config/rs6000/rs6000.h (PREDICATE_CODES): Add + any_parallel_operand, lmw_operation, stmw_operation, + mfcr_operation, mtcrf_operation. + * config/rs6000/rs6000.md (save_fpregs_{si,di}): Use + any_parallel_operand. + (return_and_restore_fpregs_{si,di}): Same. + 2004-08-12 Zack Weinberg * genrecog.c (add_to_sequence): When processing a MATCH_PARALLEL, diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 8ed2625a0a6..56008c0b2e7 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1672,7 +1672,17 @@ any_operand (rtx op ATTRIBUTE_UNUSED, return 1; } +/* Returns 1 always. */ + +int +any_parallel_operand (rtx op ATTRIBUTE_UNUSED, + enum machine_mode mode ATTRIBUTE_UNUSED) +{ + return 1; +} + /* Returns 1 if op is the count register. */ + int count_register_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) { @@ -1689,6 +1699,7 @@ count_register_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) } /* Returns 1 if op is an altivec register. */ + int altivec_register_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) { diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 4b7db3a390e..6cbb477c543 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -2530,6 +2530,7 @@ extern char rs6000_reg_names[][8]; /* register names (0 vs. %r0). */ #define PREDICATE_CODES \ {"any_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, \ LABEL_REF, SUBREG, REG, MEM, PARALLEL}}, \ + {"any_parallel_operand", {PARALLEL}}, \ {"zero_constant", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, \ LABEL_REF, SUBREG, REG, MEM}}, \ {"short_cint_operand", {CONST_INT}}, \ @@ -2580,7 +2581,11 @@ extern char rs6000_reg_names[][8]; /* register names (0 vs. %r0). */ CONST_DOUBLE, SYMBOL_REF}}, \ {"load_multiple_operation", {PARALLEL}}, \ {"store_multiple_operation", {PARALLEL}}, \ + {"lmw_operation", {PARALLEL}}, \ + {"stmw_operation", {PARALLEL}}, \ {"vrsave_operation", {PARALLEL}}, \ + {"mfcr_operation", {PARALLEL}}, \ + {"mtcrf_operation", {PARALLEL}}, \ {"branch_comparison_operator", {EQ, NE, LE, LT, GE, \ GT, LEU, LTU, GEU, GTU, \ UNORDERED, ORDERED, \ diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 8cd7063b8cf..198291e22b4 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -14393,7 +14393,7 @@ "{stm|stmw} %2,%1") (define_insn "*save_fpregs_si" - [(match_parallel 0 "any_operand" + [(match_parallel 0 "any_parallel_operand" [(clobber (match_operand:SI 1 "register_operand" "=l")) (use (match_operand:SI 2 "call_operand" "s")) (set (match_operand:DF 3 "memory_operand" "=m") @@ -14404,7 +14404,7 @@ (set_attr "length" "4")]) (define_insn "*save_fpregs_di" - [(match_parallel 0 "any_operand" + [(match_parallel 0 "any_parallel_operand" [(clobber (match_operand:DI 1 "register_operand" "=l")) (use (match_operand:DI 2 "call_operand" "s")) (set (match_operand:DF 3 "memory_operand" "=m") @@ -14500,10 +14500,10 @@ [(set_attr "type" "jmpreg")]) ; FIXME: This would probably be somewhat simpler if the Cygnus sibcall -; stuff was in GCC. Oh, and "any_operand" is a bit flexible... +; stuff was in GCC. Oh, and "any_parallel_operand" is a bit flexible... (define_insn "*return_and_restore_fpregs_si" - [(match_parallel 0 "any_operand" + [(match_parallel 0 "any_parallel_operand" [(return) (use (match_operand:SI 1 "register_operand" "l")) (use (match_operand:SI 2 "call_operand" "s")) @@ -14513,7 +14513,7 @@ "b %z2") (define_insn "*return_and_restore_fpregs_di" - [(match_parallel 0 "any_operand" + [(match_parallel 0 "any_parallel_operand" [(return) (use (match_operand:DI 1 "register_operand" "l")) (use (match_operand:DI 2 "call_operand" "s"))