| 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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 V(StoreNamedGeneric) \ | 164 V(StoreNamedGeneric) \ |
| 165 V(StringAdd) \ | 165 V(StringAdd) \ |
| 166 V(StringCharCodeAt) \ | 166 V(StringCharCodeAt) \ |
| 167 V(StringCharFromCode) \ | 167 V(StringCharFromCode) \ |
| 168 V(StringLength) \ | 168 V(StringLength) \ |
| 169 V(Sub) \ | 169 V(Sub) \ |
| 170 V(ThisFunction) \ | 170 V(ThisFunction) \ |
| 171 V(Throw) \ | 171 V(Throw) \ |
| 172 V(ToFastProperties) \ | 172 V(ToFastProperties) \ |
| 173 V(ToInt32) \ | 173 V(ToInt32) \ |
| 174 V(TransitionElementsKind) \ |
| 174 V(Typeof) \ | 175 V(Typeof) \ |
| 175 V(TypeofIsAndBranch) \ | 176 V(TypeofIsAndBranch) \ |
| 176 V(UnaryMathOperation) \ | 177 V(UnaryMathOperation) \ |
| 177 V(UnknownOSRValue) \ | 178 V(UnknownOSRValue) \ |
| 178 V(UseConst) \ | 179 V(UseConst) \ |
| 179 V(ValueOf) | 180 V(ValueOf) |
| 180 | 181 |
| 181 #define GVN_FLAG_LIST(V) \ | 182 #define GVN_FLAG_LIST(V) \ |
| 182 V(Calls) \ | 183 V(Calls) \ |
| 183 V(InobjectFields) \ | 184 V(InobjectFields) \ |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 | 391 |
| 391 bool IsJSObject() { | 392 bool IsJSObject() { |
| 392 ASSERT(type_ != kUninitialized); | 393 ASSERT(type_ != kUninitialized); |
| 393 return ((type_ & kJSObject) == kJSObject); | 394 return ((type_ & kJSObject) == kJSObject); |
| 394 } | 395 } |
| 395 | 396 |
| 396 bool IsUninitialized() { | 397 bool IsUninitialized() { |
| 397 return type_ == kUninitialized; | 398 return type_ == kUninitialized; |
| 398 } | 399 } |
| 399 | 400 |
| 401 bool IsHeapObject() { |
| 402 ASSERT(type_ != kUninitialized); |
| 403 return IsHeapNumber() || IsString() || IsNonPrimitive(); |
| 404 } |
| 405 |
| 400 static HType TypeFromValue(Handle<Object> value); | 406 static HType TypeFromValue(Handle<Object> value); |
| 401 | 407 |
| 402 const char* ToString(); | 408 const char* ToString(); |
| 403 const char* ToShortString(); | 409 const char* ToShortString(); |
| 404 | 410 |
| 405 private: | 411 private: |
| 406 enum Type { | 412 enum Type { |
| 407 kTagged = 0x1, // 0000 0000 0000 0001 | 413 kTagged = 0x1, // 0000 0000 0000 0001 |
| 408 kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 | 414 kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 |
| 409 kTaggedNumber = 0xd, // 0000 0000 0000 1101 | 415 kTaggedNumber = 0xd, // 0000 0000 0000 1101 |
| (...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1094 class HChange: public HUnaryOperation { | 1100 class HChange: public HUnaryOperation { |
| 1095 public: | 1101 public: |
| 1096 HChange(HValue* value, | 1102 HChange(HValue* value, |
| 1097 Representation to, | 1103 Representation to, |
| 1098 bool is_truncating, | 1104 bool is_truncating, |
| 1099 bool deoptimize_on_undefined) | 1105 bool deoptimize_on_undefined) |
| 1100 : HUnaryOperation(value) { | 1106 : HUnaryOperation(value) { |
| 1101 ASSERT(!value->representation().IsNone() && !to.IsNone()); | 1107 ASSERT(!value->representation().IsNone() && !to.IsNone()); |
| 1102 ASSERT(!value->representation().Equals(to)); | 1108 ASSERT(!value->representation().Equals(to)); |
| 1103 set_representation(to); | 1109 set_representation(to); |
| 1110 set_type(HType::TaggedNumber()); |
| 1104 SetFlag(kUseGVN); | 1111 SetFlag(kUseGVN); |
| 1105 if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined); | 1112 if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined); |
| 1106 if (is_truncating) SetFlag(kTruncatingToInt32); | 1113 if (is_truncating) SetFlag(kTruncatingToInt32); |
| 1107 } | 1114 } |
| 1108 | 1115 |
| 1109 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 1116 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
| 1117 virtual HType CalculateInferredType(); |
| 1110 | 1118 |
| 1111 Representation from() { return value()->representation(); } | 1119 Representation from() { return value()->representation(); } |
| 1112 Representation to() { return representation(); } | 1120 Representation to() { return representation(); } |
| 1113 bool deoptimize_on_undefined() const { | 1121 bool deoptimize_on_undefined() const { |
| 1114 return CheckFlag(kDeoptimizeOnUndefined); | 1122 return CheckFlag(kDeoptimizeOnUndefined); |
| 1115 } | 1123 } |
| 1116 virtual Representation RequiredInputRepresentation(int index) { | 1124 virtual Representation RequiredInputRepresentation(int index) { |
| 1117 return from(); | 1125 return from(); |
| 1118 } | 1126 } |
| 1119 | 1127 |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1333 } | 1341 } |
| 1334 | 1342 |
| 1335 HValue* argument() { return OperandAt(0); } | 1343 HValue* argument() { return OperandAt(0); } |
| 1336 | 1344 |
| 1337 DECLARE_CONCRETE_INSTRUCTION(PushArgument) | 1345 DECLARE_CONCRETE_INSTRUCTION(PushArgument) |
| 1338 }; | 1346 }; |
| 1339 | 1347 |
| 1340 | 1348 |
| 1341 class HThisFunction: public HTemplateInstruction<0> { | 1349 class HThisFunction: public HTemplateInstruction<0> { |
| 1342 public: | 1350 public: |
| 1343 HThisFunction() { | 1351 explicit HThisFunction(Handle<JSFunction> closure) : closure_(closure) { |
| 1344 set_representation(Representation::Tagged()); | 1352 set_representation(Representation::Tagged()); |
| 1345 SetFlag(kUseGVN); | 1353 SetFlag(kUseGVN); |
| 1346 } | 1354 } |
| 1347 | 1355 |
| 1348 virtual Representation RequiredInputRepresentation(int index) { | 1356 virtual Representation RequiredInputRepresentation(int index) { |
| 1349 return Representation::None(); | 1357 return Representation::None(); |
| 1350 } | 1358 } |
| 1351 | 1359 |
| 1360 Handle<JSFunction> closure() const { return closure_; } |
| 1361 |
| 1352 DECLARE_CONCRETE_INSTRUCTION(ThisFunction) | 1362 DECLARE_CONCRETE_INSTRUCTION(ThisFunction) |
| 1353 | 1363 |
| 1354 protected: | 1364 protected: |
| 1355 virtual bool DataEquals(HValue* other) { return true; } | 1365 virtual bool DataEquals(HValue* other) { |
| 1366 HThisFunction* b = HThisFunction::cast(other); |
| 1367 return *closure() == *b->closure(); |
| 1368 } |
| 1369 |
| 1370 private: |
| 1371 Handle<JSFunction> closure_; |
| 1356 }; | 1372 }; |
| 1357 | 1373 |
| 1358 | 1374 |
| 1359 class HContext: public HTemplateInstruction<0> { | 1375 class HContext: public HTemplateInstruction<0> { |
| 1360 public: | 1376 public: |
| 1361 HContext() { | 1377 HContext() { |
| 1362 set_representation(Representation::Tagged()); | 1378 set_representation(Representation::Tagged()); |
| 1363 SetFlag(kUseGVN); | 1379 SetFlag(kUseGVN); |
| 1364 } | 1380 } |
| 1365 | 1381 |
| (...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2273 | 2289 |
| 2274 virtual bool IsConvertibleToInteger() const { | 2290 virtual bool IsConvertibleToInteger() const { |
| 2275 if (handle_->IsSmi()) return true; | 2291 if (handle_->IsSmi()) return true; |
| 2276 if (handle_->IsHeapNumber() && | 2292 if (handle_->IsHeapNumber() && |
| 2277 (HeapNumber::cast(*handle_)->value() == | 2293 (HeapNumber::cast(*handle_)->value() == |
| 2278 static_cast<double>(NumberToInt32(*handle_)))) return true; | 2294 static_cast<double>(NumberToInt32(*handle_)))) return true; |
| 2279 return false; | 2295 return false; |
| 2280 } | 2296 } |
| 2281 | 2297 |
| 2282 virtual bool EmitAtUses() { return !representation().IsDouble(); } | 2298 virtual bool EmitAtUses() { return !representation().IsDouble(); } |
| 2299 virtual HValue* Canonicalize(); |
| 2283 virtual void PrintDataTo(StringStream* stream); | 2300 virtual void PrintDataTo(StringStream* stream); |
| 2284 virtual HType CalculateInferredType(); | 2301 virtual HType CalculateInferredType(); |
| 2285 bool IsInteger() const { return handle_->IsSmi(); } | 2302 bool IsInteger() const { return handle_->IsSmi(); } |
| 2286 HConstant* CopyToRepresentation(Representation r) const; | 2303 HConstant* CopyToRepresentation(Representation r) const; |
| 2287 HConstant* CopyToTruncatedInt32() const; | 2304 HConstant* CopyToTruncatedInt32() const; |
| 2288 bool HasInteger32Value() const { return has_int32_value_; } | 2305 bool HasInteger32Value() const { return has_int32_value_; } |
| 2289 int32_t Integer32Value() const { | 2306 int32_t Integer32Value() const { |
| 2290 ASSERT(HasInteger32Value()); | 2307 ASSERT(HasInteger32Value()); |
| 2291 return int32_value_; | 2308 return int32_value_; |
| 2292 } | 2309 } |
| (...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3253 } | 3270 } |
| 3254 | 3271 |
| 3255 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) | 3272 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) |
| 3256 | 3273 |
| 3257 private: | 3274 private: |
| 3258 Handle<Object> name_; | 3275 Handle<Object> name_; |
| 3259 bool for_typeof_; | 3276 bool for_typeof_; |
| 3260 }; | 3277 }; |
| 3261 | 3278 |
| 3262 | 3279 |
| 3280 static inline bool StoringValueNeedsWriteBarrier(HValue* value) { |
| 3281 return !value->type().IsBoolean() |
| 3282 && !value->type().IsSmi() |
| 3283 && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable()); |
| 3284 } |
| 3285 |
| 3286 |
| 3263 class HStoreGlobalCell: public HUnaryOperation { | 3287 class HStoreGlobalCell: public HUnaryOperation { |
| 3264 public: | 3288 public: |
| 3265 HStoreGlobalCell(HValue* value, | 3289 HStoreGlobalCell(HValue* value, |
| 3266 Handle<JSGlobalPropertyCell> cell, | 3290 Handle<JSGlobalPropertyCell> cell, |
| 3267 PropertyDetails details) | 3291 PropertyDetails details) |
| 3268 : HUnaryOperation(value), | 3292 : HUnaryOperation(value), |
| 3269 cell_(cell), | 3293 cell_(cell), |
| 3270 details_(details) { | 3294 details_(details) { |
| 3271 SetFlag(kChangesGlobalVars); | 3295 SetFlag(kChangesGlobalVars); |
| 3272 } | 3296 } |
| 3273 | 3297 |
| 3274 Handle<JSGlobalPropertyCell> cell() const { return cell_; } | 3298 Handle<JSGlobalPropertyCell> cell() const { return cell_; } |
| 3275 bool RequiresHoleCheck() { | 3299 bool RequiresHoleCheck() { |
| 3276 return !details_.IsDontDelete() || details_.IsReadOnly(); | 3300 return !details_.IsDontDelete() || details_.IsReadOnly(); |
| 3277 } | 3301 } |
| 3302 bool NeedsWriteBarrier() { |
| 3303 return StoringValueNeedsWriteBarrier(value()); |
| 3304 } |
| 3278 | 3305 |
| 3279 virtual Representation RequiredInputRepresentation(int index) { | 3306 virtual Representation RequiredInputRepresentation(int index) { |
| 3280 return Representation::Tagged(); | 3307 return Representation::Tagged(); |
| 3281 } | 3308 } |
| 3282 virtual void PrintDataTo(StringStream* stream); | 3309 virtual void PrintDataTo(StringStream* stream); |
| 3283 | 3310 |
| 3284 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) | 3311 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) |
| 3285 | 3312 |
| 3286 private: | 3313 private: |
| 3287 Handle<JSGlobalPropertyCell> cell_; | 3314 Handle<JSGlobalPropertyCell> cell_; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3348 virtual bool DataEquals(HValue* other) { | 3375 virtual bool DataEquals(HValue* other) { |
| 3349 HLoadContextSlot* b = HLoadContextSlot::cast(other); | 3376 HLoadContextSlot* b = HLoadContextSlot::cast(other); |
| 3350 return (slot_index() == b->slot_index()); | 3377 return (slot_index() == b->slot_index()); |
| 3351 } | 3378 } |
| 3352 | 3379 |
| 3353 private: | 3380 private: |
| 3354 int slot_index_; | 3381 int slot_index_; |
| 3355 }; | 3382 }; |
| 3356 | 3383 |
| 3357 | 3384 |
| 3358 static inline bool StoringValueNeedsWriteBarrier(HValue* value) { | |
| 3359 return !value->type().IsBoolean() | |
| 3360 && !value->type().IsSmi() | |
| 3361 && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable()); | |
| 3362 } | |
| 3363 | |
| 3364 | |
| 3365 class HStoreContextSlot: public HTemplateInstruction<2> { | 3385 class HStoreContextSlot: public HTemplateInstruction<2> { |
| 3366 public: | 3386 public: |
| 3367 HStoreContextSlot(HValue* context, int slot_index, HValue* value) | 3387 HStoreContextSlot(HValue* context, int slot_index, HValue* value) |
| 3368 : slot_index_(slot_index) { | 3388 : slot_index_(slot_index) { |
| 3369 SetOperandAt(0, context); | 3389 SetOperandAt(0, context); |
| 3370 SetOperandAt(1, value); | 3390 SetOperandAt(1, value); |
| 3371 SetFlag(kChangesContextSlots); | 3391 SetFlag(kChangesContextSlots); |
| 3372 } | 3392 } |
| 3373 | 3393 |
| 3374 HValue* context() { return OperandAt(0); } | 3394 HValue* context() { return OperandAt(0); } |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3693 Handle<Map> transition_; | 3713 Handle<Map> transition_; |
| 3694 }; | 3714 }; |
| 3695 | 3715 |
| 3696 | 3716 |
| 3697 class HStoreNamedGeneric: public HTemplateInstruction<3> { | 3717 class HStoreNamedGeneric: public HTemplateInstruction<3> { |
| 3698 public: | 3718 public: |
| 3699 HStoreNamedGeneric(HValue* context, | 3719 HStoreNamedGeneric(HValue* context, |
| 3700 HValue* object, | 3720 HValue* object, |
| 3701 Handle<String> name, | 3721 Handle<String> name, |
| 3702 HValue* value, | 3722 HValue* value, |
| 3703 bool strict_mode) | 3723 StrictModeFlag strict_mode_flag) |
| 3704 : name_(name), | 3724 : name_(name), |
| 3705 strict_mode_(strict_mode) { | 3725 strict_mode_flag_(strict_mode_flag) { |
| 3706 SetOperandAt(0, object); | 3726 SetOperandAt(0, object); |
| 3707 SetOperandAt(1, value); | 3727 SetOperandAt(1, value); |
| 3708 SetOperandAt(2, context); | 3728 SetOperandAt(2, context); |
| 3709 SetAllSideEffects(); | 3729 SetAllSideEffects(); |
| 3710 } | 3730 } |
| 3711 | 3731 |
| 3712 HValue* object() { return OperandAt(0); } | 3732 HValue* object() { return OperandAt(0); } |
| 3713 HValue* value() { return OperandAt(1); } | 3733 HValue* value() { return OperandAt(1); } |
| 3714 HValue* context() { return OperandAt(2); } | 3734 HValue* context() { return OperandAt(2); } |
| 3715 Handle<String> name() { return name_; } | 3735 Handle<String> name() { return name_; } |
| 3716 bool strict_mode() { return strict_mode_; } | 3736 StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } |
| 3717 | 3737 |
| 3718 virtual void PrintDataTo(StringStream* stream); | 3738 virtual void PrintDataTo(StringStream* stream); |
| 3719 | 3739 |
| 3720 virtual Representation RequiredInputRepresentation(int index) { | 3740 virtual Representation RequiredInputRepresentation(int index) { |
| 3721 return Representation::Tagged(); | 3741 return Representation::Tagged(); |
| 3722 } | 3742 } |
| 3723 | 3743 |
| 3724 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) | 3744 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) |
| 3725 | 3745 |
| 3726 private: | 3746 private: |
| 3727 Handle<String> name_; | 3747 Handle<String> name_; |
| 3728 bool strict_mode_; | 3748 StrictModeFlag strict_mode_flag_; |
| 3729 }; | 3749 }; |
| 3730 | 3750 |
| 3731 | 3751 |
| 3732 class HStoreKeyedFastElement: public HTemplateInstruction<3> { | 3752 class HStoreKeyedFastElement: public HTemplateInstruction<3> { |
| 3733 public: | 3753 public: |
| 3734 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val, | 3754 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val, |
| 3735 ElementsKind elements_kind = FAST_ELEMENTS) | 3755 ElementsKind elements_kind = FAST_ELEMENTS) |
| 3736 : elements_kind_(elements_kind) { | 3756 : elements_kind_(elements_kind) { |
| 3737 SetOperandAt(0, obj); | 3757 SetOperandAt(0, obj); |
| 3738 SetOperandAt(1, key); | 3758 SetOperandAt(1, key); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3879 | 3899 |
| 3880 virtual void PrintDataTo(StringStream* stream); | 3900 virtual void PrintDataTo(StringStream* stream); |
| 3881 | 3901 |
| 3882 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) | 3902 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) |
| 3883 | 3903 |
| 3884 private: | 3904 private: |
| 3885 bool strict_mode_; | 3905 bool strict_mode_; |
| 3886 }; | 3906 }; |
| 3887 | 3907 |
| 3888 | 3908 |
| 3909 class HTransitionElementsKind: public HTemplateInstruction<1> { |
| 3910 public: |
| 3911 HTransitionElementsKind(HValue* object, |
| 3912 Handle<Map> original_map, |
| 3913 Handle<Map> transitioned_map) |
| 3914 : original_map_(original_map), |
| 3915 transitioned_map_(transitioned_map) { |
| 3916 SetOperandAt(0, object); |
| 3917 SetFlag(kUseGVN); |
| 3918 SetFlag(kDependsOnMaps); |
| 3919 set_representation(Representation::Tagged()); |
| 3920 } |
| 3921 |
| 3922 virtual Representation RequiredInputRepresentation(int index) { |
| 3923 return Representation::Tagged(); |
| 3924 } |
| 3925 |
| 3926 HValue* object() { return OperandAt(0); } |
| 3927 Handle<Map> original_map() { return original_map_; } |
| 3928 Handle<Map> transitioned_map() { return transitioned_map_; } |
| 3929 |
| 3930 virtual void PrintDataTo(StringStream* stream); |
| 3931 |
| 3932 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) |
| 3933 |
| 3934 protected: |
| 3935 virtual bool DataEquals(HValue* other) { |
| 3936 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); |
| 3937 return original_map_.is_identical_to(instr->original_map()) && |
| 3938 transitioned_map_.is_identical_to(instr->transitioned_map()); |
| 3939 } |
| 3940 |
| 3941 private: |
| 3942 Handle<Map> original_map_; |
| 3943 Handle<Map> transitioned_map_; |
| 3944 }; |
| 3945 |
| 3946 |
| 3889 class HStringAdd: public HBinaryOperation { | 3947 class HStringAdd: public HBinaryOperation { |
| 3890 public: | 3948 public: |
| 3891 HStringAdd(HValue* context, HValue* left, HValue* right) | 3949 HStringAdd(HValue* context, HValue* left, HValue* right) |
| 3892 : HBinaryOperation(context, left, right) { | 3950 : HBinaryOperation(context, left, right) { |
| 3893 set_representation(Representation::Tagged()); | 3951 set_representation(Representation::Tagged()); |
| 3894 SetFlag(kUseGVN); | 3952 SetFlag(kUseGVN); |
| 3895 SetFlag(kDependsOnMaps); | 3953 SetFlag(kDependsOnMaps); |
| 3896 } | 3954 } |
| 3897 | 3955 |
| 3898 virtual Representation RequiredInputRepresentation(int index) { | 3956 virtual Representation RequiredInputRepresentation(int index) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3941 return new Range(0, String::kMaxUC16CharCode); | 3999 return new Range(0, String::kMaxUC16CharCode); |
| 3942 } | 4000 } |
| 3943 }; | 4001 }; |
| 3944 | 4002 |
| 3945 | 4003 |
| 3946 class HStringCharFromCode: public HTemplateInstruction<2> { | 4004 class HStringCharFromCode: public HTemplateInstruction<2> { |
| 3947 public: | 4005 public: |
| 3948 HStringCharFromCode(HValue* context, HValue* char_code) { | 4006 HStringCharFromCode(HValue* context, HValue* char_code) { |
| 3949 SetOperandAt(0, context); | 4007 SetOperandAt(0, context); |
| 3950 SetOperandAt(1, char_code); | 4008 SetOperandAt(1, char_code); |
| 3951 set_representation(Representation::Tagged()); | 4009 set_representation(Representation::Tagged()); |
| 3952 SetFlag(kUseGVN); | 4010 SetFlag(kUseGVN); |
| 3953 } | 4011 } |
| 3954 | 4012 |
| 3955 virtual Representation RequiredInputRepresentation(int index) { | 4013 virtual Representation RequiredInputRepresentation(int index) { |
| 3956 return index == 0 | 4014 return index == 0 |
| 3957 ? Representation::Tagged() | 4015 ? Representation::Tagged() |
| 3958 : Representation::Integer32(); | 4016 : Representation::Integer32(); |
| 3959 } | 4017 } |
| 4018 virtual HType CalculateInferredType(); |
| 3960 | 4019 |
| 3961 HValue* context() { return OperandAt(0); } | 4020 HValue* context() { return OperandAt(0); } |
| 3962 HValue* value() { return OperandAt(1); } | 4021 HValue* value() { return OperandAt(1); } |
| 3963 | 4022 |
| 3964 virtual bool DataEquals(HValue* other) { return true; } | 4023 virtual bool DataEquals(HValue* other) { return true; } |
| 3965 | 4024 |
| 3966 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) | 4025 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) |
| 3967 }; | 4026 }; |
| 3968 | 4027 |
| 3969 | 4028 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4027 | 4086 |
| 4028 HValue* context() { return OperandAt(0); } | 4087 HValue* context() { return OperandAt(0); } |
| 4029 Handle<FixedArray> constant_elements() const { return constant_elements_; } | 4088 Handle<FixedArray> constant_elements() const { return constant_elements_; } |
| 4030 int length() const { return length_; } | 4089 int length() const { return length_; } |
| 4031 | 4090 |
| 4032 bool IsCopyOnWrite() const; | 4091 bool IsCopyOnWrite() const; |
| 4033 | 4092 |
| 4034 virtual Representation RequiredInputRepresentation(int index) { | 4093 virtual Representation RequiredInputRepresentation(int index) { |
| 4035 return Representation::Tagged(); | 4094 return Representation::Tagged(); |
| 4036 } | 4095 } |
| 4096 virtual HType CalculateInferredType(); |
| 4037 | 4097 |
| 4038 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral) | 4098 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral) |
| 4039 | 4099 |
| 4040 private: | 4100 private: |
| 4041 int length_; | 4101 int length_; |
| 4042 Handle<FixedArray> constant_elements_; | 4102 Handle<FixedArray> constant_elements_; |
| 4043 }; | 4103 }; |
| 4044 | 4104 |
| 4045 | 4105 |
| 4046 class HObjectLiteral: public HMaterializedLiteral<1> { | 4106 class HObjectLiteral: public HMaterializedLiteral<1> { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 4061 HValue* context() { return OperandAt(0); } | 4121 HValue* context() { return OperandAt(0); } |
| 4062 Handle<FixedArray> constant_properties() const { | 4122 Handle<FixedArray> constant_properties() const { |
| 4063 return constant_properties_; | 4123 return constant_properties_; |
| 4064 } | 4124 } |
| 4065 bool fast_elements() const { return fast_elements_; } | 4125 bool fast_elements() const { return fast_elements_; } |
| 4066 bool has_function() const { return has_function_; } | 4126 bool has_function() const { return has_function_; } |
| 4067 | 4127 |
| 4068 virtual Representation RequiredInputRepresentation(int index) { | 4128 virtual Representation RequiredInputRepresentation(int index) { |
| 4069 return Representation::Tagged(); | 4129 return Representation::Tagged(); |
| 4070 } | 4130 } |
| 4131 virtual HType CalculateInferredType(); |
| 4071 | 4132 |
| 4072 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral) | 4133 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral) |
| 4073 | 4134 |
| 4074 private: | 4135 private: |
| 4075 Handle<FixedArray> constant_properties_; | 4136 Handle<FixedArray> constant_properties_; |
| 4076 bool fast_elements_; | 4137 bool fast_elements_; |
| 4077 bool has_function_; | 4138 bool has_function_; |
| 4078 }; | 4139 }; |
| 4079 | 4140 |
| 4080 | 4141 |
| 4081 class HRegExpLiteral: public HMaterializedLiteral<1> { | 4142 class HRegExpLiteral: public HMaterializedLiteral<1> { |
| 4082 public: | 4143 public: |
| 4083 HRegExpLiteral(HValue* context, | 4144 HRegExpLiteral(HValue* context, |
| 4084 Handle<String> pattern, | 4145 Handle<String> pattern, |
| 4085 Handle<String> flags, | 4146 Handle<String> flags, |
| 4086 int literal_index) | 4147 int literal_index) |
| 4087 : HMaterializedLiteral<1>(literal_index, 0), | 4148 : HMaterializedLiteral<1>(literal_index, 0), |
| 4088 pattern_(pattern), | 4149 pattern_(pattern), |
| 4089 flags_(flags) { | 4150 flags_(flags) { |
| 4090 SetOperandAt(0, context); | 4151 SetOperandAt(0, context); |
| 4091 } | 4152 } |
| 4092 | 4153 |
| 4093 HValue* context() { return OperandAt(0); } | 4154 HValue* context() { return OperandAt(0); } |
| 4094 Handle<String> pattern() { return pattern_; } | 4155 Handle<String> pattern() { return pattern_; } |
| 4095 Handle<String> flags() { return flags_; } | 4156 Handle<String> flags() { return flags_; } |
| 4096 | 4157 |
| 4097 virtual Representation RequiredInputRepresentation(int index) { | 4158 virtual Representation RequiredInputRepresentation(int index) { |
| 4098 return Representation::Tagged(); | 4159 return Representation::Tagged(); |
| 4099 } | 4160 } |
| 4161 virtual HType CalculateInferredType(); |
| 4100 | 4162 |
| 4101 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) | 4163 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) |
| 4102 | 4164 |
| 4103 private: | 4165 private: |
| 4104 Handle<String> pattern_; | 4166 Handle<String> pattern_; |
| 4105 Handle<String> flags_; | 4167 Handle<String> flags_; |
| 4106 }; | 4168 }; |
| 4107 | 4169 |
| 4108 | 4170 |
| 4109 class HFunctionLiteral: public HTemplateInstruction<1> { | 4171 class HFunctionLiteral: public HTemplateInstruction<1> { |
| 4110 public: | 4172 public: |
| 4111 HFunctionLiteral(HValue* context, | 4173 HFunctionLiteral(HValue* context, |
| 4112 Handle<SharedFunctionInfo> shared, | 4174 Handle<SharedFunctionInfo> shared, |
| 4113 bool pretenure) | 4175 bool pretenure) |
| 4114 : shared_info_(shared), pretenure_(pretenure) { | 4176 : shared_info_(shared), pretenure_(pretenure) { |
| 4115 SetOperandAt(0, context); | 4177 SetOperandAt(0, context); |
| 4116 set_representation(Representation::Tagged()); | 4178 set_representation(Representation::Tagged()); |
| 4117 } | 4179 } |
| 4118 | 4180 |
| 4119 HValue* context() { return OperandAt(0); } | 4181 HValue* context() { return OperandAt(0); } |
| 4120 | 4182 |
| 4121 virtual Representation RequiredInputRepresentation(int index) { | 4183 virtual Representation RequiredInputRepresentation(int index) { |
| 4122 return Representation::Tagged(); | 4184 return Representation::Tagged(); |
| 4123 } | 4185 } |
| 4186 virtual HType CalculateInferredType(); |
| 4124 | 4187 |
| 4125 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) | 4188 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) |
| 4126 | 4189 |
| 4127 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } | 4190 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
| 4128 bool pretenure() const { return pretenure_; } | 4191 bool pretenure() const { return pretenure_; } |
| 4129 | 4192 |
| 4130 private: | 4193 private: |
| 4131 Handle<SharedFunctionInfo> shared_info_; | 4194 Handle<SharedFunctionInfo> shared_info_; |
| 4132 bool pretenure_; | 4195 bool pretenure_; |
| 4133 }; | 4196 }; |
| 4134 | 4197 |
| 4135 | 4198 |
| 4136 class HTypeof: public HTemplateInstruction<2> { | 4199 class HTypeof: public HTemplateInstruction<2> { |
| 4137 public: | 4200 public: |
| 4138 explicit HTypeof(HValue* context, HValue* value) { | 4201 explicit HTypeof(HValue* context, HValue* value) { |
| 4139 SetOperandAt(0, context); | 4202 SetOperandAt(0, context); |
| 4140 SetOperandAt(1, value); | 4203 SetOperandAt(1, value); |
| 4141 set_representation(Representation::Tagged()); | 4204 set_representation(Representation::Tagged()); |
| 4142 } | 4205 } |
| 4143 | 4206 |
| 4144 HValue* context() { return OperandAt(0); } | 4207 HValue* context() { return OperandAt(0); } |
| 4145 HValue* value() { return OperandAt(1); } | 4208 HValue* value() { return OperandAt(1); } |
| 4146 | 4209 |
| 4210 virtual HValue* Canonicalize(); |
| 4147 virtual void PrintDataTo(StringStream* stream); | 4211 virtual void PrintDataTo(StringStream* stream); |
| 4148 | 4212 |
| 4149 virtual Representation RequiredInputRepresentation(int index) { | 4213 virtual Representation RequiredInputRepresentation(int index) { |
| 4150 return Representation::Tagged(); | 4214 return Representation::Tagged(); |
| 4151 } | 4215 } |
| 4152 | 4216 |
| 4153 DECLARE_CONCRETE_INSTRUCTION(Typeof) | 4217 DECLARE_CONCRETE_INSTRUCTION(Typeof) |
| 4154 }; | 4218 }; |
| 4155 | 4219 |
| 4156 | 4220 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4233 | 4297 |
| 4234 DECLARE_CONCRETE_INSTRUCTION(In) | 4298 DECLARE_CONCRETE_INSTRUCTION(In) |
| 4235 }; | 4299 }; |
| 4236 | 4300 |
| 4237 #undef DECLARE_INSTRUCTION | 4301 #undef DECLARE_INSTRUCTION |
| 4238 #undef DECLARE_CONCRETE_INSTRUCTION | 4302 #undef DECLARE_CONCRETE_INSTRUCTION |
| 4239 | 4303 |
| 4240 } } // namespace v8::internal | 4304 } } // namespace v8::internal |
| 4241 | 4305 |
| 4242 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 4306 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |