]> gitweb.factorcode.org Git - factor.git/blob - native/fixnum.c
3f59f88186ea68d7212bc81b1518e56fc8ff4e2c
[factor.git] / native / fixnum.c
1 #include "factor.h"
2
3 #define BINARY_OP(x,y) \
4         FIXNUM x, y; \
5         y = env.dt; \
6         type_check(FIXNUM_TYPE,y); \
7         x = dpop(); \
8         type_check(FIXNUM_TYPE,x);
9
10 void primitive_fixnump(void)
11 {
12         check_non_empty(env.dt);
13         env.dt = tag_boolean(TAG(env.dt) == FIXNUM_TYPE);
14 }
15
16 void primitive_divide(void)
17 {
18         BINARY_OP(x,y);
19         /* division takes common factor of 8 out. */
20         env.dt = tag_fixnum(x / y);
21 }
22
23 void primitive_mod(void)
24 {
25         BINARY_OP(x,y);
26         env.dt = x % y;
27 }
28
29 void primitive_and(void)
30 {
31         BINARY_OP(x,y);
32         env.dt = x & y;
33 }
34
35 void primitive_or(void)
36 {
37         BINARY_OP(x,y);
38         env.dt = x | y;
39 }
40
41 void primitive_xor(void)
42 {
43         BINARY_OP(x,y);
44         env.dt = x ^ y;
45 }
46
47 void primitive_not(void)
48 {
49         type_check(FIXNUM_TYPE,env.dt);
50         env.dt = RETAG(UNTAG(~env.dt),FIXNUM_TYPE);
51 }
52
53 void primitive_shiftleft(void)
54 {
55         BINARY_OP(x,y);
56         env.dt = UNTAG(x >> (y >> TAG_BITS));
57 }
58
59 void primitive_shiftright(void)
60 {
61         BINARY_OP(x,y);
62         env.dt = x << (y >> TAG_BITS);
63 }