diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1996-09-23 16:42:58 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1996-09-23 16:42:58 -0400 |
commit | 0842a17931118249ec6743dfd1aabed36eb14605 (patch) | |
tree | e9157d9f056b7841d0b09c1e7fd0d03f3c453ce6 /gcc | |
parent | 3c2f289c1ae0c7d3cee1ba0e2a2bca2b5736786e (diff) | |
download | gcc-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.c | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -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. */ |