| 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/compiler/js-typed-lowering.h" | 5 #include "src/compiler/js-typed-lowering.h" |
| 6 #include "src/code-factory.h" | 6 #include "src/code-factory.h" |
| 7 #include "src/compilation-dependencies.h" | 7 #include "src/compilation-dependencies.h" |
| 8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
| 9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
| 10 #include "src/compiler/js-operator.h" | 10 #include "src/compiler/js-operator.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 zone()); | 63 zone()); |
| 64 return reducer.Reduce(node); | 64 return reducer.Reduce(node); |
| 65 } | 65 } |
| 66 | 66 |
| 67 Handle<JSArrayBuffer> NewArrayBuffer(void* bytes, size_t byte_length) { | 67 Handle<JSArrayBuffer> NewArrayBuffer(void* bytes, size_t byte_length) { |
| 68 Handle<JSArrayBuffer> buffer = factory()->NewJSArrayBuffer(); | 68 Handle<JSArrayBuffer> buffer = factory()->NewJSArrayBuffer(); |
| 69 JSArrayBuffer::Setup(buffer, isolate(), true, bytes, byte_length); | 69 JSArrayBuffer::Setup(buffer, isolate(), true, bytes, byte_length); |
| 70 return buffer; | 70 return buffer; |
| 71 } | 71 } |
| 72 | 72 |
| 73 Matcher<Node*> IsIntPtrConstant(intptr_t value) { | |
| 74 return sizeof(value) == 4 ? IsInt32Constant(static_cast<int32_t>(value)) | |
| 75 : IsInt64Constant(static_cast<int64_t>(value)); | |
| 76 } | |
| 77 | |
| 78 JSOperatorBuilder* javascript() { return &javascript_; } | 73 JSOperatorBuilder* javascript() { return &javascript_; } |
| 79 | 74 |
| 80 private: | 75 private: |
| 81 JSOperatorBuilder javascript_; | 76 JSOperatorBuilder javascript_; |
| 82 CompilationDependencies deps_; | 77 CompilationDependencies deps_; |
| 83 }; | 78 }; |
| 84 | 79 |
| 85 | 80 |
| 86 // ----------------------------------------------------------------------------- | 81 // ----------------------------------------------------------------------------- |
| 87 // JSToBoolean | 82 // JSToBoolean |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 Matcher<Node*> offset_matcher = | 557 Matcher<Node*> offset_matcher = |
| 563 element_size == 1 | 558 element_size == 1 |
| 564 ? key | 559 ? key |
| 565 : IsNumberShiftLeft(key, | 560 : IsNumberShiftLeft(key, |
| 566 IsNumberConstant(WhichPowerOf2(element_size))); | 561 IsNumberConstant(WhichPowerOf2(element_size))); |
| 567 | 562 |
| 568 ASSERT_TRUE(r.Changed()); | 563 ASSERT_TRUE(r.Changed()); |
| 569 EXPECT_THAT( | 564 EXPECT_THAT( |
| 570 r.replacement(), | 565 r.replacement(), |
| 571 IsLoadBuffer(BufferAccess(type), | 566 IsLoadBuffer(BufferAccess(type), |
| 572 IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), | 567 IsPointerConstant(bit_cast<intptr_t>(&backing_store[0])), |
| 573 offset_matcher, | 568 offset_matcher, |
| 574 IsNumberConstant(array->byte_length()->Number()), effect, | 569 IsNumberConstant(array->byte_length()->Number()), effect, |
| 575 control)); | 570 control)); |
| 576 } | 571 } |
| 577 } | 572 } |
| 578 | 573 |
| 579 | 574 |
| 580 TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArrayWithSafeKey) { | 575 TEST_F(JSTypedLoweringTest, JSLoadPropertyFromExternalTypedArrayWithSafeKey) { |
| 581 const size_t kLength = 17; | 576 const size_t kLength = 17; |
| 582 double backing_store[kLength]; | 577 double backing_store[kLength]; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 598 Node* effect = graph()->start(); | 593 Node* effect = graph()->start(); |
| 599 Node* control = graph()->start(); | 594 Node* control = graph()->start(); |
| 600 Reduction r = Reduce(graph()->NewNode(javascript()->LoadProperty(feedback), | 595 Reduction r = Reduce(graph()->NewNode(javascript()->LoadProperty(feedback), |
| 601 base, key, vector, context, | 596 base, key, vector, context, |
| 602 EmptyFrameState(), effect, control)); | 597 EmptyFrameState(), effect, control)); |
| 603 | 598 |
| 604 ASSERT_TRUE(r.Changed()); | 599 ASSERT_TRUE(r.Changed()); |
| 605 EXPECT_THAT( | 600 EXPECT_THAT( |
| 606 r.replacement(), | 601 r.replacement(), |
| 607 IsLoadElement(access, | 602 IsLoadElement(access, |
| 608 IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), | 603 IsPointerConstant(bit_cast<intptr_t>(&backing_store[0])), |
| 609 key, effect, control)); | 604 key, effect, control)); |
| 610 } | 605 } |
| 611 } | 606 } |
| 612 | 607 |
| 613 | 608 |
| 614 // ----------------------------------------------------------------------------- | 609 // ----------------------------------------------------------------------------- |
| 615 // JSStoreProperty | 610 // JSStoreProperty |
| 616 | 611 |
| 617 | 612 |
| 618 TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArray) { | 613 TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArray) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 643 | 638 |
| 644 Matcher<Node*> offset_matcher = | 639 Matcher<Node*> offset_matcher = |
| 645 element_size == 1 | 640 element_size == 1 |
| 646 ? key | 641 ? key |
| 647 : IsNumberShiftLeft( | 642 : IsNumberShiftLeft( |
| 648 key, IsNumberConstant(WhichPowerOf2(element_size))); | 643 key, IsNumberConstant(WhichPowerOf2(element_size))); |
| 649 | 644 |
| 650 ASSERT_TRUE(r.Changed()); | 645 ASSERT_TRUE(r.Changed()); |
| 651 EXPECT_THAT( | 646 EXPECT_THAT( |
| 652 r.replacement(), | 647 r.replacement(), |
| 653 IsStoreBuffer(BufferAccess(type), | 648 IsStoreBuffer( |
| 654 IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), | 649 BufferAccess(type), |
| 655 offset_matcher, | 650 IsPointerConstant(bit_cast<intptr_t>(&backing_store[0])), |
| 656 IsNumberConstant(array->byte_length()->Number()), value, | 651 offset_matcher, IsNumberConstant(array->byte_length()->Number()), |
| 657 effect, control)); | 652 value, effect, control)); |
| 658 } | 653 } |
| 659 } | 654 } |
| 660 } | 655 } |
| 661 | 656 |
| 662 | 657 |
| 663 TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithConversion) { | 658 TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithConversion) { |
| 664 const size_t kLength = 17; | 659 const size_t kLength = 17; |
| 665 double backing_store[kLength]; | 660 double backing_store[kLength]; |
| 666 Handle<JSArrayBuffer> buffer = | 661 Handle<JSArrayBuffer> buffer = |
| 667 NewArrayBuffer(backing_store, sizeof(backing_store)); | 662 NewArrayBuffer(backing_store, sizeof(backing_store)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 696 key, IsNumberConstant(WhichPowerOf2(element_size))); | 691 key, IsNumberConstant(WhichPowerOf2(element_size))); |
| 697 | 692 |
| 698 Matcher<Node*> value_matcher = | 693 Matcher<Node*> value_matcher = |
| 699 IsToNumber(value, context, checkpoint, control); | 694 IsToNumber(value, context, checkpoint, control); |
| 700 Matcher<Node*> effect_matcher = value_matcher; | 695 Matcher<Node*> effect_matcher = value_matcher; |
| 701 Matcher<Node*> control_matcher = IsIfSuccess(value_matcher); | 696 Matcher<Node*> control_matcher = IsIfSuccess(value_matcher); |
| 702 | 697 |
| 703 ASSERT_TRUE(r.Changed()); | 698 ASSERT_TRUE(r.Changed()); |
| 704 EXPECT_THAT( | 699 EXPECT_THAT( |
| 705 r.replacement(), | 700 r.replacement(), |
| 706 IsStoreBuffer(BufferAccess(type), | 701 IsStoreBuffer( |
| 707 IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), | 702 BufferAccess(type), |
| 708 offset_matcher, | 703 IsPointerConstant(bit_cast<intptr_t>(&backing_store[0])), |
| 709 IsNumberConstant(array->byte_length()->Number()), | 704 offset_matcher, IsNumberConstant(array->byte_length()->Number()), |
| 710 value_matcher, effect_matcher, control_matcher)); | 705 value_matcher, effect_matcher, control_matcher)); |
| 711 } | 706 } |
| 712 } | 707 } |
| 713 } | 708 } |
| 714 | 709 |
| 715 | 710 |
| 716 TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithSafeKey) { | 711 TEST_F(JSTypedLoweringTest, JSStorePropertyToExternalTypedArrayWithSafeKey) { |
| 717 const size_t kLength = 17; | 712 const size_t kLength = 17; |
| 718 double backing_store[kLength]; | 713 double backing_store[kLength]; |
| 719 Handle<JSArrayBuffer> buffer = | 714 Handle<JSArrayBuffer> buffer = |
| 720 NewArrayBuffer(backing_store, sizeof(backing_store)); | 715 NewArrayBuffer(backing_store, sizeof(backing_store)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 737 VectorSlotPair feedback; | 732 VectorSlotPair feedback; |
| 738 const Operator* op = javascript()->StoreProperty(language_mode, feedback); | 733 const Operator* op = javascript()->StoreProperty(language_mode, feedback); |
| 739 Node* node = graph()->NewNode(op, base, key, value, vector, context, | 734 Node* node = graph()->NewNode(op, base, key, value, vector, context, |
| 740 EmptyFrameState(), effect, control); | 735 EmptyFrameState(), effect, control); |
| 741 Reduction r = Reduce(node); | 736 Reduction r = Reduce(node); |
| 742 | 737 |
| 743 ASSERT_TRUE(r.Changed()); | 738 ASSERT_TRUE(r.Changed()); |
| 744 EXPECT_THAT( | 739 EXPECT_THAT( |
| 745 r.replacement(), | 740 r.replacement(), |
| 746 IsStoreElement( | 741 IsStoreElement( |
| 747 access, IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), | 742 access, IsPointerConstant(bit_cast<intptr_t>(&backing_store[0])), |
| 748 key, value, effect, control)); | 743 key, value, effect, control)); |
| 749 } | 744 } |
| 750 } | 745 } |
| 751 } | 746 } |
| 752 | 747 |
| 753 | 748 |
| 754 // ----------------------------------------------------------------------------- | 749 // ----------------------------------------------------------------------------- |
| 755 // JSLoadNamed | 750 // JSLoadNamed |
| 756 | 751 |
| 757 | 752 |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1007 EmptyFrameState(), effect, control)); | 1002 EmptyFrameState(), effect, control)); |
| 1008 ASSERT_TRUE(r.Changed()); | 1003 ASSERT_TRUE(r.Changed()); |
| 1009 EXPECT_THAT(r.replacement(), IsSpeculativeNumberBitwiseXor( | 1004 EXPECT_THAT(r.replacement(), IsSpeculativeNumberBitwiseXor( |
| 1010 NumberOperationHint::kNumberOrOddball, lhs, | 1005 NumberOperationHint::kNumberOrOddball, lhs, |
| 1011 rhs, effect, control)); | 1006 rhs, effect, control)); |
| 1012 } | 1007 } |
| 1013 | 1008 |
| 1014 } // namespace compiler | 1009 } // namespace compiler |
| 1015 } // namespace internal | 1010 } // namespace internal |
| 1016 } // namespace v8 | 1011 } // namespace v8 |
| OLD | NEW |