1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "test/unittests/test-utils.h"
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/v8.h"
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "test/cctest/wasm/test-signatures.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/objects.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/wasm/ast-decoder.h"
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/wasm/wasm-macro-gen.h"
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/wasm/wasm-module.h"
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace wasm {
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic const byte kCodeGetLocal0[] = {kExprGetLocal, 0};
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic const byte kCodeGetLocal1[] = {kExprGetLocal, 1};
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic const byte kCodeSetLocal0[] = {kExprSetLocal, 0, kExprI8Const, 0};
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic const LocalType kLocalTypes[] = {kAstI32, kAstI64, kAstF32, kAstF64};
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic const MachineType machineTypes[] = {
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MachineType::Int8(),   MachineType::Uint8(),  MachineType::Int16(),
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MachineType::Uint16(), MachineType::Int32(),  MachineType::Uint32(),
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MachineType::Int64(),  MachineType::Uint64(), MachineType::Float32(),
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MachineType::Float64()};
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic const WasmOpcode kInt32BinopOpcodes[] = {
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    kExprI32Add,  kExprI32Sub,  kExprI32Mul,  kExprI32DivS, kExprI32DivU,
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    kExprI32RemS, kExprI32RemU, kExprI32And,  kExprI32Ior,  kExprI32Xor,
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    kExprI32Shl,  kExprI32ShrU, kExprI32ShrS, kExprI32Eq,   kExprI32LtS,
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    kExprI32LeS,  kExprI32LtU,  kExprI32LeU};
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPECT_VERIFIES(env, x) Verify(kSuccess, env, x, x + arraysize(x))
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPECT_FAILURE(env, x) Verify(kError, env, x, x + arraysize(x))
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPECT_VERIFIES_INLINE(env, ...)                 \
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  do {                                                   \
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static byte code[] = {__VA_ARGS__};                  \
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Verify(kSuccess, env, code, code + arraysize(code)); \
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } while (false)
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPECT_FAILURE_INLINE(env, ...)                \
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  do {                                                 \
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static byte code[] = {__VA_ARGS__};                \
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Verify(kError, env, code, code + arraysize(code)); \
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } while (false)
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define VERIFY(...)                                        \
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  do {                                                     \
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte code[] = {__VA_ARGS__};              \
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Verify(kSuccess, &env_v_i, code, code + sizeof(code)); \
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } while (false)
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass WasmDecoderTest : public TestWithZone {
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WasmDecoderTest() : TestWithZone(), sigs() {
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env_i_i, sigs.i_i());
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env_v_v, sigs.v_v());
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env_v_i, sigs.v_i());
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env_i_f, sigs.i_f());
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env_i_d, sigs.i_d());
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env_l_l, sigs.l_l());
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env_f_ff, sigs.f_ff());
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env_d_dd, sigs.d_dd());
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestSignatures sigs;
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_i_i;
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_v_v;
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_v_i;
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_i_f;
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_i_d;
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_l_l;
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_f_ff;
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_d_dd;
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static void init_env(FunctionEnv* env, FunctionSig* sig) {
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->module = nullptr;
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->sig = sig;
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->local_int32_count = 0;
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->local_int64_count = 0;
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->local_float32_count = 0;
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->local_float64_count = 0;
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env->SumLocals();
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // A wrapper around VerifyWasmCode() that renders a nice failure message.
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Verify(ErrorCode expected, FunctionEnv* env, const byte* start,
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              const byte* end) {
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TreeResult result = VerifyWasmCode(env, start, end);
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (result.error_code != expected) {
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ptrdiff_t pc = result.error_pc - result.start;
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ptrdiff_t pt = result.error_pt - result.start;
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      std::ostringstream str;
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (expected == kSuccess) {
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        str << "Verification failed: " << result.error_code << " pc = +" << pc;
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (result.error_pt) str << ", pt = +" << pt;
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        str << ", msg = " << result.error_msg.get();
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        str << "Verification expected: " << expected << ", but got "
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            << result.error_code;
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (result.error_code != kSuccess) {
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          str << " pc = +" << pc;
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          if (result.error_pt) str << ", pt = +" << pt;
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FATAL(str.str().c_str());
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void TestBinop(WasmOpcode opcode, FunctionSig* success) {
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // op(local[0], local[1])
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code[] = {static_cast<byte>(opcode), kExprGetLocal, 0, kExprGetLocal,
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   1};
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env;
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env, success);
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env, code);
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Try all combinations of return and parameter types.
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        for (size_t k = 0; k < arraysize(kLocalTypes); k++) {
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          LocalType types[] = {kLocalTypes[i], kLocalTypes[j], kLocalTypes[k]};
134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          if (types[0] != success->GetReturn(0) ||
135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              types[1] != success->GetParam(0) ||
136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              types[2] != success->GetParam(1)) {
137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            // Test signature mismatch.
138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            FunctionSig sig(1, 2, types);
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            init_env(&env, &sig);
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            EXPECT_FAILURE(&env, code);
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          }
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void TestUnop(WasmOpcode opcode, FunctionSig* success) {
148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TestUnop(opcode, success->GetReturn(), success->GetParam(0));
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void TestUnop(WasmOpcode opcode, LocalType ret_type, LocalType param_type) {
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Return(op(local[0]))
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code[] = {static_cast<byte>(opcode), kExprGetLocal, 0};
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env;
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LocalType types[] = {ret_type, param_type};
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionSig sig(1, 1, types);
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      init_env(&env, &sig);
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env, code);
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Try all combinations of return and parameter types.
163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        LocalType types[] = {kLocalTypes[i], kLocalTypes[j]};
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (types[0] != ret_type || types[1] != param_type) {
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          // Test signature mismatch.
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          FunctionSig sig(1, 1, types);
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          init_env(&env, &sig);
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          EXPECT_FAILURE(&env, code);
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic FunctionEnv CreateInt32FunctionEnv(FunctionSig* sig, int count) {
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env.module = nullptr;
181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env.sig = sig;
182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env.local_int32_count = count;
183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env.local_float64_count = 0;
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env.local_float32_count = 0;
185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env.total_locals = static_cast<unsigned>(count + sig->parameter_count());
186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return env;
187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int8Const) {
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprI8Const, 0};
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = -128; i < 128; i++) {
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    code[1] = static_cast<byte>(i);
194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_i_i, code);
195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, EmptyFunction) {
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {0};
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Verify(kSuccess, &env_v_v, code, code);
202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Verify(kError, &env_i_i, code, code);
203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IncompleteIf1) {
207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprIf};
208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_v_v, code);
209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_i, code);
210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IncompleteIf2) {
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprIf, kExprI8Const, 0};
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_v_v, code);
216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_i, code);
217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int8Const_fallthru) {
221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprI8Const, 0, kExprI8Const, 1};
222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int32Const) {
227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprI32Const, 0, 0, 0, 0};
228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int32_t* ptr = reinterpret_cast<int32_t*>(code + 1);
229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const int kInc = 4498211;
230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) {
231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    *ptr = i;
232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_i_i, code);
233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int8Const_fallthru2) {
238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprI8Const, 0, kExprI32Const, 1, 2, 3, 4};
239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int64Const) {
244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprI64Const, 0, 0, 0, 0, 0, 0, 0, 0};
245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int64_t* ptr = reinterpret_cast<int64_t*>(code + 1);
246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const int kInc = 4498211;
247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) {
248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    *ptr = (static_cast<int64_t>(i) << 32) | i;
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_l_l, code);
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Float32Const) {
258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprF32Const, 0, 0, 0, 0};
259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  float* ptr = reinterpret_cast<float*>(code + 1);
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < 30; i++) {
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    *ptr = i * -7.75f;
262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_f_ff, code);
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Float64Const) {
268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0};
269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  double* ptr = reinterpret_cast<double*>(code + 1);
270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < 30; i++) {
271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    *ptr = i * 33.45;
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_d_dd, code);
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int32Const_off_end) {
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprI32Const, 0xaa, 0xbb, 0xcc, 0x44};
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int size = 1; size <= 4; size++) {
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Verify(kError, &env_i_i, code, code + size);
284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, GetLocal0_param) {
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, kCodeGetLocal0);
290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, GetLocal0_local) {
294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(&env, sigs.i_v());
296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env.AddLocals(kAstI32, 1);
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env, kCodeGetLocal0);
298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, GetLocal0_param_n) {
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionSig* array[] = {sigs.i_i(), sigs.i_ii(), sigs.i_iii()};
303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(array); i++) {
305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env = CreateInt32FunctionEnv(array[i], 0);
306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env, kCodeGetLocal0);
307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, GetLocalN_local) {
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (byte i = 1; i < 8; i++) {
313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env = CreateInt32FunctionEnv(sigs.i_v(), i);
314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (byte j = 0; j < i; j++) {
315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code[] = {kExprGetLocal, j};
316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env, code);
317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, GetLocal0_fail_no_params) {
323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env = CreateInt32FunctionEnv(sigs.i_v(), 0);
324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env, kCodeGetLocal0);
326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, GetLocal1_fail_no_locals) {
330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_i, kCodeGetLocal1);
331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, GetLocal_off_end) {
335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprGetLocal};
336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_i, code);
337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, GetLocal_varint) {
341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env_i_i.local_int32_count = 1000000000;
342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env_i_i.total_locals += 1000000000;
343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte code[] = {kExprGetLocal, 0xFF, 0x01};
346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_i_i, code);
347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_f, code);
348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte code[] = {kExprGetLocal, 0xF0, 0x80, 0x01};
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_i_i, code);
353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_f, code);
354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte code[] = {kExprGetLocal, 0xF2, 0x81, 0x82, 0x01};
358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_i_i, code);
359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_f, code);
360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte code[] = {kExprGetLocal, 0xF3, 0xA1, 0xB1, 0xC1, 0x01};
364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_i_i, code);
365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_f, code);
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Binops_off_end) {
371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code1[] = {0};  // [opcode]
372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    code1[0] = kInt32BinopOpcodes[i];
374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_i, code1);
375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code3[] = {0, kExprGetLocal, 0};  // [opcode] [expr]
378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    code3[0] = kInt32BinopOpcodes[i];
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_i, code3);
381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code4[] = {0, kExprGetLocal, 0, 0};  // [opcode] [expr] [opcode]
384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    code4[0] = kInt32BinopOpcodes[i];
386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    code4[3] = kInt32BinopOpcodes[i];
387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_i, code4);
388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch//===================================================================
393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch//== Statements
394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch//===================================================================
395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Nop) {
396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprNop};
397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, SetLocal0_param) {
402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprSetLocal, 0, kExprI8Const, 0};
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, SetLocal0_local) {
408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprSetLocal, 0, kExprI8Const, 0};
409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env = CreateInt32FunctionEnv(sigs.i_v(), 1);
410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env, code);
412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, SetLocalN_local) {
416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (byte i = 1; i < 8; i++) {
417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env = CreateInt32FunctionEnv(sigs.i_v(), i);
418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (byte j = 0; j < i; j++) {
419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code[] = {kExprSetLocal, j, kExprI8Const, i};
420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env, code);
421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block0) {
427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 0};
428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block0_fallthru1) {
433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 0, kExprBlock, 0};
434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block1) {
439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 1, kExprSetLocal, 0, kExprI8Const, 0};
440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block0_fallthru2) {
445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 0, kExprSetLocal, 0, kExprI8Const, 0};
446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block2) {
451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock,    2,                    // --
452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal, 0, kExprI8Const, 0,   // --
453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal, 0, kExprI8Const, 0};  // --
454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block2_fallthru) {
459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock,    2,                   // --
460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal, 0, kExprI8Const, 0,  // --
461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal, 0, kExprI8Const, 0,  // --
462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprI8Const,  11};                 // --
463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, BlockN) {
468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte block[] = {kExprBlock, 2};
469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < 10; i++) {
471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    size_t total = sizeof(block) + sizeof(kCodeSetLocal0) * i;
472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte* code = reinterpret_cast<byte*>(malloc(total));
473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    memcpy(code, block, sizeof(block));
474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    code[1] = static_cast<byte>(i);
475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t j = 0; j < i; j++) {
476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      memcpy(code + sizeof(block) + j * sizeof(kCodeSetLocal0), kCodeSetLocal0,
477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             sizeof(kCodeSetLocal0));
478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Verify(kSuccess, &env_v_i, code, code + total);
480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    free(code);
481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, BlockN_off_end) {
486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (byte i = 2; i < 10; i++) {
487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code[] = {kExprBlock, i, kExprNop};
488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_v_v, code);
489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block1_break) {
494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 1, kExprBr, 0, kExprNop};
495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block2_break) {
500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 2, kExprNop, kExprBr, 0, kExprNop};
501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block1_continue) {
506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 1, kExprBr, 1, kExprNop};
507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_v_v, code);
508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Block2_continue) {
512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 2, kExprNop, kExprBr, 1, kExprNop};
513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_v_v, code);
514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBlock0) {
518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 0};
519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBlock1a) {
524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 1, kExprI8Const, 0};
525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBlock1b) {
530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 1, kExprI8Const, 0};
531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_f_ff, code);
532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBlock1c) {
539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 1, kExprF32Const, 0, 0, 0, 0};
540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_f_ff, code);
541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IfEmpty) {
547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprIf, kExprGetLocal, 0, kExprNop};
548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IfSet) {
553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprIfElse, kExprGetLocal, 0, kExprSetLocal,
554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              0,           kExprI8Const,  0, kExprNop};
555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IfBlock1) {
560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprIfElse, kExprGetLocal, 0, kExprBlock,
561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              1,           kExprSetLocal, 0, kExprI8Const,
562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              0,           kExprNop};
563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IfBlock2) {
568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprIf, kExprGetLocal, 0, kExprBlock,
569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              2,       kExprSetLocal, 0, kExprI8Const,
570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              0,       kExprSetLocal, 0, kExprI8Const,
571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              0};
572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IfElseEmpty) {
577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprIfElse, kExprGetLocal, 0, kExprNop,
578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprNop};
579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IfElseSet) {
584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprIfElse,
585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprGetLocal,
586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              0,  // --
587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal,
588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              0,
589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprI8Const,
590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              0,  // --
591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal,
592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              0,
593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprI8Const,
594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              1};  // --
595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IfElseUnreachable) {
600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprIfElse,      kExprI8Const,  0,
601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprUnreachable, kExprGetLocal, 0};
602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LocalType types[] = {kAstI32, kLocalTypes[i]};
605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env;
606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionSig sig(1, 1, types);
607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env, &sig);
608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (kLocalTypes[i] == kAstI32) {
610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env, code);
611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_FAILURE(&env, code);
613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Loop0) {
619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop, 0};
620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Loop1) {
625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop, 1, kExprSetLocal, 0, kExprI8Const, 0};
626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Loop2) {
631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop,     2,                    // --
632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal, 0, kExprI8Const, 0,   // --
633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal, 0, kExprI8Const, 0};  // --
634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Loop1_continue) {
639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop, 1, kExprBr, 0, kExprNop};
640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Loop1_break) {
645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop, 1, kExprBr, 1, kExprNop};
646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Loop2_continue) {
651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop,     2,                   // --
652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal, 0, kExprI8Const, 0,  // --
653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprBr,       0, kExprNop};        // --
654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Loop2_break) {
659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop,     2,                   // --
660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprSetLocal, 0, kExprI8Const, 0,  // --
661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprBr,       1, kExprNop};        // --
662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_i, code);
663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprLoop0) {
667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop, 0};
668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprLoop1a) {
673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop, 1, kExprBr, 0, kExprI8Const, 0};
674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprLoop1b) {
679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop, 1, kExprBr, 0, kExprI8Const, 0};
680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprLoop2_unreachable) {
685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprLoop,    2, kExprBr, 0,
686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kExprI8Const, 0, kExprNop};
687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ReturnVoid1) {
692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprNop};
693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_i, code);
695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_f, code);
696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ReturnVoid2) {
700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte code[] = {kExprBlock, 1, kExprBr, 0, kExprNop};
701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_i, code);
703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_f, code);
704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ReturnVoid3) {
711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, kExprI8Const, 0);
712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, kExprI32Const, 0, 0, 0, 0);
713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, kExprI64Const, 0, 0, 0, 0, 0, 0, 0, 0);
714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, kExprF32Const, 0, 0, 0, 0);
715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0);
716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_i, kExprGetLocal, 0);
718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Unreachable1) {
724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, kExprUnreachable);
725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, kExprUnreachable, kExprUnreachable);
726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(2, WASM_UNREACHABLE, WASM_ZERO));
727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(2, WASM_BR(0), WASM_ZERO));
728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(2, WASM_UNREACHABLE, WASM_ZERO));
729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(2, WASM_BR(0), WASM_ZERO));
730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Codeiness) {
734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(kExprLoop, 2,                       // --
735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         kExprSetLocal, 0, kExprI8Const, 0,  // --
736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         kExprBr, 0, kExprNop);              // --
737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprIf1) {
741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(kExprIf, kExprGetLocal, 0, kExprI8Const, 0, kExprI8Const, 1);
742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(kExprIf, kExprGetLocal, 0, kExprGetLocal, 0, kExprGetLocal, 0);
743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(kExprIf, kExprGetLocal, 0, kExprI32Add, kExprGetLocal, 0,
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         kExprGetLocal, 0, kExprI8Const, 1);
745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprIf_off_end) {
749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const byte kCode[] = {kExprIf, kExprGetLocal, 0, kExprGetLocal,
750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               0,       kExprGetLocal, 0};
751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t len = 1; len < arraysize(kCode); len++) {
752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Verify(kError, &env_i_i, kCode, kCode + len);
753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprIf_type) {
758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // float|double ? 1 : 2
760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte kCode[] = {kExprIfElse, kExprGetLocal, 0, kExprI8Const,
761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 1,           kExprI8Const,  2};
762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_f, kCode);
763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_d, kCode);
764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // 1 ? float|double : 2
767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte kCode[] = {kExprIfElse, kExprI8Const, 1, kExprGetLocal,
768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 0,           kExprI8Const, 2};
769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_f, kCode);
770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_d, kCode);
771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // stmt ? 0 : 1
774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte kCode[] = {kExprIfElse, kExprNop,     kExprI8Const,
775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 0,           kExprI8Const, 1};
776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_i, kCode);
777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // 0 ? stmt : 1
780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte kCode[] = {kExprIfElse, kExprI8Const, 0,
781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 kExprNop,    kExprI8Const, 1};
782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_i, kCode);
783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // 0 ? 1 : stmt
786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte kCode[] = {kExprIfElse, kExprI8Const, 0, kExprI8Const, 1,
787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 0,           kExprBlock};
788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE(&env_i_i, kCode);
789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int64Local_param) {
794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_l_l, kCodeGetLocal0);
795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int64Locals) {
799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (byte i = 1; i < 8; i++) {
800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env;
801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env, sigs.l_v());
802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env.AddLocals(kAstI64, i);
803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (byte j = 0; j < i; j++) {
804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code[] = {kExprGetLocal, j};
805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env, code);
806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int32Binops) {
812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32Add, sigs.i_ii());
813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32Sub, sigs.i_ii());
814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32Mul, sigs.i_ii());
815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32DivS, sigs.i_ii());
816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32DivU, sigs.i_ii());
817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32RemS, sigs.i_ii());
818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32RemU, sigs.i_ii());
819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32And, sigs.i_ii());
820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32Ior, sigs.i_ii());
821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32Xor, sigs.i_ii());
822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32Shl, sigs.i_ii());
823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32ShrU, sigs.i_ii());
824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32ShrS, sigs.i_ii());
825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32Eq, sigs.i_ii());
826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32LtS, sigs.i_ii());
827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32LeS, sigs.i_ii());
828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32LtU, sigs.i_ii());
829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprI32LeU, sigs.i_ii());
830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, DoubleBinops) {
834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF64Add, sigs.d_dd());
835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF64Sub, sigs.d_dd());
836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF64Mul, sigs.d_dd());
837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF64Div, sigs.d_dd());
838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF64Eq, sigs.i_dd());
840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF64Lt, sigs.i_dd());
841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF64Le, sigs.i_dd());
842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, FloatBinops) {
846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF32Add, sigs.f_ff());
847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF32Sub, sigs.f_ff());
848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF32Mul, sigs.f_ff());
849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF32Div, sigs.f_ff());
850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF32Eq, sigs.i_ff());
852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF32Lt, sigs.i_ff());
853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestBinop(kExprF32Le, sigs.i_ff());
854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TypeConversions) {
858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprI32SConvertF32, kAstI32, kAstF32);
859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprI32SConvertF64, kAstI32, kAstF64);
860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprI32UConvertF32, kAstI32, kAstF32);
861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprI32UConvertF64, kAstI32, kAstF64);
862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprF64SConvertI32, kAstF64, kAstI32);
863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprF64UConvertI32, kAstF64, kAstI32);
864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprF64ConvertF32, kAstF64, kAstF32);
865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprF32SConvertI32, kAstF32, kAstI32);
866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprF32UConvertI32, kAstF32, kAstI32);
867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestUnop(kExprF32ConvertF64, kAstF32, kAstF64);
868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MacrosStmt) {
872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_SET_LOCAL(0, WASM_I32(87348)));
873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_STORE_MEM(MachineType::Int32(), WASM_I8(24), WASM_I8(40)));
874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_IF(WASM_GET_LOCAL(0), WASM_NOP));
875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_NOP);
877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_BLOCK(1, WASM_NOP));
878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_LOOP(1, WASM_NOP));
879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_LOOP(1, WASM_BREAK(0)));
880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_LOOP(1, WASM_CONTINUE(0)));
881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MacrosBreak) {
888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BREAK(0)));
889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_i_i, WASM_LOOP(1, WASM_BREAKV(0, WASM_ZERO)));
891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_l_l, WASM_LOOP(1, WASM_BREAKV(0, WASM_I64(0))));
892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_f_ff,
893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_LOOP(1, WASM_BREAKV(0, WASM_F32(0.0))));
894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_d_dd,
895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_LOOP(1, WASM_BREAKV(0, WASM_F64(0.0))));
896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MacrosContinue) {
902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_CONTINUE(0)));
903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MacrosVariadic) {
907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_BLOCK(2, WASM_NOP, WASM_NOP));
908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_BLOCK(3, WASM_NOP, WASM_NOP, WASM_NOP));
909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_LOOP(2, WASM_NOP, WASM_NOP));
910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_LOOP(3, WASM_NOP, WASM_NOP, WASM_NOP));
911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MacrosNestedBlocks) {
915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_BLOCK(2, WASM_NOP, WASM_BLOCK(2, WASM_NOP, WASM_NOP)));
916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_BLOCK(3, WASM_NOP,                          // --
917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    WASM_BLOCK(2, WASM_NOP, WASM_NOP),    // --
918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    WASM_BLOCK(2, WASM_NOP, WASM_NOP)));  // --
919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_BLOCK(1, WASM_BLOCK(1, WASM_BLOCK(2, WASM_NOP, WASM_NOP))));
920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MultipleReturn) {
924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionSig sig_ii_v(2, 0, kIntTypes5);
926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_ii_v;
927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(&env_ii_v, &sig_ii_v);
928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_ii_v, WASM_RETURN(WASM_ZERO, WASM_ONE));
929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_ii_v, WASM_RETURN(WASM_ZERO));
930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionSig sig_iii_v(3, 0, kIntTypes5);
932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_iii_v;
933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(&env_iii_v, &sig_iii_v);
934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_iii_v,
935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_RETURN(WASM_ZERO, WASM_ONE, WASM_I8(44)));
936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_iii_v, WASM_RETURN(WASM_ZERO, WASM_ONE));
937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MultipleReturn_fallthru) {
941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionSig sig_ii_v(2, 0, kIntTypes5);
943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_ii_v;
944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(&env_ii_v, &sig_ii_v);
945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_ii_v, WASM_ZERO, WASM_ONE);
947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_ii_v, WASM_ZERO);
948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionSig sig_iii_v(3, 0, kIntTypes5);
950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_iii_v;
951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(&env_iii_v, &sig_iii_v);
952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_iii_v, WASM_ZERO, WASM_ONE, WASM_I8(44));
953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_iii_v, WASM_ZERO, WASM_ONE);
954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MacrosInt32) {
958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I8(12)));
959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(13)));
960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_MUL(WASM_GET_LOCAL(0), WASM_I8(14)));
961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(15)));
962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I8(16)));
963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_I8(17)));
964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_I8(18)));
965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_AND(WASM_GET_LOCAL(0), WASM_I8(19)));
966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_IOR(WASM_GET_LOCAL(0), WASM_I8(20)));
967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_XOR(WASM_GET_LOCAL(0), WASM_I8(21)));
968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_SHL(WASM_GET_LOCAL(0), WASM_I8(22)));
969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_SHR(WASM_GET_LOCAL(0), WASM_I8(23)));
970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_SAR(WASM_GET_LOCAL(0), WASM_I8(24)));
971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(25)));
972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_NE(WASM_GET_LOCAL(0), WASM_I8(25)));
973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_LTS(WASM_GET_LOCAL(0), WASM_I8(26)));
975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_LES(WASM_GET_LOCAL(0), WASM_I8(27)));
976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_LTU(WASM_GET_LOCAL(0), WASM_I8(28)));
977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_LEU(WASM_GET_LOCAL(0), WASM_I8(29)));
978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_GTS(WASM_GET_LOCAL(0), WASM_I8(26)));
980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_GES(WASM_GET_LOCAL(0), WASM_I8(27)));
981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_GTU(WASM_GET_LOCAL(0), WASM_I8(28)));
982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY(WASM_I32_GEU(WASM_GET_LOCAL(0), WASM_I8(29)));
983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MacrosInt64) {
987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_i_ll;
988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_l_ll;
989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(&env_i_ll, sigs.i_ll());
990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(&env_l_ll, sigs.l_ll());
991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define VERIFY_L_LL(...) EXPECT_VERIFIES_INLINE(&env_l_ll, __VA_ARGS__)
993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define VERIFY_I_LL(...) EXPECT_VERIFIES_INLINE(&env_i_ll, __VA_ARGS__)
994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_I64(12)));
996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_I64(13)));
997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_MUL(WASM_GET_LOCAL(0), WASM_I64(14)));
998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64(15)));
999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64(16)));
1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_I64(17)));
1001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_I64(18)));
1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_AND(WASM_GET_LOCAL(0), WASM_I64(19)));
1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_I64(20)));
1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_I64(21)));
1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64(22)));
1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64(23)));
1008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_L_LL(WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64(24)));
1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_I64(26)));
1011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_LES(WASM_GET_LOCAL(0), WASM_I64(27)));
1012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_I64(28)));
1013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_I64(29)));
1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_I64(26)));
1016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_GES(WASM_GET_LOCAL(0), WASM_I64(27)));
1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_I64(28)));
1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_I64(29)));
1019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_I64(25)));
1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VERIFY_I_LL(WASM_I64_NE(WASM_GET_LOCAL(0), WASM_I64(25)));
1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, AllSimpleExpressions) {
1026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Test all simple expressions which are described by a signature.
1027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECODE_TEST(name, opcode, sig)                      \
1028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {                                                         \
1029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionSig* sig = WasmOpcodes::Signature(kExpr##name); \
1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (sig->parameter_count() == 1) {                      \
1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      TestUnop(kExpr##name, sig);                           \
1032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {                                                \
1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      TestBinop(kExpr##name, sig);                          \
1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }                                                       \
1035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FOREACH_SIMPLE_OPCODE(DECODE_TEST);
1038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DECODE_TEST
1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, MemorySize) {
1044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprMemorySize};
1045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
1046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_f_ff, code);
1047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, GrowMemory) {
1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code[] = {kExprGrowMemory, kExprGetLocal, 0};
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_d, code);
1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, LoadMemOffset) {
1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int offset = 0; offset < 128; offset += 7) {
1059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code[] = {kExprI32LoadMem, WasmOpcodes::LoadStoreAccessOf(true),
1060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   static_cast<byte>(offset), kExprI8Const, 0};
1061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_i_i, code);
1062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, StoreMemOffset) {
1067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int offset = 0; offset < 128; offset += 7) {
1068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code[] = {kExprI32StoreMem,
1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   WasmOpcodes::LoadStoreAccessOf(true),
1070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   static_cast<byte>(offset),
1071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   kExprI8Const,
1072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   0,
1073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   kExprI8Const,
1074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   0};
1075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES(&env_i_i, code);
1076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, LoadMemOffset_varint) {
1081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code1[] = {kExprI32LoadMem, WasmOpcodes::LoadStoreAccessOf(true), 0,
1082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const, 0};
1083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code2[] = {kExprI32LoadMem,
1084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  WasmOpcodes::LoadStoreAccessOf(true),
1085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x80,
1086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  1,
1087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0};
1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code3[] = {kExprI32LoadMem,
1090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  WasmOpcodes::LoadStoreAccessOf(true),
1091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x81,
1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x82,
1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  5,
1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0};
1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code4[] = {kExprI32LoadMem,
1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  WasmOpcodes::LoadStoreAccessOf(true),
1098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x83,
1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x84,
1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x85,
1101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  7,
1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0};
1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code1);
1106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code2);
1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code3);
1108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code4);
1109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, StoreMemOffset_varint) {
1113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code1[] = {kExprI32StoreMem,
1114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  WasmOpcodes::LoadStoreAccessOf(true),
1115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0,
1116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0,
1118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0};
1120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code2[] = {kExprI32StoreMem,
1121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  WasmOpcodes::LoadStoreAccessOf(true),
1122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x80,
1123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  1,
1124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0,
1126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0};
1128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code3[] = {kExprI32StoreMem,
1129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  WasmOpcodes::LoadStoreAccessOf(true),
1130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x81,
1131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x82,
1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  5,
1133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0,
1135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0};
1137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code4[] = {kExprI32StoreMem,
1138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  WasmOpcodes::LoadStoreAccessOf(true),
1139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x83,
1140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x84,
1141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0x85,
1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  7,
1143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0,
1145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  kExprI8Const,
1146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  0};
1147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code1);
1149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code2);
1150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code3);
1151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code4);
1152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, AllLoadMemCombinations) {
1156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LocalType local_type = kLocalTypes[i];
1158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t j = 0; j < arraysize(machineTypes); j++) {
1159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType mem_type = machineTypes[j];
1160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code[] = {
1161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(mem_type, false)),
1162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          WasmOpcodes::LoadStoreAccessOf(false), kExprI8Const, 0};
1163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionEnv env;
1164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionSig sig(1, 0, &local_type);
1165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      init_env(&env, &sig);
1166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES(&env, code);
1168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
1169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE(&env, code);
1170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
1171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, AllStoreMemCombinations) {
1177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LocalType local_type = kLocalTypes[i];
1179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t j = 0; j < arraysize(machineTypes); j++) {
1180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType mem_type = machineTypes[j];
1181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code[] = {
1182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(mem_type, true)),
1183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          WasmOpcodes::LoadStoreAccessOf(false),
1184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprI8Const,
1185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          0,
1186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprGetLocal,
1187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          0};
1188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionEnv env;
1189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionSig sig(0, 1, &local_type);
1190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      init_env(&env, &sig);
1191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES(&env, code);
1193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
1194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE(&env, code);
1195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
1196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace {
1202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// A helper for tests that require a module environment for functions and
1203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// globals.
1204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass TestModuleEnv : public ModuleEnv {
1205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
1206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv() {
1207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    mem_start = 0;
1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    mem_end = 0;
1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    module = &mod;
1210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    linker = nullptr;
1211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    function_code = nullptr;
1212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    mod.globals = new std::vector<WasmGlobal>;
1213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    mod.signatures = new std::vector<FunctionSig*>;
1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    mod.functions = new std::vector<WasmFunction>;
1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte AddGlobal(MachineType mem_type) {
1217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    mod.globals->push_back({0, mem_type, 0, false});
1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(mod.globals->size() <= 127);
1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return static_cast<byte>(mod.globals->size() - 1);
1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte AddSignature(FunctionSig* sig) {
1222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    mod.signatures->push_back(sig);
1223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(mod.signatures->size() <= 127);
1224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return static_cast<byte>(mod.signatures->size() - 1);
1225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte AddFunction(FunctionSig* sig) {
1227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    mod.functions->push_back({sig, 0, 0, 0, 0, 0, 0, 0, false, false});
1228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(mod.functions->size() <= 127);
1229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return static_cast<byte>(mod.functions->size() - 1);
1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
1233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WasmModule mod;
1234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
1235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace
1236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, SimpleCalls) {
1239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_i_i;
1240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(sigs.i_v());
1244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(sigs.i_i());
1245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(sigs.i_ii());
1246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_CALL_FUNCTION(0));
1248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_CALL_FUNCTION(1, WASM_I8(27)));
1249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_CALL_FUNCTION(2, WASM_I8(37), WASM_I8(77)));
1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, CallsWithTooFewArguments) {
1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_i_i;
1255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(sigs.i_i());
1259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(sigs.i_ii());
1260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(sigs.f_ff());
1261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION0(0));
1263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(1, WASM_ZERO));
1264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(2, WASM_GET_LOCAL(0)));
1265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
1269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
1270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, CallsWithSpilloverArgs) {
1272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static LocalType a_i_ff[] = {kAstI32, kAstF32, kAstF32};
1273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionSig sig_i_ff(1, 2, a_i_ff);
1274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_i_ff;
1275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(&env_i_ff, &sig_i_ff);
1276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env_i_ff.module = &module_env;
1279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env_i_i.module = &module_env;
1280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env_f_ff.module = &module_env;
1281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(&sig_i_ff);
1283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_i_i,
1285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1)));
1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_i_ff,
1288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1)));
1289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_f_ff,
1291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1)));
1292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(
1294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_i_i,
1295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1), WASM_F32(0.2)));
1296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(
1298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_f_ff,
1299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1), WASM_F32(11)));
1300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, CallsWithMismatchedSigs2) {
1304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_i_i;
1305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(sigs.i_i());
1309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_I64(17)));
1311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_F32(17.1)));
1312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_F64(17.1)));
1313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, CallsWithMismatchedSigs3) {
1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_i_i;
1318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(sigs.i_f());
1322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_I8(17)));
1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_I64(27)));
1325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_F64(37.2)));
1326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddFunction(sigs.i_d());
1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(1, WASM_I8(16)));
1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(1, WASM_I64(16)));
1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(1, WASM_F32(17.6)));
1332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
1335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, SimpleIndirectCalls) {
1338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_i_i;
1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte f0 = module_env.AddSignature(sigs.i_v());
1343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte f1 = module_env.AddSignature(sigs.i_i());
1344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte f2 = module_env.AddSignature(sigs.i_ii());
1345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_CALL_INDIRECT0(f0, WASM_ZERO));
1347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_I8(22)));
1348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(
1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      env, WASM_CALL_INDIRECT(f2, WASM_ZERO, WASM_I8(32), WASM_I8(72)));
1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IndirectCallsOutOfBounds) {
1354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_i_i;
1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT0(0, WASM_ZERO));
1359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddSignature(sigs.i_v());
1360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_CALL_INDIRECT0(0, WASM_ZERO));
1361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(1, WASM_ZERO, WASM_I8(22)));
1363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddSignature(sigs.i_i());
1364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_CALL_INDIRECT(1, WASM_ZERO, WASM_I8(27)));
1365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(2, WASM_ZERO, WASM_I8(27)));
1367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, IndirectCallsWithMismatchedSigs3) {
1371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_i_i;
1372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte f0 = module_env.AddFunction(sigs.i_f());
1376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f0, WASM_ZERO, WASM_I8(17)));
1378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f0, WASM_ZERO, WASM_I64(27)));
1379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f0, WASM_ZERO, WASM_F64(37.2)));
1380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT0(f0, WASM_I8(17)));
1382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT0(f0, WASM_I64(27)));
1383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT0(f0, WASM_F64(37.2)));
1384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte f1 = module_env.AddFunction(sigs.i_d());
1386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_I8(16)));
1388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_I64(16)));
1389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_F32(17.6)));
1390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int32Globals) {
1394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_i_i;
1395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Int8());
1399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Uint8());
1400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Int16());
1401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Uint16());
1402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Int32());
1403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Uint32());
1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(0));
1406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(1));
1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(2));
1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(3));
1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(4));
1410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(5));
1411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0)));
1414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(2, WASM_GET_LOCAL(0)));
1415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(3, WASM_GET_LOCAL(0)));
1416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(4, WASM_GET_LOCAL(0)));
1417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(5, WASM_GET_LOCAL(0)));
1418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int32Globals_fail) {
1422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_i_i;
1423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Int64());
1427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Uint64());
1428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Float32());
1429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Float64());
1430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_LOAD_GLOBAL(0));
1432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_LOAD_GLOBAL(1));
1433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_LOAD_GLOBAL(2));
1434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_LOAD_GLOBAL(3));
1435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0)));
1438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_STORE_GLOBAL(2, WASM_GET_LOCAL(0)));
1439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(env, WASM_STORE_GLOBAL(3, WASM_GET_LOCAL(0)));
1440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Int64Globals) {
1444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_l_l;
1445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Int64());
1449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Uint64());
1450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(0));
1452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(1));
1453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0)));
1456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Float32Globals) {
1460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_f_ff;
1461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_f_ff;
1462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(env, sigs.f_ff());
1463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Float32());
1467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(0));
1469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Float64Globals) {
1474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env_d_dd;
1475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* env = &env_d_dd;
1476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  init_env(env, sigs.d_dd());
1477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module_env;
1478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env->module = &module_env;
1479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module_env.AddGlobal(MachineType::Float64());
1481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(0));
1483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, AllLoadGlobalCombinations) {
1488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LocalType local_type = kLocalTypes[i];
1490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t j = 0; j < arraysize(machineTypes); j++) {
1491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType mem_type = machineTypes[j];
1492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionEnv env;
1493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionSig sig(1, 0, &local_type);
1494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      TestModuleEnv module_env;
1495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      init_env(&env, &sig);
1496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      env.module = &module_env;
1497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      module_env.AddGlobal(mem_type);
1498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES_INLINE(&env, WASM_LOAD_GLOBAL(0));
1500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
1501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE_INLINE(&env, WASM_LOAD_GLOBAL(0));
1502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
1503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, AllStoreGlobalCombinations) {
1509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LocalType local_type = kLocalTypes[i];
1511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t j = 0; j < arraysize(machineTypes); j++) {
1512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MachineType mem_type = machineTypes[j];
1513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionEnv env;
1514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionSig sig(0, 1, &local_type);
1515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      TestModuleEnv module_env;
1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      init_env(&env, &sig);
1517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      env.module = &module_env;
1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      module_env.AddGlobal(mem_type);
1519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES_INLINE(&env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
1522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE_INLINE(&env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
1524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, BreakNesting1) {
1530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < 5; i++) {
1531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p)
1532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code[] = {WASM_BLOCK(
1533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        2, WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i, WASM_ZERO)),
1534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     WASM_SET_LOCAL(0, WASM_I8(1))),
1535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        WASM_GET_LOCAL(0))};
1536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (i < 3) {
1537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env_i_i, code);
1538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
1539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_FAILURE(&env_i_i, code);
1540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, BreakNesting2) {
1546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env_v_v.AddLocals(kAstI32, 1);
1547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < 5; i++) {
1548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) (return p)) (11)
1549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code[] = {
1550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        WASM_BLOCK(1, WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(i)),
1551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                WASM_SET_LOCAL(0, WASM_I8(1)))),
1552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        WASM_I8(11)};
1553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (i < 2) {
1554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env_v_v, code);
1555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
1556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_FAILURE(&env_v_v, code);
1557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, BreakNesting3) {
1563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  env_v_v.AddLocals(kAstI32, 1);
1564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < 5; i++) {
1565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // (block[1] (loop[1] (block[1] (if (get p) break[N])
1566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code[] = {WASM_BLOCK(
1567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        1, WASM_LOOP(
1568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               1, WASM_BLOCK(1, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(i)))))};
1569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (i < 3) {
1570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env_v_v, code);
1571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
1572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_FAILURE(&env_v_v, code);
1573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
1579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
1580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, BreaksWithMultipleTypes) {
1582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(
1583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_i_i,
1584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_BLOCK(2, WASM_BRV_IF(0, WASM_ZERO, WASM_I8(7)), WASM_F32(7.7)));
1585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_i_i,
1586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        WASM_BLOCK(2, WASM_BRV_IF(0, WASM_ZERO, WASM_I8(7)),
1587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   WASM_BRV_IF(0, WASM_ZERO, WASM_F32(7.7))));
1588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_i_i,
1589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        WASM_BLOCK(3, WASM_BRV_IF(0, WASM_ZERO, WASM_I8(8)),
1590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   WASM_BRV_IF(0, WASM_ZERO, WASM_I8(0)),
1591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   WASM_BRV_IF(0, WASM_ZERO, WASM_F32(7.7))));
1592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_i_i,
1593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        WASM_BLOCK(3, WASM_BRV_IF(0, WASM_ZERO, WASM_I8(9)),
1594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   WASM_BRV_IF(0, WASM_ZERO, WASM_F32(7.7)),
1595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   WASM_BRV_IF(0, WASM_ZERO, WASM_I8(11))));
1596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
1599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, BreakNesting_6_levels) {
1602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int mask = 0; mask < 64; mask++) {
1603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int i = 0; i < 14; i++) {
1604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code[] = {
1605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprBlock, 1,  // --
1606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprBlock, 1,  // --
1607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprBlock, 1,  // --
1608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprBlock, 1,  // --
1609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprBlock, 1,  // --
1610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprBlock, 1,  // --
1611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprBr,    static_cast<byte>(i),
1612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExprNop  // --
1613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      };
1614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int depth = 6;
1616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      for (int l = 0; l < 6; l++) {
1617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (mask & (1 << l)) {
1618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          code[l * 2] = kExprLoop;
1619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          depth++;
1620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
1621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
1622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (i < depth) {
1624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES(&env_v_v, code);
1625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
1626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE(&env_v_v, code);
1627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
1628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
1634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
1635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBreak_TypeCheck) {
1637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv* envs[] = {&env_i_i, &env_l_l, &env_f_ff, &env_d_dd};
1638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(envs); i++) {
1639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv* env = envs[i];
1640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // unify X and X => OK
1641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES_INLINE(
1642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        env, WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        WASM_GET_LOCAL(0)));
1644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // unify i32 and f32 => fail
1647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(
1648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_i_i,
1649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)), WASM_F32(1.2)));
1650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // unify f64 and f64 => OK
1652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(
1653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_d_dd,
1654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 WASM_F64(1.2)));
1656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
1659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBreak_TypeCheckAll) {
1662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code1[] = {WASM_BLOCK(2,
1663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                             WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                             WASM_GET_LOCAL(1))};
1665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte code2[] = {WASM_BLOCK(
1666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      2, WASM_IF(WASM_ZERO, WASM_BRV_IF(0, WASM_ZERO, WASM_GET_LOCAL(0))),
1667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_GET_LOCAL(1))};
1668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionEnv env;
1673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionSig sig(1, 2, storage);
1675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      init_env(&env, &sig);
1676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (i == j) {
1678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES(&env, code1);
1679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES(&env, code2);
1680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
1681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE(&env, code1);
1682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE(&env, code2);
1683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
1684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBr_Unify) {
1690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
1691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int which = 0; which < 2; which++) {
1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LocalType type = kLocalTypes[i];
1695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LocalType storage[] = {kAstI32, kAstI32, type};
1696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionSig sig(1, 2, storage);
1697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      init_env(&env, &sig);  // (i32, X) -> i32
1698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code1[] = {
1700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(which))),
1701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     WASM_GET_LOCAL(which ^ 1))};
1702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code2[] = {
1703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          WASM_LOOP(2, WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))),
1704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    WASM_GET_LOCAL(which ^ 1))};
1705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (type == kAstI32) {
1708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES(&env, code1);
1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES(&env, code2);
1710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
1711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE(&env, code1);
1712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE(&env, code2);
1713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
1714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBrIf_type) {
1720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(
1721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_i_i,
1722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_BLOCK(2, WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)),
1723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 WASM_GET_LOCAL(0)));
1724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(
1725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_d_dd,
1726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_BLOCK(2, WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)),
1727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 WASM_GET_LOCAL(0)));
1728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
1730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LocalType type = kLocalTypes[i];
1732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LocalType storage[] = {kAstI32, kAstI32, type};
1733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionSig sig(1, 2, storage);
1734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    init_env(&env, &sig);  // (i32, X) -> i32
1735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code1[] = {
1737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        WASM_BLOCK(2, WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)),
1738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   WASM_GET_LOCAL(0))};
1739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    byte code2[] = {
1741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        WASM_BLOCK(2, WASM_BRV_IF(0, WASM_GET_LOCAL(1), WASM_GET_LOCAL(0)),
1742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   WASM_GET_LOCAL(0))};
1743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (type == kAstI32) {
1744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env, code1);
1745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_VERIFIES(&env, code2);
1746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
1747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_FAILURE(&env, code1);
1748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_FAILURE(&env, code2);
1749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBrIf_Unify) {
1755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
1756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int which = 0; which < 2; which++) {
1758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LocalType type = kLocalTypes[i];
1760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LocalType storage[] = {kAstI32, kAstI32, type};
1761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FunctionSig sig(1, 2, storage);
1762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      init_env(&env, &sig);  // (i32, X) -> i32
1763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code1[] = {
1765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          WASM_BLOCK(2, WASM_BRV_IF(0, WASM_ZERO, WASM_GET_LOCAL(which)),
1766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     WASM_GET_LOCAL(which ^ 1))};
1767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      byte code2[] = {
1768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          WASM_LOOP(2, WASM_BRV_IF(1, WASM_ZERO, WASM_GET_LOCAL(which)),
1769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    WASM_GET_LOCAL(which ^ 1))};
1770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (type == kAstI32) {
1773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES(&env, code1);
1774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_VERIFIES(&env, code2);
1775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
1776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE(&env, code1);
1777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        EXPECT_FAILURE(&env, code2);
1778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
1779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch0) {
1785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static byte code[] = {kExprTableSwitch, 0, 0, 0, 0};
1786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_v_v, code);
1787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch0b) {
1791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static byte code[] = {kExprTableSwitch, 0, 0, 0, 0, kExprI8Const, 11};
1792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_v_v, code);
1793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_i_i, code);
1794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch0c) {
1798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static byte code[] = {
1799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_BLOCK(1, WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(0)), WASM_I8(67))};
1800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
1801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch1) {
1805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static byte code[] = {WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        WASM_TABLESWITCH_BODY(WASM_I8(0), WASM_I8(9))};
1807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
1808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
1809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_f_ff, code);
1810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_d_dd, code);
1811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch_off_end) {
1815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static byte code[] = {WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        WASM_TABLESWITCH_BODY(WASM_I8(0), WASM_I8(9))};
1817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (size_t len = arraysize(code) - 1; len > 0; len--) {
1818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Verify(kError, &env_v_v, code, code + len);
1819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch2) {
1824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static byte code[] = {
1825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)),
1826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_TABLESWITCH_BODY(WASM_I8(3), WASM_I8(10), WASM_I8(11))};
1827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_i_i, code);
1828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES(&env_v_v, code);
1829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_f_ff, code);
1830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE(&env_d_dd, code);
1831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
1835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
1836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch1b) {
1838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_i_i, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_ZERO));
1840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_f_ff, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_TABLESWITCH_BODY(WASM_ZERO, WASM_F32(0.0)));
1843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_d_dd, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_TABLESWITCH_BODY(WASM_ZERO, WASM_F64(0.0)));
1846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
1849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch_br) {
1852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_i_i, WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(0)),
1853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_GET_LOCAL(0));
1854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int depth = 0; depth < 2; depth++) {
1855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_VERIFIES_INLINE(
1856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        &env_i_i, WASM_BLOCK(1, WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(depth)),
1857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                             WASM_GET_LOCAL(0)));
1858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch_invalid_br) {
1863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int depth = 1; depth < 4; depth++) {
1864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE_INLINE(&env_i_i,
1865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(depth)),
1866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          WASM_GET_LOCAL(0));
1867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_FAILURE_INLINE(
1868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        &env_i_i,
1869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        WASM_BLOCK(1, WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(depth + 1)),
1870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   WASM_GET_LOCAL(0)));
1871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch_invalid_case_ref) {
1876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_i_i, WASM_TABLESWITCH_OP(0, 1, WASM_CASE(0)),
1877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        WASM_GET_LOCAL(0));
1878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_i_i, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(1)),
1879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_ZERO));
1880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
1884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
1885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch1_br) {
1887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(
1888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_i_i, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_ZERO)));
1890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
1893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch2_br) {
1896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(
1897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_i_i, WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)),
1898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(0)),
1899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            WASM_BRV(0, WASM_I8(1))));
1900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(
1902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_f_ff, WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)),
1903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_TABLESWITCH_BODY(WASM_ZERO, WASM_BRV(0, WASM_I8(3)),
1904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            WASM_BRV(0, WASM_I8(4))));
1905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, TableSwitch2x2) {
1909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(
1910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_i_i, WASM_TABLESWITCH_OP(2, 4, WASM_CASE(0), WASM_CASE(1),
1911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    WASM_CASE(0), WASM_CASE(1)),
1912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(3)),
1913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            WASM_BRV(0, WASM_I8(4))));
1914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
1918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
1919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, ExprBreakNesting1) {
1921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(1, WASM_BRV(0, WASM_ZERO)));
1922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(1, WASM_BR(0)));
1923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v,
1924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_BLOCK(1, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)));
1925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(1, WASM_BR_IF(0, WASM_ZERO)));
1926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BRV(0, WASM_ZERO)));
1928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BR(0)));
1929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v,
1930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         WASM_LOOP(1, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)));
1931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BR_IF(0, WASM_ZERO)));
1932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BRV(1, WASM_ZERO)));
1934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BR(1)));
1935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
1938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Select) {
1941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_VERIFIES_INLINE(
1942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_i_i,
1943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(tizer): Fix on arm and reenable.
1948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64
1949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmDecoderTest, Select_TypeCheck) {
1951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_i_i, WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0),
1952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              WASM_GET_LOCAL(0)));
1953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(&env_i_i, WASM_SELECT(WASM_GET_LOCAL(0), WASM_F64(0.25),
1955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              WASM_GET_LOCAL(0)));
1956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FAILURE_INLINE(
1958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      &env_i_i, WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_I64(0)));
1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
1962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass WasmOpcodeLengthTest : public TestWithZone {
1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
1966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WasmOpcodeLengthTest() : TestWithZone() {}
1967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
1968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPECT_LENGTH(expected, opcode)                          \
1971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {                                                              \
1972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte code[] = {opcode, 0, 0, 0, 0, 0, 0, 0, 0}; \
1973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_EQ(expected, OpcodeLength(code));                     \
1974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeLengthTest, Statements) {
1978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprNop);
1979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprBlock);
1980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprLoop);
1981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprIf);
1982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprIfElse);
1983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprSelect);
1984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprBr);
1985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprBrIf);
1986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeLengthTest, MiscExpressions) {
1990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI8Const);
1991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(5, kExprI32Const);
1992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(5, kExprF32Const);
1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(9, kExprI64Const);
1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(9, kExprF64Const);
1995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprGetLocal);
1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprSetLocal);
1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprLoadGlobal);
1998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprStoreGlobal);
1999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprCallFunction);
2000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprCallIndirect);
2001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprIf);
2002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprIfElse);
2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprBlock);
2004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprLoop);
2005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprBr);
2006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprBrIf);
2007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeLengthTest, VariableLength) {
2011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte size2[] = {kExprLoadGlobal, 1};
2012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte size3[] = {kExprLoadGlobal, 1 | 0x80, 2};
2013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte size4[] = {kExprLoadGlobal, 1 | 0x80, 2 | 0x80, 3};
2014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte size5[] = {kExprLoadGlobal, 1 | 0x80, 2 | 0x80, 3 | 0x80, 4};
2015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  byte size6[] = {kExprLoadGlobal, 1 | 0x80, 2 | 0x80, 3 | 0x80, 4 | 0x80, 5};
2016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(2, OpcodeLength(size2));
2018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(3, OpcodeLength(size3));
2019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(4, OpcodeLength(size4));
2020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(5, OpcodeLength(size5));
2021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(6, OpcodeLength(size6));
2022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeLengthTest, LoadsAndStores) {
2026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI32LoadMem8S);
2027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI32LoadMem8U);
2028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI32LoadMem16S);
2029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI32LoadMem16U);
2030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI32LoadMem);
2031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64LoadMem8S);
2032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64LoadMem8U);
2033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64LoadMem16S);
2034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64LoadMem16U);
2035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64LoadMem32S);
2036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64LoadMem32U);
2037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64LoadMem);
2038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprF32LoadMem);
2039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprF64LoadMem);
2040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI32StoreMem8);
2042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI32StoreMem16);
2043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI32StoreMem);
2044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64StoreMem8);
2045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64StoreMem16);
2046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64StoreMem32);
2047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprI64StoreMem);
2048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprF32StoreMem);
2049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(2, kExprF64StoreMem);
2050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeLengthTest, MiscMemExpressions) {
2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprMemorySize);
2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprGrowMemory);
2056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeLengthTest, SimpleExpressions) {
2060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Add);
2061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Sub);
2062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Mul);
2063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32DivS);
2064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32DivU);
2065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32RemS);
2066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32RemU);
2067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32And);
2068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Ior);
2069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Xor);
2070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Shl);
2071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32ShrU);
2072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32ShrS);
2073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Eq);
2074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Ne);
2075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32LtS);
2076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32LeS);
2077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32LtU);
2078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32LeU);
2079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32GtS);
2080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32GeS);
2081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32GtU);
2082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32GeU);
2083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Clz);
2084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Ctz);
2085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32Popcnt);
2086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprBoolNot);
2087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Add);
2088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Sub);
2089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Mul);
2090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64DivS);
2091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64DivU);
2092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64RemS);
2093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64RemU);
2094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64And);
2095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Ior);
2096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Xor);
2097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Shl);
2098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64ShrU);
2099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64ShrS);
2100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Eq);
2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Ne);
2102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64LtS);
2103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64LeS);
2104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64LtU);
2105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64LeU);
2106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64GtS);
2107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64GeS);
2108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64GtU);
2109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64GeU);
2110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Clz);
2111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Ctz);
2112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64Popcnt);
2113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Add);
2114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Sub);
2115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Mul);
2116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Div);
2117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Min);
2118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Max);
2119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Abs);
2120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Neg);
2121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32CopySign);
2122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Ceil);
2123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Floor);
2124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Trunc);
2125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32NearestInt);
2126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Sqrt);
2127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Eq);
2128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Ne);
2129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Lt);
2130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Le);
2131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Gt);
2132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32Ge);
2133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Add);
2134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Sub);
2135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Mul);
2136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Div);
2137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Min);
2138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Max);
2139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Abs);
2140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Neg);
2141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64CopySign);
2142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Ceil);
2143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Floor);
2144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Trunc);
2145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64NearestInt);
2146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Sqrt);
2147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Eq);
2148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Ne);
2149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Lt);
2150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Le);
2151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Gt);
2152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64Ge);
2153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32SConvertF32);
2154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32SConvertF64);
2155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32UConvertF32);
2156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32UConvertF64);
2157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32ConvertI64);
2158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64SConvertF32);
2159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64SConvertF64);
2160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64UConvertF32);
2161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64UConvertF64);
2162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64SConvertI32);
2163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64UConvertI32);
2164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32SConvertI32);
2165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32UConvertI32);
2166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32SConvertI64);
2167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32UConvertI64);
2168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32ConvertF64);
2169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF32ReinterpretI32);
2170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64SConvertI32);
2171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64UConvertI32);
2172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64SConvertI64);
2173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64UConvertI64);
2174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64ConvertF32);
2175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprF64ReinterpretI64);
2176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI32ReinterpretF32);
2177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_LENGTH(1, kExprI64ReinterpretF64);
2178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass WasmOpcodeArityTest : public TestWithZone {
2182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
2183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WasmOpcodeArityTest() : TestWithZone() {}
2184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
2185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define EXPECT_ARITY(expected, ...)               \
2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {                                               \
2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static const byte code[] = {__VA_ARGS__};     \
2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_EQ(expected, OpcodeArity(&env, code)); \
2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeArityTest, Control) {
2195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
2196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprNop);
2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprBlock, 0);
2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprBlock, 1);
2200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprBlock, 2);
2201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(5, kExprBlock, 5);
2202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(10, kExprBlock, 10);
2203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprLoop, 0);
2205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprLoop, 1);
2206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprLoop, 2);
2207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(7, kExprLoop, 7);
2208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(11, kExprLoop, 11);
2209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprIf);
2211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(3, kExprIfElse);
2212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(3, kExprSelect);
2213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprBr);
2215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprBrIf);
2216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TestSignatures sigs;
2219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env;
2220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WasmDecoderTest::init_env(&env, sigs.v_v());
2221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(0, kExprReturn);
2222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WasmDecoderTest::init_env(&env, sigs.i_i());
2223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(1, kExprReturn);
2224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeArityTest, Misc) {
2229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
2230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprI8Const);
2232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprI32Const);
2233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprF32Const);
2234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprI64Const);
2235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprF64Const);
2236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprGetLocal);
2237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprSetLocal);
2238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprLoadGlobal);
2239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprStoreGlobal);
2240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeArityTest, Calls) {
2244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestSignatures sigs;
2245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TestModuleEnv module;
2246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module.AddFunction(sigs.i_ii());
2247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module.AddFunction(sigs.i_i());
2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module.AddSignature(sigs.f_ff());
2250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  module.AddSignature(sigs.i_d());
2251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env;
2254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WasmDecoderTest::init_env(&env, sigs.i_ii());
2255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env.module = &module;
2256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(2, kExprCallFunction, 0);
2258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(3, kExprCallIndirect, 0);
2259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(1, kExprBr);
2260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(2, kExprBrIf);
2261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
2264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FunctionEnv env;
2265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WasmDecoderTest::init_env(&env, sigs.v_v());
2266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    env.module = &module;
2267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(1, kExprCallFunction, 1);
2269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(2, kExprCallIndirect, 1);
2270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(1, kExprBr);
2271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_ARITY(2, kExprBrIf);
2272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeArityTest, LoadsAndStores) {
2277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
2278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32LoadMem8S);
2280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32LoadMem8U);
2281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32LoadMem16S);
2282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32LoadMem16U);
2283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32LoadMem);
2284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64LoadMem8S);
2286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64LoadMem8U);
2287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64LoadMem16S);
2288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64LoadMem16U);
2289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64LoadMem32S);
2290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64LoadMem32U);
2291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64LoadMem);
2292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32LoadMem);
2293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64LoadMem);
2294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32StoreMem8);
2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32StoreMem16);
2297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32StoreMem);
2298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64StoreMem8);
2299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64StoreMem16);
2300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64StoreMem32);
2301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64StoreMem);
2302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32StoreMem);
2303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64StoreMem);
2304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeArityTest, MiscMemExpressions) {
2308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(0, kExprMemorySize);
2311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprGrowMemory);
2312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(WasmOpcodeArityTest, SimpleExpressions) {
2316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FunctionEnv env;
2317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32Add);
2319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32Sub);
2320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32Mul);
2321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32DivS);
2322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32DivU);
2323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32RemS);
2324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32RemU);
2325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32And);
2326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32Ior);
2327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32Xor);
2328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32Shl);
2329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32ShrU);
2330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32ShrS);
2331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32Eq);
2332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32Ne);
2333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32LtS);
2334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32LeS);
2335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32LtU);
2336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32LeU);
2337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32GtS);
2338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32GeS);
2339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32GtU);
2340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI32GeU);
2341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32Clz);
2342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32Ctz);
2343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32Popcnt);
2344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprBoolNot);
2345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64Add);
2346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64Sub);
2347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64Mul);
2348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64DivS);
2349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64DivU);
2350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64RemS);
2351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64RemU);
2352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64And);
2353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64Ior);
2354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64Xor);
2355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64Shl);
2356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64ShrU);
2357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64ShrS);
2358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64Eq);
2359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64Ne);
2360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64LtS);
2361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64LeS);
2362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64LtU);
2363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64LeU);
2364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64GtS);
2365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64GeS);
2366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64GtU);
2367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprI64GeU);
2368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64Clz);
2369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64Ctz);
2370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64Popcnt);
2371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Add);
2372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Sub);
2373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Mul);
2374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Div);
2375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Min);
2376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Max);
2377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32Abs);
2378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32Neg);
2379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32CopySign);
2380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32Ceil);
2381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32Floor);
2382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32Trunc);
2383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32NearestInt);
2384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32Sqrt);
2385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Eq);
2386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Ne);
2387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Lt);
2388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Le);
2389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Gt);
2390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF32Ge);
2391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Add);
2392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Sub);
2393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Mul);
2394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Div);
2395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Min);
2396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Max);
2397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64Abs);
2398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64Neg);
2399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64CopySign);
2400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64Ceil);
2401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64Floor);
2402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64Trunc);
2403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64NearestInt);
2404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64Sqrt);
2405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Eq);
2406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Ne);
2407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Lt);
2408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Le);
2409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Gt);
2410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(2, kExprF64Ge);
2411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32SConvertF32);
2412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32SConvertF64);
2413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32UConvertF32);
2414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32UConvertF64);
2415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32ConvertI64);
2416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64SConvertF32);
2417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64SConvertF64);
2418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64UConvertF32);
2419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64UConvertF64);
2420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64SConvertI32);
2421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64UConvertI32);
2422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32SConvertI32);
2423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32UConvertI32);
2424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32SConvertI64);
2425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32UConvertI64);
2426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32ConvertF64);
2427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF32ReinterpretI32);
2428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64SConvertI32);
2429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64UConvertI32);
2430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64SConvertI64);
2431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64UConvertI64);
2432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64ConvertF32);
2433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprF64ReinterpretI64);
2434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI32ReinterpretF32);
2435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_ARITY(1, kExprI64ReinterpretF64);
2436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace wasm
2438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
2439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
2440