]> gitweb.factorcode.org Git - factor.git/blob - vm/math.hpp
Merge branch 'master' into propagation
[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 inline cell factor_vm::allot_integer(fixnum x)
9 {
10         if(x < fixnum_min || x > fixnum_max)
11                 return tag<bignum>(fixnum_to_bignum(x));
12         else
13                 return tag_fixnum(x);
14 }
15
16 inline cell factor_vm::allot_cell(cell x)
17 {
18         if(x > (cell)fixnum_max)
19                 return tag<bignum>(cell_to_bignum(x));
20         else
21                 return tag_fixnum(x);
22 }
23
24 inline cell factor_vm::allot_float(double n)
25 {
26         boxed_float *flo = allot<boxed_float>(sizeof(boxed_float));
27         flo->n = n;
28         return tag(flo);
29 }
30
31 inline bignum *factor_vm::float_to_bignum(cell tagged)
32 {
33         return double_to_bignum(untag_float(tagged));
34 }
35
36 inline double factor_vm::bignum_to_float(cell tagged)
37 {
38         return bignum_to_double(untag<bignum>(tagged));
39 }
40
41 inline double factor_vm::untag_float(cell tagged)
42 {
43         return untag<boxed_float>(tagged)->n;
44 }
45
46 inline double factor_vm::untag_float_check(cell tagged)
47 {
48         return untag_check<boxed_float>(tagged)->n;
49 }
50
51 inline fixnum factor_vm::float_to_fixnum(cell tagged)
52 {
53         return (fixnum)untag_float(tagged);
54 }
55
56 inline double factor_vm::fixnum_to_float(cell tagged)
57 {
58         return (double)untag_fixnum(tagged);
59 }
60
61 inline cell factor_vm::unbox_array_size()
62 {
63         cell obj = ctx->peek();
64         if(TAG(obj) == FIXNUM_TYPE)
65         {
66                 fixnum n = untag_fixnum(obj);
67                 if(n >= 0 && n < (fixnum)array_size_max)
68                 {
69                         ctx->pop();
70                         return n;
71                 }
72         }
73
74         return unbox_array_size_slow();
75 }
76
77 VM_C_API cell from_float(float flo, factor_vm *vm);
78 VM_C_API float to_float(cell value, factor_vm *vm);
79 VM_C_API cell from_double(double flo, factor_vm *vm);
80 VM_C_API double to_double(cell value, factor_vm *vm);
81
82 VM_C_API cell from_signed_1(s8 n, factor_vm *vm);
83 VM_C_API cell from_unsigned_1(u8 n, factor_vm *vm);
84 VM_C_API cell from_signed_2(s16 n, factor_vm *vm);
85 VM_C_API cell from_unsigned_2(u16 n, factor_vm *vm);
86 VM_C_API cell from_signed_4(s32 n, factor_vm *vm);
87 VM_C_API cell from_unsigned_4(u32 n, factor_vm *vm);
88 VM_C_API cell from_signed_cell(fixnum integer, factor_vm *vm);
89 VM_C_API cell from_unsigned_cell(cell integer, factor_vm *vm);
90 VM_C_API cell from_signed_8(s64 n, factor_vm *vm);
91 VM_C_API cell from_unsigned_8(u64 n, factor_vm *vm);
92
93 VM_C_API void to_signed_8(cell obj, s64 *out, factor_vm *parent);
94 VM_C_API void to_unsigned_8(cell obj, u64 *out, factor_vm *parent);
95
96 VM_C_API fixnum to_fixnum(cell tagged, factor_vm *vm);
97 VM_C_API cell to_cell(cell tagged, factor_vm *vm);
98
99 VM_C_API void overflow_fixnum_add(fixnum x, fixnum y, factor_vm *parent);
100 VM_C_API void overflow_fixnum_subtract(fixnum x, fixnum y, factor_vm *parent);
101 VM_C_API void overflow_fixnum_multiply(fixnum x, fixnum y, factor_vm *parent);
102
103 }