Add JetStream to PerformanceTests
[WebKit-https.git] / PerformanceTests / JetStream / simple / towers.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #define  nil            0
5 #define  false          0
6 #define  true           1
7 #define  bubblebase     1.61f
8 #define  dnfbase        3.5f
9 #define  permbase       1.75f
10 #define  queensbase 1.83f
11 #define  towersbase 2.39f
12 #define  quickbase      1.92f
13 #define  intmmbase      1.46f
14 #define  treebase       2.5f
15 #define  mmbase         0.0f
16 #define  fpmmbase       2.92f
17 #define  puzzlebase     0.5f
18 #define  fftbase        0.0f
19 #define  fpfftbase      4.44f
20     /* Towers */
21 #define maxcells         18
22
23     /* Intmm, Mm */
24 #define rowsize          40
25
26     /* Puzzle */
27 #define size             511
28 #define classmax         3
29 #define typemax          12
30 #define d                    8
31
32     /* Bubble, Quick */
33 #define sortelements 5000
34 #define srtelements  500
35
36     /* fft */
37 #define fftsize          256 
38 #define fftsize2         129  
39 /*
40 type */
41     /* Perm */
42 #define permrange     10
43
44    /* tree */
45 struct node {
46         struct node *left,*right;
47         int val;
48 };
49
50     /* Towers */ /*
51     discsizrange = 1..maxcells; */
52 #define    stackrange   3
53 /*    cellcursor = 0..maxcells; */
54 struct    element {
55         int discsize;
56         int next;
57 };
58 /*    emsgtype = packed array[1..15] of char;
59 */
60     /* Intmm, Mm */ /*
61     index = 1 .. rowsize;
62     intmatrix = array [index,index] of integer;
63     realmatrix = array [index,index] of real;
64 */
65     /* Puzzle */ /*
66     piececlass = 0..classmax;
67     piecetype = 0..typemax;
68     position = 0..size;
69 */
70     /* Bubble, Quick */ /*
71     listsize = 0..sortelements;
72     sortarray = array [listsize] of integer;
73 */
74     /* FFT */
75 struct    complex { float rp, ip; } ;
76 /*
77     carray = array [1..fftsize] of complex ;
78     c2array = array [1..fftsize2] of complex ;
79 */
80
81 float value, fixed, floated;
82
83     /* global */
84 long    seed;  /* converted to long for 16 bit WR*/
85
86     /* Perm */
87 int    permarray[permrange+1];
88 /* converted pctr to unsigned int for 16 bit WR*/
89 unsigned int    pctr;
90
91     /* tree */
92 struct node *tree;
93
94     /* Towers */
95 int        stack[stackrange+1];
96 struct element    cellspace[maxcells+1];
97 int    freelist,  movesdone;
98
99     /* Intmm, Mm */
100
101 int   ima[rowsize+1][rowsize+1], imb[rowsize+1][rowsize+1], imr[rowsize+1][rowsize+1];
102 float rma[rowsize+1][rowsize+1], rmb[rowsize+1][rowsize+1], rmr[rowsize+1][rowsize+1];
103
104     /* Puzzle */
105 int     piececount[classmax+1], class[typemax+1], piecemax[typemax+1];
106 int     puzzl[size+1], p[typemax+1][size+1], n, kount;
107
108     /* Bubble, Quick */
109 int sortlist[sortelements+1], biggest, littlest, top;
110
111     /* FFT */
112 struct complex    z[fftsize+1], w[fftsize+1], e[fftsize2+1];
113 float    zr, zi;
114
115 void Initrand () {
116     seed = 74755L;   /* constant to long WR*/
117 }
118
119 int Rand () {
120     seed = (seed * 1309L + 13849L) & 65535L;  /* constants to long WR*/
121     return( (int)seed );     /* typecast back to int WR*/
122 }
123
124  
125     /*  Program to Solve the Towers of Hanoi */
126
127 void Error (char *emsg)         {
128         printf(" Error in Towers: %s\n",emsg);
129 }
130
131 void Makenull (int s) {
132         stack[s]=0;
133 }
134
135 int Getelement () {
136         int temp = 0;  /* force init of temp WR*/
137         if ( freelist>0 ) {
138             temp = freelist;
139             freelist = cellspace[freelist].next;
140         }
141         else 
142             Error("out of space   ");
143         return (temp);
144 }
145
146 void Push(int i, int s) {
147         int errorfound, localel;
148         errorfound=false;
149         if ( stack[s] > 0 )
150                 if ( cellspace[stack[s]].discsize<=i ) {
151                         errorfound=true;
152                         Error("disc size error");
153                 }
154         if ( ! errorfound )     {
155                 localel=Getelement();
156                 cellspace[localel].next=stack[s];
157                 stack[s]=localel;
158                 cellspace[localel].discsize=i;
159         }
160 }
161
162 void Init (int s, int n) {
163         int discctr;
164         Makenull(s);
165         for ( discctr = n; discctr >= 1; discctr-- )
166             Push(discctr,s);
167 }
168
169 int Pop (int s) {
170         int temp, temp1;
171         if ( stack[s] > 0 ) {
172                 temp1 = cellspace[stack[s]].discsize;
173                 temp = cellspace[stack[s]].next;
174                 cellspace[stack[s]].next=freelist;
175                 freelist=stack[s];
176                 stack[s]=temp;
177                 return (temp1);
178         }
179         else
180                 Error("nothing to pop ");
181         return 0;
182 }
183
184 void Move (int s1, int s2) {
185         Push(Pop(s1),s2);
186         movesdone=movesdone+1;
187 }
188
189 void tower(int i, int j, int k) {
190         int other;
191         if ( k==1 ) Move(i,j);
192         else {
193             other=6-i-j;
194             tower(i,other,k-1);
195             Move(i,j);
196             tower(other,j,k-1);
197         }
198 }
199
200 void Towers ()    { /* Towers */
201     int i;
202     for ( i=1; i <= maxcells; i++ ) cellspace[i].next=i-1;
203     freelist=maxcells;
204     Init(1,14);
205     Makenull(2);
206     Makenull(3);
207     movesdone=0;
208     tower(1,2,14);
209     if ( movesdone != 16383 ) printf (" Error in Towers.\n");
210          printf("%d\n", movesdone);
211 } /* Towers */
212
213 int main()
214 {
215         int i;
216         for (i = 0; i < 100; i++) Towers();
217         return 0;
218 }