]> gitweb.factorcode.org Git - factor.git/blob - vm/math.h
Initial import
[factor.git] / vm / math.h
1 #define CELL_MAX (CELL)(-1)
2 #define FIXNUM_MAX (((F_FIXNUM)1 << (WORD_SIZE - TAG_BITS - 1)) - 1)
3 #define FIXNUM_MIN (-((F_FIXNUM)1 << (WORD_SIZE - TAG_BITS - 1)))
4 #define ARRAY_SIZE_MAX ((CELL)1 << (WORD_SIZE - TAG_BITS - 2))
5
6 DLLEXPORT F_FIXNUM to_fixnum(CELL tagged);
7 DLLEXPORT CELL to_cell(CELL tagged);
8
9 DECLARE_PRIMITIVE(bignum_to_fixnum);
10 DECLARE_PRIMITIVE(float_to_fixnum);
11
12 DECLARE_PRIMITIVE(fixnum_add);
13 DECLARE_PRIMITIVE(fixnum_subtract);
14 DECLARE_PRIMITIVE(fixnum_add_fast);
15 DECLARE_PRIMITIVE(fixnum_subtract_fast);
16 DECLARE_PRIMITIVE(fixnum_multiply);
17 DECLARE_PRIMITIVE(fixnum_multiply_fast);
18 DECLARE_PRIMITIVE(fixnum_divint);
19 DECLARE_PRIMITIVE(fixnum_divmod);
20 DECLARE_PRIMITIVE(fixnum_mod);
21 DECLARE_PRIMITIVE(fixnum_and);
22 DECLARE_PRIMITIVE(fixnum_or);
23 DECLARE_PRIMITIVE(fixnum_xor);
24 DECLARE_PRIMITIVE(fixnum_shift);
25 DECLARE_PRIMITIVE(fixnum_less);
26 DECLARE_PRIMITIVE(fixnum_lesseq);
27 DECLARE_PRIMITIVE(fixnum_greater);
28 DECLARE_PRIMITIVE(fixnum_greatereq);
29 DECLARE_PRIMITIVE(fixnum_not);
30
31 CELL bignum_zero;
32 CELL bignum_pos_one;
33 CELL bignum_neg_one;
34
35 INLINE CELL tag_bignum(F_ARRAY* bignum)
36 {
37         return RETAG(bignum,BIGNUM_TYPE);
38 }
39
40 DECLARE_PRIMITIVE(fixnum_to_bignum);
41 DECLARE_PRIMITIVE(float_to_bignum);
42 DECLARE_PRIMITIVE(bignum_eq);
43 DECLARE_PRIMITIVE(bignum_add);
44 DECLARE_PRIMITIVE(bignum_subtract);
45 DECLARE_PRIMITIVE(bignum_multiply);
46 DECLARE_PRIMITIVE(bignum_divint);
47 DECLARE_PRIMITIVE(bignum_divmod);
48 DECLARE_PRIMITIVE(bignum_mod);
49 DECLARE_PRIMITIVE(bignum_and);
50 DECLARE_PRIMITIVE(bignum_or);
51 DECLARE_PRIMITIVE(bignum_xor);
52 DECLARE_PRIMITIVE(bignum_shift);
53 DECLARE_PRIMITIVE(bignum_less);
54 DECLARE_PRIMITIVE(bignum_lesseq);
55 DECLARE_PRIMITIVE(bignum_greater);
56 DECLARE_PRIMITIVE(bignum_greatereq);
57 DECLARE_PRIMITIVE(bignum_not);
58 DECLARE_PRIMITIVE(bignum_bitp);
59 DECLARE_PRIMITIVE(bignum_log2);
60 DECLARE_PRIMITIVE(byte_array_to_bignum);
61
62 INLINE CELL allot_integer(F_FIXNUM x)
63 {
64         if(x < FIXNUM_MIN || x > FIXNUM_MAX)
65                 return tag_bignum(fixnum_to_bignum(x));
66         else
67                 return tag_fixnum(x);
68 }
69
70 INLINE CELL allot_cell(CELL x)
71 {
72         if(x > (CELL)FIXNUM_MAX)
73                 return tag_bignum(cell_to_bignum(x));
74         else
75                 return tag_fixnum(x);
76 }
77
78 /* FFI calls this */
79 DLLEXPORT void box_signed_1(s8 n);
80 DLLEXPORT void box_unsigned_1(u8 n);
81 DLLEXPORT void box_signed_2(s16 n);
82 DLLEXPORT void box_unsigned_2(u16 n);
83 DLLEXPORT void box_signed_4(s32 n);
84 DLLEXPORT void box_unsigned_4(u32 n);
85 DLLEXPORT void box_signed_cell(F_FIXNUM integer);
86 DLLEXPORT void box_unsigned_cell(CELL cell);
87 DLLEXPORT void box_signed_8(s64 n);
88 DLLEXPORT s64 to_signed_8(CELL obj);
89
90 DLLEXPORT void box_unsigned_8(u64 n);
91 DLLEXPORT u64 to_unsigned_8(CELL obj);
92
93 CELL unbox_array_size(void);
94
95 DECLARE_PRIMITIVE(from_fraction);
96
97 INLINE double untag_float_fast(CELL tagged)
98 {
99         return ((F_FLOAT*)UNTAG(tagged))->n;
100 }
101
102 INLINE double untag_float(CELL tagged)
103 {
104         type_check(FLOAT_TYPE,tagged);
105         return untag_float_fast(tagged);
106 }
107
108 INLINE CELL allot_float(double n)
109 {
110         F_FLOAT* flo = allot_object(FLOAT_TYPE,sizeof(F_FLOAT));
111         flo->n = n;
112         return RETAG(flo,FLOAT_TYPE);
113 }
114
115 INLINE F_FIXNUM float_to_fixnum(CELL tagged)
116 {
117         return (F_FIXNUM)untag_float_fast(tagged);
118 }
119
120 INLINE F_ARRAY *float_to_bignum(CELL tagged)
121 {
122         return double_to_bignum(untag_float_fast(tagged));
123 }
124
125 INLINE double fixnum_to_float(CELL tagged)
126 {
127         return (double)untag_fixnum_fast(tagged);
128 }
129
130 INLINE double bignum_to_float(CELL tagged)
131 {
132         return bignum_to_double(untag_object(tagged));
133 }
134
135 DLLEXPORT void box_float(float flo);
136 DLLEXPORT float to_float(CELL value);
137 DLLEXPORT void box_double(double flo);
138 DLLEXPORT double to_double(CELL value);
139
140 DECLARE_PRIMITIVE(fixnum_to_float);
141 DECLARE_PRIMITIVE(bignum_to_float);
142 DECLARE_PRIMITIVE(str_to_float);
143 DECLARE_PRIMITIVE(float_to_str);
144 DECLARE_PRIMITIVE(float_to_bits);
145
146 DECLARE_PRIMITIVE(float_eq);
147 DECLARE_PRIMITIVE(float_add);
148 DECLARE_PRIMITIVE(float_subtract);
149 DECLARE_PRIMITIVE(float_multiply);
150 DECLARE_PRIMITIVE(float_divfloat);
151 DECLARE_PRIMITIVE(float_mod);
152 DECLARE_PRIMITIVE(float_less);
153 DECLARE_PRIMITIVE(float_lesseq);
154 DECLARE_PRIMITIVE(float_greater);
155 DECLARE_PRIMITIVE(float_greatereq);
156
157 DECLARE_PRIMITIVE(float_bits);
158 DECLARE_PRIMITIVE(bits_float);
159 DECLARE_PRIMITIVE(double_bits);
160 DECLARE_PRIMITIVE(bits_double);
161
162 DECLARE_PRIMITIVE(from_rect);