]> gitweb.factorcode.org Git - factor.git/blob - vm/math.hpp
moved global state from math into vm
[factor.git] / vm / math.hpp
1 namespace factor
2 {
3
4 static const fixnum fixnum_max = (((fixnum)1 << (WORD_SIZE - TAG_BITS - 1)) - 1);
5 static const fixnum fixnum_min = (-((fixnum)1 << (WORD_SIZE - TAG_BITS - 1)));
6 static const fixnum array_size_max = ((cell)1 << (WORD_SIZE - TAG_BITS - 2));
7
8 PRIMITIVE(fixnum_add);
9 PRIMITIVE(fixnum_subtract);
10 PRIMITIVE(fixnum_multiply);
11
12 PRIMITIVE(bignum_to_fixnum);
13 PRIMITIVE(float_to_fixnum);
14
15 PRIMITIVE(fixnum_divint);
16 PRIMITIVE(fixnum_divmod);
17 PRIMITIVE(fixnum_shift);
18
19 PRIMITIVE(fixnum_to_bignum);
20 PRIMITIVE(float_to_bignum);
21 PRIMITIVE(bignum_eq);
22 PRIMITIVE(bignum_add);
23 PRIMITIVE(bignum_subtract);
24 PRIMITIVE(bignum_multiply);
25 PRIMITIVE(bignum_divint);
26 PRIMITIVE(bignum_divmod);
27 PRIMITIVE(bignum_mod);
28 PRIMITIVE(bignum_and);
29 PRIMITIVE(bignum_or);
30 PRIMITIVE(bignum_xor);
31 PRIMITIVE(bignum_shift);
32 PRIMITIVE(bignum_less);
33 PRIMITIVE(bignum_lesseq);
34 PRIMITIVE(bignum_greater);
35 PRIMITIVE(bignum_greatereq);
36 PRIMITIVE(bignum_not);
37 PRIMITIVE(bignum_bitp);
38 PRIMITIVE(bignum_log2);
39 PRIMITIVE(byte_array_to_bignum);
40
41
42
43
44
45
46
47
48
49 cell unbox_array_size();
50
51 inline static double untag_float(cell tagged)
52 {
53         return untag<boxed_float>(tagged)->n;
54 }
55
56 inline static double untag_float_check(cell tagged)
57 {
58         return untag_check<boxed_float>(tagged)->n;
59 }
60
61
62
63
64
65 inline static fixnum float_to_fixnum(cell tagged)
66 {
67         return (fixnum)untag_float(tagged);
68 }
69
70
71
72
73
74 inline double fixnum_to_float(cell tagged)
75 {
76         return (double)untag_fixnum(tagged);
77 }
78
79
80
81
82
83 PRIMITIVE(fixnum_to_float);
84 PRIMITIVE(bignum_to_float);
85 PRIMITIVE(str_to_float);
86 PRIMITIVE(float_to_str);
87 PRIMITIVE(float_to_bits);
88
89 PRIMITIVE(float_eq);
90 PRIMITIVE(float_add);
91 PRIMITIVE(float_subtract);
92 PRIMITIVE(float_multiply);
93 PRIMITIVE(float_divfloat);
94 PRIMITIVE(float_mod);
95 PRIMITIVE(float_less);
96 PRIMITIVE(float_lesseq);
97 PRIMITIVE(float_greater);
98 PRIMITIVE(float_greatereq);
99
100 PRIMITIVE(float_bits);
101 PRIMITIVE(bits_float);
102 PRIMITIVE(double_bits);
103 PRIMITIVE(bits_double);
104
105 VM_C_API void box_float(float flo);
106 VM_C_API float to_float(cell value);
107 VM_C_API void box_double(double flo);
108 VM_C_API double to_double(cell value);
109
110 VM_C_API void box_signed_1(s8 n);
111 VM_C_API void box_unsigned_1(u8 n);
112 VM_C_API void box_signed_2(s16 n);
113 VM_C_API void box_unsigned_2(u16 n);
114 VM_C_API void box_signed_4(s32 n);
115 VM_C_API void box_unsigned_4(u32 n);
116 VM_C_API void box_signed_cell(fixnum integer);
117 VM_C_API void box_unsigned_cell(cell cell);
118 VM_C_API void box_signed_8(s64 n);
119 VM_C_API void box_unsigned_8(u64 n);
120
121 VM_C_API s64 to_signed_8(cell obj);
122 VM_C_API u64 to_unsigned_8(cell obj);
123
124 VM_C_API fixnum to_fixnum(cell tagged);
125 VM_C_API cell to_cell(cell tagged);
126
127 VM_ASM_API void overflow_fixnum_add(fixnum x, fixnum y);
128 VM_ASM_API void overflow_fixnum_subtract(fixnum x, fixnum y);
129 VM_ASM_API void overflow_fixnum_multiply(fixnum x, fixnum y);
130
131 }