aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/wasm/wasm-compiler-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/wasm/wasm-compiler-unittest.cc')
-rw-r--r--deps/v8/test/unittests/wasm/wasm-compiler-unittest.cc71
1 files changed, 71 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/wasm/wasm-compiler-unittest.cc b/deps/v8/test/unittests/wasm/wasm-compiler-unittest.cc
new file mode 100644
index 0000000000..3cca4bc55c
--- /dev/null
+++ b/deps/v8/test/unittests/wasm/wasm-compiler-unittest.cc
@@ -0,0 +1,71 @@
+// Copyright 2018 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.
+
+#include "test/unittests/test-utils.h"
+
+#include "src/compiler/linkage.h"
+#include "src/compiler/wasm-compiler.h"
+#include "src/machine-type.h"
+#include "src/signature.h"
+#include "src/wasm/value-type.h"
+
+namespace v8 {
+namespace internal {
+namespace wasm {
+
+class WasmCallDescriptorTest : public TestWithZone {};
+
+TEST_F(WasmCallDescriptorTest, TestAnyRefIsGrouped) {
+ constexpr size_t kMaxCount = 30;
+ ValueType params[kMaxCount];
+
+ for (size_t i = 0; i < kMaxCount; i += 2) {
+ params[i] = ValueType::kWasmAnyRef;
+ CHECK_LT(i + 1, kMaxCount);
+ params[i + 1] = ValueType::kWasmI32;
+ }
+
+ for (size_t count = 1; count <= kMaxCount; ++count) {
+ FunctionSig sig(/*return_count=*/0, count, params);
+ compiler::CallDescriptor* desc =
+ compiler::GetWasmCallDescriptor(zone(), &sig);
+
+ // The WasmInstance is the implicit first parameter.
+ CHECK_EQ(count + 1, desc->ParameterCount());
+
+ bool has_untagged_stack_param = false;
+ bool has_tagged_register_param = false;
+ int max_tagged_stack_location = std::numeric_limits<int>::min();
+ int min_untagged_stack_location = std::numeric_limits<int>::max();
+ for (size_t i = 1; i < desc->ParameterCount(); ++i) {
+ // InputLocation i + 1, because target is the first input.
+ compiler::LinkageLocation location = desc->GetInputLocation(i + 1);
+ if (desc->GetParameterType(i).IsTagged()) {
+ if (location.IsRegister()) {
+ has_tagged_register_param = true;
+ } else {
+ CHECK(location.IsCallerFrameSlot());
+ max_tagged_stack_location =
+ std::max(max_tagged_stack_location, location.AsCallerFrameSlot());
+ }
+ } else { // !isTagged()
+ if (location.IsCallerFrameSlot()) {
+ has_untagged_stack_param = true;
+ min_untagged_stack_location = std::min(min_untagged_stack_location,
+ location.AsCallerFrameSlot());
+ } else {
+ CHECK(location.IsRegister());
+ }
+ }
+ }
+ // There should never be a tagged parameter in a register and an untagged
+ // parameter on the stack at the same time.
+ CHECK_EQ(false, has_tagged_register_param && has_untagged_stack_param);
+ CHECK_LT(max_tagged_stack_location, min_untagged_stack_location);
+ }
+}
+
+} // namespace wasm
+} // namespace internal
+} // namespace v8