summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--otherlibs/num/.depend24
-rw-r--r--otherlibs/num/nat.h7
-rw-r--r--otherlibs/num/nat_stubs.c300
-rw-r--r--otherlibs/num/test/.depend10
4 files changed, 341 insertions, 0 deletions
diff --git a/otherlibs/num/.depend b/otherlibs/num/.depend
new file mode 100644
index 000000000..0e2872c99
--- /dev/null
+++ b/otherlibs/num/.depend
@@ -0,0 +1,24 @@
+nat_stubs.o : nat_stubs.c ./bignum/h/BigNum.h ./bignum/h/BntoBnn.h ../../byterun/mlvalues.h \
+ ../../byterun/config.h ../../byterun/../config/m.h ../../byterun/../config/s.h \
+ ../../byterun/misc.h ../../byterun/alloc.h nat.h
+big_int.cmi: nat.cmi
+num.cmi: big_int.cmi nat.cmi ratio.cmi
+ratio.cmi: big_int.cmi nat.cmi
+arith_flags.cmo: arith_flags.cmi
+arith_flags.cmx: arith_flags.cmi
+arith_status.cmo: arith_flags.cmi arith_status.cmi
+arith_status.cmx: arith_flags.cmx arith_status.cmi
+big_int.cmo: int_misc.cmi nat.cmi big_int.cmi
+big_int.cmx: int_misc.cmx nat.cmx big_int.cmi
+int_misc.cmo: int_misc.cmi
+int_misc.cmx: int_misc.cmi
+nat.cmo: int_misc.cmi nat.cmi
+nat.cmx: int_misc.cmx nat.cmi
+num.cmo: arith_flags.cmi big_int.cmi int_misc.cmi nat.cmi ratio.cmi num.cmi
+num.cmx: arith_flags.cmx big_int.cmx int_misc.cmx nat.cmx ratio.cmx num.cmi
+ratio.cmo: arith_flags.cmi big_int.cmi int_misc.cmi nat.cmi string_misc.cmi \
+ ratio.cmi
+ratio.cmx: arith_flags.cmx big_int.cmx int_misc.cmx nat.cmx string_misc.cmx \
+ ratio.cmi
+string_misc.cmo: string_misc.cmi
+string_misc.cmx: string_misc.cmi
diff --git a/otherlibs/num/nat.h b/otherlibs/num/nat.h
new file mode 100644
index 000000000..02151a5b9
--- /dev/null
+++ b/otherlibs/num/nat.h
@@ -0,0 +1,7 @@
+/* Nats are represented as unstructured blocks with tag Nat_tag. */
+
+#define Nat_tag Abstract_tag /* works OK with equal because no other
+ object uses that tag yet. */
+
+#define Bignum_val(nat) ((BigNum) nat)
+
diff --git a/otherlibs/num/nat_stubs.c b/otherlibs/num/nat_stubs.c
new file mode 100644
index 000000000..00940f082
--- /dev/null
+++ b/otherlibs/num/nat_stubs.c
@@ -0,0 +1,300 @@
+/***********************************************************************/
+/* */
+/* Caml Special Light */
+/* */
+/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */
+/* */
+/* Copyright 1995 Institut National de Recherche en Informatique et */
+/* Automatique. Distributed only by permission. */
+/* */
+/***********************************************************************/
+
+/* $Id$ */
+
+#define CAML_LIGHT
+#include "BigNum.h"
+#include "BntoBnn.h"
+#include "mlvalues.h"
+#include "alloc.h"
+#include "memory.h"
+#include "nat.h"
+
+/* Stub code for the BigNum package. */
+
+value create_nat(size) /* ML */
+ value size;
+{
+ mlsize_t sz = Long_val(size);
+
+ if (sz < Max_young_wosize) {
+ return alloc(sz, Nat_tag);
+ } else {
+ return alloc_shr(sz, Nat_tag);
+ }
+}
+
+value set_to_zero_nat(nat, ofs, len) /* ML */
+ value nat, ofs, len;
+{
+ BnSetToZero(Bignum_val(nat), Long_val(ofs), Long_val(len));
+ return Val_unit;
+}
+
+value blit_nat(nat1, ofs1, nat2, ofs2, len) /* ML */
+ value nat1, ofs1, nat2, ofs2, len;
+{
+ BnAssign(Bignum_val(nat1), Long_val(ofs1),
+ Bignum_val(nat2), Long_val(ofs2),
+ Long_val(len));
+ return Val_unit;
+}
+
+value set_digit_nat(nat, ofs, digit) /* ML */
+ value nat, ofs, digit;
+{
+ BnSetDigit(Bignum_val(nat), Long_val(ofs), Long_val(digit));
+ return Val_unit;
+}
+
+value nth_digit_nat(nat, ofs) /* ML */
+ value nat, ofs;
+{
+ return Val_long(BnGetDigit(Bignum_val(nat), Long_val(ofs)));
+}
+
+value num_digits_nat(nat, ofs, len) /* ML */
+ value nat, ofs, len;
+{
+ return Val_long(BnNumDigits(Bignum_val(nat), Long_val(ofs), Long_val(len)));
+}
+
+value num_leading_zero_bits_in_digit(nat, ofs) /* ML */
+ value nat, ofs;
+{
+ return
+ Val_long(BnNumLeadingZeroBitsInDigit(Bignum_val(nat), Long_val(ofs)));
+}
+
+value is_digit_int(nat, ofs) /* ML */
+ value nat, ofs;
+{
+ return Val_bool(BnDoesDigitFitInWord(Bignum_val(nat), Long_val(ofs)));
+}
+
+value is_digit_zero(nat, ofs) /* ML */
+ value nat, ofs;
+{
+ return Val_bool(BnIsDigitZero(Bignum_val(nat), Long_val(ofs)));
+}
+
+value is_digit_normalized(nat, ofs) /* ML */
+ value nat, ofs;
+{
+ return Val_bool(BnIsDigitNormalized(Bignum_val(nat), Long_val(ofs)));
+}
+
+value is_digit_odd(nat, ofs) /* ML */
+ value nat, ofs;
+{
+ return Val_bool(BnIsDigitOdd(Bignum_val(nat), Long_val(ofs)));
+}
+
+value incr_nat(nat, ofs, len, carry_in) /* ML */
+ value nat, ofs, len, carry_in;
+{
+ return Val_long(BnAddCarry(Bignum_val(nat), Long_val(ofs),
+ Long_val(len), Long_val(carry_in)));
+}
+
+value add_nat_native(nat1, ofs1, len1, nat2, ofs2, len2, carry_in)
+ value nat1, ofs1, len1, nat2, ofs2, len2, carry_in;
+{
+ return Val_long(BnAdd(Bignum_val(nat1), Long_val(ofs1), Long_val(len1),
+ Bignum_val(nat2), Long_val(ofs2), Long_val(len2),
+ Long_val(carry_in)));
+}
+
+value add_nat(argv, argn) /* ML */
+ value * argv;
+ int argn;
+{
+ return add_nat_native(argv[0], argv[1], argv[2], argv[3],
+ argv[4], argv[5], argv[6]);
+}
+
+value complement_nat(nat, ofs, len) /* ML */
+ value nat, ofs, len;
+{
+ BnComplement(Bignum_val(nat), Long_val(ofs), Long_val(len));
+ return Val_unit;
+}
+
+value decr_nat(nat, ofs, len, carry_in) /* ML */
+ value nat, ofs, len, carry_in;
+{
+ return Val_long(BnSubtractBorrow(Bignum_val(nat), Long_val(ofs),
+ Long_val(len), Long_val(carry_in)));
+}
+
+value sub_nat_native(nat1, ofs1, len1, nat2, ofs2, len2, carry_in)
+ value nat1, ofs1, len1, nat2, ofs2, len2, carry_in;
+{
+ return Val_long(BnSubtract(Bignum_val(nat1), Long_val(ofs1), Long_val(len1),
+ Bignum_val(nat2), Long_val(ofs2), Long_val(len2),
+ Long_val(carry_in)));
+}
+
+value sub_nat(argv, argn) /* ML */
+ value * argv;
+ int argn;
+{
+ return sub_nat_native(argv[0], argv[1], argv[2], argv[3],
+ argv[4], argv[5], argv[6]);
+}
+
+value mult_digit_nat_native(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3)
+ value nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3;
+{
+ return
+ Val_long(BnMultiplyDigit(Bignum_val(nat1), Long_val(ofs1), Long_val(len1),
+ Bignum_val(nat2), Long_val(ofs2), Long_val(len2),
+ Bignum_val(nat3), Long_val(ofs3)));
+}
+
+value mult_digit_nat(argv, argn) /* ML */
+ value * argv;
+ int argn;
+{
+ return mult_digit_nat_native(argv[0], argv[1], argv[2], argv[3],
+ argv[4], argv[5], argv[6], argv[7]);
+}
+
+value mult_nat_native(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3, len3)
+ value nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3, len3;
+{
+ return
+ Val_long(BnMultiply(Bignum_val(nat1), Long_val(ofs1), Long_val(len1),
+ Bignum_val(nat2), Long_val(ofs2), Long_val(len2),
+ Bignum_val(nat3), Long_val(ofs3), Long_val(len3)));
+}
+
+value mult_nat(argv, argn) /* ML */
+ value * argv;
+ int argn;
+{
+ return mult_nat_native(argv[0], argv[1], argv[2], argv[3],
+ argv[4], argv[5], argv[6], argv[7], argv[8]);
+}
+
+value shift_left_nat_native(nat1, ofs1, len1, nat2, ofs2, nbits)
+ value nat1, ofs1, len1, nat2, ofs2, nbits;
+{
+ BnShiftLeft(Bignum_val(nat1), Long_val(ofs1), Long_val(len1),
+ Bignum_val(nat2), Long_val(ofs2), Long_val(nbits));
+ return Val_unit;
+}
+
+value shift_left_nat(argv, argn) /* ML */
+ value * argv;
+ int argn;
+{
+ return shift_left_nat_native(argv[0], argv[1], argv[2],
+ argv[3], argv[4], argv[5]);
+}
+
+value div_digit_nat_native(natq, ofsq, natr, ofsr, nat1, ofs1, len1, nat2, ofs2)
+ value natq, ofsq, natr, ofsr, nat1, ofs1, len1, nat2, ofs2;
+{
+ BnDivideDigit(Bignum_val(natq), Long_val(ofsq),
+ Bignum_val(natr), Long_val(ofsr),
+ Bignum_val(nat1), Long_val(ofs1), Long_val(len1),
+ Bignum_val(nat2), Long_val(ofs2));
+ return Val_unit;
+}
+
+value div_digit_nat(argv, argn) /* ML */
+ value * argv;
+ int argn;
+{
+ return div_digit_nat_native(argv[0], argv[1], argv[2], argv[3],
+ argv[4], argv[5], argv[6], argv[7], argv[8]);
+}
+
+value div_nat_native(nat1, ofs1, len1, nat2, ofs2, len2)
+ value nat1, ofs1, len1, nat2, ofs2, len2;
+{
+ BnDivide(Bignum_val(nat1), Long_val(ofs1), Long_val(len1),
+ Bignum_val(nat2), Long_val(ofs2), Long_val(len2));
+ return Val_unit;
+}
+
+value div_nat(argv, argn) /* ML */
+ value * argv;
+ int argn;
+{
+ return div_nat_native(argv[0], argv[1], argv[2],
+ argv[3], argv[4], argv[5]);
+}
+
+value shift_right_nat_native(nat1, ofs1, len1, nat2, ofs2, nbits)
+ value nat1, ofs1, len1, nat2, ofs2, nbits;
+{
+ BnShiftRight(Bignum_val(nat1), Long_val(ofs1), Long_val(len1),
+ Bignum_val(nat2), Long_val(ofs2), Long_val(nbits));
+ return Val_unit;
+}
+
+value shift_right_nat(argv, argn) /* ML */
+ value * argv;
+ int argn;
+{
+ return shift_right_nat_native(argv[0], argv[1], argv[2],
+ argv[3], argv[4], argv[5]);
+}
+
+value compare_digits_nat(nat1, ofs1, nat2, ofs2) /* ML */
+ value nat1, ofs1, nat2, ofs2;
+{
+ return Val_long(BnCompareDigits(Bignum_val(nat1), Long_val(ofs1),
+ Bignum_val(nat2), Long_val(ofs2)));
+}
+
+value compare_nat_native(nat1, ofs1, len1, nat2, ofs2, len2)
+ value nat1, ofs1, len1, nat2, ofs2, len2;
+{
+ return Val_long(BnCompare(Bignum_val(nat1), Long_val(ofs1), Long_val(len1),
+ Bignum_val(nat2), Long_val(ofs2), Long_val(len2)));
+}
+
+value compare_nat(argv, argn) /* ML */
+ value * argv;
+ int argn;
+{
+ return compare_nat_native(argv[0], argv[1], argv[2],
+ argv[3], argv[4], argv[5]);
+}
+
+value land_digit_nat(nat1, ofs1, nat2, ofs2) /* ML */
+ value nat1, ofs1, nat2, ofs2;
+{
+ BnAndDigits(Bignum_val(nat1), Long_val(ofs1),
+ Bignum_val(nat2), Long_val(ofs2));
+ return Val_unit;
+}
+
+value lor_digit_nat(nat1, ofs1, nat2, ofs2) /* ML */
+ value nat1, ofs1, nat2, ofs2;
+{
+ BnOrDigits(Bignum_val(nat1), Long_val(ofs1),
+ Bignum_val(nat2), Long_val(ofs2));
+ return Val_unit;
+}
+
+value lxor_digit_nat(nat1, ofs1, nat2, ofs2) /* ML */
+ value nat1, ofs1, nat2, ofs2;
+{
+ BnXorDigits(Bignum_val(nat1), Long_val(ofs1),
+ Bignum_val(nat2), Long_val(ofs2));
+ return Val_unit;
+}
+
diff --git a/otherlibs/num/test/.depend b/otherlibs/num/test/.depend
new file mode 100644
index 000000000..28fea1f58
--- /dev/null
+++ b/otherlibs/num/test/.depend
@@ -0,0 +1,10 @@
+end_test.cmo: test.cmo
+end_test.cmx: test.cmx
+test_big_ints.cmo: test.cmo
+test_big_ints.cmx: test.cmx
+test_nats.cmo: test.cmo
+test_nats.cmx: test.cmx
+test_nums.cmo: test.cmo
+test_nums.cmx: test.cmx
+test_ratios.cmo: test.cmo
+test_ratios.cmx: test.cmx