Branch: Tag:

1999-10-08

1999-10-08 16:35:20 by Fredrik Noring <noring@nocrew.org>

A small step towards truly built-in bignums.

Rev: src/Makefile.in:1.157
Rev: src/acconfig.h:1.49
Rev: src/bignum.c:1.1
Rev: src/bignum.h:1.1
Rev: src/configure.in:1.322
Rev: src/modules/Gmp/mpz_glue.c:1.44
Rev: src/operators.c:1.61

4:   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: mpz_glue.c,v 1.43 1999/08/06 22:13:46 hubbe Exp $"); + RCSID("$Id: mpz_glue.c,v 1.44 1999/10/08 16:35:20 noring Exp $");   #include "gmp_machine.h"      #if defined(HAVE_GMP2_GMP_H) && defined(HAVE_LIBGMP2)
30:   #include "builtin_functions.h"   #include "opcodes.h"   #include "module_support.h" + #include "bignum.h"      #include "my_gmp.h"   
423:   }   #endif    + #ifdef AUTO_BIGNUM + static void reduce(struct object *o) + { +  INT_TYPE i; +  +  i = mpz_get_si(OBTOMPZ(o)); +  if(mpz_cmp_si(OBTOMPZ(o), i) == 0) +  push_int(i); +  else +  push_object(o); + } + #define PUSH_REDUCED(o) reduce(o) + #else + #define PUSH_REDUCED(o) push_object(o) + #endif /* AUTO_BIGNUM */ +    #define BINFUN(name, fun) \   static void name(INT32 args) \   { \
436:    fun(OBTOMPZ(res), OBTOMPZ(res), \    OBTOMPZ(sp[e-args].u.object)); \    pop_n_elems(args); \ -  push_object(res); \ +  PUSH_REDUCED(res); \   }      BINFUN(mpzmod_add,mpz_add)
453:    for(e=0;e<args;e++)    mpz_add(THIS, THIS, OBTOMPZ(sp[e-args].u.object));    pop_n_elems(args); +  /* FIXME: How to reduce this?? */    ref_push_object(fp->current_object);   }   
476:    mpz_neg(OBTOMPZ(res), OBTOMPZ(res));    }    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_rsub(INT32 args)
494:       mpz_sub(OBTOMPZ(res), a, THIS);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_div(INT32 args)
520:    }       pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_rdiv(INT32 args)
538:    res=clone_object(mpzmod_program,0);    mpz_fdiv_q(OBTOMPZ(res), a, THIS);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_mod(INT32 args)
556:    mpz_fdiv_r(OBTOMPZ(res), OBTOMPZ(res), OBTOMPZ(sp[e-args].u.object));       pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_rmod(INT32 args)
574:    res=clone_object(mpzmod_program,0);    mpz_fdiv_r(OBTOMPZ(res), a, THIS);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      
594:       mpz_gcdext(OBTOMPZ(g), OBTOMPZ(s), OBTOMPZ(t), THIS, a);    pop_n_elems(args); -  push_object(g); push_object(s); push_object(t); +  PUSH_REDUCED(g); PUSH_REDUCED(s); PUSH_REDUCED(t);    f_aggregate(3);   }   
613:       mpz_gcdext(OBTOMPZ(g), OBTOMPZ(s), NULL, THIS, a);    pop_n_elems(args); -  push_object(g); push_object(s); +  PUSH_REDUCED(g); PUSH_REDUCED(s);    f_aggregate(2);   }   
634:    error("Gmp.mpz->invert: not invertible");    }    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      BINFUN(mpzmod_and,mpz_and)
645:    struct object *o;    pop_n_elems(args);    o=clone_object(mpzmod_program,0); -  push_object(o); +  PUSH_REDUCED(o);    mpz_com(OBTOMPZ(o), THIS);   }   
732:    pop_n_elems(args);       o = clone_object(mpzmod_program, 0); -  push_object(o); +  PUSH_REDUCED(o);       mpz_next_prime(OBTOMPZ(o), THIS, count, limit);   }
752:    error("mpz->sqrt() on negative number.\n");       o=clone_object(mpzmod_program,0); -  push_object(o); +  PUSH_REDUCED(o);    mpz_sqrt(OBTOMPZ(o), THIS);   }   
767:    root = clone_object(mpzmod_program,0);    rem = clone_object(mpzmod_program,0);    mpz_sqrtrem(OBTOMPZ(root), OBTOMPZ(rem), THIS); -  push_object(root); push_object(rem); +  PUSH_REDUCED(root); PUSH_REDUCED(rem);    f_aggregate(2);   }   
784:    res = clone_object(mpzmod_program, 0);    mpz_mul_2exp(OBTOMPZ(res), THIS, sp[-1].u.integer);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_rsh(INT32 args)
800:    res = clone_object(mpzmod_program, 0);    mpz_fdiv_q_2exp(OBTOMPZ(res), THIS, sp[-1].u.integer);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_rlsh(INT32 args)
817:    res = clone_object(mpzmod_program, 0);    mpz_mul_2exp(OBTOMPZ(res), OBTOMPZ(sp[-1].u.object), i);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_rrsh(INT32 args)
833:    res = clone_object(mpzmod_program, 0);    mpz_fdiv_q_2exp(OBTOMPZ(res), OBTOMPZ(sp[-1].u.object), i);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_powm(INT32 args)
850:    res = clone_object(mpzmod_program, 0);    mpz_powm(OBTOMPZ(res), THIS, get_mpz(sp - 2, 1), n);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_pow(INT32 args)
866:    res = clone_object(mpzmod_program, 0);    mpz_pow_ui(OBTOMPZ(res), THIS, sp[-1].u.integer);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void mpzmod_not(INT32 args)
906:    res = clone_object(mpzmod_program, 0);    mpz_ui_pow_ui(OBTOMPZ(res), sp[-2].u.integer, sp[-1].u.integer);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void gmp_fac(INT32 args)
921:    res = clone_object(mpzmod_program, 0);    mpz_fac_ui(OBTOMPZ(res), sp[-1].u.integer);    pop_n_elems(args); -  push_object(res); +  PUSH_REDUCED(res);   }      static void init_mpz_glue(struct object *o)