Imported Upstream version 2.9.0
[debian/cc1111] / support / regression / tests / regtrack.c
1 /*
2    regtrack.c - testing register tracking
3 */
4
5 #include <testfwk.h>
6 #include <string.h>
7
8 #ifndef SDCC_mcs51
9 #  define __xdata
10 #  define __pdata
11 #  define __code
12 #endif
13
14 volatile unsigned char __xdata t;
15
16 __pdata      unsigned char ta[]={0x00,0x01,0x01,0x02,0x01,0xfe,0x7f,0xfe,0xef};
17 __code const unsigned char tb[]={0x00,0x01,0x01,0x02,0x01,0xfe,0x7f,0xfe,0xef};
18
19 static void 
20 foo(unsigned char which)
21 {
22   unsigned char i,k; // should be allocated to registers
23   volatile unsigned char m = 1;
24
25   k = 2;
26   do
27   {
28       t = 0xab;
29       i = 2;
30       do
31       {
32         switch( which )
33         {
34           case 1: k = 1;
35                   t = 1;    // mov
36                   break;
37           case 2: t = 0x01; 
38                   t = 0x02; // inc
39                   break;
40           case 3: t = 0x05;
41                   t = 0x04;
42                   t = 0x03; // dec
43                   break;
44           case 4: t = ~0x04;
45                   t = 0x04; // cpl
46                   break;
47           case 5: t = 0x05<<1;
48                   t = 0x05; // rr
49                   break;
50           case 6: t = 0x06>>1;
51                   t = 0x06; // rl
52                   break;
53           case 7: t = 0x70;
54                   t = 0x07; // swap
55                   break;
56           case 0x08: 
57                   t = 0x0a;
58                   k = 0x02;
59                   t = 0x08; // xrl
60                   break;
61           case 0x09: 
62                   t = 0x0f;
63                   k = 0xf9;
64                   t = 0x09; // anl
65                   break;
66           case 0x0a: 
67                   t = 0x08;
68                   k = 0x02;
69                   t = 0x0a; // orl
70                   break;
71           case 0x0b: 
72                   t = 0x0b*7;
73                   k = 7;
74                   t = t/7;  // div
75                   break;
76           case 0x0c: 
77                   t = 4;
78                   k = 3;
79                   t = t*3;  // mul
80                   break;
81         }
82       } while(--i);
83       
84       if(!i)
85          k = m; // prepare to exit outer loop
86
87   }while(--k);
88
89 }
90
91
92
93
94 void 
95 testRegTrack(void)
96 {
97   ASSERT(0==(char)memcmp(ta, tb, sizeof tb));
98
99   foo(1); ASSERT(t==1);
100   foo(2); ASSERT(t==2);
101   foo(3); ASSERT(t==3);
102   foo(4); ASSERT(t==4);
103 #if 1  
104   /* various checks for equality */
105   foo(5); ASSERT(!(t^5));
106   foo(6); ASSERT(0==(t^6));
107   foo(7); ASSERT(!(t-7));
108   foo(8); ASSERT(0==(t-8));
109   foo(9); ASSERT(0==((unsigned char)(t+(0x100-9))));
110   foo(10); ASSERT(!((unsigned char)(t+(0x100-10))));
111   foo(11); ASSERT(t>=11 && t<=11);
112   foo(12); ASSERT(t>11 && t<13);
113 #else  
114   foo(5); ASSERT(t==5);
115   foo(6); ASSERT(t==6);
116   foo(7); ASSERT(t==7);
117   foo(8); ASSERT(t==8);
118   foo(9); ASSERT(t==9);
119   foo(10); ASSERT(t==10);
120   foo(11); ASSERT(t==11);
121   foo(12); ASSERT(t==12);
122 #endif
123 }
124