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