H8/300 example: source file routines.c
1 /*
2
3 A part of the Bound-T test program tp_bro.
4 This is the example program in the Bound-T brochure.
5
6 */
7
8 /*
9 $RCSfile: routines.html,v $
10 $Revision: 1.1 $
11 $Date: 2010-02-25 19:03:39 $
12 $Log: routines.html,v $
12 Revision 1.1 2010-02-25 19:03:39 niklas
12 First version.
12
13 Revision 1.3 2006/02/06 14:29:39 niklas
14 Using count_t for some counters.
15
16 Revision 1.2 2006/02/05 20:28:32 niklas
17 Removed CR line-endings.
18
19 Revision 1.1 2006/02/05 14:22:24 niklas
20 First version.
21
22 */
23
24
25 #include "types.h"
26 #include "routines.h"
27
28
29 void Count25 (uint *x)
30 {
31 count_t u = 25;
32
33 for (; u > 0; u -= 2)
34 {
35 *x = *x + u;
36 }
37 }
38
39
40 void Count (count_t u, uint *x)
41 {
42 for (; u > 0; u -= 2)
43 {
44 *x = *x + u;
45 }
46 }
47
48
49 void Foo (count_t num, uint *x)
50 {
51 Count (num + 3, x);
52 /* The loop in Count depends on Count.u = num + 3. */
53 }
54
55
56 void Foo7 (uint *x)
57 {
58 *x = *x + 10;
59
60 Count (7, x);
61 /* The loop in Count depends on Count.u = 7. */
62
63 *x = *x - 8;
64 }
65
66
67 void Solve (uint *x)
68 {
69 uchar i;
70 count_t k;
71
72 for (i = 0; i < 8; i++)
73 /* The bounds on this loop are static. */
74 {
75 k = Ones (*x);
76 /* k is now the number of '1' bits in *x. */
77 /* This would be quite hard to analyse statically. */
78
79 if (k == 0) break;
80 /* This can make the for-loop stop before its full */
81 /* number of iterations. Bound-T uses the full number */
82 /* for the Worst Case Time. */
83
84 Count (k, x);
85 /* The loop in Count depends on Count.u = k, which is */
86 /* hard to analyse statically. An assertion is needed. */
87 }
88 }
89
90
91 count_t Ones (uint x)
92 {
93 count_t v = 0;
94
95 while (x)
96 /* This is not a 'counter' loop, so Bound-T cannot find */
97 /* its bounds automatically. An assertion is needed. */
98 {
99 if (x & 1) v ++;
100 x >>= 1;
101 }
102
103 return v;
104 }