| 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 |