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