diff options
author | Bob Wilson <bob.wilson@acm.org> | 2003-03-12 20:50:24 +0000 |
---|---|---|
committer | Bob Wilson <bwilson@gcc.gnu.org> | 2003-03-12 20:50:24 +0000 |
commit | 8d49831d20cea5e4114d5a692e427a875284ad10 (patch) | |
tree | 7aa024199dec5f1f2391621ce8de572b8a58fb03 | |
parent | bfa2615fe1a58d3efc0e3866d88fa0dfe0b94f04 (diff) | |
download | gcc-8d49831d20cea5e4114d5a692e427a875284ad10.zip gcc-8d49831d20cea5e4114d5a692e427a875284ad10.tar.gz gcc-8d49831d20cea5e4114d5a692e427a875284ad10.tar.bz2 |
xtensa.md (adddi3): Don't clobber source operand used to detect carry.
* config/xtensa/xtensa.md (adddi3): Don't clobber source operand used
to detect carry.
(subdi3): Reorder emitted instructions.
From-SVN: r64262
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/xtensa/xtensa.md | 17 |
2 files changed, 21 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be8cc2c..9a3a8e6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-03-12 Bob Wilson <bob.wilson@acm.org> + + * config/xtensa/xtensa.md (adddi3): Don't clobber source operand used + to detect carry. + (subdi3): Reorder emitted instructions. + 2003-03-12 Andreas Jaeger <aj@suse.de> * config/i386/netbsd64.h (TARGET_OS_CPP_BUILTINS): Remove call to diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md index cbda342..cc722b9 100644 --- a/gcc/config/xtensa/xtensa.md +++ b/gcc/config/xtensa/xtensa.md @@ -97,6 +97,7 @@ "" " { + rtx srclo; rtx dstlo = gen_lowpart (SImode, operands[0]); rtx src1lo = gen_lowpart (SImode, operands[1]); rtx src2lo = gen_lowpart (SImode, operands[2]); @@ -105,9 +106,21 @@ rtx src1hi = gen_highpart (SImode, operands[1]); rtx src2hi = gen_highpart (SImode, operands[2]); + /* Either source can be used for overflow checking, as long as it's + not clobbered by the first addition. */ + if (!rtx_equal_p (dstlo, src1lo)) + srclo = src1lo; + else if (!rtx_equal_p (dstlo, src2lo)) + srclo = src2lo; + else + { + srclo = gen_reg_rtx (SImode); + emit_move_insn (srclo, src1lo); + } + emit_insn (gen_addsi3 (dstlo, src1lo, src2lo)); emit_insn (gen_addsi3 (dsthi, src1hi, src2hi)); - emit_insn (gen_adddi_carry (dsthi, dstlo, src2lo)); + emit_insn (gen_adddi_carry (dsthi, dstlo, srclo)); DONE; }") @@ -209,9 +222,9 @@ rtx src1hi = gen_highpart (SImode, operands[1]); rtx src2hi = gen_highpart (SImode, operands[2]); - emit_insn (gen_subsi3 (dstlo, src1lo, src2lo)); emit_insn (gen_subsi3 (dsthi, src1hi, src2hi)); emit_insn (gen_subdi_carry (dsthi, src1lo, src2lo)); + emit_insn (gen_subsi3 (dstlo, src1lo, src2lo)); DONE; }") |