source: tests/array-container/array-md-sbscr-cases.cfa@ a67c5b6

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since a67c5b6 was d653faf, checked in by Michael Brooks <mlbrooks@…>, 4 years ago

Disabling the part of the new-array subscripting test that isn't working on 32-bit

  • Property mode set to 100644
File size: 8.8 KB
Line 
1#include <containers/array.hfa>
2
3#include <assert.h>
4
5float getMagicNumber( ptrdiff_t w, ptrdiff_t x, ptrdiff_t y, ptrdiff_t z ) {
6
7 assert( 0 <= w && w < 3 );
8 assert( 0 <= x && x < 4 );
9 assert( 0 <= y && y < 5 );
10 assert( 0 <= z && z < 6 );
11
12 float ww = (2.0f \ w) / 1.0f;
13 float xx = (2.0f \ x) / 100.0f;
14 float yy = (2.0f \ y) / 10000.0f;
15 float Nz = (2.0f \ z) / 1000000.0f;
16
17 return ww+xx+yy+Nz;
18}
19
20forall( [Nw], [Nx], [Ny], [Nz] )
21void fillHelloData( array( float, Nw, Nx, Ny, Nz ) & wxyz ) {
22 for (w; z(Nw))
23 for (x; z(Nx))
24 for (y; z(Ny))
25 for (z; z(Nz))
26 wxyz[w][x][y][z] = getMagicNumber(w, x, y, z);
27}
28
29// Tests all the ways to split dimensions into CFA-supported chunks, by the only order that C supports: coarsest to finest stride.
30forall( [Nw], [Nx], [Ny], [Nz] )
31void test_inOrderSplits( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) {
32
33 array( float, Nw, Nx, Ny, Nz ) wxyz;
34 fillHelloData(wxyz);
35
36 ptrdiff_t iw = 2, ix = 3, iy=4, iz=5;
37
38 const float valExpected = getMagicNumber(iw, ix, iy, iz);
39 assert( wxyz[iw][ix][iy][iz] == valExpected );
40
41 // order wxyz, natural split (4-0 or 0-4, no intermediate to declare)
42
43 assert(( wxyz[[iw, ix, iy, iz]] == valExpected ));
44
45 // order wxyz, unnatural split 1-3 (three ways declared)
46
47 typeof( wxyz[iw] ) xyz1 = wxyz[iw];
48 assert(( xyz1[[ix, iy, iz]] == valExpected ));
49
50 typeof( wxyz[iw] ) xyz2;
51 &xyz2 = &wxyz[iw];
52 assert(( xyz2[[ix, iy, iz]] == valExpected ));
53
54 assert(( wxyz[iw][[ix, iy, iz]] == valExpected ));
55
56 // order wxyz, unnatural split 2-2 (three ways declared)
57
58 typeof( wxyz[[iw, ix]] ) yz1 = wxyz[[iw,ix]];
59 assert(( yz1[[iy, iz]] == valExpected ));
60
61 typeof( wxyz[[iw, ix]] ) yz2;
62 &yz2 = &wxyz[[iw, ix]];
63 assert(( yz2[[iy, iz]] == valExpected ));
64
65 assert(( wxyz[[iw, ix]][[iy, iz]] == valExpected ));
66
67 // order wxyz, unnatural split 3-1 (three ways declared)
68
69 typeof( wxyz[[iw, ix, iy]] ) z1 = wxyz[[iw, ix, iy]];
70 assert(( z1[iz] == valExpected ));
71
72 typeof( wxyz[[iw, ix, iy]] ) z2;
73 &z2 = &wxyz[[iw, ix, iy]];
74 assert(( z2[iz] == valExpected ));
75
76 assert(( wxyz[[iw, ix, iy]][iz] == valExpected ));
77}
78
79// All orders that skip a single dimension, each in its most natural split.
80forall( [Nw], [Nx], [Ny], [Nz] )
81void test_skipSingle( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) {
82
83 array( float, Nw, Nx, Ny, Nz ) wxyz;
84 fillHelloData(wxyz);
85
86 ptrdiff_t iw = 2, ix = 3, iy=4, iz=5;
87
88 const float valExpected = getMagicNumber(iw, ix, iy, iz);
89 assert( wxyz[iw][ix][iy][iz] == valExpected );
90
91
92 // order wxyz (no intermediates to declare)
93
94 assert(( wxyz[[iw , ix , iy , iz ]] == valExpected ));
95 assert(( wxyz[[iw-1, ix , iy , iz ]] != valExpected ));
96
97 // order xyzw: *xyz, w
98
99 assert(( wxyz[[all , ix , iy , iz ]][iw ] == valExpected ));
100 assert(( wxyz[[all , ix-1, iy , iz ]][iw ] != valExpected ));
101 assert(( wxyz[[all , ix , iy , iz ]][iw-1] != valExpected ));
102
103 // order wyzx: w*yz, x
104
105 assert(( wxyz[[iw , all , iy , iz ]][ix ] == valExpected ));
106 assert(( wxyz[[iw , all , iy-1, iz ]][ix ] != valExpected ));
107 assert(( wxyz[[iw , all , iy , iz ]][ix-1] != valExpected ));
108
109 // order wxzy: wx*z, y
110 #if 0
111 // not working on 32-bit
112 assert(( wxyz[[iw , ix , all , iz ]][iy ] == valExpected ));
113 assert(( wxyz[[iw , ix , all , iz-1]][iy ] != valExpected ));
114 assert(( wxyz[[iw , ix , all , iz ]][iy-1] != valExpected ));
115 #endif
116}
117
118
119// The comments specify a covering set of orders, each in its most natural split.
120// Covering means that each edge on the lattice of dimesnions-provided is used.
121// Natural split means the arity of every -[[-,...]] tuple equals the dimensionality of its "this" operand, then that the fewest "all" subscripts are given.
122// The commented-out test code shows cases that don't work. We wish all the comment-coverd cases worked.
123forall( [Nw], [Nx], [Ny], [Nz] )
124void test_latticeCoverage( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) {
125
126 array( float, Nw, Nx, Ny, Nz ) wxyz;
127 fillHelloData(wxyz);
128
129 ptrdiff_t iw = 2, ix = 3, iy=4, iz=5;
130
131 const float valExpected = getMagicNumber(iw, ix, iy, iz);
132 assert( wxyz[iw][ix][iy][iz] == valExpected );
133
134
135 // order wxyz (no intermediates to declare)
136
137 assert(( wxyz[[iw, ix, iy, iz]] == valExpected ));
138
139 {
140 // order wyxz: w*y*, xz
141 assert( wxyz[iw][all][iy][all] [ix][iz] == valExpected );
142
143 typeof( wxyz[[iw, all, iy, all]] ) xz1 = wxyz[[iw, all, iy, all]];
144 assert(( xz1[[ix, iz]] == valExpected ));
145
146 typeof( wxyz[[iw, all, iy, all]] ) xz2;
147 &xz2 = &wxyz[[iw, all, iy, all]];
148 assert(( xz2[[ix, iz]] == valExpected ));
149
150 assert(( wxyz[[iw , all, iy , all]][[ix , iz ]] == valExpected ));
151 assert(( wxyz[[iw-1, all, iy , all]][[ix , iz ]] != valExpected ));
152 assert(( wxyz[[iw , all, iy-1, all]][[ix , iz ]] != valExpected ));
153 assert(( wxyz[[iw , all, iy , all]][[ix-1, iz ]] != valExpected ));
154 assert(( wxyz[[iw , all, iy , all]][[ix , iz-1]] != valExpected ));
155 }
156 {
157 // order wzxy: w**z, xy
158 assert( wxyz[iw][all][all][iz] [ix][iy] == valExpected );
159
160 // typeof( wxyz[[iw, all, all, iz]] ) xy1 = wxyz[[iw, all, all, iz]];
161 // assert(( xy1[[ix, iy]] == valExpected ));
162
163 // typeof( wxyz[[iw, all, all, iz]] ) xy2;
164 // &xy2 = &wxyz[[iw, all, all, iz]];
165 // assert(( xy2[[ix, iy]] == valExpected ));
166
167 // assert(( wxyz[[iw , all, all, iz ]][[ix , iy ]] == valExpected ));
168 // assert(( wxyz[[iw-1, all, all, iz ]][[ix , iy ]] != valExpected ));
169 // assert(( wxyz[[iw , all, all, iz-1]][[ix , iy ]] != valExpected ));
170 // assert(( wxyz[[iw , all, all, iz ]][[ix-1, iy ]] != valExpected ));
171 // assert(( wxyz[[iw , all, all, iz ]][[ix , iy-1]] != valExpected ));
172 }
173 {
174 // order xywz: *xy*, wz
175 assert( wxyz[all][ix][iy][all] [iw][iz] == valExpected );
176
177 typeof( wxyz[[all, ix, iy, all]] ) wz1 = wxyz[[all, ix, iy, all]];
178 assert(( wz1[[iw, iz]] == valExpected ));
179
180 assert(( wxyz[[all , ix, iy , all]][[iw , iz ]] == valExpected ));
181 }
182 {
183 // order xzwy: *x*z, wy
184 assert( wxyz[all][ix][all][iz] [iw][iy] == valExpected );
185
186 // assert(( wxyz[[all , ix , all , iz ]][[iw , iy ]] == valExpected ));
187 }
188 {
189 // order yzwx: **yz, wx
190 assert( wxyz[all][all][iy][iz] [iw][ix] == valExpected );
191
192 // assert(( wxyz[[all , all , iy , iz ]][[iw , ix ]] == valExpected ));
193 }
194 {
195 // order xwzy: *x**, w*z, y
196 assert( wxyz[all][ix][all][all] [iw][all][iz] [iy] == valExpected );
197
198 typeof( wxyz[all][ix][all][all] ) wyz_workaround = wxyz[[all , ix , all , all ]];
199 typeof( wyz_workaround[iw][all][iz] ) y_workaround = wyz_workaround[[iw , all , iz ]];
200 assert( y_workaround[iy] == valExpected );
201
202 // assert(( wxyz[[all , ix , all , all ]][[iw , all , iz ]][iy ] == valExpected ));
203 }
204 {
205 // order ywzx: **y*, w*z, x
206 }
207 {
208 // order zwyx: ***z, w*y, x
209 }
210 {
211 // order yxzw: **y*, *xz, w
212 }
213 {
214 // order zxyw: ***z, *xy, w
215 }
216 {
217 // order zyxw: ***z, **y, *x, w
218 }
219}
220
221forall( [Nw], [Nx], [Ny], [Nz] )
222void test_numSubscrTypeCompatibility( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) {
223
224 array( float, Nw, Nx, Ny, Nz ) wxyz;
225 fillHelloData(wxyz);
226
227 const float valExpected = getMagicNumber(2, 3, 4, 5);
228 assert(( wxyz [2] [3] [4] [5] == valExpected ));
229 assert(( wxyz[[2, 3]][4] [5] == valExpected ));
230 assert(( wxyz [2][[3, 4]][5] == valExpected ));
231 assert(( wxyz [2] [3][[4, 5]] == valExpected ));
232 assert(( wxyz[[2, 3, 4]][5] == valExpected ));
233 assert(( wxyz [2][[3, 4, 5]] == valExpected ));
234 assert(( wxyz[[2, 3, 4, 5]] == valExpected ));
235
236 for ( i; z(Nw) ) {
237 assert(( wxyz[[ i, 3, 4, 5 ]] == getMagicNumber(i, 3, 4, 5) ));
238 }
239
240 for ( i; z(Nx) ) {
241 assert(( wxyz[[ 2, i, 4, 5 ]] == getMagicNumber(2, i, 4, 5) ));
242 }
243
244 for ( i; z(Ny) ) {
245 assert(( wxyz[[ 2, 3, i, 5 ]] == getMagicNumber(2, 3, i, 5) ));
246 }
247
248 for ( i; z(Nz) ) {
249 assert(( wxyz[[ 2, 3, 4, i ]] == getMagicNumber(2, 3, 4, i) ));
250 }
251
252 for ( i; z(Nw) ) {
253 assert(( wxyz[[ i, all, 4, 5 ]][3] == getMagicNumber(i, 3, 4, 5) ));
254 }
255
256 for ( i; z(Nw) ) {
257 assert(( wxyz[[ all, 3, 4, 5 ]][i] == getMagicNumber(i, 3, 4, 5) ));
258 }
259}
260
261const size_t KW = 3, KX = 4, KY = 5, KZ = 6;
262
263int main() {
264
265 test_inOrderSplits ( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) );
266 test_skipSingle ( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) );
267 test_latticeCoverage( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) );
268 test_numSubscrTypeCompatibility( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) );
269 printf("done\n");
270}
Note: See TracBrowser for help on using the repository browser.