From cdc17ff2f9a9861e97ca391faac06453ce26608c Mon Sep 17 00:00:00 2001 From: bwilson Date: Wed, 12 Mar 2003 20:50:24 +0000 Subject: [PATCH] * config/xtensa/xtensa.md (adddi3): Don't clobber source operand used to detect carry. (subdi3): Reorder emitted instructions. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@64262 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/config/xtensa/xtensa.md | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be8cc2c7588..9a3a8e6dbfc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-03-12 Bob Wilson + + * config/xtensa/xtensa.md (adddi3): Don't clobber source operand used + to detect carry. + (subdi3): Reorder emitted instructions. + 2003-03-12 Andreas Jaeger * 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 cbda342917b..cc722b932a9 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; }") -- 2.11.4.GIT