aboutsummaryrefslogtreecommitdiff
path: root/gcc/optabs.c
diff options
context:
space:
mode:
authorGeoffrey Keating <geoffk@redhat.com>2001-08-27 20:35:37 +0000
committerGeoffrey Keating <geoffk@gcc.gnu.org>2001-08-27 20:35:37 +0000
commit859cb4d84e389fbc9a9192969d94c7ae4f6e896d (patch)
tree458f1faacf003439d19ad06c43e2732ffb34ee21 /gcc/optabs.c
parentb7a0c86f585f538a6d9f8f0877ae2a379e64fb05 (diff)
downloadgcc-859cb4d84e389fbc9a9192969d94c7ae4f6e896d.zip
gcc-859cb4d84e389fbc9a9192969d94c7ae4f6e896d.tar.gz
gcc-859cb4d84e389fbc9a9192969d94c7ae4f6e896d.tar.bz2
optabs.c (expand_binop): Correctly handle the carry in multiword add/subtract operations.
* optabs.c (expand_binop): Correctly handle the carry in multiword add/subtract operations. From-SVN: r45210
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r--gcc/optabs.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index dfea080..7957719 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -1185,7 +1185,6 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
&& binoptab->handlers[(int) word_mode].insn_code != CODE_FOR_nothing)
{
unsigned int i;
- rtx carry_tmp = gen_reg_rtx (word_mode);
optab otheroptab = binoptab == add_optab ? sub_optab : add_optab;
unsigned int nwords = GET_MODE_BITSIZE (mode) / BITS_PER_WORD;
rtx carry_in = NULL_RTX, carry_out = NULL_RTX;
@@ -1241,24 +1240,22 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
if (i > 0)
{
+ rtx newx;
+
/* Add/subtract previous carry to main result. */
- x = expand_binop (word_mode,
- normalizep == 1 ? binoptab : otheroptab,
- x, carry_in,
- target_piece, 1, next_methods);
- if (x == 0)
- break;
- else if (target_piece != x)
- emit_move_insn (target_piece, x);
+ newx = expand_binop (word_mode,
+ normalizep == 1 ? binoptab : otheroptab,
+ x, carry_in,
+ NULL_RTX, 1, next_methods);
if (i + 1 < nwords)
{
- /* THIS CODE HAS NOT BEEN TESTED. */
/* Get out carry from adding/subtracting carry in. */
+ rtx carry_tmp = gen_reg_rtx (word_mode);
carry_tmp = emit_store_flag_force (carry_tmp,
- binoptab == add_optab
- ? LT : GT,
- x, carry_in,
+ (binoptab == add_optab
+ ? LT : GT),
+ newx, x,
word_mode, 1, normalizep);
/* Logical-ior the two poss. carry together. */
@@ -1268,6 +1265,7 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
if (carry_out == 0)
break;
}
+ emit_move_insn (target_piece, newx);
}
carry_in = carry_out;