diff options
-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; }") |