From: Geoffrey Keating Date: Mon, 27 Aug 2001 20:35:37 +0000 (+0000) Subject: optabs.c (expand_binop): Correctly handle the carry in multiword add/subtract operations. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=859cb4d84e389fbc9a9192969d94c7ae4f6e896d;hp=b7a0c86f585f538a6d9f8f0877ae2a379e64fb05;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b80faaf46b2..11395beeb8f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-08-27 Geoffrey Keating + + * optabs.c (expand_binop): Correctly handle the carry in multiword + add/subtract operations. + 2001-08-27 Fred Fish * ginclude/stddef.h: Fix typo, __SIZE__TYPE__ should be diff --git a/gcc/optabs.c b/gcc/optabs.c index dfea0802ddf..7957719b4f9 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;