Index: test/mjsunit/wasm/asm-wasm-switch.js |
diff --git a/test/mjsunit/wasm/asm-wasm-switch.js b/test/mjsunit/wasm/asm-wasm-switch.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b0c01b7d884aaa2d84e57539ff123cca1836be1b |
--- /dev/null |
+++ b/test/mjsunit/wasm/asm-wasm-switch.js |
@@ -0,0 +1,442 @@ |
+// Copyright 2016 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Flags: --expose-wasm |
+ |
+(function TestSwitch() { |
+ function asmModule() { |
+ "use asm" |
+ |
+ function caller() { |
+ var ret = 0; |
+ var x = 7; |
+ switch (x) { |
+ case 1: return 0; |
+ case 7: { |
+ ret = 12; |
+ break; |
+ } |
+ default: return 0; |
+ } |
+ switch (x) { |
+ case 1: return 0; |
+ case 8: return 0; |
+ default: ret = (ret + 11)|0; |
+ } |
+ return ret|0; |
+ } |
+ |
+ return {caller:caller}; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(23, wasm.caller()); |
+})(); |
+ |
+(function TestSwitchFallthrough() { |
+ function asmModule() { |
+ "use asm" |
+ |
+ function caller() { |
+ var x = 17; |
+ var ret = 0; |
+ switch (x) { |
+ case 17: |
+ case 14: ret = 39; |
+ case 1: ret = (ret + 3)|0; |
+ case 4: break; |
+ default: ret = (ret + 1)|0; |
+ } |
+ return ret|0; |
+ } |
+ |
+ return {caller:caller}; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(42, wasm.caller()); |
+})(); |
+ |
+(function TestNestedSwitch() { |
+ function asmModule() { |
+ "use asm" |
+ |
+ function caller() { |
+ var x = 3; |
+ var y = -13; |
+ switch (x) { |
+ case 1: return 0; |
+ case 3: { |
+ switch (y) { |
+ case 2: return 0; |
+ case -13: return 43; |
+ default: return 0; |
+ } |
+ } |
+ default: return 0; |
+ } |
+ return 0; |
+ } |
+ |
+ return {caller:caller}; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(43, wasm.caller()); |
+})(); |
+ |
+(function TestSwitchWithDefaultOnly() { |
+ function asmModule() { |
+ "use asm"; |
+ function main(x) { |
+ x = x|0; |
+ switch(x|0) { |
+ default: return -10; |
+ } |
+ return 0; |
+ } |
+ return { |
+ main: main, |
+ }; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(-10, wasm.main(2)); |
+ assertEquals(-10, wasm.main(54)); |
+})(); |
+ |
+(function TestEmptySwitch() { |
+ function asmModule() { |
+ "use asm"; |
+ function main(x) { |
+ x = x|0; |
+ switch(x|0) { |
+ } |
+ return 73; |
+ } |
+ return { |
+ main: main, |
+ }; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(73, wasm.main(7)); |
+})(); |
+ |
+(function TestSwitchWithBrTable() { |
+ function asmModule() { |
+ "use asm"; |
+ function main(x) { |
+ x = x|0; |
+ switch(x|0) { |
+ case 14: return 23; |
+ case 12: return 25; |
+ case 15: return 29; |
+ case 19: return 34; |
+ case 18: return 17; |
+ case 16: return 16; |
+ default: return -1; |
+ } |
+ return 0; |
+ } |
+ return { |
+ main: main, |
+ }; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(25, wasm.main(12)); |
+ assertEquals(23, wasm.main(14)); |
+ assertEquals(29, wasm.main(15)); |
+ assertEquals(16, wasm.main(16)); |
+ assertEquals(17, wasm.main(18)); |
+ assertEquals(34, wasm.main(19)); |
+ assertEquals(-1, wasm.main(-1)); |
+})(); |
+ |
+(function TestSwitchWithBalancedTree() { |
+ function asmModule() { |
+ "use asm"; |
+ function main(x) { |
+ x = x|0; |
+ switch(x|0) { |
+ case 5: return 52; |
+ case 1: return 11; |
+ case 6: return 63; |
+ case 9: return 19; |
+ case -4: return -4; |
+ } |
+ return 0; |
+ } |
+ return { |
+ main: main, |
+ }; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(-4, wasm.main(-4)); |
+ assertEquals(11, wasm.main(1)); |
+ assertEquals(52, wasm.main(5)); |
+ assertEquals(63, wasm.main(6)); |
+ assertEquals(19, wasm.main(9)); |
+ assertEquals(0, wasm.main(11)); |
+})(); |
+ |
+(function TestSwitchHybrid() { |
+ function asmModule() { |
+ "use asm"; |
+ function main(x) { |
+ x = x|0; |
+ switch(x|0) { |
+ case 1: return -4; |
+ case 2: return 23; |
+ case 3: return 32; |
+ case 4: return 14; |
+ case 7: return 17; |
+ case 10: return 10; |
+ case 11: return 121; |
+ case 12: return 112; |
+ case 13: return 31; |
+ case 16: return 16; |
+ default: return -1; |
+ } |
+ return 0; |
+ } |
+ return { |
+ main: main, |
+ }; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(-4, wasm.main(1)); |
+ assertEquals(23, wasm.main(2)); |
+ assertEquals(32, wasm.main(3)); |
+ assertEquals(14, wasm.main(4)); |
+ assertEquals(17, wasm.main(7)); |
+ assertEquals(10, wasm.main(10)); |
+ assertEquals(121, wasm.main(11)); |
+ assertEquals(112, wasm.main(12)); |
+ assertEquals(31, wasm.main(13)); |
+ assertEquals(16, wasm.main(16)); |
+ assertEquals(-1, wasm.main(20)); |
+})(); |
+ |
+(function TestSwitchFallthroughWithBrTable() { |
+ function asmModule() { |
+ "use asm"; |
+ function main(x) { |
+ x = x|0; |
+ var ret = 0; |
+ switch(x|0) { |
+ case 1: { |
+ ret = 21; |
+ break; |
+ } |
+ case 2: { |
+ ret = 12; |
+ break; |
+ } |
+ case 3: { |
+ ret = 43; |
+ } |
+ case 4: { |
+ ret = 54; |
+ break; |
+ } |
+ default: { |
+ ret = 10; |
+ break; |
+ } |
+ } |
+ return ret|0; |
+ } |
+ return { |
+ main: main, |
+ }; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(12, wasm.main(2)); |
+ assertEquals(10, wasm.main(10)); |
+ assertEquals(54, wasm.main(3)); |
+})(); |
+ |
+(function TestSwitchFallthroughHybrid() { |
+ function asmModule() { |
+ "use asm"; |
+ function main(x) { |
+ x = x|0; |
+ var ret = 0; |
+ switch(x|0) { |
+ case 1: { |
+ ret = 1; |
+ break; |
+ } |
+ case 2: { |
+ ret = 2; |
+ break; |
+ } |
+ case 3: { |
+ ret = 3; |
+ break; |
+ } |
+ case 4: { |
+ ret = 4; |
+ } |
+ case 7: { |
+ ret = 7; |
+ break; |
+ } |
+ case 10: { |
+ ret = 10; |
+ } |
+ case 16: { |
+ ret = 16; |
+ break; |
+ } |
+ case 17: { |
+ ret = 17; |
+ break; |
+ } |
+ case 18: { |
+ ret = 18; |
+ break; |
+ } |
+ case 19: { |
+ ret = 19; |
+ } |
+ default: { |
+ ret = -1; |
+ break; |
+ } |
+ } |
+ return ret|0; |
+ } |
+ return { |
+ main: main, |
+ }; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(7, wasm.main(4)); |
+ assertEquals(16, wasm.main(10)); |
+ assertEquals(-1, wasm.main(19)); |
+ assertEquals(-1, wasm.main(23)); |
+})(); |
+ |
+(function TestSwitchHybridWithNoDefault() { |
+ function asmModule() { |
+ "use asm"; |
+ function main(x) { |
+ x = x|0; |
+ var ret = 19; |
+ switch(x|0) { |
+ case 1: { |
+ ret = 1; |
+ break; |
+ } |
+ case 2: { |
+ ret = 2; |
+ break; |
+ } |
+ case 3: { |
+ ret = 3; |
+ break; |
+ } |
+ case 4: { |
+ ret = 4; |
+ break; |
+ } |
+ case 7: { |
+ ret = 7; |
+ break; |
+ } |
+ } |
+ return ret|0; |
+ } |
+ return { |
+ main: main, |
+ }; |
+ } |
+ var wasm = Wasm.instantiateModuleFromAsm(asmModule.toString()); |
+ assertEquals(2, wasm.main(2)); |
+ assertEquals(7, wasm.main(7)); |
+ assertEquals(19, wasm.main(-1)); |
+})(); |
+ |
+(function TestLargeSwitch() { |
+ function LargeSwitchGenerator(begin, end, gap, handle_case) { |
+ var str = "function asmModule() {\ |
+ \"use asm\";\ |
+ function main(x) {\ |
+ x = x|0;\ |
+ switch(x|0) {"; |
+ for (var i = begin; i <= end; i = i + gap) { |
+ str = str.concat("case ", i.toString(), ": ", handle_case(i)); |
+ } |
+ str = str.concat("default: return -1;\ |
+ }\ |
+ return -2;\ |
+ }\ |
+ return {main: main}; }"); |
+ |
+ var wasm = Wasm.instantiateModuleFromAsm(str); |
+ return wasm; |
+ } |
+ |
+ var handle_case = function(k) { |
+ return "return ".concat(k, ";"); |
+ } |
+ var wasm = LargeSwitchGenerator(0, 513, 1, handle_case); |
+ for (var i = 0; i <= 513; i++) { |
+ assertEquals(i, wasm.main(i)); |
+ } |
+ assertEquals(-1, wasm.main(-1)); |
+ |
+ wasm = LargeSwitchGenerator(0, 1024, 3, handle_case); |
+ for (var i = 0; i <= 1024; i = i + 3) { |
+ assertEquals(i, wasm.main(i)); |
+ } |
+ assertEquals(-1, wasm.main(-1)); |
+ |
+ wasm = LargeSwitchGenerator(-2147483648, -2147483000, 1, handle_case); |
+ for (var i = -2147483648; i <= -2147483000; i++) { |
+ assertEquals(i, wasm.main(i)); |
+ } |
+ assertEquals(-1, wasm.main(-1)); |
+ assertEquals(-1, wasm.main(214748647)); |
+ |
+ wasm = LargeSwitchGenerator(-2147483648, -2147483000, 3, handle_case); |
+ for (var i = -2147483648; i <= -2147483000; i = i + 3) { |
+ assertEquals(i, wasm.main(i)); |
+ } |
+ assertEquals(-1, wasm.main(-1)); |
+ assertEquals(-1, wasm.main(214748647)); |
+ |
+ wasm = LargeSwitchGenerator(2147483000, 2147483647, 1, handle_case); |
+ for (var i = 2147483000; i <= 2147483647; i++) { |
+ assertEquals(i, wasm.main(i)); |
+ } |
+ assertEquals(-1, wasm.main(-1)); |
+ assertEquals(-1, wasm.main(-214748647)); |
+ |
+ wasm = LargeSwitchGenerator(2147483000, 2147483647, 4, handle_case); |
+ for (var i = 2147483000; i <= 2147483647; i = i + 4) { |
+ assertEquals(i, wasm.main(i)); |
+ } |
+ assertEquals(-1, wasm.main(-1)); |
+ assertEquals(-1, wasm.main(-214748647)); |
+ |
+ handle_case = function(k) { |
+ if (k != 7) return "return ".concat(k, ";"); |
+ else return "break;"; |
+ } |
+ wasm = LargeSwitchGenerator(0, 1499, 7, handle_case); |
+ for (var i = 0; i <= 1499; i = i + 7) { |
+ if (i == 7) assertEquals(-2, wasm.main(i)); |
+ else assertEquals(i, wasm.main(i)); |
+ } |
+ assertEquals(-1, wasm.main(-1)); |
+ |
+ handle_case = function(k) { |
+ if (k != 56) return "break;"; |
+ else return "return 23;"; |
+ } |
+ wasm = LargeSwitchGenerator(0, 638, 2, handle_case); |
+ for (var i = 0; i <= 638; i = i + 2) { |
+ if (i == 56) assertEquals(23, wasm.main(i)); |
+ else assertEquals(-2, wasm.main(i)); |
+ } |
+ assertEquals(-1, wasm.main(-1)); |
+})(); |