Dev checkpoint
parent
8426e2f877
commit
149af514e6
119
vm/bignum.cpp
119
vm/bignum.cpp
|
@ -189,9 +189,7 @@ bignum *bignum_multiply(bignum * x, bignum * y)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocates memory */
|
/* allocates memory */
|
||||||
void
|
void factorvm::bignum_divide(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder)
|
||||||
bignum_divide(bignum * numerator, bignum * denominator,
|
|
||||||
bignum * * quotient, bignum * * remainder)
|
|
||||||
{
|
{
|
||||||
if (BIGNUM_ZERO_P (denominator))
|
if (BIGNUM_ZERO_P (denominator))
|
||||||
{
|
{
|
||||||
|
@ -261,9 +259,13 @@ bignum_divide(bignum * numerator, bignum * denominator,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bignum_divide(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder)
|
||||||
|
{
|
||||||
|
return vm->bignum_divide(numerator,denominator,quotient,remainder);
|
||||||
|
}
|
||||||
|
|
||||||
/* allocates memory */
|
/* allocates memory */
|
||||||
bignum *
|
bignum *factorvm::bignum_quotient(bignum * numerator, bignum * denominator)
|
||||||
bignum_quotient(bignum * numerator, bignum * denominator)
|
|
||||||
{
|
{
|
||||||
if (BIGNUM_ZERO_P (denominator))
|
if (BIGNUM_ZERO_P (denominator))
|
||||||
{
|
{
|
||||||
|
@ -314,9 +316,13 @@ bignum_quotient(bignum * numerator, bignum * denominator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bignum *bignum_quotient(bignum * numerator, bignum * denominator)
|
||||||
|
{
|
||||||
|
return vm->bignum_quotient(numerator,denominator);
|
||||||
|
}
|
||||||
|
|
||||||
/* allocates memory */
|
/* allocates memory */
|
||||||
bignum *
|
bignum *factorvm::bignum_remainder(bignum * numerator, bignum * denominator)
|
||||||
bignum_remainder(bignum * numerator, bignum * denominator)
|
|
||||||
{
|
{
|
||||||
if (BIGNUM_ZERO_P (denominator))
|
if (BIGNUM_ZERO_P (denominator))
|
||||||
{
|
{
|
||||||
|
@ -359,6 +365,11 @@ bignum_remainder(bignum * numerator, bignum * denominator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bignum *bignum_remainder(bignum * numerator, bignum * denominator)
|
||||||
|
{
|
||||||
|
return vm->bignum_remainder(numerator, denominator);
|
||||||
|
}
|
||||||
|
|
||||||
#define FOO_TO_BIGNUM(name,type,utype) \
|
#define FOO_TO_BIGNUM(name,type,utype) \
|
||||||
bignum * name##_to_bignum(type n) \
|
bignum * name##_to_bignum(type n) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -416,8 +427,7 @@ BIGNUM_TO_FOO(fixnum,fixnum,cell);
|
||||||
BIGNUM_TO_FOO(long_long,s64,u64)
|
BIGNUM_TO_FOO(long_long,s64,u64)
|
||||||
BIGNUM_TO_FOO(ulong_long,u64,u64)
|
BIGNUM_TO_FOO(ulong_long,u64,u64)
|
||||||
|
|
||||||
double
|
double factorvm::bignum_to_double(bignum * bignum)
|
||||||
bignum_to_double(bignum * bignum)
|
|
||||||
{
|
{
|
||||||
if (BIGNUM_ZERO_P (bignum))
|
if (BIGNUM_ZERO_P (bignum))
|
||||||
return (0);
|
return (0);
|
||||||
|
@ -431,6 +441,11 @@ bignum_to_double(bignum * bignum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double bignum_to_double(bignum * bignum)
|
||||||
|
{
|
||||||
|
return vm->bignum_to_double(bignum);
|
||||||
|
}
|
||||||
|
|
||||||
#define DTB_WRITE_DIGIT(factor) \
|
#define DTB_WRITE_DIGIT(factor) \
|
||||||
{ \
|
{ \
|
||||||
significand *= (factor); \
|
significand *= (factor); \
|
||||||
|
@ -442,8 +457,7 @@ bignum_to_double(bignum * bignum)
|
||||||
/* allocates memory */
|
/* allocates memory */
|
||||||
#define inf std::numeric_limits<double>::infinity()
|
#define inf std::numeric_limits<double>::infinity()
|
||||||
|
|
||||||
bignum *
|
bignum *factorvm::double_to_bignum(double x)
|
||||||
double_to_bignum(double x)
|
|
||||||
{
|
{
|
||||||
if (x == inf || x == -inf || x != x) return (BIGNUM_ZERO ());
|
if (x == inf || x == -inf || x != x) return (BIGNUM_ZERO ());
|
||||||
int exponent;
|
int exponent;
|
||||||
|
@ -474,12 +488,16 @@ double_to_bignum(double x)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bignum *double_to_bignum(double x)
|
||||||
|
{
|
||||||
|
return vm->double_to_bignum(x);
|
||||||
|
}
|
||||||
|
|
||||||
#undef DTB_WRITE_DIGIT
|
#undef DTB_WRITE_DIGIT
|
||||||
|
|
||||||
/* Comparisons */
|
/* Comparisons */
|
||||||
|
|
||||||
int
|
int factorvm::bignum_equal_p_unsigned(bignum * x, bignum * y)
|
||||||
bignum_equal_p_unsigned(bignum * x, bignum * y)
|
|
||||||
{
|
{
|
||||||
bignum_length_type length = (BIGNUM_LENGTH (x));
|
bignum_length_type length = (BIGNUM_LENGTH (x));
|
||||||
if (length != (BIGNUM_LENGTH (y)))
|
if (length != (BIGNUM_LENGTH (y)))
|
||||||
|
@ -496,8 +514,12 @@ bignum_equal_p_unsigned(bignum * x, bignum * y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum bignum_comparison
|
int bignum_equal_p_unsigned(bignum * x, bignum * y)
|
||||||
bignum_compare_unsigned(bignum * x, bignum * y)
|
{
|
||||||
|
return vm->bignum_equal_p_unsigned(x,y);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum bignum_comparison factorvm::bignum_compare_unsigned(bignum * x, bignum * y)
|
||||||
{
|
{
|
||||||
bignum_length_type x_length = (BIGNUM_LENGTH (x));
|
bignum_length_type x_length = (BIGNUM_LENGTH (x));
|
||||||
bignum_length_type y_length = (BIGNUM_LENGTH (y));
|
bignum_length_type y_length = (BIGNUM_LENGTH (y));
|
||||||
|
@ -522,11 +544,15 @@ bignum_compare_unsigned(bignum * x, bignum * y)
|
||||||
return (bignum_comparison_equal);
|
return (bignum_comparison_equal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum bignum_comparison bignum_compare_unsigned(bignum * x, bignum * y)
|
||||||
|
{
|
||||||
|
return vm->bignum_compare_unsigned(x,y);
|
||||||
|
}
|
||||||
|
|
||||||
/* Addition */
|
/* Addition */
|
||||||
|
|
||||||
/* allocates memory */
|
/* allocates memory */
|
||||||
bignum *
|
bignum *factorvm::bignum_add_unsigned(bignum * x, bignum * y, int negative_p)
|
||||||
bignum_add_unsigned(bignum * x, bignum * y, int negative_p)
|
|
||||||
{
|
{
|
||||||
GC_BIGNUM(x); GC_BIGNUM(y);
|
GC_BIGNUM(x); GC_BIGNUM(y);
|
||||||
|
|
||||||
|
@ -590,11 +616,15 @@ bignum_add_unsigned(bignum * x, bignum * y, int negative_p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bignum *bignum_add_unsigned(bignum * x, bignum * y, int negative_p)
|
||||||
|
{
|
||||||
|
return vm->bignum_add_unsigned(x,y,negative_p);
|
||||||
|
}
|
||||||
|
|
||||||
/* Subtraction */
|
/* Subtraction */
|
||||||
|
|
||||||
/* allocates memory */
|
/* allocates memory */
|
||||||
bignum *
|
bignum *factorvm::bignum_subtract_unsigned(bignum * x, bignum * y)
|
||||||
bignum_subtract_unsigned(bignum * x, bignum * y)
|
|
||||||
{
|
{
|
||||||
GC_BIGNUM(x); GC_BIGNUM(y);
|
GC_BIGNUM(x); GC_BIGNUM(y);
|
||||||
|
|
||||||
|
@ -665,6 +695,11 @@ bignum_subtract_unsigned(bignum * x, bignum * y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bignum *bignum_subtract_unsigned(bignum * x, bignum * y)
|
||||||
|
{
|
||||||
|
return vm->bignum_subtract_unsigned(x,y);
|
||||||
|
}
|
||||||
|
|
||||||
/* Multiplication
|
/* Multiplication
|
||||||
Maximum value for product_low or product_high:
|
Maximum value for product_low or product_high:
|
||||||
((R * R) + (R * (R - 2)) + (R - 1))
|
((R * R) + (R * (R - 2)) + (R - 1))
|
||||||
|
@ -672,8 +707,7 @@ bignum_subtract_unsigned(bignum * x, bignum * y)
|
||||||
where R == BIGNUM_RADIX_ROOT */
|
where R == BIGNUM_RADIX_ROOT */
|
||||||
|
|
||||||
/* allocates memory */
|
/* allocates memory */
|
||||||
bignum *
|
bignum *factorvm::bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p)
|
||||||
bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p)
|
|
||||||
{
|
{
|
||||||
GC_BIGNUM(x); GC_BIGNUM(y);
|
GC_BIGNUM(x); GC_BIGNUM(y);
|
||||||
|
|
||||||
|
@ -743,10 +777,13 @@ bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bignum *bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p)
|
||||||
|
{
|
||||||
|
return vm->bignum_multiply_unsigned(x,y,negative_p);
|
||||||
|
}
|
||||||
|
|
||||||
/* allocates memory */
|
/* allocates memory */
|
||||||
bignum *
|
bignum *factorvm::bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,int negative_p)
|
||||||
bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,
|
|
||||||
int negative_p)
|
|
||||||
{
|
{
|
||||||
GC_BIGNUM(x);
|
GC_BIGNUM(x);
|
||||||
|
|
||||||
|
@ -760,8 +797,12 @@ bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,
|
||||||
return (bignum_trim (p));
|
return (bignum_trim (p));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bignum *bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,int negative_p)
|
||||||
bignum_destructive_add(bignum * bignum, bignum_digit_type n)
|
{
|
||||||
|
return vm->bignum_multiply_unsigned_small_factor(x,y,negative_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void factorvm::bignum_destructive_add(bignum * bignum, bignum_digit_type n)
|
||||||
{
|
{
|
||||||
bignum_digit_type * scan = (BIGNUM_START_PTR (bignum));
|
bignum_digit_type * scan = (BIGNUM_START_PTR (bignum));
|
||||||
bignum_digit_type digit;
|
bignum_digit_type digit;
|
||||||
|
@ -784,8 +825,12 @@ bignum_destructive_add(bignum * bignum, bignum_digit_type n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void bignum_destructive_add(bignum * bignum, bignum_digit_type n)
|
||||||
bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
|
{
|
||||||
|
return vm->bignum_destructive_add(bignum,n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void factorvm::bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
|
||||||
{
|
{
|
||||||
bignum_digit_type carry = 0;
|
bignum_digit_type carry = 0;
|
||||||
bignum_digit_type * scan = (BIGNUM_START_PTR (bignum));
|
bignum_digit_type * scan = (BIGNUM_START_PTR (bignum));
|
||||||
|
@ -814,6 +859,11 @@ bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
|
||||||
#undef product_high
|
#undef product_high
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
|
||||||
|
{
|
||||||
|
return vm->bignum_destructive_scale_up(bignum,factor);
|
||||||
|
}
|
||||||
|
|
||||||
/* Division */
|
/* Division */
|
||||||
|
|
||||||
/* For help understanding this algorithm, see:
|
/* For help understanding this algorithm, see:
|
||||||
|
@ -822,13 +872,7 @@ bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
|
||||||
section 4.3.1, "Multiple-Precision Arithmetic". */
|
section 4.3.1, "Multiple-Precision Arithmetic". */
|
||||||
|
|
||||||
/* allocates memory */
|
/* allocates memory */
|
||||||
void
|
void factorvm::bignum_divide_unsigned_large_denominator(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder, int q_negative_p, int r_negative_p)
|
||||||
bignum_divide_unsigned_large_denominator(bignum * numerator,
|
|
||||||
bignum * denominator,
|
|
||||||
bignum * * quotient,
|
|
||||||
bignum * * remainder,
|
|
||||||
int q_negative_p,
|
|
||||||
int r_negative_p)
|
|
||||||
{
|
{
|
||||||
GC_BIGNUM(numerator); GC_BIGNUM(denominator);
|
GC_BIGNUM(numerator); GC_BIGNUM(denominator);
|
||||||
|
|
||||||
|
@ -885,6 +929,11 @@ bignum_divide_unsigned_large_denominator(bignum * numerator,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bignum_divide_unsigned_large_denominator(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder, int q_negative_p, int r_negative_p)
|
||||||
|
{
|
||||||
|
return vm->bignum_divide_unsigned_large_denominator(numerator,denominator,quotient,remainder,q_negative_p,r_negative_p);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
bignum_divide_unsigned_normalized(bignum * u, bignum * v, bignum * q)
|
bignum_divide_unsigned_normalized(bignum * u, bignum * v, bignum * q)
|
||||||
{
|
{
|
||||||
|
|
14
vm/vm.hpp
14
vm/vm.hpp
|
@ -63,6 +63,20 @@ struct factorvm {
|
||||||
bignum *bignum_add(bignum * x, bignum * y);
|
bignum *bignum_add(bignum * x, bignum * y);
|
||||||
bignum *bignum_subtract(bignum * x, bignum * y);
|
bignum *bignum_subtract(bignum * x, bignum * y);
|
||||||
bignum *bignum_multiply(bignum * x, bignum * y);
|
bignum *bignum_multiply(bignum * x, bignum * y);
|
||||||
|
void bignum_divide(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder);
|
||||||
|
bignum *bignum_quotient(bignum * numerator, bignum * denominator);
|
||||||
|
bignum *bignum_remainder(bignum * numerator, bignum * denominator);
|
||||||
|
double bignum_to_double(bignum * bignum);
|
||||||
|
bignum *double_to_bignum(double x);
|
||||||
|
int bignum_equal_p_unsigned(bignum * x, bignum * y);
|
||||||
|
enum bignum_comparison bignum_compare_unsigned(bignum * x, bignum * y);
|
||||||
|
bignum *bignum_add_unsigned(bignum * x, bignum * y, int negative_p);
|
||||||
|
bignum *bignum_subtract_unsigned(bignum * x, bignum * y);
|
||||||
|
bignum *bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p);
|
||||||
|
bignum *bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,int negative_p);
|
||||||
|
void bignum_destructive_add(bignum * bignum, bignum_digit_type n);
|
||||||
|
void bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor);
|
||||||
|
void bignum_divide_unsigned_large_denominator(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder, int q_negative_p, int r_negative_p);
|
||||||
// next method here:
|
// next method here:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue