diff options
author | Geoffrey Keating <geoffk@redhat.com> | 2001-08-27 20:35:37 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@gcc.gnu.org> | 2001-08-27 20:35:37 +0000 |
commit | 859cb4d84e389fbc9a9192969d94c7ae4f6e896d (patch) | |
tree | 458f1faacf003439d19ad06c43e2732ffb34ee21 /gcc/optabs.c | |
parent | b7a0c86f585f538a6d9f8f0877ae2a379e64fb05 (diff) | |
download | gcc-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.c | 24 |
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; |