diff --git a/src/bignum.c b/src/bignum.c
index 9e5d52298d253b978827902d35c0d2f2a08e629a..eb198a7f33a71f98ff2c4b8a37ebefeb855b08f3 100644
--- a/src/bignum.c
+++ b/src/bignum.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: bignum.c,v 1.34 2003/03/14 15:50:43 grubba Exp $
+|| $Id: bignum.c,v 1.35 2003/03/25 19:07:48 mast Exp $
 */
 
 #include "global.h"
@@ -157,7 +157,7 @@ PMOD_EXPORT void push_int64(INT64 i)
 
 
     if(neg) {
-      apply_low(sp[-1].u.object,FIND_LFUN(sp[-1].u.object->prog,LFUN_COMPL),0);
+      apply_low(sp[-1].u.object,FIND_LFUN(sp[-1].u.object->prog,LFUN_SUBTRACT),0);
       stack_pop_n_elems_keep_top(1);
     }
   }
@@ -176,38 +176,37 @@ PMOD_EXPORT int int64_from_bignum(INT64 *i, struct object *bignum)
   apply_low(bignum, FIND_LFUN(bignum->prog, LFUN_LT), 1);
   if(sp[-1].type != T_INT)
     Pike_error("Result from Gmp.bignum->`< not an integer.\n");
-  dmalloc_touch_svalue(sp-1);
   neg = (--sp)->u.integer;
 
-  if(neg)
-    apply_low(bignum, FIND_LFUN(bignum->prog, LFUN_COMPL), 0);
+  if(neg) {
+    apply_low(bignum, FIND_LFUN(bignum->prog, LFUN_SUBTRACT), 0);
+    dmalloc_touch_svalue(sp-1);
+  }
+  else
+    ref_push_object(bignum);
 
   rshfun = FIND_LFUN(bignum->prog, LFUN_RSH);
   andfun = FIND_LFUN(bignum->prog, LFUN_AND);
-  
-  ref_push_object(bignum);
-    
+
   for(pos = 0; sp[-1].type != T_INT; )
   {
     push_int(BIGNUM_INT64_MASK);
     apply_low(sp[-2].u.object, andfun, 1);
     if(sp[-1].type != T_INT)
       Pike_error("Result from Gmp.bignum->`& not an integer.\n");
-    dmalloc_touch_svalue(sp-1);
     *i |= (INT64)(--sp)->u.integer << (INT64)pos;
     pos += BIGNUM_INT64_SHIFT;
     
     push_int(BIGNUM_INT64_SHIFT);
     apply_low(sp[-2].u.object, rshfun, 1);
-    stack_swap();
-    pop_stack();
+    stack_pop_n_elems_keep_top(1);
+    dmalloc_touch_svalue(sp-1);
   }
   
-  dmalloc_touch_svalue(sp-1);
   *i |= (INT64)(--sp)->u.integer << (INT64)pos;
 
   if(neg)
-    *i = ~*i;
+    *i = -*i;
   
   return 1;   /* We may someday return 0 if the conversion fails. */
 }