2009-05-04 02:46:13 -04:00
|
|
|
namespace factor
|
|
|
|
{
|
|
|
|
|
2009-05-08 16:05:55 -04:00
|
|
|
static const fixnum fixnum_max = (((fixnum)1 << (WORD_SIZE - TAG_BITS - 1)) - 1);
|
|
|
|
static const fixnum fixnum_min = (-((fixnum)1 << (WORD_SIZE - TAG_BITS - 1)));
|
|
|
|
static const fixnum array_size_max = ((cell)1 << (WORD_SIZE - TAG_BITS - 2));
|
2009-05-02 05:04:19 -04:00
|
|
|
|
2012-08-16 00:30:55 -04:00
|
|
|
/* Allocates memory */
|
2010-07-19 10:09:28 -04:00
|
|
|
inline cell factor_vm::from_signed_cell(fixnum x)
|
2009-09-29 14:53:10 -04:00
|
|
|
{
|
|
|
|
if(x < fixnum_min || x > fixnum_max)
|
|
|
|
return tag<bignum>(fixnum_to_bignum(x));
|
|
|
|
else
|
|
|
|
return tag_fixnum(x);
|
|
|
|
}
|
|
|
|
|
2012-08-16 00:30:55 -04:00
|
|
|
/* Allocates memory */
|
2010-07-19 10:09:28 -04:00
|
|
|
inline cell factor_vm::from_unsigned_cell(cell x)
|
2009-09-29 14:53:10 -04:00
|
|
|
{
|
|
|
|
if(x > (cell)fixnum_max)
|
|
|
|
return tag<bignum>(cell_to_bignum(x));
|
|
|
|
else
|
|
|
|
return tag_fixnum(x);
|
|
|
|
}
|
|
|
|
|
2012-08-16 00:30:55 -04:00
|
|
|
/* Allocates memory */
|
2009-09-29 14:53:10 -04:00
|
|
|
inline cell factor_vm::allot_float(double n)
|
|
|
|
{
|
|
|
|
boxed_float *flo = allot<boxed_float>(sizeof(boxed_float));
|
|
|
|
flo->n = n;
|
|
|
|
return tag(flo);
|
|
|
|
}
|
|
|
|
|
2012-08-16 00:30:55 -04:00
|
|
|
/* Allocates memory */
|
2009-09-29 14:53:10 -04:00
|
|
|
inline bignum *factor_vm::float_to_bignum(cell tagged)
|
|
|
|
{
|
|
|
|
return double_to_bignum(untag_float(tagged));
|
|
|
|
}
|
2009-05-04 02:00:30 -04:00
|
|
|
|
2009-09-29 14:53:10 -04:00
|
|
|
inline double factor_vm::untag_float(cell tagged)
|
|
|
|
{
|
|
|
|
return untag<boxed_float>(tagged)->n;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline double factor_vm::untag_float_check(cell tagged)
|
|
|
|
{
|
|
|
|
return untag_check<boxed_float>(tagged)->n;
|
|
|
|
}
|
2009-05-04 02:00:30 -04:00
|
|
|
|
2009-09-29 14:53:10 -04:00
|
|
|
inline fixnum factor_vm::float_to_fixnum(cell tagged)
|
|
|
|
{
|
|
|
|
return (fixnum)untag_float(tagged);
|
|
|
|
}
|
2009-05-04 02:00:30 -04:00
|
|
|
|
2009-09-29 14:53:10 -04:00
|
|
|
inline double factor_vm::fixnum_to_float(cell tagged)
|
|
|
|
{
|
|
|
|
return (double)untag_fixnum(tagged);
|
|
|
|
}
|
2009-05-04 02:00:30 -04:00
|
|
|
|
2009-10-31 03:30:48 -04:00
|
|
|
inline cell factor_vm::unbox_array_size()
|
|
|
|
{
|
2009-12-18 16:59:56 -05:00
|
|
|
cell obj = ctx->peek();
|
2009-10-31 03:30:48 -04:00
|
|
|
if(TAG(obj) == FIXNUM_TYPE)
|
|
|
|
{
|
|
|
|
fixnum n = untag_fixnum(obj);
|
|
|
|
if(n >= 0 && n < (fixnum)array_size_max)
|
|
|
|
{
|
2009-12-18 16:59:56 -05:00
|
|
|
ctx->pop();
|
2009-10-31 03:30:48 -04:00
|
|
|
return n;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return unbox_array_size_slow();
|
|
|
|
}
|
2009-05-04 02:00:30 -04:00
|
|
|
|
2009-12-18 16:59:56 -05:00
|
|
|
VM_C_API cell from_signed_cell(fixnum integer, factor_vm *vm);
|
|
|
|
VM_C_API cell from_unsigned_cell(cell integer, factor_vm *vm);
|
|
|
|
VM_C_API cell from_signed_8(s64 n, factor_vm *vm);
|
|
|
|
VM_C_API cell from_unsigned_8(u64 n, factor_vm *vm);
|
2009-05-04 02:00:30 -04:00
|
|
|
|
2010-07-15 19:49:29 -04:00
|
|
|
VM_C_API s64 to_signed_8(cell obj, factor_vm *parent);
|
|
|
|
VM_C_API u64 to_unsigned_8(cell obj, factor_vm *parent);
|
2009-05-04 02:00:30 -04:00
|
|
|
|
2009-09-23 14:05:46 -04:00
|
|
|
VM_C_API fixnum to_fixnum(cell tagged, factor_vm *vm);
|
|
|
|
VM_C_API cell to_cell(cell tagged, factor_vm *vm);
|
2009-05-04 02:00:30 -04:00
|
|
|
|
2009-12-23 07:37:24 -05:00
|
|
|
VM_C_API void overflow_fixnum_add(fixnum x, fixnum y, factor_vm *parent);
|
|
|
|
VM_C_API void overflow_fixnum_subtract(fixnum x, fixnum y, factor_vm *parent);
|
|
|
|
VM_C_API void overflow_fixnum_multiply(fixnum x, fixnum y, factor_vm *parent);
|
2009-05-04 02:46:13 -04:00
|
|
|
|
|
|
|
}
|