blob: 25eef034d7f3e7b86d6d9c78d52b14fdc83c38c9 [file] [log] [blame]
// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/wasm/wasm-opcodes.h"
#include "src/signature.h"
namespace v8 {
namespace internal {
namespace wasm {
typedef Signature<LocalType> FunctionSig;
const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) {
switch (opcode) {
#define DECLARE_NAME_CASE(name, opcode, sig) \
case kExpr##name: \
return "Expr" #name;
FOREACH_OPCODE(DECLARE_NAME_CASE)
#undef DECLARE_NAME_CASE
default:
break;
}
return "Unknown";
}
#define DECLARE_SIG_ENUM(name, ...) kSigEnum_##name,
enum WasmOpcodeSig { FOREACH_SIGNATURE(DECLARE_SIG_ENUM) };
// TODO(titzer): not static-initializer safe. Wrap in LazyInstance.
#define DECLARE_SIG(name, ...) \
static LocalType kTypes_##name[] = {__VA_ARGS__}; \
static const FunctionSig kSig_##name( \
1, static_cast<int>(arraysize(kTypes_##name)) - 1, kTypes_##name);
FOREACH_SIGNATURE(DECLARE_SIG)
#define DECLARE_SIG_ENTRY(name, ...) &kSig_##name,
static const FunctionSig* kSimpleExprSigs[] = {
nullptr, FOREACH_SIGNATURE(DECLARE_SIG_ENTRY)};
static byte kSimpleExprSigTable[256];
// Initialize the signature table.
static void InitSigTable() {
#define SET_SIG_TABLE(name, opcode, sig) \
kSimpleExprSigTable[opcode] = static_cast<int>(kSigEnum_##sig) + 1;
FOREACH_SIMPLE_OPCODE(SET_SIG_TABLE);
#undef SET_SIG_TABLE
}
FunctionSig* WasmOpcodes::Signature(WasmOpcode opcode) {
// TODO(titzer): use LazyInstance to make this thread safe.
if (kSimpleExprSigTable[kExprI32Add] == 0) InitSigTable();
return const_cast<FunctionSig*>(
kSimpleExprSigs[kSimpleExprSigTable[static_cast<byte>(opcode)]]);
}
// TODO(titzer): pull WASM_64 up to a common header.
#if !V8_TARGET_ARCH_32_BIT || V8_TARGET_ARCH_X64
#define WASM_64 1
#else
#define WASM_64 0
#endif
bool WasmOpcodes::IsSupported(WasmOpcode opcode) {
#if !WASM_64
switch (opcode) {
// Opcodes not supported on 32-bit platforms.
case kExprI64Add:
case kExprI64Sub:
case kExprI64Mul:
case kExprI64DivS:
case kExprI64DivU:
case kExprI64RemS:
case kExprI64RemU:
case kExprI64And:
case kExprI64Ior:
case kExprI64Xor:
case kExprI64Shl:
case kExprI64ShrU:
case kExprI64ShrS:
case kExprI64Eq:
case kExprI64Ne:
case kExprI64LtS:
case kExprI64LeS:
case kExprI64LtU:
case kExprI64LeU:
case kExprI64GtS:
case kExprI64GeS:
case kExprI64GtU:
case kExprI64GeU:
case kExprI32ConvertI64:
case kExprI64SConvertI32:
case kExprI64UConvertI32:
case kExprF64ReinterpretI64:
case kExprI64ReinterpretF64:
case kExprI64Clz:
case kExprI64Ctz:
case kExprI64Popcnt:
case kExprF32SConvertI64:
case kExprF32UConvertI64:
case kExprF64SConvertI64:
case kExprF64UConvertI64:
case kExprI64SConvertF32:
case kExprI64SConvertF64:
case kExprI64UConvertF32:
case kExprI64UConvertF64:
return false;
default:
return true;
}
#else
return true;
#endif
}
} // namespace wasm
} // namespace internal
} // namespace v8