IA MCU psABI support: changes to libraries
[gcc.git] / gcc / double-int.c
index f6e340bebfe6f238206fd5005037a467573b245d..7ffcac25a75c59a0092b96e0dfe07819fa7ee7ff 100644 (file)
@@ -1,5 +1,5 @@
 /* Operations with long integers.
-   Copyright (C) 2006-2014 Free Software Foundation, Inc.
+   Copyright (C) 2006-2015 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"                        /* For BITS_PER_UNIT and *_BIG_ENDIAN.  */
+#include "alias.h"
+#include "symtab.h"
 #include "tree.h"
 
 static int add_double_with_sign (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
@@ -569,24 +571,23 @@ div_and_round_double (unsigned code, int uns,
       {
        unsigned HOST_WIDE_INT labs_rem = *lrem;
        HOST_WIDE_INT habs_rem = *hrem;
-       unsigned HOST_WIDE_INT labs_den = lden, ltwice;
-       HOST_WIDE_INT habs_den = hden, htwice;
+       unsigned HOST_WIDE_INT labs_den = lden, lnegabs_rem, ldiff;
+       HOST_WIDE_INT habs_den = hden, hnegabs_rem, hdiff;
 
        /* Get absolute values.  */
-       if (*hrem < 0)
+       if (!uns && *hrem < 0)
          neg_double (*lrem, *hrem, &labs_rem, &habs_rem);
-       if (hden < 0)
+       if (!uns && hden < 0)
          neg_double (lden, hden, &labs_den, &habs_den);
 
-       /* If (2 * abs (lrem) >= abs (lden)), adjust the quotient.  */
-       mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
-                   labs_rem, habs_rem, &ltwice, &htwice);
+       /* If abs(rem) >= abs(den) - abs(rem), adjust the quotient.  */
+       neg_double (labs_rem, habs_rem, &lnegabs_rem, &hnegabs_rem);
+       add_double (labs_den, habs_den, lnegabs_rem, hnegabs_rem,
+                   &ldiff, &hdiff);
 
-       if (((unsigned HOST_WIDE_INT) habs_den
-            < (unsigned HOST_WIDE_INT) htwice)
-           || (((unsigned HOST_WIDE_INT) habs_den
-                == (unsigned HOST_WIDE_INT) htwice)
-               && (labs_den <= ltwice)))
+       if (((unsigned HOST_WIDE_INT) habs_rem
+            > (unsigned HOST_WIDE_INT) hdiff)
+           || (habs_rem == hdiff && labs_rem >= ldiff))
          {
            if (quo_neg)
              /* quo = quo - 1;  */