diff --git a/bin/ikarus b/bin/ikarus index b11721d..f2e8146 100755 Binary files a/bin/ikarus and b/bin/ikarus differ diff --git a/bin/ikarus-numerics.c b/bin/ikarus-numerics.c index 2bdbf0e..03d3d7c 100644 --- a/bin/ikarus-numerics.c +++ b/bin/ikarus-numerics.c @@ -1222,13 +1222,31 @@ ikrt_bignum_shift_right(ikp x, ikp y, ikpcb* pcb){ ikp ikrt_fixnum_shift_left(ikp x, ikp y, ikpcb* pcb){ - fprintf(stderr, "fxshiftleft\n"); - exit(-1); + int m = unfix(y); + int n = unfix(x); + int limb_count = (m >> 5) + 2; /* FIXME: 5 are the bits in 32-bit num */ + int bit_shift = m & 31; + ikp r = ik_alloc(pcb, align(disp_bignum_data + limb_count * wordsize)); + unsigned int* s = (unsigned int*)(r+disp_bignum_data); + bzero(s, limb_count * wordsize); + if(n >= 0){ + if(bit_shift){ + s[limb_count-1] = n >> (32 - bit_shift); + } + s[limb_count-2] = n << bit_shift; + } else { + if(bit_shift){ + s[limb_count-1] = (-n) >> (32 - bit_shift); + } + s[limb_count-2] = (-n) << bit_shift; + } + return normalize_bignum(limb_count, (n>=0)?(0):(1<