]> gitweb.factorcode.org Git - factor.git/blob - vm/math.hpp
VM: Refactor math.hpp/cpp to Factor style
[factor.git] / vm / math.hpp
1 namespace factor {
2
3 static const fixnum fixnum_max =
4     (((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 /* Allocates memory */
9 inline cell factor_vm::from_signed_cell(fixnum x) {
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 /* Allocates memory */
17 inline cell factor_vm::from_unsigned_cell(cell x) {
18   if (x > (cell) fixnum_max)
19     return tag<bignum>(cell_to_bignum(x));
20   else
21     return tag_fixnum(x);
22 }
23
24 /* Allocates memory */
25 inline cell factor_vm::allot_float(double n) {
26   boxed_float* flo = allot<boxed_float>(sizeof(boxed_float));
27   flo->n = n;
28   return tag(flo);
29 }
30
31 /* Allocates memory */
32 inline bignum* factor_vm::float_to_bignum(cell tagged) {
33   return double_to_bignum(untag_float(tagged));
34 }
35
36 inline double factor_vm::untag_float(cell tagged) {
37   return untag<boxed_float>(tagged)->n;
38 }
39
40 inline double factor_vm::untag_float_check(cell tagged) {
41   return untag_check<boxed_float>(tagged)->n;
42 }
43
44 inline fixnum factor_vm::float_to_fixnum(cell tagged) {
45   return (fixnum) untag_float(tagged);
46 }
47
48 inline double factor_vm::fixnum_to_float(cell tagged) {
49   return (double) untag_fixnum(tagged);
50 }
51
52 inline cell factor_vm::unbox_array_size() {
53   cell obj = ctx->peek();
54   if (TAG(obj) == FIXNUM_TYPE) {
55     fixnum n = untag_fixnum(obj);
56     if (n >= 0 && n < (fixnum) array_size_max) {
57       ctx->pop();
58       return n;
59     }
60   }
61
62   return unbox_array_size_slow();
63 }
64
65 VM_C_API cell from_signed_cell(fixnum integer, factor_vm* vm);
66 VM_C_API cell from_unsigned_cell(cell integer, factor_vm* vm);
67 VM_C_API cell from_signed_8(s64 n, factor_vm* vm);
68 VM_C_API cell from_unsigned_8(u64 n, factor_vm* vm);
69
70 VM_C_API s64 to_signed_8(cell obj, factor_vm* parent);
71 VM_C_API u64 to_unsigned_8(cell obj, factor_vm* parent);
72
73 VM_C_API fixnum to_fixnum(cell tagged, factor_vm* vm);
74 VM_C_API cell to_cell(cell tagged, factor_vm* vm);
75
76 VM_C_API void overflow_fixnum_add(fixnum x, fixnum y, factor_vm* parent);
77 VM_C_API void overflow_fixnum_subtract(fixnum x, fixnum y, factor_vm* parent);
78 VM_C_API void overflow_fixnum_multiply(fixnum x, fixnum y, factor_vm* parent);
79
80 }