diff options
author | Richard Henderson <rth@cygnus.com> | 1999-01-19 13:55:35 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1999-01-19 13:55:35 -0800 |
commit | 6fbe9bd84020ce363a00acea4ad0d85766b2fb97 (patch) | |
tree | 088d40957b9d7c9c96322fee3efb8313e0f0e222 /gcc | |
parent | d804ed43d00126b959d19621d7c546463d990e1a (diff) | |
download | gcc-6fbe9bd84020ce363a00acea4ad0d85766b2fb97.tar.gz |
recog.c (pop_operand): New function.
* recog.c (pop_operand): New function.
* recog.h (pop_operand): Declare it.
* genrecog.c (preds): Define it.
From-SVN: r24774
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/genrecog.c | 1 | ||||
-rw-r--r-- | gcc/recog.c | 33 | ||||
-rw-r--r-- | gcc/recog.h | 1 |
4 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 572ce6cd7d5..d32ef1b1010 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ Tue Jan 19 21:20:52 1999 Richard Henderson <rth@cygnus.com> + * recog.c (pop_operand): New function. + * recog.h (pop_operand): Declare it. + * genrecog.c (preds): Define it. + * expr.c (do_jump_for_compare): Handle conditional branch expanders emitting multiple jump instructions. * jump.c (condjump_label): New function. diff --git a/gcc/genrecog.c b/gcc/genrecog.c index da2a0cf36e9..bcc47f0a6d3 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -161,6 +161,7 @@ static struct pred_table {"nonmemory_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, LABEL_REF, SUBREG, REG}}, {"push_operand", {MEM}}, + {"pop_operand", {MEM}}, {"memory_operand", {SUBREG, MEM}}, {"indirect_operand", {SUBREG, MEM}}, {"comparison_operator", {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU, GTU}}, diff --git a/gcc/recog.c b/gcc/recog.c index da80b864655..6d8db93e918 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -41,6 +41,14 @@ Boston, MA 02111-1307, USA. */ #endif #endif +#ifndef STACK_POP_CODE +#ifdef STACK_GROWS_DOWNWARD +#define STACK_POP_CODE POST_INC +#else +#define STACK_POP_CODE POST_DEC +#endif +#endif + static void validate_replace_rtx_1 PROTO((rtx *, rtx, rtx, rtx)); static rtx *find_single_use_1 PROTO((rtx, rtx *)); static rtx *find_constant_term_loc PROTO((rtx *)); @@ -1200,6 +1208,31 @@ push_operand (op, mode) return XEXP (op, 0) == stack_pointer_rtx; } +/* Return 1 if OP is a valid operand that stands for popping a + value of mode MODE off the stack. + + The main use of this function is as a predicate in match_operand + expressions in the machine description. */ + +int +pop_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) != MEM) + return 0; + + if (GET_MODE (op) != mode) + return 0; + + op = XEXP (op, 0); + + if (GET_CODE (op) != STACK_POP_CODE) + return 0; + + return XEXP (op, 0) == stack_pointer_rtx; +} + /* Return 1 if ADDR is a valid memory address for mode MODE. */ int diff --git a/gcc/recog.h b/gcc/recog.h index d85cc0f71e1..fc4719b4e65 100644 --- a/gcc/recog.h +++ b/gcc/recog.h @@ -98,6 +98,7 @@ extern int const_double_operand PROTO((rtx, enum machine_mode)); extern int nonimmediate_operand PROTO((rtx, enum machine_mode)); extern int nonmemory_operand PROTO((rtx, enum machine_mode)); extern int push_operand PROTO((rtx, enum machine_mode)); +extern int pop_operand PROTO((rtx, enum machine_mode)); extern int memory_operand PROTO((rtx, enum machine_mode)); extern int indirect_operand PROTO((rtx, enum machine_mode)); extern int mode_independent_operand PROTO((rtx, enum machine_mode)); |