Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: src/hydrogen-instructions.h

Issue 101413006: Implement in-heap backing store for typed arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Platform ports Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 V(Calls) \ 203 V(Calls) \
204 V(ContextSlots) \ 204 V(ContextSlots) \
205 V(DoubleArrayElements) \ 205 V(DoubleArrayElements) \
206 V(DoubleFields) \ 206 V(DoubleFields) \
207 V(ElementsKind) \ 207 V(ElementsKind) \
208 V(ElementsPointer) \ 208 V(ElementsPointer) \
209 V(GlobalVars) \ 209 V(GlobalVars) \
210 V(InobjectFields) \ 210 V(InobjectFields) \
211 V(OsrEntries) \ 211 V(OsrEntries) \
212 V(ExternalMemory) \ 212 V(ExternalMemory) \
213 V(StringChars) 213 V(StringChars) \
214 V(TypedArrayElements)
214 215
215 216
216 #define DECLARE_ABSTRACT_INSTRUCTION(type) \ 217 #define DECLARE_ABSTRACT_INSTRUCTION(type) \
217 virtual bool Is##type() const V8_FINAL V8_OVERRIDE { return true; } \ 218 virtual bool Is##type() const V8_FINAL V8_OVERRIDE { return true; } \
218 static H##type* cast(HValue* value) { \ 219 static H##type* cast(HValue* value) { \
219 ASSERT(value->Is##type()); \ 220 ASSERT(value->Is##type()); \
220 return reinterpret_cast<H##type*>(value); \ 221 return reinterpret_cast<H##type*>(value); \
221 } 222 }
222 223
223 224
(...skipping 6144 matching lines...) Expand 10 before | Expand all | Expand 10 after
6368 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 6369 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
6369 public: 6370 public:
6370 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, 6371 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*,
6371 ElementsKind); 6372 ElementsKind);
6372 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, 6373 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*,
6373 ElementsKind, LoadKeyedHoleMode); 6374 ElementsKind, LoadKeyedHoleMode);
6374 6375
6375 bool is_external() const { 6376 bool is_external() const {
6376 return IsExternalArrayElementsKind(elements_kind()); 6377 return IsExternalArrayElementsKind(elements_kind());
6377 } 6378 }
6379 bool is_fixed_typed_array() const {
6380 return IsFixedTypedArrayElementsKind(elements_kind());
6381 }
6378 HValue* elements() { return OperandAt(0); } 6382 HValue* elements() { return OperandAt(0); }
6379 HValue* key() { return OperandAt(1); } 6383 HValue* key() { return OperandAt(1); }
6380 HValue* dependency() { 6384 HValue* dependency() {
6381 ASSERT(HasDependency()); 6385 ASSERT(HasDependency());
6382 return OperandAt(2); 6386 return OperandAt(2);
6383 } 6387 }
6384 bool HasDependency() const { return OperandAt(0) != OperandAt(2); } 6388 bool HasDependency() const { return OperandAt(0) != OperandAt(2); }
6385 uint32_t index_offset() { return IndexOffsetField::decode(bit_field_); } 6389 uint32_t index_offset() { return IndexOffsetField::decode(bit_field_); }
6386 void SetIndexOffset(uint32_t index_offset) { 6390 void SetIndexOffset(uint32_t index_offset) {
6387 bit_field_ = IndexOffsetField::update(bit_field_, index_offset); 6391 bit_field_ = IndexOffsetField::update(bit_field_, index_offset);
6388 } 6392 }
6389 virtual int MaxIndexOffsetBits() { 6393 virtual int MaxIndexOffsetBits() {
6390 return kBitsForIndexOffset; 6394 return kBitsForIndexOffset;
6391 } 6395 }
6392 HValue* GetKey() { return key(); } 6396 HValue* GetKey() { return key(); }
6393 void SetKey(HValue* key) { SetOperandAt(1, key); } 6397 void SetKey(HValue* key) { SetOperandAt(1, key); }
6394 bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); } 6398 bool IsDehoisted() { return IsDehoistedField::decode(bit_field_); }
6395 void SetDehoisted(bool is_dehoisted) { 6399 void SetDehoisted(bool is_dehoisted) {
6396 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); 6400 bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted);
6397 } 6401 }
6398 ElementsKind elements_kind() const { 6402 ElementsKind elements_kind() const {
6399 return ElementsKindField::decode(bit_field_); 6403 return ElementsKindField::decode(bit_field_);
6400 } 6404 }
6401 LoadKeyedHoleMode hole_mode() const { 6405 LoadKeyedHoleMode hole_mode() const {
6402 return HoleModeField::decode(bit_field_); 6406 return HoleModeField::decode(bit_field_);
6403 } 6407 }
6404 6408
6405 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6409 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
6406 // kind_fast: tagged[int32] (none) 6410 // kind_fast: tagged[int32] (none)
6407 // kind_double: tagged[int32] (none) 6411 // kind_double: tagged[int32] (none)
6408 // kind_external: external[int32] (none) 6412 // kind_fixed_typed_array: tagged[int32] (none)
6413 // kind_external: external[int32] (none)
6409 if (index == 0) { 6414 if (index == 0) {
6410 return is_external() ? Representation::External() 6415 return is_external() ? Representation::External()
6411 : Representation::Tagged(); 6416 : Representation::Tagged();
6412 } 6417 }
6413 if (index == 1) { 6418 if (index == 1) {
6414 return ArrayInstructionInterface::KeyedAccessIndexRequirement( 6419 return ArrayInstructionInterface::KeyedAccessIndexRequirement(
6415 OperandAt(1)->representation()); 6420 OperandAt(1)->representation());
6416 } 6421 }
6417 return Representation::None(); 6422 return Representation::None();
6418 } 6423 }
(...skipping 29 matching lines...) Expand all
6448 ElementsKind elements_kind, 6453 ElementsKind elements_kind,
6449 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE) 6454 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE)
6450 : bit_field_(0) { 6455 : bit_field_(0) {
6451 bit_field_ = ElementsKindField::encode(elements_kind) | 6456 bit_field_ = ElementsKindField::encode(elements_kind) |
6452 HoleModeField::encode(mode); 6457 HoleModeField::encode(mode);
6453 6458
6454 SetOperandAt(0, obj); 6459 SetOperandAt(0, obj);
6455 SetOperandAt(1, key); 6460 SetOperandAt(1, key);
6456 SetOperandAt(2, dependency != NULL ? dependency : obj); 6461 SetOperandAt(2, dependency != NULL ? dependency : obj);
6457 6462
6458 if (!is_external()) { 6463 if (!is_external() && !is_fixed_typed_array()) {
6459 // I can detect the case between storing double (holey and fast) and 6464 // I can detect the case between storing double (holey and fast) and
6460 // smi/object by looking at elements_kind_. 6465 // smi/object by looking at elements_kind_.
6461 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) || 6466 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) ||
6462 IsFastDoubleElementsKind(elements_kind)); 6467 IsFastDoubleElementsKind(elements_kind));
6463 6468
6464 if (IsFastSmiOrObjectElementsKind(elements_kind)) { 6469 if (IsFastSmiOrObjectElementsKind(elements_kind)) {
6465 if (IsFastSmiElementsKind(elements_kind) && 6470 if (IsFastSmiElementsKind(elements_kind) &&
6466 (!IsHoleyElementsKind(elements_kind) || 6471 (!IsHoleyElementsKind(elements_kind) ||
6467 mode == NEVER_RETURN_HOLE)) { 6472 mode == NEVER_RETURN_HOLE)) {
6468 set_type(HType::Smi()); 6473 set_type(HType::Smi());
6469 if (SmiValuesAre32Bits() && !RequiresHoleCheck()) { 6474 if (SmiValuesAre32Bits() && !RequiresHoleCheck()) {
6470 set_representation(Representation::Integer32()); 6475 set_representation(Representation::Integer32());
6471 } else { 6476 } else {
6472 set_representation(Representation::Smi()); 6477 set_representation(Representation::Smi());
6473 } 6478 }
6474 } else { 6479 } else {
6475 set_representation(Representation::Tagged()); 6480 set_representation(Representation::Tagged());
6476 } 6481 }
6477 6482
6478 SetGVNFlag(kDependsOnArrayElements); 6483 SetGVNFlag(kDependsOnArrayElements);
6479 } else { 6484 } else {
6480 set_representation(Representation::Double()); 6485 set_representation(Representation::Double());
6481 SetGVNFlag(kDependsOnDoubleArrayElements); 6486 SetGVNFlag(kDependsOnDoubleArrayElements);
6482 } 6487 }
6483 } else { 6488 } else {
6484 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || 6489 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
6485 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 6490 elements_kind == EXTERNAL_DOUBLE_ELEMENTS ||
6491 elements_kind == FLOAT32_ELEMENTS ||
6492 elements_kind == FLOAT64_ELEMENTS) {
6486 set_representation(Representation::Double()); 6493 set_representation(Representation::Double());
6487 } else { 6494 } else {
6488 set_representation(Representation::Integer32()); 6495 set_representation(Representation::Integer32());
6489 } 6496 }
6490 6497
6491 SetGVNFlag(kDependsOnExternalMemory); 6498 if (is_external()) {
6499 SetGVNFlag(kDependsOnExternalMemory);
6500 } else if (is_fixed_typed_array()) {
6501 SetGVNFlag(kDependsOnTypedArrayElements);
6502 } else {
6503 UNREACHABLE();
6504 }
6492 // Native code could change the specialized array. 6505 // Native code could change the specialized array.
6493 SetGVNFlag(kDependsOnCalls); 6506 SetGVNFlag(kDependsOnCalls);
6494 } 6507 }
6495 6508
6496 SetFlag(kUseGVN); 6509 SetFlag(kUseGVN);
6497 } 6510 }
6498 6511
6499 virtual bool IsDeletable() const V8_OVERRIDE { 6512 virtual bool IsDeletable() const V8_OVERRIDE {
6500 return !RequiresHoleCheck(); 6513 return !RequiresHoleCheck();
6501 } 6514 }
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
6740 6753
6741 class HStoreKeyed V8_FINAL 6754 class HStoreKeyed V8_FINAL
6742 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 6755 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
6743 public: 6756 public:
6744 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, 6757 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*,
6745 ElementsKind); 6758 ElementsKind);
6746 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, 6759 DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*,
6747 ElementsKind, StoreFieldOrKeyedMode); 6760 ElementsKind, StoreFieldOrKeyedMode);
6748 6761
6749 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { 6762 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
6750 // kind_fast: tagged[int32] = tagged 6763 // kind_fast: tagged[int32] = tagged
6751 // kind_double: tagged[int32] = double 6764 // kind_double: tagged[int32] = double
6752 // kind_smi : tagged[int32] = smi 6765 // kind_smi : tagged[int32] = smi
6753 // kind_external: external[int32] = (double | int32) 6766 // kind_fixed_typed_array: tagged[int32] = (double | int32)
6767 // kind_external: external[int32] = (double | int32)
6754 if (index == 0) { 6768 if (index == 0) {
6755 return is_external() ? Representation::External() 6769 return is_external() ? Representation::External()
6756 : Representation::Tagged(); 6770 : Representation::Tagged();
6757 } else if (index == 1) { 6771 } else if (index == 1) {
6758 return ArrayInstructionInterface::KeyedAccessIndexRequirement( 6772 return ArrayInstructionInterface::KeyedAccessIndexRequirement(
6759 OperandAt(1)->representation()); 6773 OperandAt(1)->representation());
6760 } 6774 }
6761 6775
6762 ASSERT_EQ(index, 2); 6776 ASSERT_EQ(index, 2);
6763 if (IsDoubleOrFloatElementsKind(elements_kind())) { 6777 if (IsDoubleOrFloatElementsKind(elements_kind())) {
6764 return Representation::Double(); 6778 return Representation::Double();
6765 } 6779 }
6766 if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) { 6780 if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) {
6767 return Representation::Integer32(); 6781 return Representation::Integer32();
6768 } 6782 }
6769 if (IsFastSmiElementsKind(elements_kind())) { 6783 if (IsFastSmiElementsKind(elements_kind())) {
6770 return Representation::Smi(); 6784 return Representation::Smi();
6771 } 6785 }
6772 6786
6773 return is_external() ? Representation::Integer32() 6787 return is_external() || is_fixed_typed_array()
6774 : Representation::Tagged(); 6788 ? Representation::Integer32()
6789 : Representation::Tagged();
6775 } 6790 }
6776 6791
6777 bool is_external() const { 6792 bool is_external() const {
6778 return IsExternalArrayElementsKind(elements_kind()); 6793 return IsExternalArrayElementsKind(elements_kind());
6779 } 6794 }
6780 6795
6796 bool is_fixed_typed_array() const {
6797 return IsFixedTypedArrayElementsKind(elements_kind());
6798 }
6799
6781 virtual Representation observed_input_representation(int index) V8_OVERRIDE { 6800 virtual Representation observed_input_representation(int index) V8_OVERRIDE {
6782 if (index < 2) return RequiredInputRepresentation(index); 6801 if (index < 2) return RequiredInputRepresentation(index);
6783 if (IsUninitialized()) { 6802 if (IsUninitialized()) {
6784 return Representation::None(); 6803 return Representation::None();
6785 } 6804 }
6786 if (IsDoubleOrFloatElementsKind(elements_kind())) { 6805 if (IsDoubleOrFloatElementsKind(elements_kind())) {
6787 return Representation::Double(); 6806 return Representation::Double();
6788 } 6807 }
6789 if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) { 6808 if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) {
6790 return Representation::Integer32(); 6809 return Representation::Integer32();
6791 } 6810 }
6792 if (IsFastSmiElementsKind(elements_kind())) { 6811 if (IsFastSmiElementsKind(elements_kind())) {
6793 return Representation::Smi(); 6812 return Representation::Smi();
6794 } 6813 }
6795 if (is_external()) { 6814 if (is_external() || is_fixed_typed_array()) {
6796 return Representation::Integer32(); 6815 return Representation::Integer32();
6797 } 6816 }
6798 // For fast object elements kinds, don't assume anything. 6817 // For fast object elements kinds, don't assume anything.
6799 return Representation::None(); 6818 return Representation::None();
6800 } 6819 }
6801 6820
6802 HValue* elements() { return OperandAt(0); } 6821 HValue* elements() { return OperandAt(0); }
6803 HValue* key() { return OperandAt(1); } 6822 HValue* key() { return OperandAt(1); }
6804 HValue* value() { return OperandAt(2); } 6823 HValue* value() { return OperandAt(2); }
6805 bool value_is_smi() const { 6824 bool value_is_smi() const {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
6870 SetFlag(kTrackSideEffectDominators); 6889 SetFlag(kTrackSideEffectDominators);
6871 SetGVNFlag(kDependsOnNewSpacePromotion); 6890 SetGVNFlag(kDependsOnNewSpacePromotion);
6872 } 6891 }
6873 if (is_external()) { 6892 if (is_external()) {
6874 SetGVNFlag(kChangesExternalMemory); 6893 SetGVNFlag(kChangesExternalMemory);
6875 SetFlag(kAllowUndefinedAsNaN); 6894 SetFlag(kAllowUndefinedAsNaN);
6876 } else if (IsFastDoubleElementsKind(elements_kind)) { 6895 } else if (IsFastDoubleElementsKind(elements_kind)) {
6877 SetGVNFlag(kChangesDoubleArrayElements); 6896 SetGVNFlag(kChangesDoubleArrayElements);
6878 } else if (IsFastSmiElementsKind(elements_kind)) { 6897 } else if (IsFastSmiElementsKind(elements_kind)) {
6879 SetGVNFlag(kChangesArrayElements); 6898 SetGVNFlag(kChangesArrayElements);
6899 } else if (is_fixed_typed_array()) {
6900 SetGVNFlag(kChangesTypedArrayElements);
6901 SetFlag(kAllowUndefinedAsNaN);
6880 } else { 6902 } else {
6881 SetGVNFlag(kChangesArrayElements); 6903 SetGVNFlag(kChangesArrayElements);
6882 } 6904 }
6883 6905
6884 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. 6906 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating.
6885 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS && 6907 if ((elements_kind >= EXTERNAL_BYTE_ELEMENTS &&
6886 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) { 6908 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) ||
6909 (elements_kind >= UINT8_ELEMENTS &&
6910 elements_kind <= INT32_ELEMENTS)) {
6887 SetFlag(kTruncatingToInt32); 6911 SetFlag(kTruncatingToInt32);
6888 } 6912 }
6889 } 6913 }
6890 6914
6891 ElementsKind elements_kind_; 6915 ElementsKind elements_kind_;
6892 uint32_t index_offset_; 6916 uint32_t index_offset_;
6893 bool is_dehoisted_ : 1; 6917 bool is_dehoisted_ : 1;
6894 bool is_uninitialized_ : 1; 6918 bool is_uninitialized_ : 1;
6895 StoreFieldOrKeyedMode store_mode_: 1; 6919 StoreFieldOrKeyedMode store_mode_: 1;
6896 HValue* new_space_dominator_; 6920 HValue* new_space_dominator_;
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
7585 virtual bool IsDeletable() const V8_OVERRIDE { return true; } 7609 virtual bool IsDeletable() const V8_OVERRIDE { return true; }
7586 }; 7610 };
7587 7611
7588 7612
7589 #undef DECLARE_INSTRUCTION 7613 #undef DECLARE_INSTRUCTION
7590 #undef DECLARE_CONCRETE_INSTRUCTION 7614 #undef DECLARE_CONCRETE_INSTRUCTION
7591 7615
7592 } } // namespace v8::internal 7616 } } // namespace v8::internal
7593 7617
7594 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 7618 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698