171 lines
4.3 KiB
C
171 lines
4.3 KiB
C
#define FIXNUM_MAX (((F_FIXNUM)1 << (WORD_SIZE - TAG_BITS - 1)) - 1)
|
|
#define FIXNUM_MIN (-((F_FIXNUM)1 << (WORD_SIZE - TAG_BITS - 1)))
|
|
|
|
INLINE F_FIXNUM untag_fixnum_fast(CELL tagged)
|
|
{
|
|
return ((F_FIXNUM)tagged) >> TAG_BITS;
|
|
}
|
|
|
|
INLINE CELL tag_fixnum(F_FIXNUM untagged)
|
|
{
|
|
return RETAG(untagged << TAG_BITS,FIXNUM_TYPE);
|
|
}
|
|
|
|
F_FIXNUM to_fixnum(CELL tagged);
|
|
void primitive_to_fixnum(void);
|
|
|
|
void primitive_fixnum_add(void);
|
|
void primitive_fixnum_subtract(void);
|
|
void primitive_fixnum_add_fast(void);
|
|
void primitive_fixnum_subtract_fast(void);
|
|
void primitive_fixnum_multiply(void);
|
|
void primitive_fixnum_divint(void);
|
|
void primitive_fixnum_divfloat(void);
|
|
void primitive_fixnum_divmod(void);
|
|
void primitive_fixnum_mod(void);
|
|
void primitive_fixnum_and(void);
|
|
void primitive_fixnum_or(void);
|
|
void primitive_fixnum_xor(void);
|
|
void primitive_fixnum_shift(void);
|
|
void primitive_fixnum_less(void);
|
|
void primitive_fixnum_lesseq(void);
|
|
void primitive_fixnum_greater(void);
|
|
void primitive_fixnum_greatereq(void);
|
|
void primitive_fixnum_not(void);
|
|
DLLEXPORT void box_signed_1(signed char integer);
|
|
DLLEXPORT void box_signed_2(signed short integer);
|
|
DLLEXPORT void box_unsigned_1(unsigned char integer);
|
|
DLLEXPORT void box_unsigned_2(unsigned short integer);
|
|
DLLEXPORT signed char unbox_signed_1(void);
|
|
DLLEXPORT signed short unbox_signed_2(void);
|
|
DLLEXPORT unsigned char unbox_unsigned_1(void);
|
|
DLLEXPORT unsigned short unbox_unsigned_2(void);
|
|
|
|
CELL bignum_zero;
|
|
CELL bignum_pos_one;
|
|
CELL bignum_neg_one;
|
|
|
|
INLINE F_ARRAY* untag_bignum_fast(CELL tagged)
|
|
{
|
|
return (F_ARRAY*)UNTAG(tagged);
|
|
}
|
|
|
|
INLINE CELL tag_bignum(F_ARRAY* bignum)
|
|
{
|
|
return RETAG(bignum,BIGNUM_TYPE);
|
|
}
|
|
|
|
CELL to_cell(CELL x);
|
|
F_ARRAY* to_bignum(CELL tagged);
|
|
void primitive_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_divfloat(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);
|
|
|
|
INLINE CELL tag_integer(F_FIXNUM x)
|
|
{
|
|
if(x < FIXNUM_MIN || x > FIXNUM_MAX)
|
|
return tag_bignum(s48_fixnum_to_bignum(x));
|
|
else
|
|
return tag_fixnum(x);
|
|
}
|
|
|
|
INLINE CELL tag_cell(CELL x)
|
|
{
|
|
if(x > FIXNUM_MAX)
|
|
return tag_bignum(s48_cell_to_bignum(x));
|
|
else
|
|
return tag_fixnum(x);
|
|
}
|
|
|
|
/* FFI calls this */
|
|
DLLEXPORT void box_signed_cell(F_FIXNUM integer);
|
|
DLLEXPORT F_FIXNUM unbox_signed_cell(void);
|
|
|
|
DLLEXPORT void box_unsigned_cell(CELL cell);
|
|
DLLEXPORT F_FIXNUM unbox_unsigned_cell(void);
|
|
|
|
DLLEXPORT void box_signed_4(s32 n);
|
|
DLLEXPORT s32 unbox_signed_4(void);
|
|
|
|
DLLEXPORT void box_unsigned_4(u32 n);
|
|
DLLEXPORT u32 unbox_unsigned_4(void);
|
|
|
|
DLLEXPORT void box_signed_8(s64 n);
|
|
DLLEXPORT s64 unbox_signed_8(void);
|
|
|
|
DLLEXPORT void box_unsigned_8(u64 n);
|
|
DLLEXPORT u64 unbox_unsigned_8(void);
|
|
|
|
void primitive_from_fraction(void);
|
|
|
|
/* for punning */
|
|
typedef union {
|
|
double x;
|
|
u64 y;
|
|
} DOUBLE_BITS;
|
|
|
|
typedef union {
|
|
float x;
|
|
u32 y;
|
|
} FLOAT_BITS;
|
|
|
|
INLINE F_FLOAT* make_float(double n)
|
|
{
|
|
F_FLOAT* flo = allot_object(FLOAT_TYPE,sizeof(F_FLOAT));
|
|
flo->n = n;
|
|
return flo;
|
|
}
|
|
|
|
INLINE double untag_float_fast(CELL tagged)
|
|
{
|
|
return ((F_FLOAT*)UNTAG(tagged))->n;
|
|
}
|
|
|
|
INLINE CELL tag_float(double flo)
|
|
{
|
|
return RETAG(make_float(flo),FLOAT_TYPE);
|
|
}
|
|
|
|
double to_float(CELL tagged);
|
|
void primitive_to_float(void);
|
|
void primitive_str_to_float(void);
|
|
void primitive_float_to_str(void);
|
|
void primitive_float_to_bits(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);
|
|
|
|
DLLEXPORT void box_float(float flo);
|
|
DLLEXPORT float unbox_float(void);
|
|
DLLEXPORT void box_double(double flo);
|
|
DLLEXPORT double unbox_double(void);
|
|
|
|
void primitive_from_rect(void);
|