OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 3537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3548 | 3548 |
3549 protected: | 3549 protected: |
3550 virtual bool DataEquals(HValue* other) { return true; } | 3550 virtual bool DataEquals(HValue* other) { return true; } |
3551 }; | 3551 }; |
3552 | 3552 |
3553 | 3553 |
3554 class HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> { | 3554 class HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> { |
3555 public: | 3555 public: |
3556 HLoadKeyedSpecializedArrayElement(HValue* external_elements, | 3556 HLoadKeyedSpecializedArrayElement(HValue* external_elements, |
3557 HValue* key, | 3557 HValue* key, |
3558 JSObject::ElementsKind elements_kind) | 3558 ElementsKind elements_kind) |
3559 : elements_kind_(elements_kind) { | 3559 : elements_kind_(elements_kind) { |
3560 SetOperandAt(0, external_elements); | 3560 SetOperandAt(0, external_elements); |
3561 SetOperandAt(1, key); | 3561 SetOperandAt(1, key); |
3562 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS || | 3562 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
3563 elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 3563 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
3564 set_representation(Representation::Double()); | 3564 set_representation(Representation::Double()); |
3565 } else { | 3565 } else { |
3566 set_representation(Representation::Integer32()); | 3566 set_representation(Representation::Integer32()); |
3567 } | 3567 } |
3568 SetFlag(kDependsOnSpecializedArrayElements); | 3568 SetFlag(kDependsOnSpecializedArrayElements); |
3569 // Native code could change the specialized array. | 3569 // Native code could change the specialized array. |
3570 SetFlag(kDependsOnCalls); | 3570 SetFlag(kDependsOnCalls); |
3571 SetFlag(kUseGVN); | 3571 SetFlag(kUseGVN); |
3572 } | 3572 } |
3573 | 3573 |
3574 virtual void PrintDataTo(StringStream* stream); | 3574 virtual void PrintDataTo(StringStream* stream); |
3575 | 3575 |
3576 virtual Representation RequiredInputRepresentation(int index) const { | 3576 virtual Representation RequiredInputRepresentation(int index) const { |
3577 // The key is supposed to be Integer32, but the base pointer | 3577 // The key is supposed to be Integer32, but the base pointer |
3578 // for the element load is a naked pointer. | 3578 // for the element load is a naked pointer. |
3579 return index == 0 | 3579 return index == 0 |
3580 ? Representation::External() | 3580 ? Representation::External() |
3581 : Representation::Integer32(); | 3581 : Representation::Integer32(); |
3582 } | 3582 } |
3583 | 3583 |
3584 HValue* external_pointer() { return OperandAt(0); } | 3584 HValue* external_pointer() { return OperandAt(0); } |
3585 HValue* key() { return OperandAt(1); } | 3585 HValue* key() { return OperandAt(1); } |
3586 JSObject::ElementsKind elements_kind() const { return elements_kind_; } | 3586 ElementsKind elements_kind() const { return elements_kind_; } |
3587 | 3587 |
3588 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement) | 3588 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement) |
3589 | 3589 |
3590 protected: | 3590 protected: |
3591 virtual bool DataEquals(HValue* other) { | 3591 virtual bool DataEquals(HValue* other) { |
3592 if (!other->IsLoadKeyedSpecializedArrayElement()) return false; | 3592 if (!other->IsLoadKeyedSpecializedArrayElement()) return false; |
3593 HLoadKeyedSpecializedArrayElement* cast_other = | 3593 HLoadKeyedSpecializedArrayElement* cast_other = |
3594 HLoadKeyedSpecializedArrayElement::cast(other); | 3594 HLoadKeyedSpecializedArrayElement::cast(other); |
3595 return elements_kind_ == cast_other->elements_kind(); | 3595 return elements_kind_ == cast_other->elements_kind(); |
3596 } | 3596 } |
3597 | 3597 |
3598 private: | 3598 private: |
3599 JSObject::ElementsKind elements_kind_; | 3599 ElementsKind elements_kind_; |
3600 }; | 3600 }; |
3601 | 3601 |
3602 | 3602 |
3603 class HLoadKeyedGeneric: public HTemplateInstruction<3> { | 3603 class HLoadKeyedGeneric: public HTemplateInstruction<3> { |
3604 public: | 3604 public: |
3605 HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) { | 3605 HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) { |
3606 set_representation(Representation::Tagged()); | 3606 set_representation(Representation::Tagged()); |
3607 SetOperandAt(0, obj); | 3607 SetOperandAt(0, obj); |
3608 SetOperandAt(1, key); | 3608 SetOperandAt(1, key); |
3609 SetOperandAt(2, context); | 3609 SetOperandAt(2, context); |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3769 | 3769 |
3770 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement) | 3770 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement) |
3771 }; | 3771 }; |
3772 | 3772 |
3773 | 3773 |
3774 class HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> { | 3774 class HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> { |
3775 public: | 3775 public: |
3776 HStoreKeyedSpecializedArrayElement(HValue* external_elements, | 3776 HStoreKeyedSpecializedArrayElement(HValue* external_elements, |
3777 HValue* key, | 3777 HValue* key, |
3778 HValue* val, | 3778 HValue* val, |
3779 JSObject::ElementsKind elements_kind) | 3779 ElementsKind elements_kind) |
3780 : elements_kind_(elements_kind) { | 3780 : elements_kind_(elements_kind) { |
3781 SetFlag(kChangesSpecializedArrayElements); | 3781 SetFlag(kChangesSpecializedArrayElements); |
3782 SetOperandAt(0, external_elements); | 3782 SetOperandAt(0, external_elements); |
3783 SetOperandAt(1, key); | 3783 SetOperandAt(1, key); |
3784 SetOperandAt(2, val); | 3784 SetOperandAt(2, val); |
3785 } | 3785 } |
3786 | 3786 |
3787 virtual void PrintDataTo(StringStream* stream); | 3787 virtual void PrintDataTo(StringStream* stream); |
3788 | 3788 |
3789 virtual Representation RequiredInputRepresentation(int index) const { | 3789 virtual Representation RequiredInputRepresentation(int index) const { |
3790 if (index == 0) { | 3790 if (index == 0) { |
3791 return Representation::External(); | 3791 return Representation::External(); |
3792 } else { | 3792 } else { |
3793 bool float_or_double_elements = | 3793 bool float_or_double_elements = |
3794 elements_kind() == JSObject::EXTERNAL_FLOAT_ELEMENTS || | 3794 elements_kind() == EXTERNAL_FLOAT_ELEMENTS || |
3795 elements_kind() == JSObject::EXTERNAL_DOUBLE_ELEMENTS; | 3795 elements_kind() == EXTERNAL_DOUBLE_ELEMENTS; |
3796 if (index == 2 && float_or_double_elements) { | 3796 if (index == 2 && float_or_double_elements) { |
3797 return Representation::Double(); | 3797 return Representation::Double(); |
3798 } else { | 3798 } else { |
3799 return Representation::Integer32(); | 3799 return Representation::Integer32(); |
3800 } | 3800 } |
3801 } | 3801 } |
3802 } | 3802 } |
3803 | 3803 |
3804 HValue* external_pointer() { return OperandAt(0); } | 3804 HValue* external_pointer() { return OperandAt(0); } |
3805 HValue* key() { return OperandAt(1); } | 3805 HValue* key() { return OperandAt(1); } |
3806 HValue* value() { return OperandAt(2); } | 3806 HValue* value() { return OperandAt(2); } |
3807 JSObject::ElementsKind elements_kind() const { return elements_kind_; } | 3807 ElementsKind elements_kind() const { return elements_kind_; } |
3808 | 3808 |
3809 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement) | 3809 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement) |
3810 | 3810 |
3811 private: | 3811 private: |
3812 JSObject::ElementsKind elements_kind_; | 3812 ElementsKind elements_kind_; |
3813 }; | 3813 }; |
3814 | 3814 |
3815 | 3815 |
3816 class HStoreKeyedGeneric: public HTemplateInstruction<4> { | 3816 class HStoreKeyedGeneric: public HTemplateInstruction<4> { |
3817 public: | 3817 public: |
3818 HStoreKeyedGeneric(HValue* context, | 3818 HStoreKeyedGeneric(HValue* context, |
3819 HValue* object, | 3819 HValue* object, |
3820 HValue* key, | 3820 HValue* key, |
3821 HValue* value, | 3821 HValue* value, |
3822 bool strict_mode) | 3822 bool strict_mode) |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4192 | 4192 |
4193 DECLARE_CONCRETE_INSTRUCTION(In) | 4193 DECLARE_CONCRETE_INSTRUCTION(In) |
4194 }; | 4194 }; |
4195 | 4195 |
4196 #undef DECLARE_INSTRUCTION | 4196 #undef DECLARE_INSTRUCTION |
4197 #undef DECLARE_CONCRETE_INSTRUCTION | 4197 #undef DECLARE_CONCRETE_INSTRUCTION |
4198 | 4198 |
4199 } } // namespace v8::internal | 4199 } } // namespace v8::internal |
4200 | 4200 |
4201 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 4201 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |