| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/code-factory.h" | 5 #include "src/code-factory.h" |
| 6 #include "src/code-stubs.h" | 6 #include "src/code-stubs.h" |
| 7 #include "src/compiler/common-operator.h" | 7 #include "src/compiler/common-operator.h" |
| 8 #include "src/compiler/graph-inl.h" | 8 #include "src/compiler/graph-inl.h" |
| 9 #include "src/compiler/js-generic-lowering.h" | 9 #include "src/compiler/js-generic-lowering.h" |
| 10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
| 11 #include "src/compiler/node-aux-data-inl.h" | 11 #include "src/compiler/node-aux-data-inl.h" |
| 12 #include "src/compiler/node-properties-inl.h" | 12 #include "src/compiler/node-properties-inl.h" |
| 13 #include "src/unique.h" | 13 #include "src/unique.h" |
| 14 | 14 |
| 15 namespace v8 { | 15 namespace v8 { |
| 16 namespace internal { | 16 namespace internal { |
| 17 namespace compiler { | 17 namespace compiler { |
| 18 | 18 |
| 19 JSGenericLowering::JSGenericLowering(CompilationInfo* info, JSGraph* jsgraph, | 19 JSGenericLowering::JSGenericLowering(CompilationInfo* info, JSGraph* jsgraph) |
| 20 MachineOperatorBuilder* machine) | |
| 21 : info_(info), | 20 : info_(info), |
| 22 jsgraph_(jsgraph), | 21 jsgraph_(jsgraph), |
| 23 linkage_(new (jsgraph->zone()) Linkage(info)), | 22 linkage_(new (jsgraph->zone()) Linkage(info)) {} |
| 24 machine_(machine) {} | |
| 25 | 23 |
| 26 | 24 |
| 27 void JSGenericLowering::PatchOperator(Node* node, const Operator* op) { | 25 void JSGenericLowering::PatchOperator(Node* node, const Operator* op) { |
| 28 node->set_op(op); | 26 node->set_op(op); |
| 29 } | 27 } |
| 30 | 28 |
| 31 | 29 |
| 32 void JSGenericLowering::PatchInsertInput(Node* node, int index, Node* input) { | 30 void JSGenericLowering::PatchInsertInput(Node* node, int index, Node* input) { |
| 33 node->InsertInput(zone(), index, input); | 31 node->InsertInput(zone(), index, input); |
| 34 } | 32 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 53 return jsgraph()->HeapConstant(function); | 51 return jsgraph()->HeapConstant(function); |
| 54 } | 52 } |
| 55 | 53 |
| 56 | 54 |
| 57 Node* JSGenericLowering::ExternalConstant(ExternalReference ref) { | 55 Node* JSGenericLowering::ExternalConstant(ExternalReference ref) { |
| 58 return jsgraph()->ExternalConstant(ref); | 56 return jsgraph()->ExternalConstant(ref); |
| 59 } | 57 } |
| 60 | 58 |
| 61 | 59 |
| 62 Reduction JSGenericLowering::Reduce(Node* node) { | 60 Reduction JSGenericLowering::Reduce(Node* node) { |
| 63 Node* replacement = NULL; | |
| 64 // Dispatch according to the opcode. | |
| 65 switch (node->opcode()) { | 61 switch (node->opcode()) { |
| 66 #define DECLARE_CASE(x) \ | 62 #define DECLARE_CASE(x) \ |
| 67 case IrOpcode::k##x: \ | 63 case IrOpcode::k##x: \ |
| 68 replacement = Lower##x(node); \ | 64 Lower##x(node); \ |
| 69 break; | 65 break; |
| 70 DECLARE_CASE(Branch) | 66 DECLARE_CASE(Branch) |
| 71 JS_OP_LIST(DECLARE_CASE) | 67 JS_OP_LIST(DECLARE_CASE) |
| 72 #undef DECLARE_CASE | 68 #undef DECLARE_CASE |
| 73 default: | 69 default: |
| 74 // Nothing to see. | 70 // Nothing to see. |
| 75 return NoChange(); | 71 return NoChange(); |
| 76 } | 72 } |
| 77 DCHECK_EQ(node, replacement); | 73 return Changed(node); |
| 78 return Changed(replacement); | |
| 79 } | 74 } |
| 80 | 75 |
| 81 | 76 |
| 82 #define REPLACE_BINARY_OP_IC_CALL(op, token) \ | 77 #define REPLACE_BINARY_OP_IC_CALL(op, token) \ |
| 83 Node* JSGenericLowering::Lower##op(Node* node) { \ | 78 void JSGenericLowering::Lower##op(Node* node) { \ |
| 84 ReplaceWithStubCall(node, CodeFactory::BinaryOpIC(isolate(), token), \ | 79 ReplaceWithStubCall(node, CodeFactory::BinaryOpIC(isolate(), token), \ |
| 85 CallDescriptor::kPatchableCallSiteWithNop); \ | 80 CallDescriptor::kPatchableCallSiteWithNop); \ |
| 86 return node; \ | |
| 87 } | 81 } |
| 88 REPLACE_BINARY_OP_IC_CALL(JSBitwiseOr, Token::BIT_OR) | 82 REPLACE_BINARY_OP_IC_CALL(JSBitwiseOr, Token::BIT_OR) |
| 89 REPLACE_BINARY_OP_IC_CALL(JSBitwiseXor, Token::BIT_XOR) | 83 REPLACE_BINARY_OP_IC_CALL(JSBitwiseXor, Token::BIT_XOR) |
| 90 REPLACE_BINARY_OP_IC_CALL(JSBitwiseAnd, Token::BIT_AND) | 84 REPLACE_BINARY_OP_IC_CALL(JSBitwiseAnd, Token::BIT_AND) |
| 91 REPLACE_BINARY_OP_IC_CALL(JSShiftLeft, Token::SHL) | 85 REPLACE_BINARY_OP_IC_CALL(JSShiftLeft, Token::SHL) |
| 92 REPLACE_BINARY_OP_IC_CALL(JSShiftRight, Token::SAR) | 86 REPLACE_BINARY_OP_IC_CALL(JSShiftRight, Token::SAR) |
| 93 REPLACE_BINARY_OP_IC_CALL(JSShiftRightLogical, Token::SHR) | 87 REPLACE_BINARY_OP_IC_CALL(JSShiftRightLogical, Token::SHR) |
| 94 REPLACE_BINARY_OP_IC_CALL(JSAdd, Token::ADD) | 88 REPLACE_BINARY_OP_IC_CALL(JSAdd, Token::ADD) |
| 95 REPLACE_BINARY_OP_IC_CALL(JSSubtract, Token::SUB) | 89 REPLACE_BINARY_OP_IC_CALL(JSSubtract, Token::SUB) |
| 96 REPLACE_BINARY_OP_IC_CALL(JSMultiply, Token::MUL) | 90 REPLACE_BINARY_OP_IC_CALL(JSMultiply, Token::MUL) |
| 97 REPLACE_BINARY_OP_IC_CALL(JSDivide, Token::DIV) | 91 REPLACE_BINARY_OP_IC_CALL(JSDivide, Token::DIV) |
| 98 REPLACE_BINARY_OP_IC_CALL(JSModulus, Token::MOD) | 92 REPLACE_BINARY_OP_IC_CALL(JSModulus, Token::MOD) |
| 99 #undef REPLACE_BINARY_OP_IC_CALL | 93 #undef REPLACE_BINARY_OP_IC_CALL |
| 100 | 94 |
| 101 | 95 |
| 102 #define REPLACE_FACTORY_CALL(op, FactoryDeclaration) \ | 96 #define REPLACE_COMPARE_IC_CALL(op, token, pure) \ |
| 103 Node* JSGenericLowering::Lower##op(Node* node) { \ | 97 void JSGenericLowering::Lower##op(Node* node) { \ |
| 104 Callable callable = FactoryDeclaration; \ | 98 ReplaceWithCompareIC(node, token, pure); \ |
| 105 ReplaceWithStubCall(node, callable, CallDescriptor::kNoFlags); \ | |
| 106 return node; \ | |
| 107 } | |
| 108 REPLACE_FACTORY_CALL(JSToNumber, CodeFactory::ToNumber(isolate())) | |
| 109 #undef REPLACE_FACTORY_CALL | |
| 110 | |
| 111 | |
| 112 #define REPLACE_COMPARE_IC_CALL(op, token, pure) \ | |
| 113 Node* JSGenericLowering::Lower##op(Node* node) { \ | |
| 114 ReplaceWithCompareIC(node, token, pure); \ | |
| 115 return node; \ | |
| 116 } | 99 } |
| 117 REPLACE_COMPARE_IC_CALL(JSEqual, Token::EQ, false) | 100 REPLACE_COMPARE_IC_CALL(JSEqual, Token::EQ, false) |
| 118 REPLACE_COMPARE_IC_CALL(JSNotEqual, Token::NE, false) | 101 REPLACE_COMPARE_IC_CALL(JSNotEqual, Token::NE, false) |
| 119 REPLACE_COMPARE_IC_CALL(JSStrictEqual, Token::EQ_STRICT, true) | 102 REPLACE_COMPARE_IC_CALL(JSStrictEqual, Token::EQ_STRICT, true) |
| 120 REPLACE_COMPARE_IC_CALL(JSStrictNotEqual, Token::NE_STRICT, true) | 103 REPLACE_COMPARE_IC_CALL(JSStrictNotEqual, Token::NE_STRICT, true) |
| 121 REPLACE_COMPARE_IC_CALL(JSLessThan, Token::LT, false) | 104 REPLACE_COMPARE_IC_CALL(JSLessThan, Token::LT, false) |
| 122 REPLACE_COMPARE_IC_CALL(JSGreaterThan, Token::GT, false) | 105 REPLACE_COMPARE_IC_CALL(JSGreaterThan, Token::GT, false) |
| 123 REPLACE_COMPARE_IC_CALL(JSLessThanOrEqual, Token::LTE, false) | 106 REPLACE_COMPARE_IC_CALL(JSLessThanOrEqual, Token::LTE, false) |
| 124 REPLACE_COMPARE_IC_CALL(JSGreaterThanOrEqual, Token::GTE, false) | 107 REPLACE_COMPARE_IC_CALL(JSGreaterThanOrEqual, Token::GTE, false) |
| 125 #undef REPLACE_COMPARE_IC_CALL | 108 #undef REPLACE_COMPARE_IC_CALL |
| 126 | 109 |
| 127 | 110 |
| 128 #define REPLACE_RUNTIME_CALL(op, fun) \ | 111 #define REPLACE_RUNTIME_CALL(op, fun) \ |
| 129 Node* JSGenericLowering::Lower##op(Node* node) { \ | 112 void JSGenericLowering::Lower##op(Node* node) { \ |
| 130 ReplaceWithRuntimeCall(node, fun); \ | 113 ReplaceWithRuntimeCall(node, fun); \ |
| 131 return node; \ | |
| 132 } | 114 } |
| 133 REPLACE_RUNTIME_CALL(JSTypeOf, Runtime::kTypeof) | 115 REPLACE_RUNTIME_CALL(JSTypeOf, Runtime::kTypeof) |
| 134 REPLACE_RUNTIME_CALL(JSCreate, Runtime::kAbort) | 116 REPLACE_RUNTIME_CALL(JSCreate, Runtime::kAbort) |
| 135 REPLACE_RUNTIME_CALL(JSCreateFunctionContext, Runtime::kNewFunctionContext) | 117 REPLACE_RUNTIME_CALL(JSCreateFunctionContext, Runtime::kNewFunctionContext) |
| 136 REPLACE_RUNTIME_CALL(JSCreateCatchContext, Runtime::kPushCatchContext) | 118 REPLACE_RUNTIME_CALL(JSCreateCatchContext, Runtime::kPushCatchContext) |
| 137 REPLACE_RUNTIME_CALL(JSCreateWithContext, Runtime::kPushWithContext) | 119 REPLACE_RUNTIME_CALL(JSCreateWithContext, Runtime::kPushWithContext) |
| 138 REPLACE_RUNTIME_CALL(JSCreateBlockContext, Runtime::kPushBlockContext) | 120 REPLACE_RUNTIME_CALL(JSCreateBlockContext, Runtime::kPushBlockContext) |
| 139 REPLACE_RUNTIME_CALL(JSCreateModuleContext, Runtime::kPushModuleContext) | 121 REPLACE_RUNTIME_CALL(JSCreateModuleContext, Runtime::kPushModuleContext) |
| 140 REPLACE_RUNTIME_CALL(JSCreateGlobalContext, Runtime::kAbort) | 122 REPLACE_RUNTIME_CALL(JSCreateGlobalContext, Runtime::kAbort) |
| 141 #undef REPLACE_RUNTIME | 123 #undef REPLACE_RUNTIME |
| 142 | 124 |
| 143 | 125 |
| 144 #define REPLACE_UNIMPLEMENTED(op) \ | 126 #define REPLACE_UNIMPLEMENTED(op) \ |
| 145 Node* JSGenericLowering::Lower##op(Node* node) { \ | 127 void JSGenericLowering::Lower##op(Node* node) { UNIMPLEMENTED(); } |
| 146 UNIMPLEMENTED(); \ | |
| 147 return node; \ | |
| 148 } | |
| 149 REPLACE_UNIMPLEMENTED(JSToName) | 128 REPLACE_UNIMPLEMENTED(JSToName) |
| 150 REPLACE_UNIMPLEMENTED(JSYield) | 129 REPLACE_UNIMPLEMENTED(JSYield) |
| 151 REPLACE_UNIMPLEMENTED(JSDebugger) | 130 REPLACE_UNIMPLEMENTED(JSDebugger) |
| 152 #undef REPLACE_UNIMPLEMENTED | 131 #undef REPLACE_UNIMPLEMENTED |
| 153 | 132 |
| 154 | 133 |
| 155 static CallDescriptor::Flags FlagsForNode(Node* node) { | 134 static CallDescriptor::Flags FlagsForNode(Node* node) { |
| 156 CallDescriptor::Flags result = CallDescriptor::kNoFlags; | 135 CallDescriptor::Flags result = CallDescriptor::kNoFlags; |
| 157 if (OperatorProperties::HasFrameStateInput(node->op())) { | 136 if (OperatorProperties::HasFrameStateInput(node->op())) { |
| 158 result |= CallDescriptor::kNeedsFrameState; | 137 result |= CallDescriptor::kNeedsFrameState; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 if (!centrystub_constant_.is_set()) { | 232 if (!centrystub_constant_.is_set()) { |
| 254 centrystub_constant_.set(CodeConstant(CEntryStub(isolate(), 1).GetCode())); | 233 centrystub_constant_.set(CodeConstant(CEntryStub(isolate(), 1).GetCode())); |
| 255 } | 234 } |
| 256 PatchInsertInput(node, 0, centrystub_constant_.get()); | 235 PatchInsertInput(node, 0, centrystub_constant_.get()); |
| 257 PatchInsertInput(node, nargs + 1, ref); | 236 PatchInsertInput(node, nargs + 1, ref); |
| 258 PatchInsertInput(node, nargs + 2, arity); | 237 PatchInsertInput(node, nargs + 2, arity); |
| 259 PatchOperator(node, common()->Call(desc)); | 238 PatchOperator(node, common()->Call(desc)); |
| 260 } | 239 } |
| 261 | 240 |
| 262 | 241 |
| 263 Node* JSGenericLowering::LowerBranch(Node* node) { | 242 void JSGenericLowering::LowerBranch(Node* node) { |
| 264 if (!info()->is_typing_enabled()) { | 243 if (!info()->is_typing_enabled()) { |
| 265 // TODO(mstarzinger): If typing is enabled then simplified lowering will | 244 // TODO(mstarzinger): If typing is enabled then simplified lowering will |
| 266 // have inserted the correct ChangeBoolToBit, otherwise we need to perform | 245 // have inserted the correct ChangeBoolToBit, otherwise we need to perform |
| 267 // poor-man's representation inference here and insert manual change. | 246 // poor-man's representation inference here and insert manual change. |
| 268 Node* test = graph()->NewNode(machine()->WordEqual(), node->InputAt(0), | 247 Node* test = graph()->NewNode(machine()->WordEqual(), node->InputAt(0), |
| 269 jsgraph()->TrueConstant()); | 248 jsgraph()->TrueConstant()); |
| 270 node->ReplaceInput(0, test); | 249 node->ReplaceInput(0, test); |
| 271 } | 250 } |
| 272 return node; | |
| 273 } | 251 } |
| 274 | 252 |
| 275 | 253 |
| 276 Node* JSGenericLowering::LowerJSUnaryNot(Node* node) { | 254 void JSGenericLowering::LowerJSUnaryNot(Node* node) { |
| 277 Callable callable = CodeFactory::ToBoolean( | 255 Callable callable = CodeFactory::ToBoolean( |
| 278 isolate(), ToBooleanStub::RESULT_AS_INVERSE_ODDBALL); | 256 isolate(), ToBooleanStub::RESULT_AS_INVERSE_ODDBALL); |
| 279 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); | 257 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
| 280 return node; | |
| 281 } | 258 } |
| 282 | 259 |
| 283 | 260 |
| 284 Node* JSGenericLowering::LowerJSToBoolean(Node* node) { | 261 void JSGenericLowering::LowerJSToBoolean(Node* node) { |
| 285 Callable callable = | 262 Callable callable = |
| 286 CodeFactory::ToBoolean(isolate(), ToBooleanStub::RESULT_AS_ODDBALL); | 263 CodeFactory::ToBoolean(isolate(), ToBooleanStub::RESULT_AS_ODDBALL); |
| 287 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); | 264 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
| 288 return node; | |
| 289 } | 265 } |
| 290 | 266 |
| 291 | 267 |
| 292 Node* JSGenericLowering::LowerJSToString(Node* node) { | 268 void JSGenericLowering::LowerJSToNumber(Node* node) { |
| 293 ReplaceWithBuiltinCall(node, Builtins::TO_STRING, 1); | 269 Callable callable = CodeFactory::ToNumber(isolate()); |
| 294 return node; | 270 ReplaceWithStubCall(node, callable, CallDescriptor::kNoFlags); |
| 295 } | 271 } |
| 296 | 272 |
| 297 | 273 |
| 298 Node* JSGenericLowering::LowerJSToObject(Node* node) { | 274 void JSGenericLowering::LowerJSToString(Node* node) { |
| 299 ReplaceWithBuiltinCall(node, Builtins::TO_OBJECT, 1); | 275 ReplaceWithBuiltinCall(node, Builtins::TO_STRING, 1); |
| 300 return node; | |
| 301 } | 276 } |
| 302 | 277 |
| 303 | 278 |
| 304 Node* JSGenericLowering::LowerJSLoadProperty(Node* node) { | 279 void JSGenericLowering::LowerJSToObject(Node* node) { |
| 305 Callable callable = CodeFactory::KeyedLoadIC(isolate()); | 280 ReplaceWithBuiltinCall(node, Builtins::TO_OBJECT, 1); |
| 306 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); | |
| 307 return node; | |
| 308 } | 281 } |
| 309 | 282 |
| 310 | 283 |
| 311 Node* JSGenericLowering::LowerJSLoadNamed(Node* node) { | 284 void JSGenericLowering::LowerJSLoadProperty(Node* node) { |
| 312 LoadNamedParameters p = OpParameter<LoadNamedParameters>(node); | 285 Callable callable = CodeFactory::KeyedLoadIC(isolate()); |
| 313 PatchInsertInput(node, 1, jsgraph()->HeapConstant(p.name)); | |
| 314 Callable callable = CodeFactory::LoadIC(isolate(), p.contextual_mode); | |
| 315 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); | 286 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
| 316 return node; | |
| 317 } | 287 } |
| 318 | 288 |
| 319 | 289 |
| 320 Node* JSGenericLowering::LowerJSStoreProperty(Node* node) { | 290 void JSGenericLowering::LowerJSLoadNamed(Node* node) { |
| 291 LoadNamedParameters p = OpParameter<LoadNamedParameters>(node); |
| 292 Callable callable = CodeFactory::LoadIC(isolate(), p.contextual_mode); |
| 293 PatchInsertInput(node, 1, jsgraph()->HeapConstant(p.name)); |
| 294 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
| 295 } |
| 296 |
| 297 |
| 298 void JSGenericLowering::LowerJSStoreProperty(Node* node) { |
| 321 StrictMode strict_mode = OpParameter<StrictMode>(node); | 299 StrictMode strict_mode = OpParameter<StrictMode>(node); |
| 322 Callable callable = CodeFactory::KeyedStoreIC(isolate(), strict_mode); | 300 Callable callable = CodeFactory::KeyedStoreIC(isolate(), strict_mode); |
| 323 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); | 301 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
| 324 return node; | |
| 325 } | 302 } |
| 326 | 303 |
| 327 | 304 |
| 328 Node* JSGenericLowering::LowerJSStoreNamed(Node* node) { | 305 void JSGenericLowering::LowerJSStoreNamed(Node* node) { |
| 329 StoreNamedParameters params = OpParameter<StoreNamedParameters>(node); | 306 StoreNamedParameters params = OpParameter<StoreNamedParameters>(node); |
| 330 Callable callable = CodeFactory::StoreIC(isolate(), params.strict_mode); | 307 Callable callable = CodeFactory::StoreIC(isolate(), params.strict_mode); |
| 331 PatchInsertInput(node, 1, jsgraph()->HeapConstant(params.name)); | 308 PatchInsertInput(node, 1, jsgraph()->HeapConstant(params.name)); |
| 332 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); | 309 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
| 333 return node; | |
| 334 } | 310 } |
| 335 | 311 |
| 336 | 312 |
| 337 Node* JSGenericLowering::LowerJSDeleteProperty(Node* node) { | 313 void JSGenericLowering::LowerJSDeleteProperty(Node* node) { |
| 338 StrictMode strict_mode = OpParameter<StrictMode>(node); | 314 StrictMode strict_mode = OpParameter<StrictMode>(node); |
| 339 PatchInsertInput(node, 2, SmiConstant(strict_mode)); | 315 PatchInsertInput(node, 2, SmiConstant(strict_mode)); |
| 340 ReplaceWithBuiltinCall(node, Builtins::DELETE, 3); | 316 ReplaceWithBuiltinCall(node, Builtins::DELETE, 3); |
| 341 return node; | |
| 342 } | 317 } |
| 343 | 318 |
| 344 | 319 |
| 345 Node* JSGenericLowering::LowerJSHasProperty(Node* node) { | 320 void JSGenericLowering::LowerJSHasProperty(Node* node) { |
| 346 ReplaceWithBuiltinCall(node, Builtins::IN, 2); | 321 ReplaceWithBuiltinCall(node, Builtins::IN, 2); |
| 347 return node; | |
| 348 } | 322 } |
| 349 | 323 |
| 350 | 324 |
| 351 Node* JSGenericLowering::LowerJSInstanceOf(Node* node) { | 325 void JSGenericLowering::LowerJSInstanceOf(Node* node) { |
| 352 InstanceofStub::Flags flags = static_cast<InstanceofStub::Flags>( | 326 InstanceofStub::Flags flags = static_cast<InstanceofStub::Flags>( |
| 353 InstanceofStub::kReturnTrueFalseObject | | 327 InstanceofStub::kReturnTrueFalseObject | |
| 354 InstanceofStub::kArgsInRegisters); | 328 InstanceofStub::kArgsInRegisters); |
| 355 InstanceofStub stub(isolate(), flags); | 329 InstanceofStub stub(isolate(), flags); |
| 356 CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor(); | 330 CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor(); |
| 357 CallDescriptor* desc = linkage()->GetStubCallDescriptor(d, 0); | 331 CallDescriptor* desc = linkage()->GetStubCallDescriptor(d, 0); |
| 358 Node* stub_code = CodeConstant(stub.GetCode()); | 332 Node* stub_code = CodeConstant(stub.GetCode()); |
| 359 PatchInsertInput(node, 0, stub_code); | 333 PatchInsertInput(node, 0, stub_code); |
| 360 PatchOperator(node, common()->Call(desc)); | 334 PatchOperator(node, common()->Call(desc)); |
| 361 return node; | |
| 362 } | 335 } |
| 363 | 336 |
| 364 | 337 |
| 365 Node* JSGenericLowering::LowerJSLoadContext(Node* node) { | 338 void JSGenericLowering::LowerJSLoadContext(Node* node) { |
| 366 ContextAccess access = OpParameter<ContextAccess>(node); | 339 ContextAccess access = OpParameter<ContextAccess>(node); |
| 367 // TODO(mstarzinger): Use simplified operators instead of machine operators | 340 // TODO(mstarzinger): Use simplified operators instead of machine operators |
| 368 // here so that load/store optimization can be applied afterwards. | 341 // here so that load/store optimization can be applied afterwards. |
| 369 for (int i = 0; i < access.depth(); ++i) { | 342 for (int i = 0; i < access.depth(); ++i) { |
| 370 node->ReplaceInput( | 343 node->ReplaceInput( |
| 371 0, graph()->NewNode( | 344 0, graph()->NewNode( |
| 372 machine()->Load(kMachAnyTagged), | 345 machine()->Load(kMachAnyTagged), |
| 373 NodeProperties::GetValueInput(node, 0), | 346 NodeProperties::GetValueInput(node, 0), |
| 374 Int32Constant(Context::SlotOffset(Context::PREVIOUS_INDEX)), | 347 Int32Constant(Context::SlotOffset(Context::PREVIOUS_INDEX)), |
| 375 NodeProperties::GetEffectInput(node))); | 348 NodeProperties::GetEffectInput(node))); |
| 376 } | 349 } |
| 377 node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index()))); | 350 node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index()))); |
| 378 PatchOperator(node, machine()->Load(kMachAnyTagged)); | 351 PatchOperator(node, machine()->Load(kMachAnyTagged)); |
| 379 return node; | |
| 380 } | 352 } |
| 381 | 353 |
| 382 | 354 |
| 383 Node* JSGenericLowering::LowerJSStoreContext(Node* node) { | 355 void JSGenericLowering::LowerJSStoreContext(Node* node) { |
| 384 ContextAccess access = OpParameter<ContextAccess>(node); | 356 ContextAccess access = OpParameter<ContextAccess>(node); |
| 385 // TODO(mstarzinger): Use simplified operators instead of machine operators | 357 // TODO(mstarzinger): Use simplified operators instead of machine operators |
| 386 // here so that load/store optimization can be applied afterwards. | 358 // here so that load/store optimization can be applied afterwards. |
| 387 for (int i = 0; i < access.depth(); ++i) { | 359 for (int i = 0; i < access.depth(); ++i) { |
| 388 node->ReplaceInput( | 360 node->ReplaceInput( |
| 389 0, graph()->NewNode( | 361 0, graph()->NewNode( |
| 390 machine()->Load(kMachAnyTagged), | 362 machine()->Load(kMachAnyTagged), |
| 391 NodeProperties::GetValueInput(node, 0), | 363 NodeProperties::GetValueInput(node, 0), |
| 392 Int32Constant(Context::SlotOffset(Context::PREVIOUS_INDEX)), | 364 Int32Constant(Context::SlotOffset(Context::PREVIOUS_INDEX)), |
| 393 NodeProperties::GetEffectInput(node))); | 365 NodeProperties::GetEffectInput(node))); |
| 394 } | 366 } |
| 395 node->ReplaceInput(2, NodeProperties::GetValueInput(node, 1)); | 367 node->ReplaceInput(2, NodeProperties::GetValueInput(node, 1)); |
| 396 node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index()))); | 368 node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index()))); |
| 397 PatchOperator(node, machine()->Store(StoreRepresentation(kMachAnyTagged, | 369 PatchOperator(node, machine()->Store(StoreRepresentation(kMachAnyTagged, |
| 398 kFullWriteBarrier))); | 370 kFullWriteBarrier))); |
| 399 return node; | |
| 400 } | 371 } |
| 401 | 372 |
| 402 | 373 |
| 403 Node* JSGenericLowering::LowerJSCallConstruct(Node* node) { | 374 void JSGenericLowering::LowerJSCallConstruct(Node* node) { |
| 404 int arity = OpParameter<int>(node); | 375 int arity = OpParameter<int>(node); |
| 405 CallConstructStub stub(isolate(), NO_CALL_CONSTRUCTOR_FLAGS); | 376 CallConstructStub stub(isolate(), NO_CALL_CONSTRUCTOR_FLAGS); |
| 406 CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor(); | 377 CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor(); |
| 407 CallDescriptor* desc = | 378 CallDescriptor* desc = |
| 408 linkage()->GetStubCallDescriptor(d, arity, FlagsForNode(node)); | 379 linkage()->GetStubCallDescriptor(d, arity, FlagsForNode(node)); |
| 409 Node* stub_code = CodeConstant(stub.GetCode()); | 380 Node* stub_code = CodeConstant(stub.GetCode()); |
| 410 Node* construct = NodeProperties::GetValueInput(node, 0); | 381 Node* construct = NodeProperties::GetValueInput(node, 0); |
| 411 PatchInsertInput(node, 0, stub_code); | 382 PatchInsertInput(node, 0, stub_code); |
| 412 PatchInsertInput(node, 1, Int32Constant(arity - 1)); | 383 PatchInsertInput(node, 1, Int32Constant(arity - 1)); |
| 413 PatchInsertInput(node, 2, construct); | 384 PatchInsertInput(node, 2, construct); |
| 414 PatchInsertInput(node, 3, jsgraph()->UndefinedConstant()); | 385 PatchInsertInput(node, 3, jsgraph()->UndefinedConstant()); |
| 415 PatchOperator(node, common()->Call(desc)); | 386 PatchOperator(node, common()->Call(desc)); |
| 416 return node; | |
| 417 } | 387 } |
| 418 | 388 |
| 419 | 389 |
| 420 Node* JSGenericLowering::LowerJSCallFunction(Node* node) { | 390 void JSGenericLowering::LowerJSCallFunction(Node* node) { |
| 421 CallParameters p = OpParameter<CallParameters>(node); | 391 CallParameters p = OpParameter<CallParameters>(node); |
| 422 CallFunctionStub stub(isolate(), p.arity - 2, p.flags); | 392 CallFunctionStub stub(isolate(), p.arity - 2, p.flags); |
| 423 CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor(); | 393 CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor(); |
| 424 CallDescriptor* desc = | 394 CallDescriptor* desc = |
| 425 linkage()->GetStubCallDescriptor(d, p.arity - 1, FlagsForNode(node)); | 395 linkage()->GetStubCallDescriptor(d, p.arity - 1, FlagsForNode(node)); |
| 426 Node* stub_code = CodeConstant(stub.GetCode()); | 396 Node* stub_code = CodeConstant(stub.GetCode()); |
| 427 PatchInsertInput(node, 0, stub_code); | 397 PatchInsertInput(node, 0, stub_code); |
| 428 PatchOperator(node, common()->Call(desc)); | 398 PatchOperator(node, common()->Call(desc)); |
| 429 return node; | |
| 430 } | 399 } |
| 431 | 400 |
| 432 | 401 |
| 433 Node* JSGenericLowering::LowerJSCallRuntime(Node* node) { | 402 void JSGenericLowering::LowerJSCallRuntime(Node* node) { |
| 434 Runtime::FunctionId function = OpParameter<Runtime::FunctionId>(node); | 403 Runtime::FunctionId function = OpParameter<Runtime::FunctionId>(node); |
| 435 int arity = OperatorProperties::GetValueInputCount(node->op()); | 404 int arity = OperatorProperties::GetValueInputCount(node->op()); |
| 436 ReplaceWithRuntimeCall(node, function, arity); | 405 ReplaceWithRuntimeCall(node, function, arity); |
| 437 return node; | |
| 438 } | 406 } |
| 439 | 407 |
| 440 } // namespace compiler | 408 } // namespace compiler |
| 441 } // namespace internal | 409 } // namespace internal |
| 442 } // namespace v8 | 410 } // namespace v8 |
| OLD | NEW |