VM: bignum_new_sign, bignum_maybe_new_sign and bitnum_magnitude_ash

converted to using data_roots
db4
Björn Lindqvist 2014-06-17 11:05:51 +02:00 committed by John Benediktsson
parent c6ab72effc
commit 2fcea047d2
2 changed files with 22 additions and 26 deletions

View File

@ -1274,23 +1274,19 @@ bignum* factor_vm::bignum_trim(bignum* bn) {
/* Copying */ /* Copying */
/* Allocates memory */ /* Allocates memory */
bignum* factor_vm::bignum_new_sign(bignum* x, int negative_p) { bignum* factor_vm::bignum_new_sign(bignum* x_, int negative_p) {
GC_BIGNUM(x); data_root<bignum> x(x_, this);
bignum* result = (allot_bignum((BIGNUM_LENGTH(x)), negative_p)); bignum* result = allot_bignum(BIGNUM_LENGTH(x), negative_p);
bignum_destructive_copy(x.untagged(), result);
bignum_destructive_copy(x, result); return result;
return (result);
} }
/* Allocates memory */ /* Allocates memory */
bignum* factor_vm::bignum_maybe_new_sign(bignum* x, int negative_p) { bignum* factor_vm::bignum_maybe_new_sign(bignum* x_, int negative_p) {
if ((BIGNUM_NEGATIVE_P(x)) ? negative_p : (!negative_p)) if ((BIGNUM_NEGATIVE_P(x_)) ? negative_p : (!negative_p))
return (x); return x_;
else { else {
GC_BIGNUM(x); return bignum_new_sign(x_, negative_p);
bignum* result = (allot_bignum((BIGNUM_LENGTH(x)), negative_p));
bignum_destructive_copy(x, result);
return (result);
} }
} }
@ -1405,8 +1401,9 @@ bignum* factor_vm::bignum_bitwise_xor(bignum* arg1, bignum* arg2) {
/* Allocates memory */ /* Allocates memory */
/* ash for the magnitude */ /* ash for the magnitude */
/* assume arg1 is a big number, n is a long */ /* assume arg1 is a big number, n is a long */
bignum* factor_vm::bignum_magnitude_ash(bignum* arg1, fixnum n) { bignum* factor_vm::bignum_magnitude_ash(bignum* arg1_, fixnum n) {
GC_BIGNUM(arg1);
data_root<bignum> arg1(arg1_, this);
bignum* result = NULL; bignum* result = NULL;
bignum_digit_type* scan1; bignum_digit_type* scan1;
@ -1416,7 +1413,7 @@ bignum* factor_vm::bignum_magnitude_ash(bignum* arg1, fixnum n) {
fixnum digit_offset, bit_offset; fixnum digit_offset, bit_offset;
if (BIGNUM_ZERO_P(arg1)) if (BIGNUM_ZERO_P(arg1))
return (arg1); return arg1.untagged();
if (n > 0) { if (n > 0) {
digit_offset = n / BIGNUM_DIGIT_LENGTH; digit_offset = n / BIGNUM_DIGIT_LENGTH;
@ -1437,10 +1434,9 @@ bignum* factor_vm::bignum_magnitude_ash(bignum* arg1, fixnum n) {
*scanr = *scanr & BIGNUM_DIGIT_MASK; *scanr = *scanr & BIGNUM_DIGIT_MASK;
} }
} else if (n < 0 && (-n >= (BIGNUM_LENGTH(arg1) * (bignum_length_type) } else if (n < 0 && (-n >= (BIGNUM_LENGTH(arg1) * (bignum_length_type)
BIGNUM_DIGIT_LENGTH))) BIGNUM_DIGIT_LENGTH))) {
result = BIGNUM_ZERO(); result = BIGNUM_ZERO();
} else if (n < 0) {
else if (n < 0) {
digit_offset = -n / BIGNUM_DIGIT_LENGTH; digit_offset = -n / BIGNUM_DIGIT_LENGTH;
bit_offset = -n % BIGNUM_DIGIT_LENGTH; bit_offset = -n % BIGNUM_DIGIT_LENGTH;
@ -1458,10 +1454,11 @@ bignum* factor_vm::bignum_magnitude_ash(bignum* arg1, fixnum n) {
scanr++; scanr++;
} }
*scanr = (*scan1++ & BIGNUM_DIGIT_MASK) >> bit_offset; *scanr = (*scan1++ & BIGNUM_DIGIT_MASK) >> bit_offset;
} else if (n == 0) } else if (n == 0) {
result = arg1; result = arg1.untagged();
}
return (bignum_trim(result)); return bignum_trim(result);
} }
/* Allocates memory */ /* Allocates memory */
@ -1686,7 +1683,6 @@ int factor_vm::bignum_unsigned_logbitp(int shift, bignum* bn) {
/* Allocates memory. */ /* Allocates memory. */
bignum* factor_vm::bignum_gcd(bignum* a_, bignum* b_) { bignum* factor_vm::bignum_gcd(bignum* a_, bignum* b_) {
std::cout << "bignum_gcd" << std::endl;
data_root<bignum> a(a_, this); data_root<bignum> a(a_, this);
data_root<bignum> b(b_, this); data_root<bignum> b(b_, this);

View File

@ -288,15 +288,15 @@ struct factor_vm {
bignum* allot_bignum_zeroed(bignum_length_type length, int negative_p); bignum* allot_bignum_zeroed(bignum_length_type length, int negative_p);
bignum* bignum_shorten_length(bignum* bn, bignum_length_type length); bignum* bignum_shorten_length(bignum* bn, bignum_length_type length);
bignum* bignum_trim(bignum* bn); bignum* bignum_trim(bignum* bn);
bignum* bignum_new_sign(bignum* x, int negative_p); bignum* bignum_new_sign(bignum* x_, int negative_p);
bignum* bignum_maybe_new_sign(bignum* x, int negative_p); bignum* bignum_maybe_new_sign(bignum* x_, int negative_p);
void bignum_destructive_copy(bignum* source, bignum* target); void bignum_destructive_copy(bignum* source, bignum* target);
bignum* bignum_bitwise_not(bignum* x_); bignum* bignum_bitwise_not(bignum* x_);
bignum* bignum_arithmetic_shift(bignum* arg1, fixnum n); bignum* bignum_arithmetic_shift(bignum* arg1, fixnum n);
bignum* bignum_bitwise_and(bignum* arg1, bignum* arg2); bignum* bignum_bitwise_and(bignum* arg1, bignum* arg2);
bignum* bignum_bitwise_ior(bignum* arg1, bignum* arg2); bignum* bignum_bitwise_ior(bignum* arg1, bignum* arg2);
bignum* bignum_bitwise_xor(bignum* arg1, bignum* arg2); bignum* bignum_bitwise_xor(bignum* arg1, bignum* arg2);
bignum* bignum_magnitude_ash(bignum* arg1, fixnum n); bignum* bignum_magnitude_ash(bignum* arg1_, fixnum n);
bignum* bignum_pospos_bitwise_op(int op, bignum* arg1, bignum* arg2); bignum* bignum_pospos_bitwise_op(int op, bignum* arg1, bignum* arg2);
bignum* bignum_posneg_bitwise_op(int op, bignum* arg1, bignum* arg2); bignum* bignum_posneg_bitwise_op(int op, bignum* arg1, bignum* arg2);
bignum* bignum_negneg_bitwise_op(int op, bignum* arg1, bignum* arg2); bignum* bignum_negneg_bitwise_op(int op, bignum* arg1, bignum* arg2);