optabs.c (expand_binop): Correctly handle the carry in multiword add/subtract operations.
authorGeoffrey Keating <geoffk@redhat.com>
Mon, 27 Aug 2001 20:35:37 +0000 (20:35 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Mon, 27 Aug 2001 20:35:37 +0000 (20:35 +0000)
* optabs.c (expand_binop): Correctly handle the carry in multiword
add/subtract operations.

From-SVN: r45210

gcc/ChangeLog
gcc/optabs.c

index b80faaf46b25862cfa25d45dc6fef6676acecebb..11395beeb8f747be39c0993558afa01f49ad4b56 100644 (file)
@@ -1,3 +1,8 @@
+2001-08-27  Geoffrey Keating  <geoffk@redhat.com>
+
+       * optabs.c (expand_binop): Correctly handle the carry in multiword
+       add/subtract operations.
+
 2001-08-27  Fred Fish  <fnf@be.com>
 
        * ginclude/stddef.h: Fix typo, __SIZE__TYPE__ should be
index dfea0802ddfc570d1ad5fb03d68d1e6e855a47b7..7957719b4f94730a2aa4c39ebbb1d209e15ecef4 100644 (file)
@@ -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;