Regression file for testing the nested for-loop bug in the PIC port that Steve Tell...
[fw/sdcc] / src / regression / nestfor.c
1 #define __16F873
2 #include "p16f873.h"
3 //#include "p16c84.h"
4
5 unsigned char success=0;
6 unsigned char failures=0;
7 unsigned char dummy=0;
8
9 bit bit0 = 0;
10 unsigned int uint0 = 0;
11 unsigned int uint1 = 0;
12 unsigned char uchar0 = 0;
13 unsigned char uchar1 = 0;
14
15 unsigned char call3(void);
16
17 void dput(unsigned char val)
18 {
19         PORTB = val;
20         PORTA = 0x01;
21         PORTA = 0x00;
22 }
23
24 void done()
25 {
26
27   dummy++;
28
29 }
30
31 /* both loops use the loop variable inside the inner loop */
32 void for1(void)
33 {
34         unsigned char i, j;
35
36         uchar0 = 0;
37         uchar1 = 0;
38         for(i = 0; i < 3; i++) {
39                 uchar0++;
40                 for(j = 0; j < 4; j++) {
41                         uchar1++;
42                         dput(i);
43                         dput(j);
44                 }
45         }
46         if(uchar0 != 3)
47                 failures++;
48         if(uchar1 != 12)
49                 failures++;
50 }
51
52 /* only the outer loop's variable is used inside, inner can be optimized into a repeat-loop */
53 void for2(void)
54 {
55         unsigned char i, j;
56
57         uchar0 = 0;
58         uchar1 = 0;
59         for(i = 0; i < 3; i++) {
60                 uchar0++;
61                 for(j = 0; j < 4; j++) {
62                         uchar1++;
63                         dput(i);
64                 }
65         }
66         if(uchar0 != 3)
67                 failures++;
68         if(uchar1 != 12)
69                 failures++;
70 }
71
72 /* only the inner loop's variable is used inside */
73 void for3(void)
74 {
75         unsigned char i, j;
76
77         uchar0 = 0;
78         uchar1 = 0;
79         for(i = 0; i < 3; i++) {
80                 uchar0++;
81                 for(j = 0; j < 4; j++) {
82                         uchar1++;
83                         dput(j);
84                 }
85         }
86         if(uchar0 != 3)
87                 failures++;
88         if(uchar1 != 12)
89                 failures++;
90
91 }
92
93 /* neither loop variable used inside the loops */
94 void for4(void)
95 {
96         unsigned char i, j;
97
98         uchar0 = 0;
99         uchar1 = 0;
100         for(i = 0; i < 3; i++) {
101                 uchar0++;
102                 for(j = 0; j < 4; j++) {
103                         uchar1++;
104                         dput(uchar0);
105                         dput(uchar1);
106                 }
107         }
108         if(uchar0 != 3)
109                 failures++;
110         if(uchar1 != 12)
111                 failures++;
112
113 }
114
115 /* like for1 but different condition in inner loop */
116 void for5(void)
117 {
118         unsigned char i, j;
119
120         uchar0 = 0;
121         uchar1 = 0;
122         for(i = 0; i < 3; i++) {
123                 uchar0++;
124                 for(j = 10; j >= 5; j--) {
125                         uchar1++;
126                         dput(i);
127                         dput(j);
128                 }
129         }
130         if(uchar0 != 3)
131                 failures++;
132         if(uchar1 != 18)
133                 failures++;
134 }
135
136 void main(void)
137 {
138   for1();
139   for2();
140   for3();
141   for4();
142   for5();
143
144   success = failures;
145   done();
146 }