| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 #include <stdint.h> | 5 #include <stdint.h> |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/wasm/wasm-macro-gen.h" | 10 #include "src/wasm/wasm-macro-gen.h" |
| 11 | 11 |
| 12 #include "test/cctest/cctest.h" | 12 #include "test/cctest/cctest.h" |
| 13 #include "test/cctest/compiler/value-helper.h" | 13 #include "test/cctest/compiler/value-helper.h" |
| 14 #include "test/cctest/wasm/test-signatures.h" | 14 #include "test/cctest/wasm/test-signatures.h" |
| 15 #include "test/cctest/wasm/wasm-run-utils.h" | 15 #include "test/cctest/wasm/wasm-run-utils.h" |
| 16 | 16 |
| 17 #define CHECK_TRAP32(x) \ | 17 #define CHECK_TRAP32(x) \ |
| 18 CHECK_EQ(0xdeadbeef, (bit_cast<uint32_t>(x)) & 0xFFFFFFFF) | 18 CHECK_EQ(0xdeadbeef, (bit_cast<uint32_t>(x)) & 0xFFFFFFFF) |
| 19 #define CHECK_TRAP64(x) \ | 19 #define CHECK_TRAP64(x) \ |
| 20 CHECK_EQ(0xdeadbeefdeadbeef, (bit_cast<uint64_t>(x)) & 0xFFFFFFFFFFFFFFFF) | 20 CHECK_EQ(0xdeadbeefdeadbeef, (bit_cast<uint64_t>(x)) & 0xFFFFFFFFFFFFFFFF) |
| 21 #define CHECK_TRAP(x) CHECK_TRAP32(x) | 21 #define CHECK_TRAP(x) CHECK_TRAP32(x) |
| 22 | 22 |
| 23 #define asi64(x) static_cast<int64_t>(x) | 23 #define asi64(x) static_cast<int64_t>(x) |
| 24 | 24 |
| 25 #define asu64(x) static_cast<uint64_t>(x) | 25 #define asu64(x) static_cast<uint64_t>(x) |
| 26 | 26 |
| 27 #define B2(a, b) kExprBlock, 2, a, b | 27 #define B2(a, b) kExprBlock, a, b, kExprEnd |
| 28 #define B1(a) kExprBlock, 1, a | 28 #define B1(a) kExprBlock, a, kExprEnd |
| 29 | 29 |
| 30 // Can't bridge macro land with nested macros. | 30 // Can't bridge macro land with nested macros. |
| 31 #if V8_TARGET_ARCH_MIPS | 31 #if V8_TARGET_ARCH_MIPS |
| 32 #define MIPS true | 32 #define MIPS true |
| 33 #else | 33 #else |
| 34 #define MIPS false | 34 #define MIPS false |
| 35 #endif | 35 #endif |
| 36 | 36 |
| 37 #define FOREACH_I64_OPERATOR(V) \ | 37 #define FOREACH_I64_OPERATOR(V) \ |
| 38 V(DepthFirst, true) \ | 38 V(DepthFirst, true) \ |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 BUILD(r, WASM_I64V(kExpectedValue)); | 109 BUILD(r, WASM_I64V(kExpectedValue)); |
| 110 CHECK_EQ(kExpectedValue, r.Call()); | 110 CHECK_EQ(kExpectedValue, r.Call()); |
| 111 cntr++; | 111 cntr++; |
| 112 } | 112 } |
| 113 } | 113 } |
| 114 | 114 |
| 115 TEST(Run_Wasm_Return_I64) { | 115 TEST(Run_Wasm_Return_I64) { |
| 116 REQUIRE(I64Return); | 116 REQUIRE(I64Return); |
| 117 WasmRunner<int64_t> r(MachineType::Int64()); | 117 WasmRunner<int64_t> r(MachineType::Int64()); |
| 118 | 118 |
| 119 BUILD(r, WASM_RETURN(WASM_GET_LOCAL(0))); | 119 BUILD(r, WASM_RETURN1(WASM_GET_LOCAL(0))); |
| 120 | 120 |
| 121 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } | 121 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } |
| 122 } | 122 } |
| 123 | 123 |
| 124 // todo(ahaas): I added a list of missing instructions here to make merging | 124 // todo(ahaas): I added a list of missing instructions here to make merging |
| 125 // easier when I do them one by one. | 125 // easier when I do them one by one. |
| 126 // kExprI64Add: | 126 // kExprI64Add: |
| 127 TEST(Run_WasmI64Add) { | 127 TEST(Run_WasmI64Add) { |
| 128 REQUIRE(I64Add); | 128 REQUIRE(I64Add); |
| 129 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); | 129 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); |
| (...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 continue; | 809 continue; |
| 810 } else { | 810 } else { |
| 811 BUILD(t, WASM_GET_LOCAL(i)); | 811 BUILD(t, WASM_GET_LOCAL(i)); |
| 812 } | 812 } |
| 813 uint32_t index = t.CompileAndAdd(); | 813 uint32_t index = t.CompileAndAdd(); |
| 814 | 814 |
| 815 // Build the calling function. | 815 // Build the calling function. |
| 816 WasmRunner<int32_t> r(&module); | 816 WasmRunner<int32_t> r(&module); |
| 817 BUILD( | 817 BUILD( |
| 818 r, | 818 r, |
| 819 WASM_I32_CONVERT_I64(WASM_CALL_FUNCTION( | 819 WASM_I32_CONVERT_I64(WASM_CALL_FUNCTIONN( |
| 820 index, WASM_I64V_9(0xbcd12340000000b), | 820 19, index, WASM_I64V_9(0xbcd12340000000b), |
| 821 WASM_I64V_9(0xbcd12340000000c), WASM_I32V_1(0xd), | 821 WASM_I64V_9(0xbcd12340000000c), WASM_I32V_1(0xd), |
| 822 WASM_I32_CONVERT_I64(WASM_I64V_9(0xbcd12340000000e)), | 822 WASM_I32_CONVERT_I64(WASM_I64V_9(0xbcd12340000000e)), |
| 823 WASM_I64V_9(0xbcd12340000000f), WASM_I64V_10(0xbcd1234000000010), | 823 WASM_I64V_9(0xbcd12340000000f), WASM_I64V_10(0xbcd1234000000010), |
| 824 WASM_I64V_10(0xbcd1234000000011), WASM_I64V_10(0xbcd1234000000012), | 824 WASM_I64V_10(0xbcd1234000000011), WASM_I64V_10(0xbcd1234000000012), |
| 825 WASM_I64V_10(0xbcd1234000000013), WASM_I64V_10(0xbcd1234000000014), | 825 WASM_I64V_10(0xbcd1234000000013), WASM_I64V_10(0xbcd1234000000014), |
| 826 WASM_I64V_10(0xbcd1234000000015), WASM_I64V_10(0xbcd1234000000016), | 826 WASM_I64V_10(0xbcd1234000000015), WASM_I64V_10(0xbcd1234000000016), |
| 827 WASM_I64V_10(0xbcd1234000000017), WASM_I64V_10(0xbcd1234000000018), | 827 WASM_I64V_10(0xbcd1234000000017), WASM_I64V_10(0xbcd1234000000018), |
| 828 WASM_I64V_10(0xbcd1234000000019), WASM_I64V_10(0xbcd123400000001a), | 828 WASM_I64V_10(0xbcd1234000000019), WASM_I64V_10(0xbcd123400000001a), |
| 829 WASM_I64V_10(0xbcd123400000001b), WASM_I64V_10(0xbcd123400000001c), | 829 WASM_I64V_10(0xbcd123400000001b), WASM_I64V_10(0xbcd123400000001c), |
| 830 WASM_I64V_10(0xbcd123400000001d)))); | 830 WASM_I64V_10(0xbcd123400000001d)))); |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1086 REQUIRE(I64Sub); | 1086 REQUIRE(I64Sub); |
| 1087 // Build the target function. | 1087 // Build the target function. |
| 1088 TestSignatures sigs; | 1088 TestSignatures sigs; |
| 1089 TestingModule module; | 1089 TestingModule module; |
| 1090 WasmFunctionCompiler t(sigs.l_ll(), &module); | 1090 WasmFunctionCompiler t(sigs.l_ll(), &module); |
| 1091 BUILD(t, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 1091 BUILD(t, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 1092 uint32_t index = t.CompileAndAdd(); | 1092 uint32_t index = t.CompileAndAdd(); |
| 1093 | 1093 |
| 1094 // Build the caller function. | 1094 // Build the caller function. |
| 1095 WasmRunner<int64_t> r(&module, MachineType::Int64(), MachineType::Int64()); | 1095 WasmRunner<int64_t> r(&module, MachineType::Int64(), MachineType::Int64()); |
| 1096 BUILD(r, WASM_CALL_FUNCTION(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 1096 BUILD(r, WASM_CALL_FUNCTION2(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 1097 | 1097 |
| 1098 FOR_INT32_INPUTS(i) { | 1098 FOR_INT32_INPUTS(i) { |
| 1099 FOR_INT32_INPUTS(j) { | 1099 FOR_INT32_INPUTS(j) { |
| 1100 int64_t a = static_cast<int64_t>(*i) << 32 | | 1100 int64_t a = static_cast<int64_t>(*i) << 32 | |
| 1101 (static_cast<int64_t>(*j) | 0xFFFFFFFF); | 1101 (static_cast<int64_t>(*j) | 0xFFFFFFFF); |
| 1102 int64_t b = static_cast<int64_t>(*j) << 32 | | 1102 int64_t b = static_cast<int64_t>(*j) << 32 | |
| 1103 (static_cast<int64_t>(*i) | 0xFFFFFFFF); | 1103 (static_cast<int64_t>(*i) | 0xFFFFFFFF); |
| 1104 | 1104 |
| 1105 int64_t expected = static_cast<int64_t>(static_cast<uint64_t>(a) - | 1105 int64_t expected = static_cast<int64_t>(static_cast<uint64_t>(a) - |
| 1106 static_cast<uint64_t>(b)); | 1106 static_cast<uint64_t>(b)); |
| 1107 CHECK_EQ(expected, r.Call(a, b)); | 1107 CHECK_EQ(expected, r.Call(a, b)); |
| 1108 } | 1108 } |
| 1109 } | 1109 } |
| 1110 } | 1110 } |
| 1111 | 1111 |
| 1112 TEST(Run_Wasm_LoadStoreI64_sx) { | 1112 TEST(Run_Wasm_LoadStoreI64_sx) { |
| 1113 REQUIRE(I64LoadStore); | 1113 REQUIRE(I64LoadStore); |
| 1114 REQUIRE(DepthFirst); | 1114 REQUIRE(DepthFirst); |
| 1115 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S, | 1115 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S, |
| 1116 kExprI64LoadMem}; | 1116 kExprI64LoadMem}; |
| 1117 | 1117 |
| 1118 for (size_t m = 0; m < arraysize(loads); m++) { | 1118 for (size_t m = 0; m < arraysize(loads); m++) { |
| 1119 TestingModule module; | 1119 TestingModule module; |
| 1120 byte* memory = module.AddMemoryElems<byte>(16); | 1120 byte* memory = module.AddMemoryElems<byte>(16); |
| 1121 WasmRunner<int64_t> r(&module); | 1121 WasmRunner<int64_t> r(&module); |
| 1122 | 1122 |
| 1123 byte code[] = {kExprI64StoreMem, ZERO_ALIGNMENT, | 1123 byte code[] = { |
| 1124 ZERO_OFFSET, // -- | 1124 kExprI8Const, 8, // -- |
| 1125 kExprI8Const, 8, // -- | 1125 kExprI8Const, 0, // -- |
| 1126 loads[m], ZERO_ALIGNMENT, | 1126 loads[m], // -- |
| 1127 ZERO_OFFSET, // -- | 1127 ZERO_ALIGNMENT, // -- |
| 1128 kExprI8Const, 0}; // -- | 1128 ZERO_OFFSET, // -- |
| 1129 kExprI64StoreMem, // -- |
| 1130 ZERO_ALIGNMENT, // -- |
| 1131 ZERO_OFFSET // -- |
| 1132 }; |
| 1129 | 1133 |
| 1130 r.Build(code, code + arraysize(code)); | 1134 r.Build(code, code + arraysize(code)); |
| 1131 | 1135 |
| 1132 // Try a bunch of different negative values. | 1136 // Try a bunch of different negative values. |
| 1133 for (int i = -1; i >= -128; i -= 11) { | 1137 for (int i = -1; i >= -128; i -= 11) { |
| 1134 int size = 1 << m; | 1138 int size = 1 << m; |
| 1135 module.BlankMemory(); | 1139 module.BlankMemory(); |
| 1136 memory[size - 1] = static_cast<byte>(i); // set the high order byte. | 1140 memory[size - 1] = static_cast<byte>(i); // set the high order byte. |
| 1137 | 1141 |
| 1138 int64_t expected = static_cast<int64_t>(i) << ((size - 1) * 8); | 1142 int64_t expected = static_cast<int64_t>(i) << ((size - 1) * 8); |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1345 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); | 1349 WasmRunner<int64_t> r(MachineType::Int64(), MachineType::Int64()); |
| 1346 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 1350 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 1347 | 1351 |
| 1348 FOR_UINT64_INPUTS(i) { | 1352 FOR_UINT64_INPUTS(i) { |
| 1349 FOR_UINT64_INPUTS(j) { | 1353 FOR_UINT64_INPUTS(j) { |
| 1350 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f); | 1354 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f); |
| 1351 CHECK_EQ(expected, r.Call(*i, *j)); | 1355 CHECK_EQ(expected, r.Call(*i, *j)); |
| 1352 } | 1356 } |
| 1353 } | 1357 } |
| 1354 } | 1358 } |
| OLD | NEW |