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