4 extern cell bignum_zero;
5 extern cell bignum_pos_one;
6 extern cell bignum_neg_one;
8 static const fixnum fixnum_max = (((fixnum)1 << (WORD_SIZE - TAG_BITS - 1)) - 1);
9 static const fixnum fixnum_min = (-((fixnum)1 << (WORD_SIZE - TAG_BITS - 1)));
10 static const fixnum array_size_max = ((cell)1 << (WORD_SIZE - TAG_BITS - 2));
12 PRIMITIVE(fixnum_add);
13 PRIMITIVE(fixnum_subtract);
14 PRIMITIVE(fixnum_multiply);
16 PRIMITIVE(bignum_to_fixnum);
17 PRIMITIVE(float_to_fixnum);
19 PRIMITIVE(fixnum_divint);
20 PRIMITIVE(fixnum_divmod);
21 PRIMITIVE(fixnum_shift);
23 PRIMITIVE(fixnum_to_bignum);
24 PRIMITIVE(float_to_bignum);
26 PRIMITIVE(bignum_add);
27 PRIMITIVE(bignum_subtract);
28 PRIMITIVE(bignum_multiply);
29 PRIMITIVE(bignum_divint);
30 PRIMITIVE(bignum_divmod);
31 PRIMITIVE(bignum_mod);
32 PRIMITIVE(bignum_and);
34 PRIMITIVE(bignum_xor);
35 PRIMITIVE(bignum_shift);
36 PRIMITIVE(bignum_less);
37 PRIMITIVE(bignum_lesseq);
38 PRIMITIVE(bignum_greater);
39 PRIMITIVE(bignum_greatereq);
40 PRIMITIVE(bignum_not);
41 PRIMITIVE(bignum_bitp);
42 PRIMITIVE(bignum_log2);
43 PRIMITIVE(byte_array_to_bignum);
45 inline cell factorvm::allot_integer(fixnum x)
47 if(x < fixnum_min || x > fixnum_max)
48 return tag<bignum>(fixnum_to_bignum(x));
53 inline cell allot_integer(fixnum x)
55 return vm->allot_integer(x);
58 inline cell factorvm::allot_cell(cell x)
60 if(x > (cell)fixnum_max)
61 return tag<bignum>(cell_to_bignum(x));
66 inline cell allot_cell(cell x)
68 return vm->allot_cell(x);
71 cell unbox_array_size();
73 inline static double untag_float(cell tagged)
75 return untag<boxed_float>(tagged)->n;
78 inline static double untag_float_check(cell tagged)
80 return untag_check<boxed_float>(tagged)->n;
83 inline cell factorvm::allot_float(double n)
85 boxed_float *flo = allot<boxed_float>(sizeof(boxed_float));
90 inline cell allot_float(double n)
92 return vm->allot_float(n);
95 inline static fixnum float_to_fixnum(cell tagged)
97 return (fixnum)untag_float(tagged);
100 inline bignum *factorvm::float_to_bignum(cell tagged)
102 return double_to_bignum(untag_float(tagged));
105 inline bignum *float_to_bignum(cell tagged)
107 return vm->float_to_bignum(tagged);
110 inline double fixnum_to_float(cell tagged)
112 return (double)untag_fixnum(tagged);
115 inline double factorvm::bignum_to_float(cell tagged)
117 return bignum_to_double(untag<bignum>(tagged));
120 inline double bignum_to_float(cell tagged)
122 return vm->bignum_to_float(tagged);
125 PRIMITIVE(fixnum_to_float);
126 PRIMITIVE(bignum_to_float);
127 PRIMITIVE(str_to_float);
128 PRIMITIVE(float_to_str);
129 PRIMITIVE(float_to_bits);
132 PRIMITIVE(float_add);
133 PRIMITIVE(float_subtract);
134 PRIMITIVE(float_multiply);
135 PRIMITIVE(float_divfloat);
136 PRIMITIVE(float_mod);
137 PRIMITIVE(float_less);
138 PRIMITIVE(float_lesseq);
139 PRIMITIVE(float_greater);
140 PRIMITIVE(float_greatereq);
142 PRIMITIVE(float_bits);
143 PRIMITIVE(bits_float);
144 PRIMITIVE(double_bits);
145 PRIMITIVE(bits_double);
147 VM_C_API void box_float(float flo);
148 VM_C_API float to_float(cell value);
149 VM_C_API void box_double(double flo);
150 VM_C_API double to_double(cell value);
152 VM_C_API void box_signed_1(s8 n);
153 VM_C_API void box_unsigned_1(u8 n);
154 VM_C_API void box_signed_2(s16 n);
155 VM_C_API void box_unsigned_2(u16 n);
156 VM_C_API void box_signed_4(s32 n);
157 VM_C_API void box_unsigned_4(u32 n);
158 VM_C_API void box_signed_cell(fixnum integer);
159 VM_C_API void box_unsigned_cell(cell cell);
160 VM_C_API void box_signed_8(s64 n);
161 VM_C_API void box_unsigned_8(u64 n);
163 VM_C_API s64 to_signed_8(cell obj);
164 VM_C_API u64 to_unsigned_8(cell obj);
166 VM_C_API fixnum to_fixnum(cell tagged);
167 VM_C_API cell to_cell(cell tagged);
169 VM_ASM_API void overflow_fixnum_add(fixnum x, fixnum y);
170 VM_ASM_API void overflow_fixnum_subtract(fixnum x, fixnum y);
171 VM_ASM_API void overflow_fixnum_multiply(fixnum x, fixnum y);