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