17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file.
47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef V8_COMPILER_JS_OPERATOR_H_
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define V8_COMPILER_JS_OPERATOR_H_
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
831c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org#include "src/compiler/linkage.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/opcodes.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/operator.h"
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/unique.h"
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/zone.h"
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 {
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal {
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler {
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Defines the location of a context slot relative to a specific scope. This is
197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// used as a parameter by JSLoadContext and JSStoreContext operators and allows
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// accessing a context-allocated variable without keeping track of the scope.
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass ContextAccess {
227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public:
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ContextAccess(int depth, int index, bool immutable)
247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      : immutable_(immutable), depth_(depth), index_(index) {
25e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(0 <= depth && depth <= kMaxUInt16);
26e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(0 <= index && static_cast<uint32_t>(index) <= kMaxUInt32);
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int depth() const { return depth_; }
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int index() const { return index_; }
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  bool immutable() const { return immutable_; }
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private:
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // For space reasons, we keep this tightly packed, otherwise we could just use
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // a simple int/int/bool POD.
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  const bool immutable_;
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  const uint16_t depth_;
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  const uint32_t index_;
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
409d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// Defines the property being loaded from an object by a named load. This is
419d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// used as a parameter by JSLoadNamed operators.
429d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgstruct LoadNamedParameters {
431af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org  Unique<Name> name;
449d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  ContextualMode contextual_mode;
459d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org};
469d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Defines the arity and the call flags for a JavaScript function call. This is
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// used as a parameter by JSCall operators.
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstruct CallParameters {
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int arity;
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CallFunctionFlags flags;
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
54c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org// Defines the property being stored to an object by a named store. This is
55c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org// used as a parameter by JSStoreNamed operators.
56c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.orgstruct StoreNamedParameters {
57c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org  StrictMode strict_mode;
581af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org  Unique<Name> name;
59c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org};
60c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org
617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Interface for building JavaScript-level operators, e.g. directly from the
627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// AST. Most operators have no parameters, thus can be globally shared for all
637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// graphs.
647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass JSOperatorBuilder {
657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public:
667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  explicit JSOperatorBuilder(Zone* zone) : zone_(zone) {}
677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define SIMPLE(name, properties, inputs, outputs) \
697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return new (zone_)                              \
707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      SimpleOperator(IrOpcode::k##name, properties, inputs, outputs, #name);
717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define NOPROPS(name, inputs, outputs) \
737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SIMPLE(name, Operator::kNoProperties, inputs, outputs)
747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define OP1(name, ptype, pname, properties, inputs, outputs)                 \
767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return new (zone_) Operator1<ptype>(IrOpcode::k##name, properties, inputs, \
777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                      outputs, #name, pname)
787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define BINOP(name) NOPROPS(name, 2, 1)
807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define UNOP(name) NOPROPS(name, 1, 1)
817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define PURE_BINOP(name) SIMPLE(name, Operator::kPure, 2, 1)
837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Equal() { BINOP(JSEqual); }
852c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* NotEqual() { BINOP(JSNotEqual); }
862c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* StrictEqual() { PURE_BINOP(JSStrictEqual); }
872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* StrictNotEqual() { PURE_BINOP(JSStrictNotEqual); }
882c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* LessThan() { BINOP(JSLessThan); }
892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* GreaterThan() { BINOP(JSGreaterThan); }
902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* LessThanOrEqual() { BINOP(JSLessThanOrEqual); }
912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* GreaterThanOrEqual() { BINOP(JSGreaterThanOrEqual); }
922c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* BitwiseOr() { BINOP(JSBitwiseOr); }
932c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* BitwiseXor() { BINOP(JSBitwiseXor); }
942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* BitwiseAnd() { BINOP(JSBitwiseAnd); }
952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* ShiftLeft() { BINOP(JSShiftLeft); }
962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* ShiftRight() { BINOP(JSShiftRight); }
972c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* ShiftRightLogical() { BINOP(JSShiftRightLogical); }
982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Add() { BINOP(JSAdd); }
992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Subtract() { BINOP(JSSubtract); }
1002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Multiply() { BINOP(JSMultiply); }
1012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Divide() { BINOP(JSDivide); }
1022c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Modulus() { BINOP(JSModulus); }
1032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
1042c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* UnaryNot() { UNOP(JSUnaryNot); }
1052c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* ToBoolean() { UNOP(JSToBoolean); }
1062c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* ToNumber() { UNOP(JSToNumber); }
1072c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* ToString() { UNOP(JSToString); }
1082c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* ToName() { UNOP(JSToName); }
1092c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* ToObject() { UNOP(JSToObject); }
1102c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Yield() { UNOP(JSYield); }
1112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
1122c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Create() { SIMPLE(JSCreate, Operator::kEliminatable, 0, 1); }
1132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
1142c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Call(int arguments, CallFunctionFlags flags) {
1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CallParameters parameters = {arguments, flags};
1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    OP1(JSCallFunction, CallParameters, parameters, Operator::kNoProperties,
1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        arguments, 1);
1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1202c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* CallNew(int arguments) {
1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    return new (zone_)
1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        Operator1<int>(IrOpcode::kJSCallConstruct, Operator::kNoProperties,
1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                       arguments, 1, "JSCallConstruct", arguments);
1247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1262c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* LoadProperty() { BINOP(JSLoadProperty); }
1272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* LoadNamed(Unique<Name> name,
1282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                            ContextualMode contextual_mode = NOT_CONTEXTUAL) {
1299d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org    LoadNamedParameters parameters = {name, contextual_mode};
1309d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org    OP1(JSLoadNamed, LoadNamedParameters, parameters, Operator::kNoProperties,
1319d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org        1, 1);
1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1342c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* StoreProperty(StrictMode strict_mode) {
135c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org    OP1(JSStoreProperty, StrictMode, strict_mode, Operator::kNoProperties, 3,
1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        0);
1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* StoreNamed(StrictMode strict_mode, Unique<Name> name) {
140c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org    StoreNamedParameters parameters = {strict_mode, name};
141c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org    OP1(JSStoreNamed, StoreNamedParameters, parameters, Operator::kNoProperties,
142c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org        2, 0);
143c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org  }
144c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org
1452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* DeleteProperty(StrictMode strict_mode) {
1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    OP1(JSDeleteProperty, StrictMode, strict_mode, Operator::kNoProperties, 2,
1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        1);
1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* HasProperty() { NOPROPS(JSHasProperty, 2, 1); }
1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* LoadContext(uint16_t depth, uint32_t index, bool immutable) {
1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    ContextAccess access(depth, index, immutable);
1547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    OP1(JSLoadContext, ContextAccess, access,
1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        Operator::kEliminatable | Operator::kNoWrite, 1, 1);
1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* StoreContext(uint16_t depth, uint32_t index) {
1587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    ContextAccess access(depth, index, false);
1592c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    OP1(JSStoreContext, ContextAccess, access, Operator::kNoProperties, 2, 0);
1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1622c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* TypeOf() { SIMPLE(JSTypeOf, Operator::kPure, 1, 1); }
1632c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* InstanceOf() { NOPROPS(JSInstanceOf, 2, 1); }
1642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Debugger() { NOPROPS(JSDebugger, 0, 0); }
1657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer): nail down the static parts of each of these context flavors.
1672c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* CreateFunctionContext() {
1682c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    NOPROPS(JSCreateFunctionContext, 1, 1);
1692c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
1702c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* CreateCatchContext(Unique<String> name) {
1711af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org    OP1(JSCreateCatchContext, Unique<String>, name, Operator::kNoProperties, 1,
1721af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org        1);
1737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* CreateWithContext() { NOPROPS(JSCreateWithContext, 2, 1); }
1752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* CreateBlockContext() { NOPROPS(JSCreateBlockContext, 2, 1); }
1762c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* CreateModuleContext() {
1772c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    NOPROPS(JSCreateModuleContext, 2, 1);
1782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
1792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* CreateGlobalContext() {
1802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    NOPROPS(JSCreateGlobalContext, 2, 1);
1812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
1827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* Runtime(Runtime::FunctionId function, int arguments) {
1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    const Runtime::Function* f = Runtime::FunctionForId(function);
185e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(f->nargs == -1 || f->nargs == arguments);
1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    OP1(JSCallRuntime, Runtime::FunctionId, function, Operator::kNoProperties,
1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        arguments, f->result_size);
1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef SIMPLE
1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef NOPROPS
1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef OP1
1937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef BINOP
1947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef UNOP
1957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private:
1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Zone* zone_;
1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Specialization for static parameters of type {ContextAccess}.
2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <>
2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstruct StaticParameterTraits<ContextAccess> {
2037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static OStream& PrintTo(OStream& os, ContextAccess val) {  // NOLINT
2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    return os << val.depth() << "," << val.index()
2057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org              << (val.immutable() ? ",imm" : "");
2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static int HashCode(ContextAccess val) {
2087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    return (val.depth() << 16) | (val.index() & 0xffff);
2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static bool Equals(ContextAccess a, ContextAccess b) {
2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    return a.immutable() == b.immutable() && a.depth() == b.depth() &&
2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org           a.index() == b.index();
2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
2157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Specialization for static parameters of type {Runtime::FunctionId}.
2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <>
2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstruct StaticParameterTraits<Runtime::FunctionId> {
2197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static OStream& PrintTo(OStream& os, Runtime::FunctionId val) {  // NOLINT
2207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    const Runtime::Function* f = Runtime::FunctionForId(val);
2217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    return os << (f->name ? f->name : "?Runtime?");
2227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static int HashCode(Runtime::FunctionId val) { return static_cast<int>(val); }
2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static bool Equals(Runtime::FunctionId a, Runtime::FunctionId b) {
2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    return a == b;
2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
2282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
2292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org}  // namespace compiler
2302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org}  // namespace internal
2312c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org}  // namespace v8
2327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif  // V8_COMPILER_JS_OPERATOR_H_
234