Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index f1093a004c6c340131307d8fe18ed6baf868cef1..ce37b2474e427d749b3a5a9979ab9edb8eb3db74 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -126,12 +126,15 @@ class LChunkBuilder; |
V(LoadKeyedGeneric) \ |
V(LoadNamedField) \ |
V(LoadNamedGeneric) \ |
+ V(LoadPixelArrayElement) \ |
+ V(LoadPixelArrayExternalPointer) \ |
V(Mod) \ |
V(Mul) \ |
V(ObjectLiteral) \ |
V(OsrEntry) \ |
V(OuterContext) \ |
V(Parameter) \ |
+ V(PixelArrayLength) \ |
V(Power) \ |
V(PushArgument) \ |
V(RegExpLiteral) \ |
@@ -163,6 +166,7 @@ class LChunkBuilder; |
V(InobjectFields) \ |
V(BackingStoreFields) \ |
V(ArrayElements) \ |
+ V(PixelArrayElements) \ |
V(GlobalVars) \ |
V(Maps) \ |
V(ArrayLengths) \ |
@@ -288,6 +292,7 @@ class Representation { |
kTagged, |
kDouble, |
kInteger32, |
+ kExternal, |
kNumRepresentations |
}; |
@@ -297,6 +302,7 @@ class Representation { |
static Representation Tagged() { return Representation(kTagged); } |
static Representation Integer32() { return Representation(kInteger32); } |
static Representation Double() { return Representation(kDouble); } |
+ static Representation External() { return Representation(kExternal); } |
bool Equals(const Representation& other) const { |
return kind_ == other.kind_; |
@@ -307,6 +313,7 @@ class Representation { |
bool IsTagged() const { return kind_ == kTagged; } |
bool IsInteger32() const { return kind_ == kInteger32; } |
bool IsDouble() const { return kind_ == kDouble; } |
+ bool IsExternal() const { return kind_ == kExternal; } |
bool IsSpecialization() const { |
return kind_ == kInteger32 || kind_ == kDouble; |
} |
@@ -1333,6 +1340,24 @@ class HFixedArrayLength: public HUnaryOperation { |
}; |
+class HPixelArrayLength: public HUnaryOperation { |
+ public: |
+ explicit HPixelArrayLength(HValue* value) : HUnaryOperation(value) { |
+ set_representation(Representation::Integer32()); |
+ SetFlag(kUseGVN); |
Mads Ager (chromium)
2011/02/08 17:26:31
I get a little worried when I see kUseGVN without
|
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(PixelArrayLength, "pixel_array_length") |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) const { return true; } |
+}; |
+ |
+ |
class HBitNot: public HUnaryOperation { |
public: |
explicit HBitNot(HValue* value) : HUnaryOperation(value) { |
@@ -1451,6 +1476,26 @@ class HLoadElements: public HUnaryOperation { |
}; |
+class HLoadPixelArrayExternalPointer: public HUnaryOperation { |
+ public: |
+ explicit HLoadPixelArrayExternalPointer(HValue* value) |
+ : HUnaryOperation(value) { |
+ set_representation(Representation::External()); |
+ SetFlag(kUseGVN); |
Mads Ager (chromium)
2011/02/08 17:26:31
Same comment here. I see why we don't need a kDepe
|
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayExternalPointer, |
+ "load-pixel-array-external-pointer") |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) const { return true; } |
+}; |
+ |
+ |
class HCheckMap: public HUnaryOperation { |
public: |
HCheckMap(HValue* value, Handle<Map> map) |
@@ -2829,6 +2874,37 @@ class HLoadKeyedFastElement: public HLoadKeyed { |
}; |
+class HLoadPixelArrayElement: public HBinaryOperation { |
+ public: |
+ HLoadPixelArrayElement(HValue* external_elements, HValue* key) |
+ : HBinaryOperation(external_elements, key) { |
+ set_representation(Representation::Integer32()); |
+ SetFlag(kDependsOnPixelArrayElements); |
+ // Native code could change the pixel array. |
+ SetFlag(kDependsOnCalls); |
+ SetFlag(kUseGVN); |
+ } |
+ |
+ virtual void PrintDataTo(StringStream* stream) const; |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ // The key is supposed to be Integer32, but the base pointer |
+ // for the element load is a naked pointer. |
+ return (index == 1) ? Representation::Integer32() |
+ : Representation::External(); |
+ } |
+ |
+ HValue* external_pointer() const { return OperandAt(0); } |
+ HValue* key() const { return OperandAt(1); } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayElement, |
+ "load_pixel_array_element") |
+ |
+ protected: |
+ virtual bool DataEquals(HValue* other) const { return true; } |
+}; |
+ |
+ |
class HLoadKeyedGeneric: public HLoadKeyed { |
public: |
HLoadKeyedGeneric(HValue* obj, HValue* key) : HLoadKeyed(obj, key) { |