BUGFIX - CPI off by a factor of 10 X
[yari.git] / testcases / stalls.c
blob7311b80261bb932d70d8f06fbdfd4a79dd7bb402
1 #define NCAND 64
3 #ifdef STANDALONE
4 asm(" .globl _start");
5 asm(" # This is to stay compatible with crt0 C programs (starts at 0x80000003c)");
6 asm("_init:");
7 asm(" nop # 0x80000000");
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(" nop");
21 asm(" nop");
22 asm("");
23 asm("# 0x8000003c");
24 asm("_start: lui $29,0x8000 ");
25 asm(" ori $29,$29,0x2000"); /* + 8KiB */
26 asm(" jal main ");
27 asm(" nop ");
28 asm(" break ");
29 #endif
31 static inline putchar(unsigned ch)
33 if (ch == '\n')
34 putchar('\r');
36 #define SER_OUTBUSY() (*(volatile unsigned *)0xFF000000 != 0)
37 #define SER_OUT(data) (*(volatile unsigned *)0xFF000000 = (data))
38 while (SER_OUTBUSY())
40 SER_OUT(ch);
44 static void put_unsigned(unsigned n)
46 // (unsigned)-1 == 4294967295
47 static unsigned powers10[] = {
48 1000000000,
49 100000000,
50 10000000,
51 1000000,
52 100000,
53 10000,
54 1000,
55 100,
56 10,
60 unsigned *p;
61 unsigned leading_zero = 1;
63 if (!n) {
64 putchar('0');
65 return;
68 for (p = powers10; *p; ++p) {
69 unsigned scale = *p;
70 unsigned i, t;
72 for (i = 0; n >= scale; ++i, n -= scale)
74 if (i != 0 || !leading_zero) {
75 putchar('0' + i);
76 leading_zero = 0;
81 main()
83 // 0 1 2 3 4 5 6
84 // 3 5 7 9 11 13 15
85 static unsigned cand[NCAND];
87 unsigned i, j, n = 0;
88 unsigned *p;
90 for (i = 0; i != NCAND*32; ++i) {
91 if ((cand[i >> 5] & (1 << (i & 31))) == 0) {
92 unsigned p = 2*i+3;
93 put_unsigned(p);
94 putchar(' ');
95 // Remove 3p 5p 7p 9p ...
96 // 3p ~ cand[(3p - 3)/2] = cand[(6i+9-3)/2] = cand[3i+3]
97 // 5p ~ cand[(5p - 3)/2] = cand[(10i+15-3)/2] = cand[5i+6]
98 // ...
99 // np ~ cand[(np - 3)/2] = cand[(2ni+3n-3)/2] = cand[ni+1.5(n-1)]
100 // = cand[pos(np)]
102 // (n+2)p ~ cand[((n+2)p - 3)/2] =
103 // cand[((np + 2p) - 3) / 2] =
104 // cand[(np - 3)/2 + p]
106 for (j = i + p; j < NCAND*32; j += p) {
107 cand[j >> 5] |= 1 << (j & 31);
108 // printf("-%d ", 2*j+3);
110 if (++n == 15) {
111 putchar('\n');
112 n = 0;
116 putchar('\n');