mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-07-12 15:37:35 +02:00
Reusing some values in bignum mul.
This commit is contained in:
parent
894d3c5451
commit
f1927e5834
1 changed files with 8 additions and 7 deletions
15
bignum.c
15
bignum.c
|
@ -394,15 +394,16 @@ sexp sexp_bignum_add (sexp ctx, sexp dst, sexp a, sexp b) {
|
||||||
|
|
||||||
sexp sexp_bignum_sub (sexp ctx, sexp dst, sexp a, sexp b) {
|
sexp sexp_bignum_sub (sexp ctx, sexp dst, sexp a, sexp b) {
|
||||||
sexp res;
|
sexp res;
|
||||||
|
int sign;
|
||||||
if (sexp_bignum_sign(a) == sexp_bignum_sign(b)) {
|
if (sexp_bignum_sign(a) == sexp_bignum_sign(b)) {
|
||||||
|
sign = (sexp_bignum_compare_abs(a, b) >= 0 ? sexp_bignum_sign(a)
|
||||||
|
: -sexp_bignum_sign(a));
|
||||||
res = sexp_bignum_sub_digits(ctx, dst, a, b);
|
res = sexp_bignum_sub_digits(ctx, dst, a, b);
|
||||||
sexp_bignum_sign(res)
|
|
||||||
= (sexp_bignum_compare_abs(a, b) >= 0 ? sexp_bignum_sign(a)
|
|
||||||
: -sexp_bignum_sign(a));
|
|
||||||
} else {
|
} else {
|
||||||
|
sign = sexp_bignum_sign(a);
|
||||||
res = sexp_bignum_add_digits(ctx, dst, a, b);
|
res = sexp_bignum_add_digits(ctx, dst, a, b);
|
||||||
sexp_bignum_sign(res) = sexp_bignum_sign(a);
|
|
||||||
}
|
}
|
||||||
|
sexp_bignum_sign(res) = sign;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,7 +435,7 @@ sexp sexp_bignum_mul (sexp ctx, sexp dst, sexp a, sexp b) {
|
||||||
sexp_gc_var7(a0, a1, b0, b1, z0, z1, z2);
|
sexp_gc_var7(a0, a1, b0, b1, z0, z1, z2);
|
||||||
if (alen < blen) return sexp_bignum_mul(ctx, dst, b, a);
|
if (alen < blen) return sexp_bignum_mul(ctx, dst, b, a);
|
||||||
if (blen == 1) {
|
if (blen == 1) {
|
||||||
z1 = sexp_bignum_fxmul(ctx, NULL, a, bdata[0], 0);
|
z1 = sexp_bignum_fxmul(ctx, dst, a, bdata[0], 0);
|
||||||
} else {
|
} else {
|
||||||
/* karatsuba: */
|
/* karatsuba: */
|
||||||
/* ab = (a1B^k + a0) * (b1B^k + b0) */
|
/* ab = (a1B^k + a0) * (b1B^k + b0) */
|
||||||
|
@ -458,8 +459,8 @@ sexp sexp_bignum_mul (sexp ctx, sexp dst, sexp a, sexp b) {
|
||||||
z1 = sexp_bignum_sub(ctx, NULL, z1, z2);
|
z1 = sexp_bignum_sub(ctx, NULL, z1, z2);
|
||||||
z2 = sexp_bignum_shift(ctx, z2, 2*k);
|
z2 = sexp_bignum_shift(ctx, z2, 2*k);
|
||||||
z1 = sexp_bignum_shift(ctx, z1, k);
|
z1 = sexp_bignum_shift(ctx, z1, k);
|
||||||
z1 = sexp_bignum_add(ctx, NULL, z1, z0);
|
z1 = sexp_bignum_add(ctx, z1, z1, z0);
|
||||||
z1 = sexp_bignum_add(ctx, NULL, z1, z2);
|
z1 = sexp_bignum_add(ctx, z1, z1, z2);
|
||||||
sexp_gc_release7(ctx);
|
sexp_gc_release7(ctx);
|
||||||
}
|
}
|
||||||
sexp_bignum_sign(z1) = sexp_bignum_sign(a) * sexp_bignum_sign(b);
|
sexp_bignum_sign(z1) = sexp_bignum_sign(a) * sexp_bignum_sign(b);
|
||||||
|
|
Loading…
Add table
Reference in a new issue