Changeset: 8ec3150441ef for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8ec3150441ef
Modified Files:
clients/Tests/exports.stable.out
gdk/gdk.h
gdk/gdk_atoms.c
gdk/gdk_atoms.h
monetdb5/modules/mal/Tests/remote03.stable.out
monetdb5/tests/BugDay_2005-10-06_4.9.3/Tests/return_types_of_head_and_tail.SF-701641.stable.out
sql/test/leaks/Tests/check0.stable.out
sql/test/leaks/Tests/check1.stable.out
sql/test/leaks/Tests/check2.stable.out
sql/test/leaks/Tests/check3.stable.out
sql/test/leaks/Tests/check4.stable.out
sql/test/leaks/Tests/check5.stable.out
sql/test/leaks/Tests/drop3.stable.out
sql/test/leaks/Tests/select1.stable.out
sql/test/leaks/Tests/select2.stable.out
sql/test/leaks/Tests/temp1.stable.out
sql/test/leaks/Tests/temp2.stable.out
sql/test/leaks/Tests/temp3.stable.out
Branch: int128
Log Message:
added 128-bit integer type "hge" ("huge") and related functions to gdk.h &
gdk_atoms.[hc]
diffs (truncated from 563 to 300 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -424,6 +424,9 @@ const flt flt_nil;
char *get_bin_path(void);
int gettimeofday(struct timeval *tv, int *ignore_zone);
int gprof_pthread_create(pthread_t *__restrict, __const pthread_attr_t
*__restrict, void *( *fcn)(void *), void *__restrict);
+int hgeFromStr(const char *src, int *len, hge **dst);
+int hgeToStr(str *dst, int *len, const hge *src);
+const hge hge_nil;
int intFromStr(const char *src, int *len, int **dst);
int intToStr(str *dst, int *len, const int *src);
const int int_nil;
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -479,7 +479,12 @@
#define TYPE_flt 9
#define TYPE_dbl 10
#define TYPE_lng 11
+#ifdef HAVE_HGE
+#define TYPE_hge 12
+#define TYPE_str 13
+#else
#define TYPE_str 12
+#endif
#define TYPE_any 255 /* limit types to <255! */
typedef signed char bit;
@@ -740,6 +745,9 @@ typedef struct {
str sval;
dbl dval;
lng lval;
+#ifdef HAVE_HGE
+ hge hval;
+#endif
} val;
int len, vtype;
} *ValPtr, ValRecord;
@@ -2324,6 +2332,9 @@ VALptr(const ValRecord *v)
case TYPE_flt: return (const void *) &v->val.fval;
case TYPE_dbl: return (const void *) &v->val.dval;
case TYPE_lng: return (const void *) &v->val.lval;
+#ifdef HAVE_HGE
+ case TYPE_hge: return (const void *) &v->val.hval;
+#endif
case TYPE_str: return (const void *) v->val.sval;
default: return (const void *) v->val.pval;
}
@@ -2416,6 +2427,12 @@ VALptr(const ValRecord *v)
((((lng)normal_int_SWAP(l))<<32) |\
(0xffffffff&normal_int_SWAP(l>>32)))
+#ifdef HAVE_HGE
+#define huge_int_SWAP(h) \
+ ((((hge)long_long_SWAP(h))<<64) |\
+ (0xffffffffffffffff&long_long_SWAP(h>>64)))
+#endif
+
/*
* The kernel maintains a central table of all active threads. They
* are indexed by their tid. The structure contains information on the
@@ -2970,6 +2987,9 @@ gdk_export int ALIGNsetH(BAT *b1, BAT *b
#define HASHloop_int(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, int)
#define HASHloop_wrd(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, wrd)
#define HASHloop_lng(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, lng)
+#ifdef HAVE_HGE
+#define HASHloop_hge(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, hge)
+#endif
#define HASHloop_oid(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, oid)
#define HASHloop_bat(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, bat)
#define HASHloop_flt(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, flt)
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -66,6 +66,14 @@ lngCmp(const lng *l, const lng *r)
return simple_CMP(l, r, lng);
}
+#ifdef HAVE_HGE
+static int
+hgeCmp(const hge *l, const hge *r)
+{
+ return simple_CMP(l, r, hge);
+}
+#endif
+
static int
dblCmp(const dbl *l, const dbl *r)
{
@@ -100,6 +108,15 @@ lngHash(const lng *v)
return (BUN) mix_int(((const unsigned int *) v)[0] ^ ((const unsigned
int *) v)[1]);
}
+#ifdef HAVE_HGE
+static BUN
+hgeHash(const hge *v)
+{
+ return (BUN) mix_int(((const unsigned int *) v)[0] ^ ((const unsigned
int *) v)[1] ^ \
+ ((const unsigned int *) v)[2] ^ ((const unsigned
int *) v)[3]);
+}
+#endif
+
/*
* @+ Standard Atoms
*/
@@ -121,6 +138,14 @@ lngConvert(lng *s)
*s = long_long_SWAP(*s);
}
+#ifdef HAVE_HGE
+static inline void
+hgeConvert(hge *s)
+{
+ *s = huge_int_SWAP(*s);
+}
+#endif
+
static inline int
batFix(const bat *b)
{
@@ -337,6 +362,9 @@ const int int_nil = GDK_int_min;
const flt flt_nil = GDK_flt_min;
const dbl dbl_nil = GDK_dbl_min;
const lng lng_nil = GDK_lng_min;
+#ifdef HAVE_HGE
+const hge hge_nil = GDK_hge_min;
+#endif
const oid oid_nil = (oid) 1 << (sizeof(oid) * 8 - 1);
const wrd wrd_nil = GDK_wrd_min;
const char str_nil[2] = { '\200', 0 };
@@ -392,6 +420,10 @@ ATOMcmp(int t, const void *l, const void
return simple_CMP(l, r, flt);
case TYPE_lng:
return simple_CMP(l, r, lng);
+#ifdef HAVE_HGE
+ case TYPE_hge:
+ return simple_CMP(l, r, hge);
+#endif
case TYPE_dbl:
return simple_CMP(l, r, dbl);
default:
@@ -686,8 +718,13 @@ numFromStr(const char *src, int *len, vo
{
const char *p = src;
int sz = ATOMsize(tp);
+#ifdef HAVE_HGE
+ hge base = 0;
+ hge maxdiv10 = 0; /* max value / 10 */
+#else
lng base = 0;
lng maxdiv10 = 0; /* max value / 10 */
+#endif
int maxmod10 = 7; /* max value % 10 */
int sign = 1;
@@ -722,6 +759,12 @@ numFromStr(const char *src, int *len, vo
case 8:
maxdiv10 = LL_CONSTANT(922337203685477580)/*7*/;
break;
+#ifdef HAVE_HGE
+ case 16:
+ maxdiv10 = GDK_hge_max / 10;
+ // 17014118346046923173168730371588410572/*7*/;
+ break;
+#endif
}
do {
if (base > maxdiv10 ||
@@ -756,6 +799,15 @@ numFromStr(const char *src, int *len, vo
p += 2;
break;
}
+#ifdef HAVE_HGE
+ case 16: {
+ hge **dsthge = (hge **) dst;
+ **dsthge = (hge) base;
+ if (p[0] == 'L' && p[1] == 'L')
+ p += 2;
+ break;
+ }
+#endif
}
return (int) (p - src);
}
@@ -784,6 +836,14 @@ lngFromStr(const char *src, int *len, ln
return numFromStr(src, len, (void **) dst, TYPE_lng);
}
+#ifdef HAVE_HGE
+int
+hgeFromStr(const char *src, int *len, hge **dst)
+{
+ return numFromStr(src, len, (void **) dst, TYPE_hge);
+}
+#endif
+
#define atom_io(TYPE, NAME, CAST) \
static TYPE * \
TYPE##Read(TYPE *a, stream *s, size_t cnt) \
@@ -808,8 +868,36 @@ atomtostr(int, "%d", )
atom_io(int, Int, int)
atomtostr(lng, LLFMT, )
+atom_io(lng, Lng, lng)
-atom_io(lng, Lng, lng)
+#ifdef HAVE_HGE
+#ifdef WIN32
+#define HGE_LL018FMT "%018I64d"
+#else
+#define HGE_LL018FMT "%018lld"
+#endif
+#define HGE_LL18DIGITS LL_CONSTANT(1000000000000000000)
+
+int
+hgeToStr(char **dst, int *len, const hge *src)
+{
+ atommem(char, hgeStrlen);
+ if (*src == hge_nil) {
+ strncpy(*dst, "nil", *len);
+ return 3;
+ }
+ if ((hge) GDK_lng_min <= *src && *src <= (hge) GDK_lng_max) {
+ lng s = (lng) *src;
+ return lngToStr(dst, len, &s);
+ } else {
+ hge s = *src / HGE_LL18DIGITS;
+ int l = hgeToStr(dst, len, &s);
+ snprintf(*dst + l, *len - l, HGE_LL018FMT, (lng) ABS(*src %
HGE_LL18DIGITS));
+ return (int) strlen(*dst);
+ }
+}
+atom_io(hge, Hge, hge)
+#endif
int
ptrFromStr(const char *src, int *len, ptr **dst)
@@ -1900,6 +1988,17 @@ atomDesc BATatoms[MAXATOMS] = {
0, 0,
0, 0,
0, 0},
+#ifdef HAVE_HGE
+ {"hge", TYPE_hge, 1, sizeof(hge), sizeof(hge), 0, 0, (ptr) &hge_nil,
+ (int (*)(const char *, int *, ptr *)) hgeFromStr, (int (*)(str *, int
*, const void *)) hgeToStr,
+ (void *(*)(void *, stream *, size_t)) hgeRead, (int (*)(const void *,
stream *, size_t)) hgeWrite,
+ (int (*)(const void *, const void *)) hgeCmp,
+ (BUN (*)(const void *)) hgeHash, (void (*)(ptr, int)) hgeConvert,
+ 0, 0,
+ 0, 0,
+ 0, 0,
+ 0, 0},
+#endif
{"str", TYPE_str, 1, sizeof(var_t), sizeof(var_t), 0, 1, (ptr) str_nil,
(int (*)(const char *, int *, ptr *)) strFromStr, (int (*)(str *, int
*, const void *)) strToStr,
(void *(*)(void *, stream *, size_t)) strRead, (int (*)(const void *,
stream *, size_t)) strWrite,
diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h
--- a/gdk/gdk_atoms.h
+++ b/gdk/gdk_atoms.h
@@ -69,6 +69,9 @@
#define ptrStrlen 48
#endif
#define lngStrlen 48
+#ifdef HAVE_HGE
+#define hgeStrlen 96
+#endif
#define fltStrlen 48
#define dblStrlen 96
@@ -79,6 +82,10 @@
* leads to the following type descriptor table.
*/
+#ifdef HAVE_HGE
+gdk_export int hgeFromStr(const char *src, int *len, hge **dst);
+gdk_export int hgeToStr(str *dst, int *len, const hge *src);
+#endif
gdk_export int lngFromStr(const char *src, int *len, lng **dst);
gdk_export int lngToStr(str *dst, int *len, const lng *src);
gdk_export int intFromStr(const char *src, int *len, int **dst);
@@ -127,6 +134,11 @@ gdk_export int escapedStr(char *dst, con
#define GDK_flt_min (-GDK_flt_max)
#define GDK_lng_max ((lng) LLONG_MAX)
#define GDK_lng_min ((lng) LLONG_MIN)
+#ifdef HAVE_HGE
+#define GDK_hge_max ((((hge) 1) << 126) - 1 + \
+ (((hge) 1) << 126))
+#define GDK_hge_min (((hge) 1) << 127)
+#endif
#define GDK_dbl_max ((dbl) DBL_MAX)
#define GDK_dbl_min (-GDK_dbl_max)
/* GDK_oid_max see below */
@@ -138,6 +150,9 @@ gdk_export const int int_nil;
gdk_export const flt flt_nil;
gdk_export const dbl dbl_nil;
gdk_export const lng lng_nil;
+#ifdef HAVE_HGE
+gdk_export const hge hge_nil;
+#endif
gdk_export const oid oid_nil;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list