blob: bbdb1a20f37fe1eb684dce88dc98e526577f82c4 [file] [log] [blame]
Ben Murdochc5610432016-08-08 18:44:38 +01001// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --expose-wasm
6
7(function TestSwitch0() {
8 function asmModule() {
9 "use asm"
10
11 function caller() {
12 var ret = 0;
13 var x = 7;
14 switch (x) {
15 case 1: {
16 return 0;
17 }
18 case 7: {
19 ret = 5;
20 break;
21 }
22 default: return 0;
23 }
24 return ret|0;
25 }
26
27 return {caller:caller};
28 }
29 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
30 assertEquals(5, wasm.caller());
31})();
32
33(function TestSwitch() {
34 function asmModule() {
35 "use asm"
36
37 function caller() {
38 var ret = 0;
39 var x = 7;
40 switch (x) {
41 case 1: return 0;
42 case 7: {
43 ret = 12;
44 break;
45 }
46 default: return 0;
47 }
48 switch (x) {
49 case 1: return 0;
50 case 8: return 0;
51 default: ret = (ret + 11)|0;
52 }
53 return ret|0;
54 }
55
56 return {caller:caller};
57 }
58 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
59 assertEquals(23, wasm.caller());
60})();
61
62(function TestSwitchFallthrough() {
63 function asmModule() {
64 "use asm"
65
66 function caller() {
67 var x = 17;
68 var ret = 0;
69 switch (x) {
70 case 17:
71 case 14: ret = 39;
72 case 1: ret = (ret + 3)|0;
73 case 4: break;
74 default: ret = (ret + 1)|0;
75 }
76 return ret|0;
77 }
78
79 return {caller:caller};
80 }
81 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
82 assertEquals(42, wasm.caller());
83})();
84
85(function TestNestedSwitch() {
86 function asmModule() {
87 "use asm"
88
89 function caller() {
90 var x = 3;
91 var y = -13;
92 switch (x) {
93 case 1: return 0;
94 case 3: {
95 switch (y) {
96 case 2: return 0;
97 case -13: return 43;
98 default: return 0;
99 }
100 }
101 default: return 0;
102 }
103 return 0;
104 }
105
106 return {caller:caller};
107 }
108 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
109 assertEquals(43, wasm.caller());
110})();
111
112(function TestSwitchWithDefaultOnly() {
113 function asmModule() {
114 "use asm";
115 function main(x) {
116 x = x|0;
117 switch(x|0) {
118 default: return -10;
119 }
120 return 0;
121 }
122 return {
123 main: main,
124 };
125 }
126 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
127 assertEquals(-10, wasm.main(2));
128 assertEquals(-10, wasm.main(54));
129})();
130
131(function TestEmptySwitch() {
132 function asmModule() {
133 "use asm";
134 function main(x) {
135 x = x|0;
136 switch(x|0) {
137 }
138 return 73;
139 }
140 return {
141 main: main,
142 };
143 }
144 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
145 assertEquals(73, wasm.main(7));
146})();
147
148(function TestSwitchWithBrTable() {
149 function asmModule() {
150 "use asm";
151 function main(x) {
152 x = x|0;
153 switch(x|0) {
154 case 14: return 23;
155 case 12: return 25;
156 case 15: return 29;
157 case 19: return 34;
158 case 18: return 17;
159 case 16: return 16;
160 default: return -1;
161 }
162 return 0;
163 }
164 return {
165 main: main,
166 };
167 }
168 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
169 assertEquals(25, wasm.main(12));
170 assertEquals(23, wasm.main(14));
171 assertEquals(29, wasm.main(15));
172 assertEquals(16, wasm.main(16));
173 assertEquals(17, wasm.main(18));
174 assertEquals(34, wasm.main(19));
175 assertEquals(-1, wasm.main(-1));
176})();
177
178(function TestSwitchWithBalancedTree() {
179 function asmModule() {
180 "use asm";
181 function main(x) {
182 x = x|0;
183 switch(x|0) {
184 case 5: return 52;
185 case 1: return 11;
186 case 6: return 63;
187 case 9: return 19;
188 case -4: return -4;
189 }
190 return 0;
191 }
192 return {
193 main: main,
194 };
195 }
196 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
197 assertEquals(-4, wasm.main(-4));
198 assertEquals(11, wasm.main(1));
199 assertEquals(52, wasm.main(5));
200 assertEquals(63, wasm.main(6));
201 assertEquals(19, wasm.main(9));
202 assertEquals(0, wasm.main(11));
203})();
204
205(function TestSwitchHybrid() {
206 function asmModule() {
207 "use asm";
208 function main(x) {
209 x = x|0;
210 switch(x|0) {
211 case 1: return -4;
212 case 2: return 23;
213 case 3: return 32;
214 case 4: return 14;
215 case 7: return 17;
216 case 10: return 10;
217 case 11: return 121;
218 case 12: return 112;
219 case 13: return 31;
220 case 16: return 16;
221 default: return -1;
222 }
223 return 0;
224 }
225 return {
226 main: main,
227 };
228 }
229 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
230 assertEquals(-4, wasm.main(1));
231 assertEquals(23, wasm.main(2));
232 assertEquals(32, wasm.main(3));
233 assertEquals(14, wasm.main(4));
234 assertEquals(17, wasm.main(7));
235 assertEquals(10, wasm.main(10));
236 assertEquals(121, wasm.main(11));
237 assertEquals(112, wasm.main(12));
238 assertEquals(31, wasm.main(13));
239 assertEquals(16, wasm.main(16));
240 assertEquals(-1, wasm.main(20));
241})();
242
243(function TestSwitchFallthroughWithBrTable() {
244 function asmModule() {
245 "use asm";
246 function main(x) {
247 x = x|0;
248 var ret = 0;
249 switch(x|0) {
250 case 1: {
251 ret = 21;
252 break;
253 }
254 case 2: {
255 ret = 12;
256 break;
257 }
258 case 3: {
259 ret = 43;
260 }
261 case 4: {
262 ret = 54;
263 break;
264 }
265 default: {
266 ret = 10;
267 break;
268 }
269 }
270 return ret|0;
271 }
272 return {
273 main: main,
274 };
275 }
276 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
277 assertEquals(12, wasm.main(2));
278 assertEquals(10, wasm.main(10));
279 assertEquals(54, wasm.main(3));
280})();
281
282(function TestSwitchFallthroughHybrid() {
283 function asmModule() {
284 "use asm";
285 function main(x) {
286 x = x|0;
287 var ret = 0;
288 switch(x|0) {
289 case 1: {
290 ret = 1;
291 break;
292 }
293 case 2: {
294 ret = 2;
295 break;
296 }
297 case 3: {
298 ret = 3;
299 break;
300 }
301 case 4: {
302 ret = 4;
303 }
304 case 7: {
305 ret = 7;
306 break;
307 }
308 case 10: {
309 ret = 10;
310 }
311 case 16: {
312 ret = 16;
313 break;
314 }
315 case 17: {
316 ret = 17;
317 break;
318 }
319 case 18: {
320 ret = 18;
321 break;
322 }
323 case 19: {
324 ret = 19;
325 }
326 default: {
327 ret = -1;
328 break;
329 }
330 }
331 return ret|0;
332 }
333 return {
334 main: main,
335 };
336 }
337 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
338 assertEquals(7, wasm.main(4));
339 assertEquals(16, wasm.main(10));
340 assertEquals(-1, wasm.main(19));
341 assertEquals(-1, wasm.main(23));
342})();
343
344(function TestSwitchHybridWithNoDefault() {
345 function asmModule() {
346 "use asm";
347 function main(x) {
348 x = x|0;
349 var ret = 19;
350 switch(x|0) {
351 case 1: {
352 ret = 1;
353 break;
354 }
355 case 2: {
356 ret = 2;
357 break;
358 }
359 case 3: {
360 ret = 3;
361 break;
362 }
363 case 4: {
364 ret = 4;
365 break;
366 }
367 case 7: {
368 ret = 7;
369 break;
370 }
371 }
372 return ret|0;
373 }
374 return {
375 main: main,
376 };
377 }
378 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString());
379 assertEquals(2, wasm.main(2));
380 assertEquals(7, wasm.main(7));
381 assertEquals(19, wasm.main(-1));
382})();
383
384(function TestLargeSwitch() {
385 function LargeSwitchGenerator(begin, end, gap, handle_case) {
386 var str = "function asmModule() {\
387 \"use asm\";\
388 function main(x) {\
389 x = x|0;\
390 switch(x|0) {";
391 for (var i = begin; i <= end; i = i + gap) {
392 str = str.concat("case ", i.toString(), ": ", handle_case(i));
393 }
394 str = str.concat("default: return -1;\
395 }\
396 return -2;\
397 }\
398 return {main: main}; }");
399
400 var wasm = Wasm.instantiateModuleFromAsm(str);
401 return wasm;
402 }
403
404 var handle_case = function(k) {
405 return "return ".concat(k, ";");
406 }
407 var wasm = LargeSwitchGenerator(0, 513, 1, handle_case);
408 for (var i = 0; i <= 513; i++) {
409 assertEquals(i, wasm.main(i));
410 }
411 assertEquals(-1, wasm.main(-1));
412
413 wasm = LargeSwitchGenerator(0, 1024, 3, handle_case);
414 for (var i = 0; i <= 1024; i = i + 3) {
415 assertEquals(i, wasm.main(i));
416 }
417 assertEquals(-1, wasm.main(-1));
418
419 wasm = LargeSwitchGenerator(-2147483648, -2147483000, 1, handle_case);
420 for (var i = -2147483648; i <= -2147483000; i++) {
421 assertEquals(i, wasm.main(i));
422 }
423 assertEquals(-1, wasm.main(-1));
424 assertEquals(-1, wasm.main(214748647));
425
426 wasm = LargeSwitchGenerator(-2147483648, -2147483000, 3, handle_case);
427 for (var i = -2147483648; i <= -2147483000; i = i + 3) {
428 assertEquals(i, wasm.main(i));
429 }
430 assertEquals(-1, wasm.main(-1));
431 assertEquals(-1, wasm.main(214748647));
432
433 wasm = LargeSwitchGenerator(2147483000, 2147483647, 1, handle_case);
434 for (var i = 2147483000; i <= 2147483647; i++) {
435 assertEquals(i, wasm.main(i));
436 }
437 assertEquals(-1, wasm.main(-1));
438 assertEquals(-1, wasm.main(-214748647));
439
440 wasm = LargeSwitchGenerator(2147483000, 2147483647, 4, handle_case);
441 for (var i = 2147483000; i <= 2147483647; i = i + 4) {
442 assertEquals(i, wasm.main(i));
443 }
444 assertEquals(-1, wasm.main(-1));
445 assertEquals(-1, wasm.main(-214748647));
446
447 handle_case = function(k) {
448 if (k != 7) return "return ".concat(k, ";");
449 else return "break;";
450 }
451 wasm = LargeSwitchGenerator(0, 1499, 7, handle_case);
452 for (var i = 0; i <= 1499; i = i + 7) {
453 if (i == 7) assertEquals(-2, wasm.main(i));
454 else assertEquals(i, wasm.main(i));
455 }
456 assertEquals(-1, wasm.main(-1));
457
458 handle_case = function(k) {
459 if (k != 56) return "break;";
460 else return "return 23;";
461 }
462 wasm = LargeSwitchGenerator(0, 638, 2, handle_case);
463 for (var i = 0; i <= 638; i = i + 2) {
464 if (i == 56) assertEquals(23, wasm.main(i));
465 else assertEquals(-2, wasm.main(i));
466 }
467 assertEquals(-1, wasm.main(-1));
468})();