aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/i386.md19
2 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3041ab0..62c417c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-01-16 Zack Weinberg <zack@wolery.cumb.org>
+
+ * config/i386/i386.md: Add peephole to merge successive stack
+ adjusts.
+
Sat Jan 15 15:41:14 EST 2000 John Wehle (john@feith.com)
* gcse.c (insert_insn_end_bb): Use emit_block_insn_before
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 2f7aa6a..c7b0181 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -8947,6 +8947,25 @@
[(parallel [(set (match_dup 0) (ashift:SI (match_dup 0) (match_dup 2)))
(clobber (reg:CC 17))])]
"operands[2] = GEN_INT (exact_log2 (INTVAL (operands[1])));")
+
+;; Merge two successive stack adjusts. The combiner doesn't know how
+;; to do this, and doesn't see all of them.
+;; (reg:SI 7) is %esp.
+(define_peephole2
+ [(parallel[
+ (set (reg:SI 7)
+ (plus:SI (reg:SI 7) (match_operand:SI 0 "const_int_operand" "")))
+ (clobber (reg:CC 17))])
+ (parallel[
+ (set (reg:SI 7)
+ (plus:SI (reg:SI 7) (match_operand:SI 1 "const_int_operand" "")))
+ (clobber (reg:CC 17))])]
+ ""
+ [(parallel[
+ (set (reg:SI 7)
+ (plus:SI (reg:SI 7) (match_dup 2)))
+ (clobber (reg:CC 17))])]
+ "operands[2] = GEN_INT (INTVAL (operands[0]) + INTVAL (operands[1]));")
;; Call-value patterns last so that the wildcard operand does not
;; disrupt insn-recog's switch tables.