]> gitweb.factorcode.org Git - factor.git/blob - vm/math.hpp
Merge branch 'mongo-factor-driver' of git@github.com:x6j8x/factor into mongo-factor...
[factor.git] / vm / math.hpp
1 namespace factor
2 {
3
4 extern cell bignum_zero;
5 extern cell bignum_pos_one;
6 extern cell bignum_neg_one;
7
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));
11
12 PRIMITIVE(fixnum_add);
13 PRIMITIVE(fixnum_subtract);
14 PRIMITIVE(fixnum_multiply);
15
16 PRIMITIVE(bignum_to_fixnum);
17 PRIMITIVE(float_to_fixnum);
18
19 PRIMITIVE(fixnum_divint);
20 PRIMITIVE(fixnum_divmod);
21 PRIMITIVE(fixnum_shift);
22
23 PRIMITIVE(fixnum_to_bignum);
24 PRIMITIVE(float_to_bignum);
25 PRIMITIVE(bignum_eq);
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);
33 PRIMITIVE(bignum_or);
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);
44
45 inline static cell allot_integer(fixnum x)
46 {
47         if(x < fixnum_min || x > fixnum_max)
48                 return tag<bignum>(fixnum_to_bignum(x));
49         else
50                 return tag_fixnum(x);
51 }
52
53 inline static cell allot_cell(cell x)
54 {
55         if(x > (cell)fixnum_max)
56                 return tag<bignum>(cell_to_bignum(x));
57         else
58                 return tag_fixnum(x);
59 }
60
61 cell unbox_array_size();
62
63 inline static double untag_float(cell tagged)
64 {
65         return untag<boxed_float>(tagged)->n;
66 }
67
68 inline static double untag_float_check(cell tagged)
69 {
70         return untag_check<boxed_float>(tagged)->n;
71 }
72
73 inline static cell allot_float(double n)
74 {
75         boxed_float *flo = allot<boxed_float>(sizeof(boxed_float));
76         flo->n = n;
77         return tag(flo);
78 }
79
80 inline static fixnum float_to_fixnum(cell tagged)
81 {
82         return (fixnum)untag_float(tagged);
83 }
84
85 inline static bignum *float_to_bignum(cell tagged)
86 {
87         return double_to_bignum(untag_float(tagged));
88 }
89
90 inline static double fixnum_to_float(cell tagged)
91 {
92         return (double)untag_fixnum(tagged);
93 }
94
95 inline static double bignum_to_float(cell tagged)
96 {
97         return bignum_to_double(untag<bignum>(tagged));
98 }
99
100 PRIMITIVE(fixnum_to_float);
101 PRIMITIVE(bignum_to_float);
102 PRIMITIVE(str_to_float);
103 PRIMITIVE(float_to_str);
104 PRIMITIVE(float_to_bits);
105
106 PRIMITIVE(float_eq);
107 PRIMITIVE(float_add);
108 PRIMITIVE(float_subtract);
109 PRIMITIVE(float_multiply);
110 PRIMITIVE(float_divfloat);
111 PRIMITIVE(float_mod);
112 PRIMITIVE(float_less);
113 PRIMITIVE(float_lesseq);
114 PRIMITIVE(float_greater);
115 PRIMITIVE(float_greatereq);
116
117 PRIMITIVE(float_bits);
118 PRIMITIVE(bits_float);
119 PRIMITIVE(double_bits);
120 PRIMITIVE(bits_double);
121
122 VM_C_API void box_float(float flo);
123 VM_C_API float to_float(cell value);
124 VM_C_API void box_double(double flo);
125 VM_C_API double to_double(cell value);
126
127 VM_C_API void box_signed_1(s8 n);
128 VM_C_API void box_unsigned_1(u8 n);
129 VM_C_API void box_signed_2(s16 n);
130 VM_C_API void box_unsigned_2(u16 n);
131 VM_C_API void box_signed_4(s32 n);
132 VM_C_API void box_unsigned_4(u32 n);
133 VM_C_API void box_signed_cell(fixnum integer);
134 VM_C_API void box_unsigned_cell(cell cell);
135 VM_C_API void box_signed_8(s64 n);
136 VM_C_API void box_unsigned_8(u64 n);
137
138 VM_C_API s64 to_signed_8(cell obj);
139 VM_C_API u64 to_unsigned_8(cell obj);
140
141 VM_C_API fixnum to_fixnum(cell tagged);
142 VM_C_API cell to_cell(cell tagged);
143
144 VM_ASM_API void overflow_fixnum_add(fixnum x, fixnum y);
145 VM_ASM_API void overflow_fixnum_subtract(fixnum x, fixnum y);
146 VM_ASM_API void overflow_fixnum_multiply(fixnum x, fixnum y);
147
148 }