]> gitweb.factorcode.org Git - factor.git/blob - native/arithmetic.h
working on native image output
[factor.git] / native / arithmetic.h
1 #include "factor.h"
2
3 INLINE BIGNUM* fixnum_to_bignum(CELL n)
4 {
5         return bignum((BIGNUM_2)untag_fixnum_fast(n));
6 }
7
8 INLINE FIXNUM bignum_to_fixnum(CELL tagged)
9 {
10         return (FIXNUM)(untag_bignum(tagged)->n);
11 }
12
13 #define BINARY_OP(OP) \
14 void primitive_##OP(void) \
15 { \
16         CELL x = dpop(), y = env.dt; \
17 \
18         switch(TAG(x)) \
19         { \
20         case FIXNUM_TYPE: \
21 \
22                 switch(TAG(y)) \
23                 { \
24                 case FIXNUM_TYPE: \
25                         OP##_fixnum(x,y); \
26                         break; \
27                 case OBJECT_TYPE: \
28                         switch(object_type(y)) \
29                         { \
30                         case BIGNUM_TYPE: \
31                                 OP##_bignum((CELL)fixnum_to_bignum(x),y); \
32                                 break; \
33                         default: \
34                                 type_error(FIXNUM_TYPE,y); \
35                                 break; \
36                         } \
37                         break; \
38                 default: \
39                         type_error(FIXNUM_TYPE,y); \
40                         break; \
41                 } \
42 \
43                 break; \
44 \
45         case OBJECT_TYPE: \
46 \
47                 switch(object_type(x)) \
48                 { \
49          \
50                 case BIGNUM_TYPE: \
51                  \
52                         switch(TAG(y)) \
53                         { \
54                         case FIXNUM_TYPE: \
55                                 OP##_bignum(x,(CELL)fixnum_to_bignum(y)); \
56                                 break; \
57                         case OBJECT_TYPE: \
58 \
59                                 switch(object_type(y)) \
60                                 { \
61                                 case BIGNUM_TYPE: \
62                                         OP##_bignum(x,y); \
63                                         break; \
64                                 default: \
65                                         type_error(BIGNUM_TYPE,y); \
66                                         break; \
67                                 } \
68                                 break; \
69                         default: \
70                                 type_error(BIGNUM_TYPE,y); \
71                                 break; \
72                         } \
73                         break; \
74 \
75                 default: \
76 \
77                         type_error(FIXNUM_TYPE,x); \
78                         break; \
79                 } \
80 \
81                 break; \
82 \
83         default: \
84 \
85                 type_error(FIXNUM_TYPE,x); \
86                 break; \
87         } \
88 }
89
90 FIXNUM to_fixnum(CELL tagged);
91
92 void primitive_add(void);
93 void primitive_subtract(void);
94 void primitive_multiply(void);
95 void primitive_divmod(void);
96 void primitive_less(void);
97 void primitive_lesseq(void);
98 void primitive_greater(void);
99 void primitive_greatereq(void);
100 void primitive_mod(void);
101 void primitive_and(void);
102 void primitive_or(void);
103 void primitive_xor(void);
104 void primitive_shiftleft(void);
105 void primitive_shiftright(void);