Moved neg into the standard library.
[picobit.git] / debug.c
blobecd52280c987297bb80ebc1856abbc9d2d7b485a
1 /* file: "debug.c" */
3 /*
4 * Copyright 2004-2009 by Marc Feeley and Vincent St-Amour, All Rights Reserved.
5 */
7 #include "picobit-vm.h"
9 // debugging functions
11 #ifdef WORKSTATION
12 void show_type (obj o) {
13 printf("%d : ", 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");
27 else { // ROM
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");
36 printf("\n");
39 void show_state (rom_addr pc) {
40 printf("\n");
41 printf ("pc=0x%04x bytecode=0x%02x env=", pc, rom_get (pc));
42 show (env);
43 printf (" cont=");
44 show (cont);
45 printf ("\n");
46 fflush (stdout);
49 void p (integer n) {
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);
55 printf ("%lld ", x);
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) {
65 integer result = NIL;
67 while (n != 0 && n != -1) {
68 result = make_integer ((digit)n, result);
69 n >>= digit_width;
72 if (n < 0)
73 return norm (result, NEG1);
74 else
75 return norm (result, ZERO);
78 void test () {
79 integer min2;
80 integer min1;
81 integer zero;
82 integer one;
83 integer two;
84 integer three;
85 integer four;
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));
133 integer n = one;
134 int i;
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));
138 p (n);
139 n = shl(n);
141 for (i=1; i<=35; i++) {
142 printf("\nloop-2 : i=%d len=%d ", i, integer_length(n));
143 p (n);
144 n = shr(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));
154 printf("\n");
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
174 printf ("done\n");
176 exit (0);
179 #endif