BUGFIX - CPI off by a factor of 10 X
[yari.git] / testcases / testshifts.c
blobbd0c5423ca07b8ad47876b9ce6288102ba2ab884
1 #ifdef STANDALONE
2 asm(" .globl _start");
3 asm(" # This is to stay compatible with crt0 C programs (starts at 0x80000003c)");
4 asm("_init:");
5 asm(" nop # 0x80000000");
6 asm(" nop");
7 asm(" nop");
8 asm(" nop");
9 asm(" nop");
10 asm(" nop");
11 asm(" nop");
12 asm(" nop");
13 asm(" nop");
14 asm(" nop");
15 asm(" nop");
16 asm(" nop");
17 asm(" nop");
18 asm(" nop");
19 asm(" nop");
20 asm("");
21 asm("# 0x8000003c");
22 asm("_start: la $29,0x80002000"); /* sp = + 8KiB */
23 asm(" la $28, _gp "); /* gp */
24 asm(" la $4, _ftext "); /* a0 */
25 asm(" la $5, _etext "); /* a1 */
26 asm(" jal main ");
27 asm(" nop ");
28 asm(" break ");
29 #endif
31 #ifdef mips
32 static inline putchar(unsigned ch)
34 if (ch == '\n')
35 putchar('\r');
37 #define SER_OUTBUSY() (*(volatile unsigned *)0xFF000000 != 0)
38 #define SER_OUT(data) (*(volatile unsigned *)0xFF000000 = (data))
39 while (SER_OUTBUSY())
41 SER_OUT(ch);
43 #endif
45 static void put_unsigned(unsigned n)
47 // (unsigned)-1 == 4294967295
48 static unsigned powers10[] = {
49 1000000000,
50 100000000,
51 10000000,
52 1000000,
53 100000,
54 10000,
55 1000,
56 100,
57 10,
61 unsigned *p;
62 unsigned leading_zero = 1;
64 if (!n) {
65 putchar('0');
66 return;
69 for (p = powers10; *p; ++p) {
70 unsigned scale = *p;
71 unsigned i, t;
73 for (i = 0; n >= scale; ++i, n -= scale)
75 if (i != 0 || !leading_zero) {
76 putchar('0' + i);
77 leading_zero = 0;
82 foo(unsigned n)
84 int i = n;
86 put_unsigned(n >> 5); putchar('\n');
87 put_unsigned(i >> 5); putchar('\n');
88 put_unsigned(i << 5); putchar('\n');
89 put_unsigned(n >> 31); putchar('\n');
90 put_unsigned(i >> 31); putchar('\n');
91 put_unsigned(i << 31); putchar('\n');
94 main()
96 int i, sh;
97 unsigned u;
98 unsigned failed = 0;
100 i = 1;
101 u = 1;
102 for (sh = 0; sh < 32; ++sh) {
103 put_unsigned(1 << sh); putchar('\n');
104 // putchar(i == (1 << sh) ? '.' : (failed++, '!'));
105 i += i;
107 putchar('\n');
109 i = ~0;
110 for (sh = 31; sh >= 0; --sh) {
111 put_unsigned(((int) 0x80000000) >> sh); putchar('\n');
112 // putchar(i == (((int) 0x80000000) >> sh) ? '.' : (failed++, '!'));
113 i += i;
115 putchar('\n');
116 u = 1;
117 for (sh = 31; sh >= 0; --sh) {
118 put_unsigned(((unsigned) 0x80000000) >> sh); putchar('\n');
119 // putchar(u == ((unsigned) 0x80000000 >> sh) ? '.' : (failed++, '!'));
120 u += u;
122 putchar('\n');
123 put_unsigned(failed);
124 putchar('\n');
125 foo(0x1729);
126 foo(-1729);