4 * Copyright 2004-2009 by Marc Feeley and Vincent St-Amour, All Rights Reserved.
7 #include "picobit-vm.h"
12 void show_type (obj o
) {
14 if (o
== OBJ_FALSE
) printf("#f");
15 else if (o
== OBJ_TRUE
) printf("#t");
16 else if (o
== OBJ_NULL
) printf("()");
17 else if (o
< MIN_ROM_ENCODING
) printf("fixnum");
18 else if (IN_RAM (o
)) {
19 if (RAM_BIGNUM(o
)) printf("ram bignum");
20 else if (RAM_PAIR(o
)) printf("ram pair");
21 else if (RAM_SYMBOL(o
)) printf("ram symbol");
22 else if (RAM_STRING(o
)) printf("ram string");
23 else if (RAM_VECTOR(o
)) printf("ram vector");
24 else if (RAM_CONTINUATION(o
)) printf("ram continuation");
25 else if (RAM_CLOSURE(o
)) printf("ram closure");
28 if (ROM_BIGNUM(o
)) printf("rom bignum");
29 else if (ROM_PAIR(o
)) printf("rom pair");
30 else if (ROM_SYMBOL(o
)) printf("rom symbol");
31 else if (ROM_STRING(o
)) printf("rom string");
32 else if (ROM_VECTOR(o
)) printf("rom vector");
33 else if (ROM_CONTINUATION(o
)) printf("rom continuation");
34 else if (RAM_CLOSURE(o
)) printf("rom closure");
39 void show_state (rom_addr pc
) {
41 printf ("pc=0x%04x bytecode=0x%02x env=", pc
, rom_get (pc
));
50 long long x
; // TODO long long is 32 bits here, what about on a 64 bit machine ?
51 x
= ((long long)integer_lo (integer_hi (integer_hi (integer_hi (n
))))<<48)+
52 ((long long)integer_lo (integer_hi (integer_hi (n
)))<<32)+
53 ((long long)integer_lo (integer_hi (n
))<<16)+
54 (long long)integer_lo (n
);
56 // TODO test for hex output, to avoid signedness problems
57 /* printf("%x %x %x %x\n", // TODO prob, if a lower part is 0, will show 0, not 0000 */
58 /* integer_lo (integer_hi (integer_hi (integer_hi (n)))), */
59 /* integer_lo (integer_hi (integer_hi (n))), */
60 /* integer_lo (integer_hi (n)), */
61 /* integer_lo (n)); */
64 integer
enc (long long n
) {
67 while (n
!= 0 && n
!= -1) {
68 result
= make_integer ((digit
)n
, result
);
73 return norm (result
, NEG1
);
75 return norm (result
, ZERO
);
87 zero
= make_integer (0x0000, 0);
88 min1
= make_integer (0xffff, 0);
89 integer_hi_set (zero
, ZERO
);
90 integer_hi_set (min1
, NEG1
);
92 min2
= make_integer (0xfffe, NEG1
);
93 one
= make_integer (0x0001, ZERO
);
94 two
= make_integer (0x0002, ZERO
);
95 three
= make_integer (0x0003, ZERO
);
96 four
= make_integer (0x0004, ZERO
);
98 if (negp (ZERO
)) printf ("zero is negp\n"); // should not show
99 if (negp (NEG1
)) printf ("min1 is negp\n");
101 printf ("cmp(5,5) = %d\n",cmp (make_integer (5, ZERO
), make_integer (5, ZERO
)));
102 printf ("cmp(2,5) = %d\n",cmp (make_integer (2, ZERO
), make_integer (5, ZERO
)));
103 printf ("cmp(5,2) = %d\n",cmp (make_integer (5, ZERO
), make_integer (2, ZERO
)));
105 printf ("cmp(-5,-5) = %d\n",cmp (make_integer (-5, NEG1
), make_integer (-5, NEG1
)));
106 printf ("cmp(-2,-5) = %d\n",cmp (make_integer (-2, NEG1
), make_integer (-5, NEG1
)));
107 printf ("cmp(-5,-2) = %d\n",cmp (make_integer (-5, NEG1
), make_integer (-2, NEG1
)));
109 printf ("cmp(-5,65533) = %d\n",cmp (make_integer (-5, NEG1
), make_integer (65533, ZERO
)));
110 printf ("cmp(-5,2) = %d\n",cmp (make_integer (-5, NEG1
), make_integer (2, ZERO
)));
111 printf ("cmp(5,-65533) = %d\n",cmp (make_integer (5, ZERO
), make_integer (-65533, NEG1
)));
112 printf ("cmp(5,-2) = %d\n",cmp (make_integer (5, ZERO
), make_integer (-2, NEG1
)));
114 printf ("integer_length(0) = %d\n", integer_length (ZERO
)); // these return the number of bits necessary to encode
115 printf ("integer_length(1) = %d\n", integer_length (make_integer (1, ZERO
)));
116 printf ("integer_length(2) = %d\n", integer_length (make_integer (2, ZERO
)));
117 printf ("integer_length(3) = %d\n", integer_length (make_integer (3, ZERO
)));
118 printf ("integer_length(4) = %d\n", integer_length (make_integer (4, ZERO
)));
119 printf ("integer_length(65536 + 4) = %d\n", integer_length (make_integer (4, make_integer (1, ZERO
))));
122 printf ("1 = %d\n", one
);
123 printf ("2 = %d\n", two
);
124 printf ("4 = %d\n", four
);
125 printf ("norm(2) = %d\n", norm (make_integer (0, make_integer (2, NIL
)), ZERO
));
126 printf ("norm(2) = %d\n", norm (make_integer (0, make_integer (2, NIL
)), ZERO
));
127 printf ("norm(3) = %d\n", norm (make_integer (0, make_integer (3, NIL
)), ZERO
));
128 printf ("norm(3) = %d\n", norm (make_integer (0, make_integer (3, NIL
)), ZERO
));
130 printf ("shl(1) = %d\n", shl (one
));
131 printf ("shl(2) = %d\n", shl (two
));
135 // should show powers of 2 incerasing, then decreasing
136 for (i
=1; i
<=34; i
++) {
137 printf("\nloop-1 : i=%d len=%d ", i
, integer_length(n
));
141 for (i
=1; i
<=35; i
++) {
142 printf("\nloop-2 : i=%d len=%d ", i
, integer_length(n
));
147 n
= shift_left (four
, 5);
149 for (i
=0; i
<=14; i
++) {
150 printf("\nloop-3 : i=%d len=%d ", i
, integer_length(n
));
151 p (shift_left (n
, i
*4));
155 p (add (enc (32768), enc (32768))); printf("\n"); // 65536
156 p (add (enc (32768+(65536*65535LL)), enc (32768))); printf("\n"); // 4294967296
158 p (sub (enc (32768), enc (-32768))); printf("\n"); // 65536
159 p (sub (enc (32768+(65536*65535LL)), enc (-32768))); printf("\n"); // 4294967296
161 p (sub (enc (32768), enc (32769))); printf("\n"); // -1
162 p (sub (enc (32768), enc (132768))); printf("\n"); // -100000
163 p (add(sub (enc (32768), enc (32769)), enc(1000))); printf("\n"); // 999
165 // TODO mul was scrapped, logic is now in prim_mul
166 /* p (mul (enc (123456789), enc (1000000000))); printf("\n"); // 123456789000000000 */
167 /* p (mul (enc (123456789), enc (-1000000000))); printf("\n"); // -123456789000000000 */
168 /* p (mul (enc (-123456789), enc (1000000000))); printf("\n"); // -123456789000000000 */
169 /* p (mul (enc (-123456789), enc (-1000000000))); printf("\n"); // 123456789000000000 */
170 /* p (mul (enc (-123456789), neg (enc (1000000000)))); printf("\n"); // 123456789000000000 */
172 p (divnonneg (enc (10000000-1), enc (500000))); printf("\n"); // 19