factor/vm/math.hpp

142 lines
3.7 KiB
C++
Raw Normal View History

2009-05-02 05:04:19 -04:00
#define CELL_MAX (CELL)(-1)
#define FIXNUM_MAX (((F_FIXNUM)1 << (WORD_SIZE - TAG_BITS - 1)) - 1)
#define FIXNUM_MIN (-((F_FIXNUM)1 << (WORD_SIZE - TAG_BITS - 1)))
#define ARRAY_SIZE_MAX ((CELL)1 << (WORD_SIZE - TAG_BITS - 2))
DLLEXPORT F_FIXNUM to_fixnum(CELL tagged);
DLLEXPORT CELL to_cell(CELL tagged);
void primitive_bignum_to_fixnum(void);
void primitive_float_to_fixnum(void);
F_FASTCALL void overflow_fixnum_add(F_FIXNUM x, F_FIXNUM y);
F_FASTCALL void overflow_fixnum_subtract(F_FIXNUM x, F_FIXNUM y);
F_FASTCALL void overflow_fixnum_multiply(F_FIXNUM x, F_FIXNUM y);
void primitive_fixnum_divint(void);
void primitive_fixnum_divmod(void);
void primitive_fixnum_shift(void);
extern CELL bignum_zero;
extern CELL bignum_pos_one;
extern CELL bignum_neg_one;
void primitive_fixnum_to_bignum(void);
void primitive_float_to_bignum(void);
void primitive_bignum_eq(void);
void primitive_bignum_add(void);
void primitive_bignum_subtract(void);
void primitive_bignum_multiply(void);
void primitive_bignum_divint(void);
void primitive_bignum_divmod(void);
void primitive_bignum_mod(void);
void primitive_bignum_and(void);
void primitive_bignum_or(void);
void primitive_bignum_xor(void);
void primitive_bignum_shift(void);
void primitive_bignum_less(void);
void primitive_bignum_lesseq(void);
void primitive_bignum_greater(void);
void primitive_bignum_greatereq(void);
void primitive_bignum_not(void);
void primitive_bignum_bitp(void);
void primitive_bignum_log2(void);
void primitive_byte_array_to_bignum(void);
INLINE CELL allot_integer(F_FIXNUM x)
{
if(x < FIXNUM_MIN || x > FIXNUM_MAX)
return tag<F_BIGNUM>(fixnum_to_bignum(x));
2009-05-02 05:04:19 -04:00
else
return tag_fixnum(x);
}
INLINE CELL allot_cell(CELL x)
{
if(x > (CELL)FIXNUM_MAX)
return tag<F_BIGNUM>(cell_to_bignum(x));
2009-05-02 05:04:19 -04:00
else
return tag_fixnum(x);
}
/* FFI calls this */
DLLEXPORT void box_signed_1(s8 n);
DLLEXPORT void box_unsigned_1(u8 n);
DLLEXPORT void box_signed_2(s16 n);
DLLEXPORT void box_unsigned_2(u16 n);
DLLEXPORT void box_signed_4(s32 n);
DLLEXPORT void box_unsigned_4(u32 n);
DLLEXPORT void box_signed_cell(F_FIXNUM integer);
DLLEXPORT void box_unsigned_cell(CELL cell);
DLLEXPORT void box_signed_8(s64 n);
DLLEXPORT s64 to_signed_8(CELL obj);
DLLEXPORT void box_unsigned_8(u64 n);
DLLEXPORT u64 to_unsigned_8(CELL obj);
CELL unbox_array_size(void);
INLINE double untag_float(CELL tagged)
2009-05-02 05:04:19 -04:00
{
return untag<F_FLOAT>(tagged)->n;
2009-05-02 05:04:19 -04:00
}
INLINE double untag_float_check(CELL tagged)
2009-05-02 05:04:19 -04:00
{
return untag_check<F_FLOAT>(tagged)->n;
2009-05-02 05:04:19 -04:00
}
INLINE CELL allot_float(double n)
{
2009-05-02 10:19:09 -04:00
F_FLOAT *flo = allot<F_FLOAT>(sizeof(F_FLOAT));
2009-05-02 05:04:19 -04:00
flo->n = n;
return RETAG(flo,FLOAT_TYPE);
}
INLINE F_FIXNUM float_to_fixnum(CELL tagged)
{
return (F_FIXNUM)untag_float(tagged);
2009-05-02 05:04:19 -04:00
}
2009-05-02 05:43:58 -04:00
INLINE F_BIGNUM *float_to_bignum(CELL tagged)
2009-05-02 05:04:19 -04:00
{
return double_to_bignum(untag_float(tagged));
2009-05-02 05:04:19 -04:00
}
INLINE double fixnum_to_float(CELL tagged)
{
return (double)untag_fixnum(tagged);
2009-05-02 05:04:19 -04:00
}
INLINE double bignum_to_float(CELL tagged)
{
return bignum_to_double(untag<F_BIGNUM>(tagged));
2009-05-02 05:04:19 -04:00
}
DLLEXPORT void box_float(float flo);
DLLEXPORT float to_float(CELL value);
DLLEXPORT void box_double(double flo);
DLLEXPORT double to_double(CELL value);
void primitive_fixnum_to_float(void);
void primitive_bignum_to_float(void);
void primitive_str_to_float(void);
void primitive_float_to_str(void);
void primitive_float_to_bits(void);
void primitive_float_eq(void);
void primitive_float_add(void);
void primitive_float_subtract(void);
void primitive_float_multiply(void);
void primitive_float_divfloat(void);
void primitive_float_mod(void);
void primitive_float_less(void);
void primitive_float_lesseq(void);
void primitive_float_greater(void);
void primitive_float_greatereq(void);
void primitive_float_bits(void);
void primitive_bits_float(void);
void primitive_double_bits(void);
void primitive_bits_double(void);