aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1996-09-23 16:42:58 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1996-09-23 16:42:58 -0400
commit0842a17931118249ec6743dfd1aabed36eb14605 (patch)
treee9157d9f056b7841d0b09c1e7fd0d03f3c453ce6 /gcc
parent3c2f289c1ae0c7d3cee1ba0e2a2bca2b5736786e (diff)
downloadgcc-0842a17931118249ec6743dfd1aabed36eb14605.zip
gcc-0842a17931118249ec6743dfd1aabed36eb14605.tar.gz
gcc-0842a17931118249ec6743dfd1aabed36eb14605.tar.bz2
(expand_increment): If postincrement for MEM can't use add directly,
load address in reg and enqueue increment and store of reg. From-SVN: r12785
Diffstat (limited to 'gcc')
-rw-r--r--gcc/expr.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index e0db908..1b0ba5b 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -9642,6 +9642,22 @@ expand_increment (exp, post, ignore)
return enqueue_insn (op0, GEN_FCN (icode) (op0, op0, op1));
}
+ if (icode != (int) CODE_FOR_nothing && GET_CODE (op0) == MEM)
+ {
+ rtx addr = force_reg (Pmode, XEXP (op0, 0));
+ rtx temp, result;
+
+ op0 = change_address (op0, VOIDmode, addr);
+ temp = force_reg (GET_MODE (op0), op0);
+ if (! (*insn_operand_predicate[icode][2]) (op1, mode))
+ op1 = force_reg (mode, op1);
+
+ /* The increment queue is LIFO, thus we have to `queue'
+ the instructions in reverse order. */
+ enqueue_insn (op0, gen_move_insn (op0, temp));
+ result = enqueue_insn (temp, GEN_FCN (icode) (temp, temp, op1));
+ return result;
+ }
}
/* Preincrement, or we can't increment with one simple insn. */