| 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/code-factory.h" | 9 #include "src/code-factory.h" | 
| 10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 66     case Runtime::kInlineJSValueGetValue: | 66     case Runtime::kInlineJSValueGetValue: | 
| 67       return ReduceJSValueGetValue(node); | 67       return ReduceJSValueGetValue(node); | 
| 68     case Runtime::kInlineMapGetInstanceType: | 68     case Runtime::kInlineMapGetInstanceType: | 
| 69       return ReduceMapGetInstanceType(node); | 69       return ReduceMapGetInstanceType(node); | 
| 70     case Runtime::kInlineMathClz32: | 70     case Runtime::kInlineMathClz32: | 
| 71       return ReduceMathClz32(node); | 71       return ReduceMathClz32(node); | 
| 72     case Runtime::kInlineMathFloor: | 72     case Runtime::kInlineMathFloor: | 
| 73       return ReduceMathFloor(node); | 73       return ReduceMathFloor(node); | 
| 74     case Runtime::kInlineMathSqrt: | 74     case Runtime::kInlineMathSqrt: | 
| 75       return ReduceMathSqrt(node); | 75       return ReduceMathSqrt(node); | 
| 76     case Runtime::kInlineStringGetLength: |  | 
| 77       return ReduceStringGetLength(node); |  | 
| 78     case Runtime::kInlineValueOf: | 76     case Runtime::kInlineValueOf: | 
| 79       return ReduceValueOf(node); | 77       return ReduceValueOf(node); | 
| 80     case Runtime::kInlineIsMinusZero: | 78     case Runtime::kInlineIsMinusZero: | 
| 81       return ReduceIsMinusZero(node); | 79       return ReduceIsMinusZero(node); | 
| 82     case Runtime::kInlineFixedArrayGet: | 80     case Runtime::kInlineFixedArrayGet: | 
| 83       return ReduceFixedArrayGet(node); | 81       return ReduceFixedArrayGet(node); | 
| 84     case Runtime::kInlineFixedArraySet: | 82     case Runtime::kInlineFixedArraySet: | 
| 85       return ReduceFixedArraySet(node); | 83       return ReduceFixedArraySet(node); | 
|  | 84     case Runtime::kInlineRegExpConstructResult: | 
|  | 85       return ReduceRegExpConstructResult(node); | 
|  | 86     case Runtime::kInlineRegExpExec: | 
|  | 87       return ReduceRegExpExec(node); | 
|  | 88     case Runtime::kInlineRegExpFlags: | 
|  | 89       return ReduceRegExpFlags(node); | 
|  | 90     case Runtime::kInlineRegExpSource: | 
|  | 91       return ReduceRegExpSource(node); | 
|  | 92     case Runtime::kInlineSubString: | 
|  | 93       return ReduceSubString(node); | 
| 86     case Runtime::kInlineToInteger: | 94     case Runtime::kInlineToInteger: | 
| 87       return ReduceToInteger(node); | 95       return ReduceToInteger(node); | 
| 88     case Runtime::kInlineToLength: | 96     case Runtime::kInlineToLength: | 
| 89       return ReduceToLength(node); | 97       return ReduceToLength(node); | 
| 90     case Runtime::kInlineToName: | 98     case Runtime::kInlineToName: | 
| 91       return ReduceToName(node); | 99       return ReduceToName(node); | 
| 92     case Runtime::kInlineToNumber: | 100     case Runtime::kInlineToNumber: | 
| 93       return ReduceToNumber(node); | 101       return ReduceToNumber(node); | 
| 94     case Runtime::kInlineToObject: | 102     case Runtime::kInlineToObject: | 
| 95       return ReduceToObject(node); | 103       return ReduceToObject(node); | 
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 319   if (!machine()->Float64RoundDown().IsSupported()) return NoChange(); | 327   if (!machine()->Float64RoundDown().IsSupported()) return NoChange(); | 
| 320   return Change(node, machine()->Float64RoundDown().op()); | 328   return Change(node, machine()->Float64RoundDown().op()); | 
| 321 } | 329 } | 
| 322 | 330 | 
| 323 | 331 | 
| 324 Reduction JSIntrinsicLowering::ReduceMathSqrt(Node* node) { | 332 Reduction JSIntrinsicLowering::ReduceMathSqrt(Node* node) { | 
| 325   return Change(node, machine()->Float64Sqrt()); | 333   return Change(node, machine()->Float64Sqrt()); | 
| 326 } | 334 } | 
| 327 | 335 | 
| 328 | 336 | 
| 329 Reduction JSIntrinsicLowering::ReduceStringGetLength(Node* node) { |  | 
| 330   Node* value = NodeProperties::GetValueInput(node, 0); |  | 
| 331   Node* effect = NodeProperties::GetEffectInput(node); |  | 
| 332   Node* control = NodeProperties::GetControlInput(node); |  | 
| 333   return Change(node, simplified()->LoadField(AccessBuilder::ForStringLength()), |  | 
| 334                 value, effect, control); |  | 
| 335 } |  | 
| 336 |  | 
| 337 |  | 
| 338 Reduction JSIntrinsicLowering::ReduceValueOf(Node* node) { | 337 Reduction JSIntrinsicLowering::ReduceValueOf(Node* node) { | 
| 339   // if (%_IsSmi(value)) { | 338   // if (%_IsSmi(value)) { | 
| 340   //   return value; | 339   //   return value; | 
| 341   // } else if (%_GetInstanceType(%_GetMap(value)) == JS_VALUE_TYPE) { | 340   // } else if (%_GetInstanceType(%_GetMap(value)) == JS_VALUE_TYPE) { | 
| 342   //   return %_GetValue(value); | 341   //   return %_GetValue(value); | 
| 343   // } else { | 342   // } else { | 
| 344   //   return value; | 343   //   return value; | 
| 345   // } | 344   // } | 
| 346   const Operator* const merge_op = common()->Merge(2); | 345   const Operator* const merge_op = common()->Merge(2); | 
| 347   const Operator* const ephi_op = common()->EffectPhi(2); | 346   const Operator* const ephi_op = common()->EffectPhi(2); | 
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 452   Node* effect = NodeProperties::GetEffectInput(node); | 451   Node* effect = NodeProperties::GetEffectInput(node); | 
| 453   Node* control = NodeProperties::GetControlInput(node); | 452   Node* control = NodeProperties::GetControlInput(node); | 
| 454   Node* store = (graph()->NewNode( | 453   Node* store = (graph()->NewNode( | 
| 455       simplified()->StoreElement(AccessBuilder::ForFixedArrayElement()), base, | 454       simplified()->StoreElement(AccessBuilder::ForFixedArrayElement()), base, | 
| 456       index, value, effect, control)); | 455       index, value, effect, control)); | 
| 457   ReplaceWithValue(node, value, store); | 456   ReplaceWithValue(node, value, store); | 
| 458   return Changed(store); | 457   return Changed(store); | 
| 459 } | 458 } | 
| 460 | 459 | 
| 461 | 460 | 
|  | 461 Reduction JSIntrinsicLowering::ReduceRegExpConstructResult(Node* node) { | 
|  | 462   // TODO(bmeurer): Introduce JSCreateRegExpResult? | 
|  | 463   return Change(node, CodeFactory::RegExpConstructResult(isolate()), 0); | 
|  | 464 } | 
|  | 465 | 
|  | 466 | 
|  | 467 Reduction JSIntrinsicLowering::ReduceRegExpExec(Node* node) { | 
|  | 468   return Change(node, CodeFactory::RegExpExec(isolate()), 4); | 
|  | 469 } | 
|  | 470 | 
|  | 471 | 
|  | 472 Reduction JSIntrinsicLowering::ReduceRegExpFlags(Node* node) { | 
|  | 473   Node* const receiver = NodeProperties::GetValueInput(node, 0); | 
|  | 474   Node* const effect = NodeProperties::GetEffectInput(node); | 
|  | 475   Node* const control = NodeProperties::GetControlInput(node); | 
|  | 476   Operator const* const op = | 
|  | 477       simplified()->LoadField(AccessBuilder::ForJSRegExpFlags()); | 
|  | 478   return Change(node, op, receiver, effect, control); | 
|  | 479 } | 
|  | 480 | 
|  | 481 | 
|  | 482 Reduction JSIntrinsicLowering::ReduceRegExpSource(Node* node) { | 
|  | 483   Node* const receiver = NodeProperties::GetValueInput(node, 0); | 
|  | 484   Node* const effect = NodeProperties::GetEffectInput(node); | 
|  | 485   Node* const control = NodeProperties::GetControlInput(node); | 
|  | 486   Operator const* const op = | 
|  | 487       simplified()->LoadField(AccessBuilder::ForJSRegExpSource()); | 
|  | 488   return Change(node, op, receiver, effect, control); | 
|  | 489 } | 
|  | 490 | 
|  | 491 | 
|  | 492 Reduction JSIntrinsicLowering::ReduceSubString(Node* node) { | 
|  | 493   return Change(node, CodeFactory::SubString(isolate()), 3); | 
|  | 494 } | 
|  | 495 | 
|  | 496 | 
| 462 Reduction JSIntrinsicLowering::ReduceThrowNotDateError(Node* node) { | 497 Reduction JSIntrinsicLowering::ReduceThrowNotDateError(Node* node) { | 
| 463   if (mode() != kDeoptimizationEnabled) return NoChange(); | 498   if (mode() != kDeoptimizationEnabled) return NoChange(); | 
| 464   Node* const frame_state = NodeProperties::GetFrameStateInput(node, 1); | 499   Node* const frame_state = NodeProperties::GetFrameStateInput(node, 1); | 
| 465   Node* const effect = NodeProperties::GetEffectInput(node); | 500   Node* const effect = NodeProperties::GetEffectInput(node); | 
| 466   Node* const control = NodeProperties::GetControlInput(node); | 501   Node* const control = NodeProperties::GetControlInput(node); | 
| 467 | 502 | 
| 468   // TODO(bmeurer): Move MergeControlToEnd() to the AdvancedReducer. | 503   // TODO(bmeurer): Move MergeControlToEnd() to the AdvancedReducer. | 
| 469   Node* deoptimize = | 504   Node* deoptimize = | 
| 470       graph()->NewNode(common()->Deoptimize(DeoptimizeKind::kEager), | 505       graph()->NewNode(common()->Deoptimize(DeoptimizeKind::kEager), | 
| 471                        frame_state, effect, control); | 506                        frame_state, effect, control); | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 525                              jsgraph()->Constant(kMaxSafeInteger), value), | 560                              jsgraph()->Constant(kMaxSafeInteger), value), | 
| 526             jsgraph()->Constant(kMaxSafeInteger), value); | 561             jsgraph()->Constant(kMaxSafeInteger), value); | 
| 527         value_type = | 562         value_type = | 
| 528             Type::Range(value_type->Min(), kMaxSafeInteger, graph()->zone()); | 563             Type::Range(value_type->Min(), kMaxSafeInteger, graph()->zone()); | 
| 529         NodeProperties::SetType(value, value_type); | 564         NodeProperties::SetType(value, value_type); | 
| 530       } | 565       } | 
| 531     } | 566     } | 
| 532     ReplaceWithValue(node, value); | 567     ReplaceWithValue(node, value); | 
| 533     return Replace(value); | 568     return Replace(value); | 
| 534   } | 569   } | 
| 535   Callable callable = CodeFactory::ToLength(isolate()); | 570   return Change(node, CodeFactory::ToLength(isolate()), 0); | 
| 536   CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( |  | 
| 537       isolate(), graph()->zone(), callable.descriptor(), 0, |  | 
| 538       CallDescriptor::kNeedsFrameState, node->op()->properties()); |  | 
| 539   node->InsertInput(graph()->zone(), 0, |  | 
| 540                     jsgraph()->HeapConstant(callable.code())); |  | 
| 541   NodeProperties::ChangeOp(node, common()->Call(desc)); |  | 
| 542   return Changed(node); |  | 
| 543 } | 571 } | 
| 544 | 572 | 
| 545 | 573 | 
| 546 Reduction JSIntrinsicLowering::ReduceToObject(Node* node) { | 574 Reduction JSIntrinsicLowering::ReduceToObject(Node* node) { | 
| 547   NodeProperties::ChangeOp(node, javascript()->ToObject()); | 575   NodeProperties::ChangeOp(node, javascript()->ToObject()); | 
| 548   return Changed(node); | 576   return Changed(node); | 
| 549 } | 577 } | 
| 550 | 578 | 
| 551 | 579 | 
| 552 Reduction JSIntrinsicLowering::ReduceToPrimitive(Node* node) { | 580 Reduction JSIntrinsicLowering::ReduceToPrimitive(Node* node) { | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 621   return Changed(node); | 649   return Changed(node); | 
| 622 } | 650 } | 
| 623 | 651 | 
| 624 | 652 | 
| 625 Reduction JSIntrinsicLowering::ChangeToUndefined(Node* node, Node* effect) { | 653 Reduction JSIntrinsicLowering::ChangeToUndefined(Node* node, Node* effect) { | 
| 626   ReplaceWithValue(node, jsgraph()->UndefinedConstant(), effect); | 654   ReplaceWithValue(node, jsgraph()->UndefinedConstant(), effect); | 
| 627   return Changed(node); | 655   return Changed(node); | 
| 628 } | 656 } | 
| 629 | 657 | 
| 630 | 658 | 
|  | 659 Reduction JSIntrinsicLowering::Change(Node* node, Callable const& callable, | 
|  | 660                                       int stack_parameter_count) { | 
|  | 661   CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( | 
|  | 662       isolate(), graph()->zone(), callable.descriptor(), stack_parameter_count, | 
|  | 663       CallDescriptor::kNeedsFrameState, node->op()->properties()); | 
|  | 664   node->InsertInput(graph()->zone(), 0, | 
|  | 665                     jsgraph()->HeapConstant(callable.code())); | 
|  | 666   NodeProperties::ChangeOp(node, common()->Call(desc)); | 
|  | 667   return Changed(node); | 
|  | 668 } | 
|  | 669 | 
|  | 670 | 
| 631 Graph* JSIntrinsicLowering::graph() const { return jsgraph()->graph(); } | 671 Graph* JSIntrinsicLowering::graph() const { return jsgraph()->graph(); } | 
| 632 | 672 | 
| 633 | 673 | 
| 634 Isolate* JSIntrinsicLowering::isolate() const { return jsgraph()->isolate(); } | 674 Isolate* JSIntrinsicLowering::isolate() const { return jsgraph()->isolate(); } | 
| 635 | 675 | 
| 636 | 676 | 
| 637 CommonOperatorBuilder* JSIntrinsicLowering::common() const { | 677 CommonOperatorBuilder* JSIntrinsicLowering::common() const { | 
| 638   return jsgraph()->common(); | 678   return jsgraph()->common(); | 
| 639 } | 679 } | 
| 640 | 680 | 
| 641 JSOperatorBuilder* JSIntrinsicLowering::javascript() const { | 681 JSOperatorBuilder* JSIntrinsicLowering::javascript() const { | 
| 642   return jsgraph_->javascript(); | 682   return jsgraph_->javascript(); | 
| 643 } | 683 } | 
| 644 | 684 | 
| 645 | 685 | 
| 646 MachineOperatorBuilder* JSIntrinsicLowering::machine() const { | 686 MachineOperatorBuilder* JSIntrinsicLowering::machine() const { | 
| 647   return jsgraph()->machine(); | 687   return jsgraph()->machine(); | 
| 648 } | 688 } | 
| 649 | 689 | 
| 650 | 690 | 
| 651 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { | 691 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { | 
| 652   return jsgraph()->simplified(); | 692   return jsgraph()->simplified(); | 
| 653 } | 693 } | 
| 654 | 694 | 
| 655 }  // namespace compiler | 695 }  // namespace compiler | 
| 656 }  // namespace internal | 696 }  // namespace internal | 
| 657 }  // namespace v8 | 697 }  // namespace v8 | 
| OLD | NEW | 
|---|