Commit 8ae8d16c authored by jjgarcia's avatar jjgarcia

Fixed LOGBITP and the other binary operations among integers.

parent 5b7ac2b2
...@@ -264,9 +264,25 @@ static bignum_bit_operator bignum_operations[16] = { ...@@ -264,9 +264,25 @@ static bignum_bit_operator bignum_operations[16] = {
mpz_b_set_op}; mpz_b_set_op};
static cl_object log_op2(cl_object x, cl_object y, int op);
static cl_object static cl_object
log_op(int narg, int op, cl_va_list ARGS) log_op(int narg, int op, cl_va_list ARGS)
{ {
#if 1
cl_object x, y;
/* FIXME! This can be optimized */
x = cl_va_arg(ARGS);
if (narg-- == 1) {
assert_type_integer(x);
} else {
do {
y = cl_va_arg(ARGS);
x = log_op2(x, y, op);
} while (--narg);
}
return x;
#else
cl_object x, numi; cl_object x, numi;
bit_operator fix_log_op; bit_operator fix_log_op;
bignum_bit_operator big_log_op; bignum_bit_operator big_log_op;
...@@ -325,6 +341,7 @@ BIG_OP: ...@@ -325,6 +341,7 @@ BIG_OP:
} }
} }
return(big_normalize(x)); return(big_normalize(x));
#endif
} }
static cl_object static cl_object
...@@ -422,8 +439,11 @@ ecl_ash(cl_object x, cl_fixnum w) ...@@ -422,8 +439,11 @@ ecl_ash(cl_object x, cl_fixnum w)
return(x); return(x);
y = big_register0_get(); y = big_register0_get();
if (w < 0) { if (w < 0) {
if (FIXNUMP(x)) if (FIXNUMP(x)) {
return MAKE_FIXNUM(fix(x) >> -w); cl_fixnum y = fix(x);
y >>= -w;
return MAKE_FIXNUM(y);
}
mpz_div_2exp(y->big.big_num, x->big.big_num, -w); mpz_div_2exp(y->big.big_num, x->big.big_num, -w);
} else { } else {
if (FIXNUMP(x)) { if (FIXNUMP(x)) {
...@@ -539,10 +559,16 @@ cl_logbitp(cl_object p, cl_object x) ...@@ -539,10 +559,16 @@ cl_logbitp(cl_object p, cl_object x)
assert_type_integer(x); assert_type_integer(x);
if (FIXNUMP(p)) { if (FIXNUMP(p)) {
cl_fixnum n = fixnnint(p); cl_fixnum n = fixnnint(p);
if (FIXNUMP(x)) if (FIXNUMP(x)) {
i = ((fix(x) >> n) & 1); cl_fixnum y = fix(x);
else if (n >= FIXNUM_BITS) {
i = (y < 0);
} else {
i = ((y >> n) & 1);
}
} else {
i = mpz_tstbit(x->big.big_num, n); i = mpz_tstbit(x->big.big_num, n);
}
} else { } else {
assert_type_non_negative_integer(p); assert_type_non_negative_integer(p);
if (FIXNUMP(x)) if (FIXNUMP(x))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment