Upgrade V8 to version 4.9.385.28

https://chromium.googlesource.com/v8/v8/+/4.9.385.28

FPIIM-449

Change-Id: I4b2e74289d4bf3667f2f3dc8aa2e541f63e26eb4
diff --git a/src/wasm/wasm-opcodes.cc b/src/wasm/wasm-opcodes.cc
new file mode 100644
index 0000000..25eef03
--- /dev/null
+++ b/src/wasm/wasm-opcodes.cc
@@ -0,0 +1,133 @@
+// 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