Changeset: 0097ac37d8ae for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0097ac37d8ae
Modified Files:
        gdk/gdk_calc.c
Branch: Oct2020
Log Message:

Implemented division of int and float giving int.
Also, make multiplication of int and float giving int work for all outout int
types, not just ones that are at least as large as the input int.


diffs (truncated from 810 to 300 lines):

diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -5600,6 +5600,12 @@ mul_##TYPE1##_##TYPE2##_##TYPE3(const TY
 #define rounddbl(x)    round(x)
 #endif
 
+#define absbte(x)      abs(x)
+#define abssht(x)      abs(x)
+#define absint(x)      abs(x)
+#define abslng(x)      llabs(x)
+#define abshge(x)      ABSOLUTE(x)
+
 #define MUL_INT_FLT_INT(TYPE1, TYPE2, TYPE3)                           \
 static BUN                                                             \
 mul_##TYPE1##_##TYPE2##_##TYPE3(                                       \
@@ -5622,7 +5628,7 @@ mul_##TYPE1##_##TYPE2##_##TYPE3(                          
        \
                                nils++;                                 \
                        } else if (lft[i] == 0 || rgt[j] == 0) {        \
                                dst[k] = 0;                             \
-                       } else if (max / rgt[j] < lft[i]) {             \
+                       } else if (max / fabs(rgt[j]) < abs##TYPE1(lft[i])) { \
                                if (abort_on_error)                     \
                                        ON_OVERFLOW(TYPE1, TYPE2, "*"); \
                                dst[k] = TYPE3##_nil;                   \
@@ -5643,7 +5649,7 @@ mul_##TYPE1##_##TYPE2##_##TYPE3(                          
        \
                                nils++;                                 \
                        } else if (lft[i] == 0 || rgt[j] == 0) {        \
                                dst[k] = 0;                             \
-                       } else if (max / rgt[j] < lft[i]) {             \
+                       } else if (max / fabs(rgt[j]) < abs##TYPE1(lft[i])) { \
                                if (abort_on_error)                     \
                                        ON_OVERFLOW(TYPE1, TYPE2, "*"); \
                                dst[k] = TYPE3##_nil;                   \
@@ -5661,17 +5667,27 @@ MUL_INT_FLT_INT(bte, flt, bte)
 MUL_INT_FLT_INT(bte, flt, sht)
 MUL_INT_FLT_INT(bte, flt, int)
 MUL_INT_FLT_INT(bte, flt, lng)
+MUL_INT_FLT_INT(sht, flt, bte)
 MUL_INT_FLT_INT(sht, flt, sht)
 MUL_INT_FLT_INT(sht, flt, int)
 MUL_INT_FLT_INT(sht, flt, lng)
+MUL_INT_FLT_INT(int, flt, bte)
+MUL_INT_FLT_INT(int, flt, sht)
 MUL_INT_FLT_INT(int, flt, int)
 MUL_INT_FLT_INT(int, flt, lng)
+MUL_INT_FLT_INT(lng, flt, bte)
+MUL_INT_FLT_INT(lng, flt, sht)
+MUL_INT_FLT_INT(lng, flt, int)
 MUL_INT_FLT_INT(lng, flt, lng)
 #ifdef HAVE_HGE
 MUL_INT_FLT_INT(bte, flt, hge)
 MUL_INT_FLT_INT(sht, flt, hge)
 MUL_INT_FLT_INT(int, flt, hge)
 MUL_INT_FLT_INT(lng, flt, hge)
+MUL_INT_FLT_INT(hge, flt, bte)
+MUL_INT_FLT_INT(hge, flt, sht)
+MUL_INT_FLT_INT(hge, flt, int)
+MUL_INT_FLT_INT(hge, flt, lng)
 MUL_INT_FLT_INT(hge, flt, hge)
 #endif
 
@@ -5679,17 +5695,27 @@ MUL_INT_FLT_INT(bte, dbl, bte)
 MUL_INT_FLT_INT(bte, dbl, sht)
 MUL_INT_FLT_INT(bte, dbl, int)
 MUL_INT_FLT_INT(bte, dbl, lng)
+MUL_INT_FLT_INT(sht, dbl, bte)
 MUL_INT_FLT_INT(sht, dbl, sht)
 MUL_INT_FLT_INT(sht, dbl, int)
 MUL_INT_FLT_INT(sht, dbl, lng)
+MUL_INT_FLT_INT(int, dbl, bte)
+MUL_INT_FLT_INT(int, dbl, sht)
 MUL_INT_FLT_INT(int, dbl, int)
 MUL_INT_FLT_INT(int, dbl, lng)
+MUL_INT_FLT_INT(lng, dbl, bte)
+MUL_INT_FLT_INT(lng, dbl, sht)
+MUL_INT_FLT_INT(lng, dbl, int)
 MUL_INT_FLT_INT(lng, dbl, lng)
 #ifdef HAVE_HGE
 MUL_INT_FLT_INT(bte, dbl, hge)
 MUL_INT_FLT_INT(sht, dbl, hge)
 MUL_INT_FLT_INT(int, dbl, hge)
 MUL_INT_FLT_INT(lng, dbl, hge)
+MUL_INT_FLT_INT(hge, dbl, bte)
+MUL_INT_FLT_INT(hge, dbl, sht)
+MUL_INT_FLT_INT(hge, dbl, int)
+MUL_INT_FLT_INT(hge, dbl, lng)
 MUL_INT_FLT_INT(hge, dbl, hge)
 #endif
 
@@ -6383,6 +6409,13 @@ mul_typeswitchloop(const void *lft, int 
 #endif
                case TYPE_flt:
                        switch (tp) {
+                       case TYPE_bte:
+                               nils = mul_sht_flt_bte(lft, incr1, rgt, incr2,
+                                                      dst, GDK_bte_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
                        case TYPE_sht:
                                nils = mul_sht_flt_sht(lft, incr1, rgt, incr2,
                                                       dst, GDK_sht_max,
@@ -6431,6 +6464,13 @@ mul_typeswitchloop(const void *lft, int 
                        break;
                case TYPE_dbl:
                        switch (tp) {
+                       case TYPE_bte:
+                               nils = mul_sht_dbl_bte(lft, incr1, rgt, incr2,
+                                                      dst, GDK_bte_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
                        case TYPE_sht:
                                nils = mul_sht_dbl_sht(lft, incr1, rgt, incr2,
                                                       dst, GDK_sht_max,
@@ -6651,6 +6691,20 @@ mul_typeswitchloop(const void *lft, int 
 #endif
                case TYPE_flt:
                        switch (tp) {
+                       case TYPE_bte:
+                               nils = mul_int_flt_bte(lft, incr1, rgt, incr2,
+                                                      dst, GDK_bte_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_sht:
+                               nils = mul_int_flt_sht(lft, incr1, rgt, incr2,
+                                                      dst, GDK_sht_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
                        case TYPE_int:
                                nils = mul_int_flt_int(lft, incr1, rgt, incr2,
                                                       dst, GDK_int_max,
@@ -6692,6 +6746,20 @@ mul_typeswitchloop(const void *lft, int 
                        break;
                case TYPE_dbl:
                        switch (tp) {
+                       case TYPE_bte:
+                               nils = mul_int_dbl_bte(lft, incr1, rgt, incr2,
+                                                      dst, GDK_bte_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_sht:
+                               nils = mul_int_dbl_sht(lft, incr1, rgt, incr2,
+                                                      dst, GDK_sht_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
                        case TYPE_int:
                                nils = mul_int_dbl_int(lft, incr1, rgt, incr2,
                                                       dst, GDK_int_max,
@@ -6887,6 +6955,27 @@ mul_typeswitchloop(const void *lft, int 
 #endif
                case TYPE_flt:
                        switch (tp) {
+                       case TYPE_bte:
+                               nils = mul_lng_flt_bte(lft, incr1, rgt, incr2,
+                                                      dst, GDK_bte_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_sht:
+                               nils = mul_lng_flt_sht(lft, incr1, rgt, incr2,
+                                                      dst, GDK_sht_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_int:
+                               nils = mul_lng_flt_int(lft, incr1, rgt, incr2,
+                                                      dst, GDK_int_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
                        case TYPE_lng:
                                nils = mul_lng_flt_lng(lft, incr1, rgt, incr2,
                                                       dst, GDK_lng_max,
@@ -6921,6 +7010,27 @@ mul_typeswitchloop(const void *lft, int 
                        break;
                case TYPE_dbl:
                        switch (tp) {
+                       case TYPE_bte:
+                               nils = mul_lng_dbl_bte(lft, incr1, rgt, incr2,
+                                                      dst, GDK_bte_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_sht:
+                               nils = mul_lng_dbl_sht(lft, incr1, rgt, incr2,
+                                                      dst, GDK_sht_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_int:
+                               nils = mul_lng_dbl_int(lft, incr1, rgt, incr2,
+                                                      dst, GDK_int_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
                        case TYPE_lng:
                                nils = mul_lng_dbl_lng(lft, incr1, rgt, incr2,
                                                       dst, GDK_lng_max,
@@ -7076,6 +7186,34 @@ mul_typeswitchloop(const void *lft, int 
                        break;
                case TYPE_flt:
                        switch (tp) {
+                       case TYPE_bte:
+                               nils = mul_hge_flt_bte(lft, incr1, rgt, incr2,
+                                                      dst, GDK_bte_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_sht:
+                               nils = mul_hge_flt_sht(lft, incr1, rgt, incr2,
+                                                      dst, GDK_sht_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_int:
+                               nils = mul_hge_flt_int(lft, incr1, rgt, incr2,
+                                                      dst, GDK_int_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_lng:
+                               nils = mul_hge_flt_lng(lft, incr1, rgt, incr2,
+                                                      dst, GDK_lng_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
                        case TYPE_hge:
                                nils = mul_hge_flt_hge(lft, incr1, rgt, incr2,
                                                       dst, GDK_hge_max,
@@ -7101,6 +7239,34 @@ mul_typeswitchloop(const void *lft, int 
                        break;
                case TYPE_dbl:
                        switch (tp) {
+                       case TYPE_bte:
+                               nils = mul_hge_dbl_bte(lft, incr1, rgt, incr2,
+                                                      dst, GDK_bte_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_sht:
+                               nils = mul_hge_dbl_sht(lft, incr1, rgt, incr2,
+                                                      dst, GDK_sht_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_int:
+                               nils = mul_hge_dbl_int(lft, incr1, rgt, incr2,
+                                                      dst, GDK_int_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
+                       case TYPE_lng:
+                               nils = mul_hge_dbl_lng(lft, incr1, rgt, incr2,
+                                                      dst, GDK_lng_max,
+                                                      ci1, ci2,
+                                                      candoff1, candoff2,
+                                                      abort_on_error);
+                               break;
                        case TYPE_hge:
                                nils = mul_hge_dbl_hge(lft, incr1, rgt, incr2,
                                                       dst, GDK_hge_max,
@@ -7715,6 +7881,137 @@ div_##TYPE1##_##TYPE2##_##TYPE3(const TY
        return nils;                                                    \
 }
 
+#define DIV_INT_FLT_INT(TYPE1, TYPE2, TYPE3)                           \
+static BUN                                                             \
+div_##TYPE1##_##TYPE2##_##TYPE3(                                       \
+       const TYPE1 *lft, bool incr1, const TYPE2 *rgt, bool incr2,     \
+       TYPE3 *restrict dst, TYPE3 max,                                 \
+       struct canditer *restrict ci1, struct canditer *restrict ci2,   \
+       oid candoff1, oid candoff2, bool abort_on_error)                \
+{                                                                      \
+       BUN nils = 0;                                                   \
+       BUN i = 0, j = 0;                                               \
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to