diff --git a/src/bignum.c b/src/bignum.c index cc907af397210c2a4bfa789499cd522471f4cd28..f45c1aaa4c786c95a25b211001c789d6dd3e1234 100644 --- a/src/bignum.c +++ b/src/bignum.c @@ -130,10 +130,6 @@ PMOD_EXPORT void convert_svalue_to_bignum(struct svalue *s) } #ifdef INT64 -/* These routines can be made much more optimized. */ - -#define BIGNUM_INT64_MASK 0xffff -#define BIGNUM_INT64_SHIFT 16 PMOD_EXPORT void push_int64(INT64 i) { @@ -143,44 +139,37 @@ PMOD_EXPORT void push_int64(INT64 i) } else { - int neg, pos, lshfun, orfun; - - neg = (i < 0); - - if(neg) - i = ~i; - - push_int(DO_NOT_WARN(i & BIGNUM_INT64_MASK)); - i >>= BIGNUM_INT64_SHIFT; - convert_stack_top_to_bignum(); - - lshfun = FIND_LFUN(sp[-1].u.object->prog, LFUN_LSH); - orfun = FIND_LFUN(sp[-1].u.object->prog, LFUN_OR); - - for(pos = BIGNUM_INT64_SHIFT; i; pos += BIGNUM_INT64_SHIFT) + unsigned int neg = 0; + if( i < 0 ) { - push_int(DO_NOT_WARN(i & BIGNUM_INT64_MASK)); - i >>= BIGNUM_INT64_SHIFT; - convert_stack_top_to_bignum(); - - push_int(pos); - apply_low(sp[-2].u.object, lshfun, 1); - stack_swap(); - pop_stack(); - - apply_low(sp[-2].u.object, orfun, 1); - stack_swap(); - pop_stack(); - - if(sp[-1].type == T_INT) - convert_stack_top_to_bignum(); + i = -i; + neg = 1; } - +#if PIKE_BYTEORDER == 1234 + { + char digits[8]; + char *ledigits = (char *)&i; + digits[7] = ledigits[ 0 ]; digits[6] = ledigits[ 1 ]; + digits[5] = ledigits[ 2 ]; digits[4] = ledigits[ 3 ]; + digits[3] = ledigits[ 4 ]; digits[2] = ledigits[ 5 ]; + digits[1] = ledigits[ 6 ]; digits[0] = ledigits[ 7 ]; + push_string( make_shared_binary_string( digits, 8 ) ); + } +#else + push_string( make_shared_binary_string( (char *)&i, 8 ) ); +#endif + push_int( 256 ); + apply_svalue(&auto_bignum_program, 2); + + if(neg) apply_low(sp[-1].u.object,FIND_LFUN(sp[-1].u.object->prog,LFUN_COMPL),0); } } +/* This routines can be optimized quite drastically. */ +#define BIGNUM_INT64_MASK 0xffffff +#define BIGNUM_INT64_SHIFT 24 PMOD_EXPORT int int64_from_bignum(INT64 *i, struct object *bignum) { int neg, pos, rshfun, andfun;