| OLD | NEW |
| 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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 V(CallNew) \ | 86 V(CallNew) \ |
| 87 V(CallNewArray) \ | 87 V(CallNewArray) \ |
| 88 V(CallRuntime) \ | 88 V(CallRuntime) \ |
| 89 V(CallStub) \ | 89 V(CallStub) \ |
| 90 V(Change) \ | 90 V(Change) \ |
| 91 V(CheckFunction) \ | 91 V(CheckFunction) \ |
| 92 V(CheckHeapObject) \ | 92 V(CheckHeapObject) \ |
| 93 V(CheckInstanceType) \ | 93 V(CheckInstanceType) \ |
| 94 V(CheckMaps) \ | 94 V(CheckMaps) \ |
| 95 V(CheckMapValue) \ | 95 V(CheckMapValue) \ |
| 96 V(CheckPrototypeMaps) \ | |
| 97 V(CheckSmi) \ | 96 V(CheckSmi) \ |
| 98 V(ClampToUint8) \ | 97 V(ClampToUint8) \ |
| 99 V(ClassOfTestAndBranch) \ | 98 V(ClassOfTestAndBranch) \ |
| 100 V(CompareNumericAndBranch) \ | 99 V(CompareNumericAndBranch) \ |
| 101 V(CompareGeneric) \ | 100 V(CompareGeneric) \ |
| 102 V(CompareObjectEqAndBranch) \ | 101 V(CompareObjectEqAndBranch) \ |
| 103 V(CompareMap) \ | 102 V(CompareMap) \ |
| 104 V(Constant) \ | 103 V(Constant) \ |
| 105 V(Context) \ | 104 V(Context) \ |
| 106 V(DateField) \ | 105 V(DateField) \ |
| (...skipping 3012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3119 | 3118 |
| 3120 private: | 3119 private: |
| 3121 explicit HCheckHeapObject(HValue* value) | 3120 explicit HCheckHeapObject(HValue* value) |
| 3122 : HUnaryOperation(value, HType::NonPrimitive()) { | 3121 : HUnaryOperation(value, HType::NonPrimitive()) { |
| 3123 set_representation(Representation::Tagged()); | 3122 set_representation(Representation::Tagged()); |
| 3124 SetFlag(kUseGVN); | 3123 SetFlag(kUseGVN); |
| 3125 } | 3124 } |
| 3126 }; | 3125 }; |
| 3127 | 3126 |
| 3128 | 3127 |
| 3129 class HCheckPrototypeMaps: public HTemplateInstruction<0> { | |
| 3130 public: | |
| 3131 static HCheckPrototypeMaps* New(Zone* zone, | |
| 3132 HValue* context, | |
| 3133 Handle<JSObject> prototype, | |
| 3134 Handle<JSObject> holder, | |
| 3135 CompilationInfo* info) { | |
| 3136 return new(zone) HCheckPrototypeMaps(prototype, holder, zone, info); | |
| 3137 } | |
| 3138 | |
| 3139 ZoneList<Handle<JSObject> >* prototypes() { return &prototypes_; } | |
| 3140 | |
| 3141 ZoneList<Handle<Map> >* maps() { return &maps_; } | |
| 3142 | |
| 3143 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps) | |
| 3144 | |
| 3145 virtual Representation RequiredInputRepresentation(int index) { | |
| 3146 return Representation::None(); | |
| 3147 } | |
| 3148 | |
| 3149 virtual void PrintDataTo(StringStream* stream); | |
| 3150 | |
| 3151 virtual intptr_t Hashcode() { | |
| 3152 return first_prototype_unique_id_.Hashcode() * 17 + | |
| 3153 last_prototype_unique_id_.Hashcode(); | |
| 3154 } | |
| 3155 | |
| 3156 virtual void FinalizeUniqueValueId() { | |
| 3157 first_prototype_unique_id_ = UniqueValueId(prototypes_.first()); | |
| 3158 last_prototype_unique_id_ = UniqueValueId(prototypes_.last()); | |
| 3159 } | |
| 3160 | |
| 3161 bool CanOmitPrototypeChecks() { return can_omit_prototype_maps_; } | |
| 3162 | |
| 3163 protected: | |
| 3164 virtual bool DataEquals(HValue* other) { | |
| 3165 HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other); | |
| 3166 return first_prototype_unique_id_ == b->first_prototype_unique_id_ && | |
| 3167 last_prototype_unique_id_ == b->last_prototype_unique_id_; | |
| 3168 } | |
| 3169 | |
| 3170 private: | |
| 3171 HCheckPrototypeMaps(Handle<JSObject> prototype, | |
| 3172 Handle<JSObject> holder, | |
| 3173 Zone* zone, | |
| 3174 CompilationInfo* info) | |
| 3175 : prototypes_(2, zone), | |
| 3176 maps_(2, zone), | |
| 3177 first_prototype_unique_id_(), | |
| 3178 last_prototype_unique_id_(), | |
| 3179 can_omit_prototype_maps_(true) { | |
| 3180 SetFlag(kUseGVN); | |
| 3181 SetGVNFlag(kDependsOnMaps); | |
| 3182 // Keep a list of all objects on the prototype chain up to the holder | |
| 3183 // and the expected maps. | |
| 3184 while (true) { | |
| 3185 prototypes_.Add(prototype, zone); | |
| 3186 Handle<Map> map(prototype->map()); | |
| 3187 maps_.Add(map, zone); | |
| 3188 can_omit_prototype_maps_ &= map->CanOmitPrototypeChecks(); | |
| 3189 if (prototype.is_identical_to(holder)) break; | |
| 3190 prototype = Handle<JSObject>(JSObject::cast(prototype->GetPrototype())); | |
| 3191 } | |
| 3192 if (can_omit_prototype_maps_) { | |
| 3193 // Mark in-flight compilation as dependent on those maps. | |
| 3194 for (int i = 0; i < maps()->length(); i++) { | |
| 3195 Handle<Map> map = maps()->at(i); | |
| 3196 map->AddDependentCompilationInfo(DependentCode::kPrototypeCheckGroup, | |
| 3197 info); | |
| 3198 } | |
| 3199 } | |
| 3200 } | |
| 3201 | |
| 3202 ZoneList<Handle<JSObject> > prototypes_; | |
| 3203 ZoneList<Handle<Map> > maps_; | |
| 3204 UniqueValueId first_prototype_unique_id_; | |
| 3205 UniqueValueId last_prototype_unique_id_; | |
| 3206 bool can_omit_prototype_maps_; | |
| 3207 }; | |
| 3208 | |
| 3209 | |
| 3210 class InductionVariableData; | 3128 class InductionVariableData; |
| 3211 | 3129 |
| 3212 | 3130 |
| 3213 struct InductionVariableLimitUpdate { | 3131 struct InductionVariableLimitUpdate { |
| 3214 InductionVariableData* updated_variable; | 3132 InductionVariableData* updated_variable; |
| 3215 HValue* limit; | 3133 HValue* limit; |
| 3216 bool limit_is_upper; | 3134 bool limit_is_upper; |
| 3217 bool limit_is_included; | 3135 bool limit_is_included; |
| 3218 | 3136 |
| 3219 InductionVariableLimitUpdate() | 3137 InductionVariableLimitUpdate() |
| (...skipping 4050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7270 virtual bool IsDeletable() const { return true; } | 7188 virtual bool IsDeletable() const { return true; } |
| 7271 }; | 7189 }; |
| 7272 | 7190 |
| 7273 | 7191 |
| 7274 #undef DECLARE_INSTRUCTION | 7192 #undef DECLARE_INSTRUCTION |
| 7275 #undef DECLARE_CONCRETE_INSTRUCTION | 7193 #undef DECLARE_CONCRETE_INSTRUCTION |
| 7276 | 7194 |
| 7277 } } // namespace v8::internal | 7195 } } // namespace v8::internal |
| 7278 | 7196 |
| 7279 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 7197 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |