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

Unified 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: Self-review Created 7 years 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 side-by-side diff with in-line comments
Download patch
Index: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index fde3abcbe8d3567814a218ff515ab6c43940a9a6..708f1b4f31421445e14d46174a6e96b35f151f00 100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -6316,6 +6316,9 @@ class HLoadKeyed V8_FINAL
bool is_external() const {
return IsExternalArrayElementsKind(elements_kind());
}
+ bool is_fixed_typed_array() const {
+ return IsFixedTypedArrayElementsKind(elements_kind());
+ }
HValue* elements() { return OperandAt(0); }
HValue* key() { return OperandAt(1); }
HValue* dependency() {
@@ -6344,9 +6347,10 @@ class HLoadKeyed V8_FINAL
}
virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
- // kind_fast: tagged[int32] (none)
- // kind_double: tagged[int32] (none)
- // kind_external: external[int32] (none)
+ // kind_fast: tagged[int32] (none)
+ // kind_double: tagged[int32] (none)
+ // kind_fixed_typed_array: tagged[int32] (none)
+ // kind_external: external[int32] (none)
if (index == 0) {
return is_external() ? Representation::External()
: Representation::Tagged();
@@ -6396,7 +6400,7 @@ class HLoadKeyed V8_FINAL
SetOperandAt(1, key);
SetOperandAt(2, dependency != NULL ? dependency : obj);
- if (!is_external()) {
+ if (!is_external() && !is_fixed_typed_array()) {
// I can detect the case between storing double (holey and fast) and
// smi/object by looking at elements_kind_.
ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) ||
@@ -6423,13 +6427,21 @@ class HLoadKeyed V8_FINAL
}
} else {
if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
- elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
+ elements_kind == EXTERNAL_DOUBLE_ELEMENTS ||
+ elements_kind == FLOAT32_ELEMENTS ||
+ elements_kind == FLOAT64_ELEMENTS) {
set_representation(Representation::Double());
} else {
set_representation(Representation::Integer32());
}
- SetGVNFlag(kDependsOnExternalMemory);
+ if (is_external()) {
+ SetGVNFlag(kDependsOnExternalMemory);
+ } else if (is_fixed_typed_array()) {
+ SetGVNFlag(kDependsOnArrayElements);
Toon Verwaest 2013/12/23 10:40:32 Don't you want to make a separate DependsOnTypedAr
Dmitry Lomov (no reviews) 2014/01/07 15:48:43 Done. Good suggestion.
+ } else {
+ UNREACHABLE();
+ }
// Native code could change the specialized array.
SetGVNFlag(kDependsOnCalls);
}
@@ -6688,10 +6700,11 @@ class HStoreKeyed V8_FINAL
ElementsKind, StoreFieldOrKeyedMode);
virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
- // kind_fast: tagged[int32] = tagged
- // kind_double: tagged[int32] = double
- // kind_smi : tagged[int32] = smi
- // kind_external: external[int32] = (double | int32)
+ // kind_fast: tagged[int32] = tagged
+ // kind_double: tagged[int32] = double
+ // kind_smi : tagged[int32] = smi
+ // kind_fixed_typed_array: tagged[int32] = (double | int32)
+ // kind_external: external[int32] = (double | int32)
if (index == 0) {
return is_external() ? Representation::External()
: Representation::Tagged();
@@ -6711,7 +6724,8 @@ class HStoreKeyed V8_FINAL
return Representation::Smi();
}
- return is_external() ? Representation::Integer32()
+ return is_external() || is_fixed_typed_array()
+ ? Representation::Integer32()
Toon Verwaest 2013/12/23 10:40:32 4-space indent if you put the ? on a new line.
Dmitry Lomov (no reviews) 2014/01/07 15:48:43 Done.
: Representation::Tagged();
}
@@ -6719,6 +6733,10 @@ class HStoreKeyed V8_FINAL
return IsExternalArrayElementsKind(elements_kind());
}
+ bool is_fixed_typed_array() const {
+ return IsFixedTypedArrayElementsKind(elements_kind());
+ }
+
virtual Representation observed_input_representation(int index) V8_OVERRIDE {
if (index < 2) return RequiredInputRepresentation(index);
if (IsUninitialized()) {
@@ -6733,7 +6751,7 @@ class HStoreKeyed V8_FINAL
if (IsFastSmiElementsKind(elements_kind())) {
return Representation::Smi();
}
- if (is_external()) {
+ if (is_external() || is_fixed_typed_array()) {
return Representation::Integer32();
}
// For fast object elements kinds, don't assume anything.
@@ -6818,13 +6836,18 @@ class HStoreKeyed V8_FINAL
SetGVNFlag(kChangesDoubleArrayElements);
} else if (IsFastSmiElementsKind(elements_kind)) {
SetGVNFlag(kChangesArrayElements);
+ } else if (is_fixed_typed_array()) {
+ SetGVNFlag(kChangesArrayElements);
+ SetFlag(kAllowUndefinedAsNaN);
} else {
SetGVNFlag(kChangesArrayElements);
}
// EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating.
- if (elements_kind >= EXTERNAL_BYTE_ELEMENTS &&
- elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) {
+ if ((elements_kind >= EXTERNAL_BYTE_ELEMENTS &&
+ elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) ||
+ (elements_kind >= UINT8_ELEMENTS &&
+ elements_kind <= INT32_ELEMENTS)) {
SetFlag(kTruncatingToInt32);
}
}

Powered by Google App Engine
This is Rietveld 408576698