OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --expose-wasm | 5 // Flags: --validate-asm --allow-natives-syntax |
| 6 |
| 7 function assertValidAsm(func) { |
| 8 assertTrue(%IsAsmWasmCode(func)); |
| 9 } |
6 | 10 |
7 (function TestSwitch0() { | 11 (function TestSwitch0() { |
8 function asmModule() { | 12 function asmModule() { |
9 "use asm" | 13 "use asm" |
10 | 14 |
11 function caller() { | 15 function caller() { |
12 var ret = 0; | 16 var ret = 0; |
13 var x = 7; | 17 var x = 7; |
14 switch (x|0) { | 18 switch (x|0) { |
15 case 1: { | 19 case 1: { |
16 return 0; | 20 return 0; |
17 } | 21 } |
18 case 7: { | 22 case 7: { |
19 ret = 5; | 23 ret = 5; |
20 break; | 24 break; |
21 } | 25 } |
22 default: return 0; | 26 default: return 0; |
23 } | 27 } |
24 return ret|0; | 28 return ret|0; |
25 } | 29 } |
26 | 30 |
27 return {caller:caller}; | 31 return {caller:caller}; |
28 } | 32 } |
29 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 33 var wasm = asmModule(); |
| 34 assertValidAsm(asmModule); |
30 assertEquals(5, wasm.caller()); | 35 assertEquals(5, wasm.caller()); |
31 })(); | 36 })(); |
32 | 37 |
33 (function TestSwitch() { | 38 (function TestSwitch() { |
34 function asmModule() { | 39 function asmModule() { |
35 "use asm" | 40 "use asm" |
36 | 41 |
37 function caller() { | 42 function caller() { |
38 var ret = 0; | 43 var ret = 0; |
39 var x = 7; | 44 var x = 7; |
40 switch (x|0) { | 45 switch (x|0) { |
41 case 1: return 0; | 46 case 1: return 0; |
42 case 7: { | 47 case 7: { |
43 ret = 12; | 48 ret = 12; |
44 break; | 49 break; |
45 } | 50 } |
46 default: return 0; | 51 default: return 0; |
47 } | 52 } |
48 switch (x|0) { | 53 switch (x|0) { |
49 case 1: return 0; | 54 case 1: return 0; |
50 case 8: return 0; | 55 case 8: return 0; |
51 default: ret = (ret + 11)|0; | 56 default: ret = (ret + 11)|0; |
52 } | 57 } |
53 return ret|0; | 58 return ret|0; |
54 } | 59 } |
55 | 60 |
56 return {caller:caller}; | 61 return {caller:caller}; |
57 } | 62 } |
58 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 63 var wasm = asmModule(); |
| 64 assertValidAsm(asmModule); |
59 assertEquals(23, wasm.caller()); | 65 assertEquals(23, wasm.caller()); |
60 })(); | 66 })(); |
61 | 67 |
62 (function TestSwitchFallthrough() { | 68 (function TestSwitchFallthrough() { |
63 function asmModule() { | 69 function asmModule() { |
64 "use asm" | 70 "use asm" |
65 | 71 |
66 function caller() { | 72 function caller() { |
67 var x = 17; | 73 var x = 17; |
68 var ret = 0; | 74 var ret = 0; |
69 switch (x|0) { | 75 switch (x|0) { |
70 case 17: | 76 case 17: |
71 case 14: ret = 39; | 77 case 14: ret = 39; |
72 case 1: ret = (ret + 3)|0; | 78 case 1: ret = (ret + 3)|0; |
73 case 4: break; | 79 case 4: break; |
74 default: ret = (ret + 1)|0; | 80 default: ret = (ret + 1)|0; |
75 } | 81 } |
76 return ret|0; | 82 return ret|0; |
77 } | 83 } |
78 | 84 |
79 return {caller:caller}; | 85 return {caller:caller}; |
80 } | 86 } |
81 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 87 var wasm = asmModule(); |
| 88 assertValidAsm(asmModule); |
82 assertEquals(42, wasm.caller()); | 89 assertEquals(42, wasm.caller()); |
83 })(); | 90 })(); |
84 | 91 |
85 (function TestNestedSwitch() { | 92 (function TestNestedSwitch() { |
86 function asmModule() { | 93 function asmModule() { |
87 "use asm" | 94 "use asm" |
88 | 95 |
89 function caller() { | 96 function caller() { |
90 var x = 3; | 97 var x = 3; |
91 var y = -13; | 98 var y = -13; |
92 switch (x|0) { | 99 switch (x|0) { |
93 case 1: return 0; | 100 case 1: return 0; |
94 case 3: { | 101 case 3: { |
95 switch (y|0) { | 102 switch (y|0) { |
96 case 2: return 0; | 103 case 2: return 0; |
97 case -13: return 43; | 104 case -13: return 43; |
98 default: return 0; | 105 default: return 0; |
99 } | 106 } |
100 } | 107 } |
101 default: return 0; | 108 default: return 0; |
102 } | 109 } |
103 return 0; | 110 return 0; |
104 } | 111 } |
105 | 112 |
106 return {caller:caller}; | 113 return {caller:caller}; |
107 } | 114 } |
108 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 115 var wasm = asmModule(); |
| 116 assertValidAsm(asmModule); |
109 assertEquals(43, wasm.caller()); | 117 assertEquals(43, wasm.caller()); |
110 })(); | 118 })(); |
111 | 119 |
112 (function TestSwitchWithDefaultOnly() { | 120 (function TestSwitchWithDefaultOnly() { |
113 function asmModule() { | 121 function asmModule() { |
114 "use asm"; | 122 "use asm"; |
115 function main(x) { | 123 function main(x) { |
116 x = x|0; | 124 x = x|0; |
117 switch(x|0) { | 125 switch(x|0) { |
118 default: return -10; | 126 default: return -10; |
119 } | 127 } |
120 return 0; | 128 return 0; |
121 } | 129 } |
122 return { | 130 return { |
123 main: main, | 131 main: main, |
124 }; | 132 }; |
125 } | 133 } |
126 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 134 var wasm = asmModule(); |
| 135 assertValidAsm(asmModule); |
127 assertEquals(-10, wasm.main(2)); | 136 assertEquals(-10, wasm.main(2)); |
128 assertEquals(-10, wasm.main(54)); | 137 assertEquals(-10, wasm.main(54)); |
129 })(); | 138 })(); |
130 | 139 |
131 (function TestEmptySwitch() { | 140 (function TestEmptySwitch() { |
132 function asmModule() { | 141 function asmModule() { |
133 "use asm"; | 142 "use asm"; |
134 function main(x) { | 143 function main(x) { |
135 x = x|0; | 144 x = x|0; |
136 switch(x|0) { | 145 switch(x|0) { |
137 } | 146 } |
138 return 73; | 147 return 73; |
139 } | 148 } |
140 return { | 149 return { |
141 main: main, | 150 main: main, |
142 }; | 151 }; |
143 } | 152 } |
144 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 153 var wasm = asmModule(); |
| 154 assertValidAsm(asmModule); |
145 assertEquals(73, wasm.main(7)); | 155 assertEquals(73, wasm.main(7)); |
146 })(); | 156 })(); |
147 | 157 |
148 (function TestSwitchWithBrTable() { | 158 (function TestSwitchWithBrTable() { |
149 function asmModule() { | 159 function asmModule() { |
150 "use asm"; | 160 "use asm"; |
151 function main(x) { | 161 function main(x) { |
152 x = x|0; | 162 x = x|0; |
153 switch(x|0) { | 163 switch(x|0) { |
154 case 14: return 23; | 164 case 14: return 23; |
155 case 12: return 25; | 165 case 12: return 25; |
156 case 15: return 29; | 166 case 15: return 29; |
157 case 19: return 34; | 167 case 19: return 34; |
158 case 18: return 17; | 168 case 18: return 17; |
159 case 16: return 16; | 169 case 16: return 16; |
160 default: return -1; | 170 default: return -1; |
161 } | 171 } |
162 return 0; | 172 return 0; |
163 } | 173 } |
164 return { | 174 return { |
165 main: main, | 175 main: main, |
166 }; | 176 }; |
167 } | 177 } |
168 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 178 var wasm = asmModule(); |
| 179 assertValidAsm(asmModule); |
169 assertEquals(25, wasm.main(12)); | 180 assertEquals(25, wasm.main(12)); |
170 assertEquals(23, wasm.main(14)); | 181 assertEquals(23, wasm.main(14)); |
171 assertEquals(29, wasm.main(15)); | 182 assertEquals(29, wasm.main(15)); |
172 assertEquals(16, wasm.main(16)); | 183 assertEquals(16, wasm.main(16)); |
173 assertEquals(17, wasm.main(18)); | 184 assertEquals(17, wasm.main(18)); |
174 assertEquals(34, wasm.main(19)); | 185 assertEquals(34, wasm.main(19)); |
175 assertEquals(-1, wasm.main(-1)); | 186 assertEquals(-1, wasm.main(-1)); |
176 })(); | 187 })(); |
177 | 188 |
178 (function TestSwitchWithBalancedTree() { | 189 (function TestSwitchWithBalancedTree() { |
179 function asmModule() { | 190 function asmModule() { |
180 "use asm"; | 191 "use asm"; |
181 function main(x) { | 192 function main(x) { |
182 x = x|0; | 193 x = x|0; |
183 switch(x|0) { | 194 switch(x|0) { |
184 case 5: return 52; | 195 case 5: return 52; |
185 case 1: return 11; | 196 case 1: return 11; |
186 case 6: return 63; | 197 case 6: return 63; |
187 case 9: return 19; | 198 case 9: return 19; |
188 case -4: return -4; | 199 case -4: return -4; |
189 } | 200 } |
190 return 0; | 201 return 0; |
191 } | 202 } |
192 return { | 203 return { |
193 main: main, | 204 main: main, |
194 }; | 205 }; |
195 } | 206 } |
196 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 207 var wasm = asmModule(); |
| 208 assertValidAsm(asmModule); |
197 assertEquals(-4, wasm.main(-4)); | 209 assertEquals(-4, wasm.main(-4)); |
198 assertEquals(11, wasm.main(1)); | 210 assertEquals(11, wasm.main(1)); |
199 assertEquals(52, wasm.main(5)); | 211 assertEquals(52, wasm.main(5)); |
200 assertEquals(63, wasm.main(6)); | 212 assertEquals(63, wasm.main(6)); |
201 assertEquals(19, wasm.main(9)); | 213 assertEquals(19, wasm.main(9)); |
202 assertEquals(0, wasm.main(11)); | 214 assertEquals(0, wasm.main(11)); |
203 })(); | 215 })(); |
204 | 216 |
205 (function TestSwitchHybrid() { | 217 (function TestSwitchHybrid() { |
206 function asmModule() { | 218 function asmModule() { |
(...skipping 12 matching lines...) Expand all Loading... |
219 case 13: return 31; | 231 case 13: return 31; |
220 case 16: return 16; | 232 case 16: return 16; |
221 default: return -1; | 233 default: return -1; |
222 } | 234 } |
223 return 0; | 235 return 0; |
224 } | 236 } |
225 return { | 237 return { |
226 main: main, | 238 main: main, |
227 }; | 239 }; |
228 } | 240 } |
229 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 241 var wasm = asmModule(); |
| 242 assertValidAsm(asmModule); |
230 assertEquals(-4, wasm.main(1)); | 243 assertEquals(-4, wasm.main(1)); |
231 assertEquals(23, wasm.main(2)); | 244 assertEquals(23, wasm.main(2)); |
232 assertEquals(32, wasm.main(3)); | 245 assertEquals(32, wasm.main(3)); |
233 assertEquals(14, wasm.main(4)); | 246 assertEquals(14, wasm.main(4)); |
234 assertEquals(17, wasm.main(7)); | 247 assertEquals(17, wasm.main(7)); |
235 assertEquals(10, wasm.main(10)); | 248 assertEquals(10, wasm.main(10)); |
236 assertEquals(121, wasm.main(11)); | 249 assertEquals(121, wasm.main(11)); |
237 assertEquals(112, wasm.main(12)); | 250 assertEquals(112, wasm.main(12)); |
238 assertEquals(31, wasm.main(13)); | 251 assertEquals(31, wasm.main(13)); |
239 assertEquals(16, wasm.main(16)); | 252 assertEquals(16, wasm.main(16)); |
(...skipping 26 matching lines...) Expand all Loading... |
266 ret = 10; | 279 ret = 10; |
267 break; | 280 break; |
268 } | 281 } |
269 } | 282 } |
270 return ret|0; | 283 return ret|0; |
271 } | 284 } |
272 return { | 285 return { |
273 main: main, | 286 main: main, |
274 }; | 287 }; |
275 } | 288 } |
276 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 289 var wasm = asmModule(); |
| 290 assertValidAsm(asmModule); |
277 assertEquals(12, wasm.main(2)); | 291 assertEquals(12, wasm.main(2)); |
278 assertEquals(10, wasm.main(10)); | 292 assertEquals(10, wasm.main(10)); |
279 assertEquals(54, wasm.main(3)); | 293 assertEquals(54, wasm.main(3)); |
280 })(); | 294 })(); |
281 | 295 |
282 (function TestSwitchFallthroughHybrid() { | 296 (function TestSwitchFallthroughHybrid() { |
283 function asmModule() { | 297 function asmModule() { |
284 "use asm"; | 298 "use asm"; |
285 function main(x) { | 299 function main(x) { |
286 x = x|0; | 300 x = x|0; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 ret = -1; | 341 ret = -1; |
328 break; | 342 break; |
329 } | 343 } |
330 } | 344 } |
331 return ret|0; | 345 return ret|0; |
332 } | 346 } |
333 return { | 347 return { |
334 main: main, | 348 main: main, |
335 }; | 349 }; |
336 } | 350 } |
337 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 351 var wasm = asmModule(); |
| 352 assertValidAsm(asmModule); |
338 assertEquals(7, wasm.main(4)); | 353 assertEquals(7, wasm.main(4)); |
339 assertEquals(16, wasm.main(10)); | 354 assertEquals(16, wasm.main(10)); |
340 assertEquals(-1, wasm.main(19)); | 355 assertEquals(-1, wasm.main(19)); |
341 assertEquals(-1, wasm.main(23)); | 356 assertEquals(-1, wasm.main(23)); |
342 })(); | 357 })(); |
343 | 358 |
344 (function TestSwitchHybridWithNoDefault() { | 359 (function TestSwitchHybridWithNoDefault() { |
345 function asmModule() { | 360 function asmModule() { |
346 "use asm"; | 361 "use asm"; |
347 function main(x) { | 362 function main(x) { |
(...skipping 20 matching lines...) Expand all Loading... |
368 ret = 7; | 383 ret = 7; |
369 break; | 384 break; |
370 } | 385 } |
371 } | 386 } |
372 return ret|0; | 387 return ret|0; |
373 } | 388 } |
374 return { | 389 return { |
375 main: main, | 390 main: main, |
376 }; | 391 }; |
377 } | 392 } |
378 var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); | 393 var wasm = asmModule(); |
| 394 assertValidAsm(asmModule); |
379 assertEquals(2, wasm.main(2)); | 395 assertEquals(2, wasm.main(2)); |
380 assertEquals(7, wasm.main(7)); | 396 assertEquals(7, wasm.main(7)); |
381 assertEquals(19, wasm.main(-1)); | 397 assertEquals(19, wasm.main(-1)); |
382 })(); | 398 })(); |
383 | 399 |
384 (function TestLargeSwitch() { | 400 (function TestLargeSwitch() { |
385 function LargeSwitchGenerator(begin, end, gap, handle_case) { | 401 function LargeSwitchGenerator(begin, end, gap, handle_case) { |
386 var str = "function asmModule() {\ | 402 var str = "function asmModule() {\ |
387 \"use asm\";\ | 403 \"use asm\";\ |
388 function main(x) {\ | 404 function main(x) {\ |
389 x = x|0;\ | 405 x = x|0;\ |
390 switch(x|0) {"; | 406 switch(x|0) {"; |
391 for (var i = begin; i <= end; i = i + gap) { | 407 for (var i = begin; i <= end; i = i + gap) { |
392 str = str.concat("case ", i.toString(), ": ", handle_case(i)); | 408 str = str.concat("case ", i.toString(), ": ", handle_case(i)); |
393 } | 409 } |
394 str = str.concat("default: return -1;\ | 410 str = str.concat("default: return -1;\ |
395 }\ | 411 }\ |
396 return -2;\ | 412 return -2;\ |
397 }\ | 413 }\ |
398 return {main: main}; }"); | 414 return {main: main}; }"); |
399 | 415 |
400 var wasm = Wasm.instantiateModuleFromAsm(str); | 416 var decl = eval('(' + str + ')'); |
| 417 var wasm = decl(); |
| 418 assertValidAsm(decl); |
401 return wasm; | 419 return wasm; |
402 } | 420 } |
403 | 421 |
404 var handle_case = function(k) { | 422 var handle_case = function(k) { |
405 return "return ".concat(k, ";"); | 423 return "return ".concat(k, ";"); |
406 } | 424 } |
407 var wasm = LargeSwitchGenerator(0, 513, 1, handle_case); | 425 var wasm = LargeSwitchGenerator(0, 513, 1, handle_case); |
408 for (var i = 0; i <= 513; i++) { | 426 for (var i = 0; i <= 513; i++) { |
409 assertEquals(i, wasm.main(i)); | 427 assertEquals(i, wasm.main(i)); |
410 } | 428 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 if (k != 56) return "break;"; | 477 if (k != 56) return "break;"; |
460 else return "return 23;"; | 478 else return "return 23;"; |
461 } | 479 } |
462 wasm = LargeSwitchGenerator(0, 638, 2, handle_case); | 480 wasm = LargeSwitchGenerator(0, 638, 2, handle_case); |
463 for (var i = 0; i <= 638; i = i + 2) { | 481 for (var i = 0; i <= 638; i = i + 2) { |
464 if (i == 56) assertEquals(23, wasm.main(i)); | 482 if (i == 56) assertEquals(23, wasm.main(i)); |
465 else assertEquals(-2, wasm.main(i)); | 483 else assertEquals(-2, wasm.main(i)); |
466 } | 484 } |
467 assertEquals(-1, wasm.main(-1)); | 485 assertEquals(-1, wasm.main(-1)); |
468 })(); | 486 })(); |
OLD | NEW |