Changeset: 4f67aa73f954 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4f67aa73f954
Modified Files:
        gdk/gdk_aggr.c
Branch: default
Log Message:

Merge with Jul2017 branch.


diffs (110 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -10,7 +10,11 @@
 #include "gdk.h"
 #include "gdk_private.h"
 #include "gdk_calc_private.h"
+#ifdef __INTEL_COMPILER
+#include <mathimf.h>
+#else
 #include <math.h>
+#endif
 
 /* grouped aggregates
  *
@@ -163,7 +167,7 @@ samesign(double x, double y)
  * fact that the sum returns INFINITY in *hi of the correct sign
  * (i.e. isinf() returns TRUE) in case of overflow. */
 static inline void
-twosum(double *hi, double *lo, double x, double y)
+twosum(volatile double *hi, volatile double *lo, double x, double y)
 {
        volatile double yr;
 
@@ -200,7 +204,7 @@ dofsum(const void *restrict values, oid 
        size_t i;
        BUN grp;
        double x, y;
-       double lo, hi;
+       volatile double lo, hi;
        double twopow = pow((double) FLT_RADIX, (double) (DBL_MAX_EXP - 1));
        BUN nils = 0;
 
@@ -275,7 +279,8 @@ dofsum(const void *restrict values, oid 
                        twosum(&hi, &lo, x, y);
                        if (isinf(hi)) {
                                int sign = hi > 0 ? 1 : -1;
-                               x = x - twopow * sign - twopow * sign;
+                               hi = x - twopow * sign;
+                               x = hi - twopow * sign;
                                pergroup[grp].partials[0] += sign;
                                if (fabs(x) < fabs(y))
                                        exchange(&x, &y);
@@ -336,12 +341,15 @@ dofsum(const void *restrict values, oid 
                    !samesign(pergroup[grp].partials[0], 
pergroup[grp].partials[pergroup[grp].npartials - 1])) {
                        twosum(&hi, &lo, pergroup[grp].partials[0] * twopow, 
pergroup[grp].partials[pergroup[grp].npartials - 1] / 2);
                        if (isinf(2 * hi)) {
-                               if (hi + 2 * lo - hi == 2 * lo &&
+                               y = 2 * lo;
+                               x = hi + y;
+                               x -= hi;
+                               if (x == y &&
                                    pergroup[grp].npartials > 2 &&
                                    samesign(lo, 
pergroup[grp].partials[pergroup[grp].npartials - 2])) {
                                        GDKfree(pergroup[grp].partials);
                                        pergroup[grp].partials = NULL;
-                                       x = 2 * (hi + 2 * lo);
+                                       x = 2 * (hi + y);
                                        if (tp2 == TYPE_flt) {
                                                if (x > GDK_flt_max ||
                                                    x <= GDK_flt_min) {
@@ -386,10 +394,10 @@ dofsum(const void *restrict values, oid 
                if (pergroup[grp].partials[0] != 0)
                        goto overflow;
 
-               /* accumulate into x */
-               x = pergroup[grp].partials[--pergroup[grp].npartials];
+               /* accumulate into hi */
+               hi = pergroup[grp].partials[--pergroup[grp].npartials];
                while (pergroup[grp].npartials > 0) {
-                       twosum(&x, &lo, x, 
pergroup[grp].partials[--pergroup[grp].npartials]);
+                       twosum(&hi, &lo, hi, 
pergroup[grp].partials[--pergroup[grp].npartials]);
                        if (lo) {
                                
pergroup[grp].partials[pergroup[grp].npartials++] = lo;
                                break;
@@ -398,28 +406,28 @@ dofsum(const void *restrict values, oid 
 
                if (pergroup[grp].npartials >= 2 &&
                    samesign(pergroup[grp].partials[pergroup[grp].npartials - 
1], pergroup[grp].partials[pergroup[grp].npartials - 2]) &&
-                   x + 2 * pergroup[grp].partials[pergroup[grp].npartials - 1] 
- x == 2 * pergroup[grp].partials[pergroup[grp].npartials - 1]) {
-                       x += 2 * pergroup[grp].partials[pergroup[grp].npartials 
- 1];
+                   hi + 2 * pergroup[grp].partials[pergroup[grp].npartials - 
1] - hi == 2 * pergroup[grp].partials[pergroup[grp].npartials - 1]) {
+                       hi += 2 * 
pergroup[grp].partials[pergroup[grp].npartials - 1];
                        pergroup[grp].partials[pergroup[grp].npartials - 1] = 
-pergroup[grp].partials[pergroup[grp].npartials - 1];
                }
 
                GDKfree(pergroup[grp].partials);
                pergroup[grp].partials = NULL;
                if (tp2 == TYPE_flt) {
-                       if (x > GDK_flt_max || x <= GDK_flt_min) {
+                       if (hi > GDK_flt_max || hi <= GDK_flt_min) {
                                if (abort_on_error)
                                        goto overflow;
                                ((flt *) results)[grp] = flt_nil;
                                nils++;
                        } else
-                               ((flt *) results)[grp] = (flt) x;
-               } else if (x == GDK_dbl_min) {
+                               ((flt *) results)[grp] = (flt) hi;
+               } else if (hi == GDK_dbl_min) {
                        if (abort_on_error)
                                goto overflow;
                        ((dbl *) results)[grp] = dbl_nil;
                        nils++;
                } else
-                       ((dbl *) results)[grp] = x;
+                       ((dbl *) results)[grp] = hi;
        }
        GDKfree(pergroup);
        return nils;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to