Ported bignum_simplify

This commit is contained in:
Justin Ethier 2022-06-10 17:11:58 -04:00
parent a956c6fd41
commit 7405969b4a
2 changed files with 17 additions and 12 deletions

View file

@ -2464,21 +2464,21 @@ object C_bignum_simplify(object big)
switch(length) { switch(length) {
case 0: case 0:
//if (C_in_scratchspacep(C_internal_bignum_vector(big)))
// C_mutate_scratch_slot(NULL, C_internal_bignum_vector(big));
return obj_int2obj(0); return obj_int2obj(0);
case 1: case 1:
tmp = *start; tmp = *start;
if (C_bignum_negativep(big) ? if (((uint32_t)tmp) <= CYC_FIXNUM_MAX) {
!(tmp & C_INT_SIGN_BIT) && C_fitsinfixnump(-(C_word)tmp) : if (C_bignum_negativep(big)) {
C_ufitsinfixnump(tmp)) { return obj_int2obj(-(int32_t)tmp);
if (C_in_scratchspacep(C_internal_bignum_vector(big))) } else {
C_mutate_scratch_slot(NULL, C_internal_bignum_vector(big)); return obj_int2obj(tmp);
return C_bignum_negativep(big) ? C_fix(-(C_word)tmp) : C_fix(tmp); }
} }
/* FALLTHROUGH */ /* FALLTHROUGH */
default: default:
if (scan < last_digit) C_bignum_mutate_size(big, length); if (scan < last_digit) {
C_bignum_size(big) = length;
}
return big; return big;
} }
} }
@ -2761,8 +2761,7 @@ object bignum2_plus_unsigned(void *data, bignum2_type *x, bignum2_type *y, int n
} }
assert(scan_r <= end_r); assert(scan_r <= end_r);
// TODO: return C_bignum_simplify(result); return C_bignum_simplify(result);
return result; // TODO: no, could be a fixnum. need to simplify using above!
} }
object Cyc_symbol2string(void *data, object cont, object sym) object Cyc_symbol2string(void *data, object cont, object sym)

View file

@ -6,6 +6,11 @@
" object bn1 = Cyc_int2bignum2(data, obj_obj2int(fx1)); " object bn1 = Cyc_int2bignum2(data, obj_obj2int(fx1));
object bn2 = Cyc_int2bignum2(data, obj_obj2int(fx2)); object bn2 = Cyc_int2bignum2(data, obj_obj2int(fx2));
object result = bignum2_plus_unsigned(data, bn1, bn2, 0); // TODO: int negp); object result = bignum2_plus_unsigned(data, bn1, bn2, 0); // TODO: int negp);
if(is_value_type(result)) {
printf(\"fixnum result\\n\");
} else if (type_of(result) == bignum2_tag) {
printf(\"bignum result\\n\");
}
return_closcall1(data, k, result); return_closcall1(data, k, result);
") ")
(define-c test-bn (define-c test-bn
@ -32,10 +37,11 @@
(write row) (write row)
(newline)) (newline))
(list (list
(test-plus #x0FFFffff #x0FFFffff)
(test-plus #x2FFFffff #x2FFFffff)
(test-plus 1 2) (test-plus 1 2)
;; TODO: (fixnum? (test-plus 1 2)) ;; TODO: (fixnum? (test-plus 1 2))
(test-plus -1 2) (test-plus -1 2)
(test-plus #x0FFFffff #x0FFFffff)
(test-bn 123456789 ) (test-bn 123456789 )
(test-bn 123456789 ) (test-bn 123456789 )
(test-larger-bn 0 #x0FFF0001 ) (test-larger-bn 0 #x0FFF0001 )