e0c8972
--- src/gmpints.c.orig	2016-03-19 16:35:29.000000000 -0600
e0c8972
+++ src/gmpints.c	2016-04-02 07:38:28.517903402 -0600
e0c8972
@@ -377,6 +377,41 @@ Obj ObjInt_UInt( UInt i )
e0c8972
   }
e0c8972
 }
e0c8972
 
e0c8972
+Obj ObjInt_LongLong( long long i )
e0c8972
+{
e0c8972
+  Obj gmp;
e0c8972
+  unsigned long long ull;
e0c8972
+  size_t j;
e0c8972
+
e0c8972
+  if ( (-(1LL<
e0c8972
+    return INTOBJ_INT((Int) i);
e0c8972
+
e0c8972
+  if ( i >= 0LL ) {
e0c8972
+    gmp = NewBag( T_INTPOS, sizeof(i) );
e0c8972
+    ull = (unsigned long long) i;
e0c8972
+  }
e0c8972
+  else {
e0c8972
+    gmp = NewBag( T_INTNEG, sizeof(i) );
e0c8972
+    ull = (unsigned long long) -i;
e0c8972
+  }
e0c8972
+  for ( j = 0U; j < sizeof(i) / sizeof(TypLimb); j++ )
e0c8972
+    ((TypLimb *)ADDR_OBJ( gmp ))[j] = ull >> (j * sizeof(TypLimb));
e0c8972
+  return GMP_NORMALIZE( gmp );
e0c8972
+}
e0c8972
+
e0c8972
+Obj ObjInt_ULongLong( unsigned long long i )
e0c8972
+{
e0c8972
+  Obj gmp;
e0c8972
+  size_t j;
e0c8972
+
e0c8972
+  if ( i < 1ULL<
e0c8972
+    return INTOBJ_INT((Int) i);
e0c8972
+  gmp = NewBag( T_INTPOS, sizeof(i) );
e0c8972
+  for ( j = 0U; j < sizeof(i) / sizeof(TypLimb); j++ )
e0c8972
+    ((TypLimb *)ADDR_OBJ( gmp ))[j] = i >> (j * sizeof(TypLimb));
e0c8972
+  return GMP_NORMALIZE( gmp );
e0c8972
+}
e0c8972
+
e0c8972
 
e0c8972
 /****************************************************************************
e0c8972
 **
e0c8972
--- src/gmpints.h.orig	2016-03-19 16:35:29.000000000 -0600
e0c8972
+++ src/gmpints.h	2016-04-02 07:38:28.518903322 -0600
e0c8972
@@ -87,6 +87,21 @@ typedef mp_size_t   TypGMPSize;
e0c8972
 Obj ObjInt_Int(Int i);
e0c8972
 Obj ObjInt_UInt(UInt i);
e0c8972
 
e0c8972
+
e0c8972
+/**************************************************************************
e0c8972
+** The following two functions convert a C long long or unsigned long long
e0c8972
+** respectively into* a GAP integer, either an immediate, small integer if
e0c8972
+** possible or otherwise a new GAP bag with TNUM T_INTPOS or T_INTNEG.
e0c8972
+**
e0c8972
+*F ObjInt_LongLong(long long i)
e0c8972
+*F ObjInt_ULongLong(unsigned long long i)
e0c8972
+**
e0c8972
+****************************************************************************/
e0c8972
+
e0c8972
+Obj ObjInt_LongLong(long long i);
e0c8972
+Obj ObjInt_ULongLong(unsigned long long i);
e0c8972
+
e0c8972
+
e0c8972
 /****************************************************************************
e0c8972
 **
e0c8972
 */
e0c8972
--- src/integer.c.orig	2016-03-19 16:35:29.000000000 -0600
e0c8972
+++ src/integer.c	2016-04-02 07:38:28.520903161 -0600
e0c8972
@@ -216,6 +216,58 @@ Obj ObjInt_UInt(UInt i)
e0c8972
 }
e0c8972
 
e0c8972
 
e0c8972
+/**************************************************************************
e0c8972
+** The following two functions convert a C long long or unsigned long long
e0c8972
+** respectively into a GAP integer, either an immediate, small integer if
e0c8972
+** possible or otherwise a new GAP bag with TNUM T_INTPOS or T_INTNEG.
e0c8972
+**
e0c8972
+*F ObjInt_LongLong(long long i)
e0c8972
+*F ObjInt_ULongLong(unsigned long long i)
e0c8972
+**
e0c8972
+****************************************************************************/
e0c8972
+
e0c8972
+#define NDIGITS_RAW (sizeof (long long) / sizeof (TypDigit))
e0c8972
+#define NDIGITS (NDIGITS_RAW >= 4U ? NDIGITS_RAW : 4U)
e0c8972
+
e0c8972
+Obj ObjInt_LongLong(long long i)
e0c8972
+{
e0c8972
+    Obj n;
e0c8972
+    long long bound = 1LL << NR_SMALL_INT_BITS;
e0c8972
+    if (i >= bound) {
e0c8972
+        /* We have to make a big integer */
e0c8972
+        size_t j;
e0c8972
+        n = NewBag(T_INTPOS, NDIGITS);
e0c8972
+        for ( j = 0U; j < NDIGITS; j++ )
e0c8972
+            ADDR_INT(n)[j] = (TypDigit) (i >> (j * NR_DIGIT_BITS));
e0c8972
+        return n;
e0c8972
+    } else if (-i > bound) {
e0c8972
+        size_t j;
e0c8972
+        n = NewBag(T_INTNEG, NDIGITS);
e0c8972
+        for ( j = 0U; j < NDIGITS; j++ )
e0c8972
+            ADDR_INT(n)[j] = (TypDigit) ((-i) >> (j * NR_DIGIT_BITS));
e0c8972
+        return n;
e0c8972
+    } else {
e0c8972
+        return INTOBJ_INT((Int) i);
e0c8972
+    }
e0c8972
+}
e0c8972
+
e0c8972
+Obj ObjInt_ULongLong(unsigned long long i)
e0c8972
+{
e0c8972
+    Obj n;
e0c8972
+    unsigned long long bound = 1ULL << NR_SMALL_INT_BITS;
e0c8972
+    if (i >= bound) {
e0c8972
+        /* We have to make a big integer */
e0c8972
+        size_t j;
e0c8972
+        n = NewBag(T_INTPOS, NDIGITS);
e0c8972
+        for ( j = 0U; j < NDIGITS; j++ )
e0c8972
+            ADDR_INT(n)[j] = (TypDigit) (i >> (j * NR_DIGIT_BITS));
e0c8972
+        return n;
e0c8972
+    } else {
e0c8972
+        return INTOBJ_INT((Int) i);
e0c8972
+    }
e0c8972
+}
e0c8972
+
e0c8972
+
e0c8972
 
e0c8972
 /****************************************************************************
e0c8972
 **
e0c8972
--- src/integer.h.orig	2016-03-19 16:35:29.000000000 -0600
e0c8972
+++ src/integer.h	2016-04-02 07:38:28.521903081 -0600
e0c8972
@@ -59,6 +59,20 @@ Obj ObjInt_Int(Int i);
e0c8972
 Obj ObjInt_UInt(UInt i);
e0c8972
 
e0c8972
 
e0c8972
+/**************************************************************************
e0c8972
+** The following two functions convert a C long long or unsigned long long
e0c8972
+** respectively into a GAP integer, either an immediate, small integer if
e0c8972
+** possible or otherwise a new GAP bag with TNUM T_INTPOS or T_INTNEG.
e0c8972
+**
e0c8972
+*F ObjInt_LongLong(long long i)
e0c8972
+*F ObjInt_ULongLong(unsigned long long i)
e0c8972
+**
e0c8972
+****************************************************************************/
e0c8972
+
e0c8972
+Obj ObjInt_LongLong(long long i);
e0c8972
+Obj ObjInt_ULongLong(unsigned long long i);
e0c8972
+
e0c8972
+
e0c8972
 /****************************************************************************
e0c8972
 **
e0c8972
 *F  PrintInt( <int> ) . . . . . . . . . . . . . . . print an integer constant