17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 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
56313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#include "src/code-factory.h"
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/code-stubs.h"
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/common-operator.h"
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/graph-inl.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/js-generic-lowering.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/machine-operator.h"
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-aux-data-inl.h"
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-properties-inl.h"
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/unique.h"
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 {
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal {
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler {
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
19b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgJSGenericLowering::JSGenericLowering(CompilationInfo* info, JSGraph* jsgraph)
205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    : info_(info),
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      jsgraph_(jsgraph),
22b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org      linkage_(new (jsgraph->zone()) Linkage(info)) {}
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
252c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgvoid JSGenericLowering::PatchOperator(Node* node, const Operator* op) {
267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  node->set_op(op);
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid JSGenericLowering::PatchInsertInput(Node* node, int index, Node* input) {
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  node->InsertInput(zone(), index, input);
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgNode* JSGenericLowering::SmiConstant(int32_t immediate) {
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return jsgraph()->SmiConstant(immediate);
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgNode* JSGenericLowering::Int32Constant(int immediate) {
417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return jsgraph()->Int32Constant(immediate);
427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgNode* JSGenericLowering::CodeConstant(Handle<Code> code) {
467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return jsgraph()->HeapConstant(code);
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgNode* JSGenericLowering::FunctionConstant(Handle<JSFunction> function) {
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return jsgraph()->HeapConstant(function);
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgNode* JSGenericLowering::ExternalConstant(ExternalReference ref) {
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return jsgraph()->ExternalConstant(ref);
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgReduction JSGenericLowering::Reduce(Node* node) {
617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  switch (node->opcode()) {
62b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org#define DECLARE_CASE(x) \
63b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  case IrOpcode::k##x:  \
64b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    Lower##x(node);     \
657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    break;
667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    DECLARE_CASE(Branch)
677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    JS_OP_LIST(DECLARE_CASE)
687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef DECLARE_CASE
697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    default:
707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      // Nothing to see.
715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      return NoChange();
727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
73b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  return Changed(node);
747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
776313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#define REPLACE_BINARY_OP_IC_CALL(op, token)                             \
78b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  void JSGenericLowering::Lower##op(Node* node) {                        \
796313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org    ReplaceWithStubCall(node, CodeFactory::BinaryOpIC(isolate(), token), \
806313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org                        CallDescriptor::kPatchableCallSiteWithNop);      \
817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
82d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSBitwiseOr, Token::BIT_OR)
83d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSBitwiseXor, Token::BIT_XOR)
84d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSBitwiseAnd, Token::BIT_AND)
85d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSShiftLeft, Token::SHL)
86d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSShiftRight, Token::SAR)
87d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSShiftRightLogical, Token::SHR)
88d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSAdd, Token::ADD)
89d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSSubtract, Token::SUB)
90d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSMultiply, Token::MUL)
91d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSDivide, Token::DIV)
92d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgREPLACE_BINARY_OP_IC_CALL(JSModulus, Token::MOD)
93d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org#undef REPLACE_BINARY_OP_IC_CALL
94d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
95d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
96b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org#define REPLACE_COMPARE_IC_CALL(op, token, pure)  \
97b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  void JSGenericLowering::Lower##op(Node* node) { \
98b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    ReplaceWithCompareIC(node, token, pure);      \
997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_COMPARE_IC_CALL(JSEqual, Token::EQ, false)
1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_COMPARE_IC_CALL(JSNotEqual, Token::NE, false)
1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_COMPARE_IC_CALL(JSStrictEqual, Token::EQ_STRICT, true)
1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_COMPARE_IC_CALL(JSStrictNotEqual, Token::NE_STRICT, true)
1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_COMPARE_IC_CALL(JSLessThan, Token::LT, false)
1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_COMPARE_IC_CALL(JSGreaterThan, Token::GT, false)
1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_COMPARE_IC_CALL(JSLessThanOrEqual, Token::LTE, false)
1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_COMPARE_IC_CALL(JSGreaterThanOrEqual, Token::GTE, false)
1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef REPLACE_COMPARE_IC_CALL
1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
111b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org#define REPLACE_RUNTIME_CALL(op, fun)             \
112b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  void JSGenericLowering::Lower##op(Node* node) { \
113b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    ReplaceWithRuntimeCall(node, fun);            \
1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_RUNTIME_CALL(JSTypeOf, Runtime::kTypeof)
1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_RUNTIME_CALL(JSCreate, Runtime::kAbort)
1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_RUNTIME_CALL(JSCreateFunctionContext, Runtime::kNewFunctionContext)
1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_RUNTIME_CALL(JSCreateCatchContext, Runtime::kPushCatchContext)
1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_RUNTIME_CALL(JSCreateWithContext, Runtime::kPushWithContext)
1207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_RUNTIME_CALL(JSCreateBlockContext, Runtime::kPushBlockContext)
1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_RUNTIME_CALL(JSCreateModuleContext, Runtime::kPushModuleContext)
1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_RUNTIME_CALL(JSCreateGlobalContext, Runtime::kAbort)
1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef REPLACE_RUNTIME
1247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
126b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org#define REPLACE_UNIMPLEMENTED(op) \
127b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  void JSGenericLowering::Lower##op(Node* node) { UNIMPLEMENTED(); }
1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_UNIMPLEMENTED(JSToName)
1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_UNIMPLEMENTED(JSYield)
1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgREPLACE_UNIMPLEMENTED(JSDebugger)
1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef REPLACE_UNIMPLEMENTED
1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
134d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.orgstatic CallDescriptor::Flags FlagsForNode(Node* node) {
135d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  CallDescriptor::Flags result = CallDescriptor::kNoFlags;
136a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  if (OperatorProperties::HasFrameStateInput(node->op())) {
137a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    result |= CallDescriptor::kNeedsFrameState;
138a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
139d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  return result;
14031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org}
14131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org
14231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org
1437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token,
1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                             bool pure) {
1456313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Callable callable = CodeFactory::CompareIC(isolate(), token);
14621d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  bool has_frame_state = OperatorProperties::HasFrameStateInput(node->op());
147d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  CallDescriptor* desc_compare = linkage()->GetStubCallDescriptor(
1486313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      callable.descriptor(), 0,
1496313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node));
15021d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  NodeVector inputs(zone());
15121d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  inputs.reserve(node->InputCount() + 1);
1526313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  inputs.push_back(CodeConstant(callable.code()));
15321d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  inputs.push_back(NodeProperties::GetValueInput(node, 0));
15421d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  inputs.push_back(NodeProperties::GetValueInput(node, 1));
15521d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  inputs.push_back(NodeProperties::GetContextInput(node));
1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  if (pure) {
15721d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    // A pure (strict) comparison doesn't have an effect, control or frame
15821d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    // state.  But for the graph, we need to add control and effect inputs.
15921d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    DCHECK(!has_frame_state);
16021d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    inputs.push_back(graph()->start());
16121d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    inputs.push_back(graph()->start());
1627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  } else {
16321d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    DCHECK(has_frame_state == FLAG_turbo_deoptimization);
16421d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    if (FLAG_turbo_deoptimization) {
16521d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org      inputs.push_back(NodeProperties::GetFrameStateInput(node));
16621d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    }
16721d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    inputs.push_back(NodeProperties::GetEffectInput(node));
16821d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    inputs.push_back(NodeProperties::GetControlInput(node));
1697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
17021d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  Node* compare =
17121d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org      graph()->NewNode(common()->Call(desc_compare),
17221d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org                       static_cast<int>(inputs.size()), &inputs.front());
17321d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org
1747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  node->ReplaceInput(0, compare);
1757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  node->ReplaceInput(1, SmiConstant(token));
17621d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org
17721d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  if (has_frame_state) {
17821d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org    // Remove the frame state from inputs.
179b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    node->RemoveInput(NodeProperties::FirstFrameStateIndex(node));
18021d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  }
18121d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org
1827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReplaceWithRuntimeCall(node, Runtime::kBooleanize);
1837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1866313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgvoid JSGenericLowering::ReplaceWithStubCall(Node* node, Callable callable,
187d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org                                            CallDescriptor::Flags flags) {
1886313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  CallDescriptor* desc = linkage()->GetStubCallDescriptor(
1896313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      callable.descriptor(), 0, flags | FlagsForNode(node));
1906313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Node* stub_code = CodeConstant(callable.code());
1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 0, stub_code);
1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchOperator(node, common()->Call(desc));
1937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid JSGenericLowering::ReplaceWithBuiltinCall(Node* node,
1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               Builtins::JavaScript id,
1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               int nargs) {
1996313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Callable callable =
2006313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      CodeFactory::CallFunction(isolate(), nargs - 1, NO_CALL_FUNCTION_FLAGS);
2016313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  CallDescriptor* desc =
2026313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      linkage()->GetStubCallDescriptor(callable.descriptor(), nargs);
2037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(mstarzinger): Accessing the builtins object this way prevents sharing
2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // of code across native contexts. Fix this by loading from given context.
2057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Handle<JSFunction> function(
2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      JSFunction::cast(info()->context()->builtins()->javascript_builtin(id)));
2076313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Node* stub_code = CodeConstant(callable.code());
2087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* function_node = FunctionConstant(function);
2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 0, stub_code);
2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 1, function_node);
2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchOperator(node, common()->Call(desc));
2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid JSGenericLowering::ReplaceWithRuntimeCall(Node* node,
2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               Runtime::FunctionId f,
2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               int nargs_override) {
21821d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  Operator::Properties properties = node->op()->properties();
2197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  const Runtime::Function* fun = Runtime::FunctionForId(f);
2207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int nargs = (nargs_override < 0) ? fun->nargs : nargs_override;
221d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  CallDescriptor* desc =
22221d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org      linkage()->GetRuntimeCallDescriptor(f, nargs, properties);
2237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* ref = ExternalConstant(ExternalReference(f, isolate()));
2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* arity = Int32Constant(nargs);
2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  if (!centrystub_constant_.is_set()) {
2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    centrystub_constant_.set(CodeConstant(CEntryStub(isolate(), 1).GetCode()));
2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 0, centrystub_constant_.get());
2297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, nargs + 1, ref);
2307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, nargs + 2, arity);
2317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchOperator(node, common()->Call(desc));
2327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
235b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerBranch(Node* node) {
236d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  if (!info()->is_typing_enabled()) {
237d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org    // TODO(mstarzinger): If typing is enabled then simplified lowering will
238d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org    // have inserted the correct ChangeBoolToBit, otherwise we need to perform
239d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org    // poor-man's representation inference here and insert manual change.
240d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org    Node* test = graph()->NewNode(machine()->WordEqual(), node->InputAt(0),
241d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org                                  jsgraph()->TrueConstant());
242d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org    node->ReplaceInput(0, test);
243d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  }
2447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
247b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSUnaryNot(Node* node) {
2486313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Callable callable = CodeFactory::ToBoolean(
2496313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      isolate(), ToBooleanStub::RESULT_AS_INVERSE_ODDBALL);
2506313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
2517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
254b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSToBoolean(Node* node) {
2556313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Callable callable =
2566313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      CodeFactory::ToBoolean(isolate(), ToBooleanStub::RESULT_AS_ODDBALL);
2576313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
2587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
261b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSToNumber(Node* node) {
262b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  Callable callable = CodeFactory::ToNumber(isolate());
263b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  ReplaceWithStubCall(node, callable, CallDescriptor::kNoFlags);
264b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org}
265b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
266b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
267b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSToString(Node* node) {
268ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  ReplaceWithBuiltinCall(node, Builtins::TO_STRING, 1);
269ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org}
270ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org
271ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org
272b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSToObject(Node* node) {
2737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReplaceWithBuiltinCall(node, Builtins::TO_OBJECT, 1);
2747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
277b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSLoadProperty(Node* node) {
2786313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Callable callable = CodeFactory::KeyedLoadIC(isolate());
2796313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
2807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
283b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSLoadNamed(Node* node) {
2849d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  LoadNamedParameters p = OpParameter<LoadNamedParameters>(node);
2856313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Callable callable = CodeFactory::LoadIC(isolate(), p.contextual_mode);
286b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  PatchInsertInput(node, 1, jsgraph()->HeapConstant(p.name));
2876313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
2887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
291b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSStoreProperty(Node* node) {
292c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org  StrictMode strict_mode = OpParameter<StrictMode>(node);
2936313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Callable callable = CodeFactory::KeyedStoreIC(isolate(), strict_mode);
2946313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
2957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
298b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSStoreNamed(Node* node) {
299c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org  StoreNamedParameters params = OpParameter<StoreNamedParameters>(node);
3006313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  Callable callable = CodeFactory::StoreIC(isolate(), params.strict_mode);
301c714f377950c6a8a80b90ddca93ad8bd23ce362amachenbach@chromium.org  PatchInsertInput(node, 1, jsgraph()->HeapConstant(params.name));
3026313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite);
3037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
306b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSDeleteProperty(Node* node) {
3077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  StrictMode strict_mode = OpParameter<StrictMode>(node);
3087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 2, SmiConstant(strict_mode));
3097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReplaceWithBuiltinCall(node, Builtins::DELETE, 3);
3107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
313b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSHasProperty(Node* node) {
3147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReplaceWithBuiltinCall(node, Builtins::IN, 2);
3157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
318b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSInstanceOf(Node* node) {
3197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  InstanceofStub::Flags flags = static_cast<InstanceofStub::Flags>(
3207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      InstanceofStub::kReturnTrueFalseObject |
3217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      InstanceofStub::kArgsInRegisters);
3227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  InstanceofStub stub(isolate(), flags);
323e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor();
324e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  CallDescriptor* desc = linkage()->GetStubCallDescriptor(d, 0);
3257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* stub_code = CodeConstant(stub.GetCode());
3267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 0, stub_code);
3277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchOperator(node, common()->Call(desc));
3287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
331b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSLoadContext(Node* node) {
3327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ContextAccess access = OpParameter<ContextAccess>(node);
3337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(mstarzinger): Use simplified operators instead of machine operators
3347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // here so that load/store optimization can be applied afterwards.
3357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int i = 0; i < access.depth(); ++i) {
3367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    node->ReplaceInput(
3377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        0, graph()->NewNode(
3385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               machine()->Load(kMachAnyTagged),
3397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               NodeProperties::GetValueInput(node, 0),
3407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               Int32Constant(Context::SlotOffset(Context::PREVIOUS_INDEX)),
3417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               NodeProperties::GetEffectInput(node)));
3427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
3437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index())));
3445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  PatchOperator(node, machine()->Load(kMachAnyTagged));
3457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
348b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSStoreContext(Node* node) {
3497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ContextAccess access = OpParameter<ContextAccess>(node);
350aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org  // TODO(mstarzinger): Use simplified operators instead of machine operators
351aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org  // here so that load/store optimization can be applied afterwards.
352aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org  for (int i = 0; i < access.depth(); ++i) {
353aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org    node->ReplaceInput(
354aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org        0, graph()->NewNode(
3555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               machine()->Load(kMachAnyTagged),
356aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org               NodeProperties::GetValueInput(node, 0),
357aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org               Int32Constant(Context::SlotOffset(Context::PREVIOUS_INDEX)),
358aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org               NodeProperties::GetEffectInput(node)));
359aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org  }
360aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org  node->ReplaceInput(2, NodeProperties::GetValueInput(node, 1));
361aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org  node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index())));
3626313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  PatchOperator(node, machine()->Store(StoreRepresentation(kMachAnyTagged,
3636313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org                                                           kFullWriteBarrier)));
3647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
367b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSCallConstruct(Node* node) {
3687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int arity = OpParameter<int>(node);
3697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CallConstructStub stub(isolate(), NO_CALL_CONSTRUCTOR_FLAGS);
370e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor();
371d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  CallDescriptor* desc =
372e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      linkage()->GetStubCallDescriptor(d, arity, FlagsForNode(node));
3737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* stub_code = CodeConstant(stub.GetCode());
3747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* construct = NodeProperties::GetValueInput(node, 0);
3757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 0, stub_code);
3767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 1, Int32Constant(arity - 1));
3777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 2, construct);
3787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 3, jsgraph()->UndefinedConstant());
3797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchOperator(node, common()->Call(desc));
3807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
383b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSCallFunction(Node* node) {
3847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CallParameters p = OpParameter<CallParameters>(node);
3857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CallFunctionStub stub(isolate(), p.arity - 2, p.flags);
386e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor();
387d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org  CallDescriptor* desc =
388e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      linkage()->GetStubCallDescriptor(d, p.arity - 1, FlagsForNode(node));
3897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* stub_code = CodeConstant(stub.GetCode());
3907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchInsertInput(node, 0, stub_code);
3917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  PatchOperator(node, common()->Call(desc));
3927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
395b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.orgvoid JSGenericLowering::LowerJSCallRuntime(Node* node) {
3967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Runtime::FunctionId function = OpParameter<Runtime::FunctionId>(node);
3978640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  int arity = OperatorProperties::GetValueInputCount(node->op());
3987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReplaceWithRuntimeCall(node, function, arity);
3997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
400d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org
401d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org}  // namespace compiler
402d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org}  // namespace internal
403d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org}  // namespace v8
404