| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/js-intrinsic-lowering.h" | 5 #include "src/compiler/js-intrinsic-lowering.h" |
| 6 | 6 |
| 7 #include <stack> | 7 #include <stack> |
| 8 | 8 |
| 9 #include "src/compiler/access-builder.h" | 9 #include "src/compiler/access-builder.h" |
| 10 #include "src/compiler/js-graph.h" | 10 #include "src/compiler/js-graph.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 case Runtime::kInlineUnlikely: | 77 case Runtime::kInlineUnlikely: |
| 78 return ReduceUnLikely(node, BranchHint::kFalse); | 78 return ReduceUnLikely(node, BranchHint::kFalse); |
| 79 case Runtime::kInlineValueOf: | 79 case Runtime::kInlineValueOf: |
| 80 return ReduceValueOf(node); | 80 return ReduceValueOf(node); |
| 81 case Runtime::kInlineIsMinusZero: | 81 case Runtime::kInlineIsMinusZero: |
| 82 return ReduceIsMinusZero(node); | 82 return ReduceIsMinusZero(node); |
| 83 case Runtime::kInlineFixedArraySet: | 83 case Runtime::kInlineFixedArraySet: |
| 84 return ReduceFixedArraySet(node); | 84 return ReduceFixedArraySet(node); |
| 85 case Runtime::kInlineGetTypeFeedbackVector: | 85 case Runtime::kInlineGetTypeFeedbackVector: |
| 86 return ReduceGetTypeFeedbackVector(node); | 86 return ReduceGetTypeFeedbackVector(node); |
| 87 case Runtime::kInlineGetCallerJSFunction: |
| 88 return ReduceGetCallerJSFunction(node); |
| 87 default: | 89 default: |
| 88 break; | 90 break; |
| 89 } | 91 } |
| 90 return NoChange(); | 92 return NoChange(); |
| 91 } | 93 } |
| 92 | 94 |
| 93 | 95 |
| 94 Reduction JSIntrinsicLowering::ReduceConstructDouble(Node* node) { | 96 Reduction JSIntrinsicLowering::ReduceConstructDouble(Node* node) { |
| 95 Node* high = NodeProperties::GetValueInput(node, 0); | 97 Node* high = NodeProperties::GetValueInput(node, 0); |
| 96 Node* low = NodeProperties::GetValueInput(node, 1); | 98 Node* low = NodeProperties::GetValueInput(node, 1); |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 Node* effect = NodeProperties::GetEffectInput(node); | 450 Node* effect = NodeProperties::GetEffectInput(node); |
| 449 Node* control = NodeProperties::GetControlInput(node); | 451 Node* control = NodeProperties::GetControlInput(node); |
| 450 FieldAccess access = AccessBuilder::ForJSFunctionSharedFunctionInfo(); | 452 FieldAccess access = AccessBuilder::ForJSFunctionSharedFunctionInfo(); |
| 451 Node* load = | 453 Node* load = |
| 452 graph()->NewNode(simplified()->LoadField(access), func, effect, control); | 454 graph()->NewNode(simplified()->LoadField(access), func, effect, control); |
| 453 access = AccessBuilder::ForSharedFunctionInfoTypeFeedbackVector(); | 455 access = AccessBuilder::ForSharedFunctionInfoTypeFeedbackVector(); |
| 454 return Change(node, simplified()->LoadField(access), load, load, control); | 456 return Change(node, simplified()->LoadField(access), load, load, control); |
| 455 } | 457 } |
| 456 | 458 |
| 457 | 459 |
| 460 Reduction JSIntrinsicLowering::ReduceGetCallerJSFunction(Node* node) { |
| 461 Node* effect = NodeProperties::GetEffectInput(node); |
| 462 Node* control = NodeProperties::GetControlInput(node); |
| 463 |
| 464 Node* const frame_state = NodeProperties::GetFrameStateInput(node, 0); |
| 465 Node* outer_frame = frame_state->InputAt(kFrameStateOuterStateInput); |
| 466 if (outer_frame->opcode() == IrOpcode::kFrameState) { |
| 467 // Use the runtime implementation to throw the appropriate error if the |
| 468 // containing function is inlined. |
| 469 return NoChange(); |
| 470 } |
| 471 |
| 472 // TODO(danno): This implementation forces intrinsic lowering to happen after |
| 473 // inlining, which is fine for now, but eventually the frame-querying logic |
| 474 // probably should go later, e.g. in instruction selection, so that there is |
| 475 // no phase-ordering dependency. |
| 476 FieldAccess access = AccessBuilder::ForFrameCallerFramePtr(); |
| 477 Node* fp = graph()->NewNode(machine()->LoadFramePointer()); |
| 478 Node* next_fp = |
| 479 graph()->NewNode(simplified()->LoadField(access), fp, effect, control); |
| 480 return Change(node, simplified()->LoadField(AccessBuilder::ForFrameMarker()), |
| 481 next_fp, effect, control); |
| 482 } |
| 483 |
| 484 |
| 458 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, | 485 Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, |
| 459 Node* b) { | 486 Node* b) { |
| 460 node->set_op(op); | 487 node->set_op(op); |
| 461 node->ReplaceInput(0, a); | 488 node->ReplaceInput(0, a); |
| 462 node->ReplaceInput(1, b); | 489 node->ReplaceInput(1, b); |
| 463 node->TrimInputCount(2); | 490 node->TrimInputCount(2); |
| 464 RelaxControls(node); | 491 RelaxControls(node); |
| 465 return Changed(node); | 492 return Changed(node); |
| 466 } | 493 } |
| 467 | 494 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 492 } | 519 } |
| 493 | 520 |
| 494 | 521 |
| 495 MachineOperatorBuilder* JSIntrinsicLowering::machine() const { | 522 MachineOperatorBuilder* JSIntrinsicLowering::machine() const { |
| 496 return jsgraph()->machine(); | 523 return jsgraph()->machine(); |
| 497 } | 524 } |
| 498 | 525 |
| 499 } // namespace compiler | 526 } // namespace compiler |
| 500 } // namespace internal | 527 } // namespace internal |
| 501 } // namespace v8 | 528 } // namespace v8 |
| OLD | NEW |