diff options
-rw-r--r-- | otherlibs/num/.depend | 24 | ||||
-rw-r--r-- | otherlibs/num/nat.h | 7 | ||||
-rw-r--r-- | otherlibs/num/nat_stubs.c | 300 | ||||
-rw-r--r-- | otherlibs/num/test/.depend | 10 |
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 |