3 FIXNUM to_fixnum(CELL tagged)
5 switch(type_of(tagged))
8 return untag_fixnum_fast(tagged);
10 return bignum_to_fixnum(tagged);
12 type_error(FIXNUM_TYPE,tagged);
13 return -1; /* can't happen */
17 #define CELL_TO_INTEGER(result) \
18 FIXNUM _result = (result); \
19 if(_result < FIXNUM_MIN || _result > FIXNUM_MAX) \
20 env.dt = tag_bignum(fixnum_to_bignum(_result)); \
22 env.dt = tag_fixnum(_result);
24 #define BIGNUM_2_TO_INTEGER(result) \
25 BIGNUM_2 _result = (result); \
26 if(_result < FIXNUM_MIN || _result > FIXNUM_MAX) \
27 env.dt = tag_bignum(bignum(_result)); \
29 env.dt = tag_fixnum(_result);
32 INLINE void add_fixnum(CELL x, CELL y)
34 CELL_TO_INTEGER(untag_fixnum_fast(x) + untag_fixnum_fast(y));
37 INLINE void add_bignum(CELL x, CELL y)
39 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
40 + ((BIGNUM*)UNTAG(y))->n));
46 INLINE void subtract_fixnum(CELL x, CELL y)
48 CELL_TO_INTEGER(untag_fixnum_fast(x) - untag_fixnum_fast(y));
51 INLINE void subtract_bignum(CELL x, CELL y)
53 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
54 - ((BIGNUM*)UNTAG(y))->n));
60 INLINE void multiply_fixnum(CELL x, CELL y)
62 BIGNUM_2_TO_INTEGER((BIGNUM_2)untag_fixnum_fast(x)
63 * (BIGNUM_2)untag_fixnum_fast(y));
66 INLINE void multiply_bignum(CELL x, CELL y)
68 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
69 * ((BIGNUM*)UNTAG(y))->n));
75 INLINE void divmod_fixnum(CELL x, CELL y)
78 /* division takes common factor of 8 out. */
79 dpush(tag_fixnum(q.quot));
83 INLINE void divmod_bignum(CELL x, CELL y)
85 dpush(tag_object(bignum(((BIGNUM*)UNTAG(x))->n
86 / ((BIGNUM*)UNTAG(y))->n)));
87 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
88 % ((BIGNUM*)UNTAG(y))->n));
94 INLINE void mod_fixnum(CELL x, CELL y)
99 INLINE void mod_bignum(CELL x, CELL y)
101 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
102 % ((BIGNUM*)UNTAG(y))->n));
108 INLINE void and_fixnum(CELL x, CELL y)
113 INLINE void and_bignum(CELL x, CELL y)
115 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
116 & ((BIGNUM*)UNTAG(y))->n));
122 INLINE void or_fixnum(CELL x, CELL y)
127 INLINE void or_bignum(CELL x, CELL y)
129 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
130 | ((BIGNUM*)UNTAG(y))->n));
136 INLINE void xor_fixnum(CELL x, CELL y)
141 INLINE void xor_bignum(CELL x, CELL y)
143 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
144 ^ ((BIGNUM*)UNTAG(y))->n));
150 INLINE void shiftleft_fixnum(CELL x, CELL y)
152 BIGNUM_2_TO_INTEGER((BIGNUM_2)untag_fixnum_fast(x)
153 << (BIGNUM_2)untag_fixnum_fast(y));
156 INLINE void shiftleft_bignum(CELL x, CELL y)
158 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
159 << ((BIGNUM*)UNTAG(y))->n));
165 INLINE void shiftright_fixnum(CELL x, CELL y)
167 BIGNUM_2_TO_INTEGER((BIGNUM_2)untag_fixnum_fast(x)
168 >> (BIGNUM_2)untag_fixnum_fast(y));
171 INLINE void shiftright_bignum(CELL x, CELL y)
173 env.dt = tag_object(bignum(((BIGNUM*)UNTAG(x))->n
174 >> ((BIGNUM*)UNTAG(y))->n));
177 BINARY_OP(shiftright)
180 INLINE void less_fixnum(CELL x, CELL y)
182 env.dt = tag_boolean((FIXNUM)x < (FIXNUM)y);
185 INLINE void less_bignum(CELL x, CELL y)
187 env.dt = tag_boolean(((BIGNUM*)UNTAG(x))->n
188 < ((BIGNUM*)UNTAG(y))->n);
194 INLINE void lesseq_fixnum(CELL x, CELL y)
196 env.dt = tag_boolean((FIXNUM)x <= (FIXNUM)y);
199 INLINE void lesseq_bignum(CELL x, CELL y)
201 env.dt = tag_boolean(((BIGNUM*)UNTAG(x))->n
202 <= ((BIGNUM*)UNTAG(y))->n);
208 INLINE void greater_fixnum(CELL x, CELL y)
210 env.dt = tag_boolean((FIXNUM)x > (FIXNUM)y);
213 INLINE void greater_bignum(CELL x, CELL y)
215 env.dt = tag_boolean(((BIGNUM*)UNTAG(x))->n
216 > ((BIGNUM*)UNTAG(y))->n);
222 INLINE void greatereq_fixnum(CELL x, CELL y)
224 env.dt = tag_boolean((FIXNUM)x >= (FIXNUM)y);
227 INLINE void greatereq_bignum(CELL x, CELL y)
229 env.dt = tag_boolean(((BIGNUM*)UNTAG(x))->n
230 >= ((BIGNUM*)UNTAG(y))->n);