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