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 3928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3939 virtual Representation RequiredInputRepresentation(int index) { | 3939 virtual Representation RequiredInputRepresentation(int index) { |
3940 return Representation::Tagged(); | 3940 return Representation::Tagged(); |
3941 } | 3941 } |
3942 | 3942 |
3943 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) | 3943 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) |
3944 | 3944 |
3945 protected: | 3945 protected: |
3946 virtual bool DataEquals(HValue* other) { return true; } | 3946 virtual bool DataEquals(HValue* other) { return true; } |
3947 }; | 3947 }; |
3948 | 3948 |
| 3949 class ArrayInstructionInterface { |
| 3950 public: |
| 3951 virtual HValue* GetKey() = 0; |
| 3952 virtual void SetKey(HValue* key) = 0; |
| 3953 virtual void SetIndexOffset(uint32_t index_offset) = 0; |
| 3954 virtual bool IsDehoisted() = 0; |
| 3955 virtual void SetDehoisted(bool is_dehoisted) = 0; |
| 3956 virtual ~ArrayInstructionInterface() { }; |
| 3957 }; |
3949 | 3958 |
3950 class HLoadKeyedFastElement: public HTemplateInstruction<2> { | 3959 class HLoadKeyedFastElement |
| 3960 : public HTemplateInstruction<2>, public ArrayInstructionInterface { |
3951 public: | 3961 public: |
3952 enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK }; | 3962 enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK }; |
3953 | 3963 |
3954 HLoadKeyedFastElement(HValue* obj, | 3964 HLoadKeyedFastElement(HValue* obj, |
3955 HValue* key, | 3965 HValue* key, |
3956 HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK) | 3966 HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK) |
3957 : hole_check_mode_(hole_check_mode) { | 3967 : hole_check_mode_(hole_check_mode), |
| 3968 index_offset_(0), |
| 3969 is_dehoisted_(false) { |
3958 SetOperandAt(0, obj); | 3970 SetOperandAt(0, obj); |
3959 SetOperandAt(1, key); | 3971 SetOperandAt(1, key); |
3960 set_representation(Representation::Tagged()); | 3972 set_representation(Representation::Tagged()); |
3961 SetGVNFlag(kDependsOnArrayElements); | 3973 SetGVNFlag(kDependsOnArrayElements); |
3962 SetFlag(kUseGVN); | 3974 SetFlag(kUseGVN); |
3963 } | 3975 } |
3964 | 3976 |
3965 HValue* object() { return OperandAt(0); } | 3977 HValue* object() { return OperandAt(0); } |
3966 HValue* key() { return OperandAt(1); } | 3978 HValue* key() { return OperandAt(1); } |
| 3979 uint32_t index_offset() { return index_offset_; } |
| 3980 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| 3981 HValue* GetKey() { return key(); } |
| 3982 void SetKey(HValue* key) { SetOperandAt(1, key); } |
| 3983 bool IsDehoisted() { return is_dehoisted_; } |
| 3984 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
3967 | 3985 |
3968 virtual Representation RequiredInputRepresentation(int index) { | 3986 virtual Representation RequiredInputRepresentation(int index) { |
3969 // The key is supposed to be Integer32. | 3987 // The key is supposed to be Integer32. |
3970 return index == 0 | 3988 return index == 0 |
3971 ? Representation::Tagged() | 3989 ? Representation::Tagged() |
3972 : Representation::Integer32(); | 3990 : Representation::Integer32(); |
3973 } | 3991 } |
3974 | 3992 |
3975 virtual void PrintDataTo(StringStream* stream); | 3993 virtual void PrintDataTo(StringStream* stream); |
3976 | 3994 |
3977 bool RequiresHoleCheck(); | 3995 bool RequiresHoleCheck(); |
3978 | 3996 |
3979 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) | 3997 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) |
3980 | 3998 |
3981 protected: | 3999 protected: |
3982 virtual bool DataEquals(HValue* other) { | 4000 virtual bool DataEquals(HValue* other) { |
3983 if (!other->IsLoadKeyedFastElement()) return false; | 4001 if (!other->IsLoadKeyedFastElement()) return false; |
3984 HLoadKeyedFastElement* other_load = HLoadKeyedFastElement::cast(other); | 4002 HLoadKeyedFastElement* other_load = HLoadKeyedFastElement::cast(other); |
| 4003 if (is_dehoisted_ && index_offset_ != other_load->index_offset_) |
| 4004 return false; |
3985 return hole_check_mode_ == other_load->hole_check_mode_; | 4005 return hole_check_mode_ == other_load->hole_check_mode_; |
3986 } | 4006 } |
3987 | 4007 |
3988 private: | 4008 private: |
3989 HoleCheckMode hole_check_mode_; | 4009 HoleCheckMode hole_check_mode_; |
| 4010 uint32_t index_offset_; |
| 4011 bool is_dehoisted_; |
3990 }; | 4012 }; |
3991 | 4013 |
3992 | 4014 |
3993 class HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> { | 4015 class HLoadKeyedFastDoubleElement |
| 4016 : public HTemplateInstruction<2>, public ArrayInstructionInterface { |
3994 public: | 4017 public: |
3995 HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) { | 4018 HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) |
| 4019 : index_offset_(0), is_dehoisted_(false) { |
3996 SetOperandAt(0, elements); | 4020 SetOperandAt(0, elements); |
3997 SetOperandAt(1, key); | 4021 SetOperandAt(1, key); |
3998 set_representation(Representation::Double()); | 4022 set_representation(Representation::Double()); |
3999 SetGVNFlag(kDependsOnDoubleArrayElements); | 4023 SetGVNFlag(kDependsOnDoubleArrayElements); |
4000 SetFlag(kUseGVN); | 4024 SetFlag(kUseGVN); |
4001 } | 4025 } |
4002 | 4026 |
4003 HValue* elements() { return OperandAt(0); } | 4027 HValue* elements() { return OperandAt(0); } |
4004 HValue* key() { return OperandAt(1); } | 4028 HValue* key() { return OperandAt(1); } |
| 4029 uint32_t index_offset() { return index_offset_; } |
| 4030 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| 4031 HValue* GetKey() { return key(); } |
| 4032 void SetKey(HValue* key) { SetOperandAt(1, key); } |
| 4033 bool IsDehoisted() { return is_dehoisted_; } |
| 4034 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
4005 | 4035 |
4006 virtual Representation RequiredInputRepresentation(int index) { | 4036 virtual Representation RequiredInputRepresentation(int index) { |
4007 // The key is supposed to be Integer32. | 4037 // The key is supposed to be Integer32. |
4008 return index == 0 | 4038 return index == 0 |
4009 ? Representation::Tagged() | 4039 ? Representation::Tagged() |
4010 : Representation::Integer32(); | 4040 : Representation::Integer32(); |
4011 } | 4041 } |
4012 | 4042 |
4013 virtual void PrintDataTo(StringStream* stream); | 4043 virtual void PrintDataTo(StringStream* stream); |
4014 | 4044 |
4015 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement) | 4045 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement) |
4016 | 4046 |
4017 protected: | 4047 protected: |
4018 virtual bool DataEquals(HValue* other) { return true; } | 4048 virtual bool DataEquals(HValue* other) { return true; } |
| 4049 |
| 4050 private: |
| 4051 uint32_t index_offset_; |
| 4052 bool is_dehoisted_; |
4019 }; | 4053 }; |
4020 | 4054 |
4021 | 4055 |
4022 class HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> { | 4056 class HLoadKeyedSpecializedArrayElement |
| 4057 : public HTemplateInstruction<2>, public ArrayInstructionInterface { |
4023 public: | 4058 public: |
4024 HLoadKeyedSpecializedArrayElement(HValue* external_elements, | 4059 HLoadKeyedSpecializedArrayElement(HValue* external_elements, |
4025 HValue* key, | 4060 HValue* key, |
4026 ElementsKind elements_kind) | 4061 ElementsKind elements_kind) |
4027 : elements_kind_(elements_kind) { | 4062 : elements_kind_(elements_kind), |
| 4063 index_offset_(0), |
| 4064 is_dehoisted_(false) { |
4028 SetOperandAt(0, external_elements); | 4065 SetOperandAt(0, external_elements); |
4029 SetOperandAt(1, key); | 4066 SetOperandAt(1, key); |
4030 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || | 4067 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
4031 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { | 4068 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
4032 set_representation(Representation::Double()); | 4069 set_representation(Representation::Double()); |
4033 } else { | 4070 } else { |
4034 set_representation(Representation::Integer32()); | 4071 set_representation(Representation::Integer32()); |
4035 } | 4072 } |
4036 SetGVNFlag(kDependsOnSpecializedArrayElements); | 4073 SetGVNFlag(kDependsOnSpecializedArrayElements); |
4037 // Native code could change the specialized array. | 4074 // Native code could change the specialized array. |
4038 SetGVNFlag(kDependsOnCalls); | 4075 SetGVNFlag(kDependsOnCalls); |
4039 SetFlag(kUseGVN); | 4076 SetFlag(kUseGVN); |
4040 } | 4077 } |
4041 | 4078 |
4042 virtual void PrintDataTo(StringStream* stream); | 4079 virtual void PrintDataTo(StringStream* stream); |
4043 | 4080 |
4044 virtual Representation RequiredInputRepresentation(int index) { | 4081 virtual Representation RequiredInputRepresentation(int index) { |
4045 // The key is supposed to be Integer32, but the base pointer | 4082 // The key is supposed to be Integer32, but the base pointer |
4046 // for the element load is a naked pointer. | 4083 // for the element load is a naked pointer. |
4047 return index == 0 | 4084 return index == 0 |
4048 ? Representation::External() | 4085 ? Representation::External() |
4049 : Representation::Integer32(); | 4086 : Representation::Integer32(); |
4050 } | 4087 } |
4051 | 4088 |
4052 HValue* external_pointer() { return OperandAt(0); } | 4089 HValue* external_pointer() { return OperandAt(0); } |
4053 HValue* key() { return OperandAt(1); } | 4090 HValue* key() { return OperandAt(1); } |
4054 ElementsKind elements_kind() const { return elements_kind_; } | 4091 ElementsKind elements_kind() const { return elements_kind_; } |
| 4092 uint32_t index_offset() { return index_offset_; } |
| 4093 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| 4094 HValue* GetKey() { return key(); } |
| 4095 void SetKey(HValue* key) { SetOperandAt(1, key); } |
| 4096 bool IsDehoisted() { return is_dehoisted_; } |
| 4097 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
4055 | 4098 |
4056 virtual Range* InferRange(Zone* zone); | 4099 virtual Range* InferRange(Zone* zone); |
4057 | 4100 |
4058 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement) | 4101 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement) |
4059 | 4102 |
4060 protected: | 4103 protected: |
4061 virtual bool DataEquals(HValue* other) { | 4104 virtual bool DataEquals(HValue* other) { |
4062 if (!other->IsLoadKeyedSpecializedArrayElement()) return false; | 4105 if (!other->IsLoadKeyedSpecializedArrayElement()) return false; |
4063 HLoadKeyedSpecializedArrayElement* cast_other = | 4106 HLoadKeyedSpecializedArrayElement* cast_other = |
4064 HLoadKeyedSpecializedArrayElement::cast(other); | 4107 HLoadKeyedSpecializedArrayElement::cast(other); |
4065 return elements_kind_ == cast_other->elements_kind(); | 4108 return elements_kind_ == cast_other->elements_kind(); |
4066 } | 4109 } |
4067 | 4110 |
4068 private: | 4111 private: |
4069 ElementsKind elements_kind_; | 4112 ElementsKind elements_kind_; |
| 4113 uint32_t index_offset_; |
| 4114 bool is_dehoisted_; |
4070 }; | 4115 }; |
4071 | 4116 |
4072 | 4117 |
4073 class HLoadKeyedGeneric: public HTemplateInstruction<3> { | 4118 class HLoadKeyedGeneric: public HTemplateInstruction<3> { |
4074 public: | 4119 public: |
4075 HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) { | 4120 HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) { |
4076 set_representation(Representation::Tagged()); | 4121 set_representation(Representation::Tagged()); |
4077 SetOperandAt(0, obj); | 4122 SetOperandAt(0, obj); |
4078 SetOperandAt(1, key); | 4123 SetOperandAt(1, key); |
4079 SetOperandAt(2, context); | 4124 SetOperandAt(2, context); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4181 } | 4226 } |
4182 | 4227 |
4183 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) | 4228 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) |
4184 | 4229 |
4185 private: | 4230 private: |
4186 Handle<String> name_; | 4231 Handle<String> name_; |
4187 StrictModeFlag strict_mode_flag_; | 4232 StrictModeFlag strict_mode_flag_; |
4188 }; | 4233 }; |
4189 | 4234 |
4190 | 4235 |
4191 class HStoreKeyedFastElement: public HTemplateInstruction<3> { | 4236 class HStoreKeyedFastElement |
| 4237 : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
4192 public: | 4238 public: |
4193 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val, | 4239 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val, |
4194 ElementsKind elements_kind = FAST_ELEMENTS) | 4240 ElementsKind elements_kind = FAST_ELEMENTS) |
4195 : elements_kind_(elements_kind) { | 4241 : elements_kind_(elements_kind), index_offset_(0), is_dehoisted_(false) { |
4196 SetOperandAt(0, obj); | 4242 SetOperandAt(0, obj); |
4197 SetOperandAt(1, key); | 4243 SetOperandAt(1, key); |
4198 SetOperandAt(2, val); | 4244 SetOperandAt(2, val); |
4199 SetGVNFlag(kChangesArrayElements); | 4245 SetGVNFlag(kChangesArrayElements); |
4200 } | 4246 } |
4201 | 4247 |
4202 virtual Representation RequiredInputRepresentation(int index) { | 4248 virtual Representation RequiredInputRepresentation(int index) { |
4203 // The key is supposed to be Integer32. | 4249 // The key is supposed to be Integer32. |
4204 return index == 1 | 4250 return index == 1 |
4205 ? Representation::Integer32() | 4251 ? Representation::Integer32() |
4206 : Representation::Tagged(); | 4252 : Representation::Tagged(); |
4207 } | 4253 } |
4208 | 4254 |
4209 HValue* object() { return OperandAt(0); } | 4255 HValue* object() { return OperandAt(0); } |
4210 HValue* key() { return OperandAt(1); } | 4256 HValue* key() { return OperandAt(1); } |
4211 HValue* value() { return OperandAt(2); } | 4257 HValue* value() { return OperandAt(2); } |
4212 bool value_is_smi() { | 4258 bool value_is_smi() { |
4213 return elements_kind_ == FAST_SMI_ONLY_ELEMENTS; | 4259 return elements_kind_ == FAST_SMI_ONLY_ELEMENTS; |
4214 } | 4260 } |
| 4261 uint32_t index_offset() { return index_offset_; } |
| 4262 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| 4263 HValue* GetKey() { return key(); } |
| 4264 void SetKey(HValue* key) { SetOperandAt(1, key); } |
| 4265 bool IsDehoisted() { return is_dehoisted_; } |
| 4266 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
4215 | 4267 |
4216 bool NeedsWriteBarrier() { | 4268 bool NeedsWriteBarrier() { |
4217 if (value_is_smi()) { | 4269 if (value_is_smi()) { |
4218 return false; | 4270 return false; |
4219 } else { | 4271 } else { |
4220 return StoringValueNeedsWriteBarrier(value()); | 4272 return StoringValueNeedsWriteBarrier(value()); |
4221 } | 4273 } |
4222 } | 4274 } |
4223 | 4275 |
4224 virtual void PrintDataTo(StringStream* stream); | 4276 virtual void PrintDataTo(StringStream* stream); |
4225 | 4277 |
4226 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement) | 4278 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement) |
4227 | 4279 |
4228 private: | 4280 private: |
4229 ElementsKind elements_kind_; | 4281 ElementsKind elements_kind_; |
| 4282 uint32_t index_offset_; |
| 4283 bool is_dehoisted_; |
4230 }; | 4284 }; |
4231 | 4285 |
4232 | 4286 |
4233 class HStoreKeyedFastDoubleElement: public HTemplateInstruction<3> { | 4287 class HStoreKeyedFastDoubleElement |
| 4288 : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
4234 public: | 4289 public: |
4235 HStoreKeyedFastDoubleElement(HValue* elements, | 4290 HStoreKeyedFastDoubleElement(HValue* elements, |
4236 HValue* key, | 4291 HValue* key, |
4237 HValue* val) { | 4292 HValue* val) |
| 4293 : index_offset_(0), is_dehoisted_(false) { |
4238 SetOperandAt(0, elements); | 4294 SetOperandAt(0, elements); |
4239 SetOperandAt(1, key); | 4295 SetOperandAt(1, key); |
4240 SetOperandAt(2, val); | 4296 SetOperandAt(2, val); |
4241 SetGVNFlag(kChangesDoubleArrayElements); | 4297 SetGVNFlag(kChangesDoubleArrayElements); |
4242 } | 4298 } |
4243 | 4299 |
4244 virtual Representation RequiredInputRepresentation(int index) { | 4300 virtual Representation RequiredInputRepresentation(int index) { |
4245 if (index == 1) { | 4301 if (index == 1) { |
4246 return Representation::Integer32(); | 4302 return Representation::Integer32(); |
4247 } else if (index == 2) { | 4303 } else if (index == 2) { |
4248 return Representation::Double(); | 4304 return Representation::Double(); |
4249 } else { | 4305 } else { |
4250 return Representation::Tagged(); | 4306 return Representation::Tagged(); |
4251 } | 4307 } |
4252 } | 4308 } |
4253 | 4309 |
4254 HValue* elements() { return OperandAt(0); } | 4310 HValue* elements() { return OperandAt(0); } |
4255 HValue* key() { return OperandAt(1); } | 4311 HValue* key() { return OperandAt(1); } |
4256 HValue* value() { return OperandAt(2); } | 4312 HValue* value() { return OperandAt(2); } |
| 4313 uint32_t index_offset() { return index_offset_; } |
| 4314 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| 4315 HValue* GetKey() { return key(); } |
| 4316 void SetKey(HValue* key) { SetOperandAt(1, key); } |
| 4317 bool IsDehoisted() { return is_dehoisted_; } |
| 4318 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
4257 | 4319 |
4258 bool NeedsWriteBarrier() { | 4320 bool NeedsWriteBarrier() { |
4259 return StoringValueNeedsWriteBarrier(value()); | 4321 return StoringValueNeedsWriteBarrier(value()); |
4260 } | 4322 } |
4261 | 4323 |
4262 bool NeedsCanonicalization(); | 4324 bool NeedsCanonicalization(); |
4263 | 4325 |
4264 virtual void PrintDataTo(StringStream* stream); | 4326 virtual void PrintDataTo(StringStream* stream); |
4265 | 4327 |
4266 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement) | 4328 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement) |
| 4329 |
| 4330 private: |
| 4331 uint32_t index_offset_; |
| 4332 bool is_dehoisted_; |
4267 }; | 4333 }; |
4268 | 4334 |
4269 | 4335 |
4270 class HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> { | 4336 class HStoreKeyedSpecializedArrayElement |
| 4337 : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
4271 public: | 4338 public: |
4272 HStoreKeyedSpecializedArrayElement(HValue* external_elements, | 4339 HStoreKeyedSpecializedArrayElement(HValue* external_elements, |
4273 HValue* key, | 4340 HValue* key, |
4274 HValue* val, | 4341 HValue* val, |
4275 ElementsKind elements_kind) | 4342 ElementsKind elements_kind) |
4276 : elements_kind_(elements_kind) { | 4343 : elements_kind_(elements_kind), index_offset_(0), is_dehoisted_(false) { |
4277 SetGVNFlag(kChangesSpecializedArrayElements); | 4344 SetGVNFlag(kChangesSpecializedArrayElements); |
4278 SetOperandAt(0, external_elements); | 4345 SetOperandAt(0, external_elements); |
4279 SetOperandAt(1, key); | 4346 SetOperandAt(1, key); |
4280 SetOperandAt(2, val); | 4347 SetOperandAt(2, val); |
4281 } | 4348 } |
4282 | 4349 |
4283 virtual void PrintDataTo(StringStream* stream); | 4350 virtual void PrintDataTo(StringStream* stream); |
4284 | 4351 |
4285 virtual Representation RequiredInputRepresentation(int index) { | 4352 virtual Representation RequiredInputRepresentation(int index) { |
4286 if (index == 0) { | 4353 if (index == 0) { |
4287 return Representation::External(); | 4354 return Representation::External(); |
4288 } else { | 4355 } else { |
4289 bool float_or_double_elements = | 4356 bool float_or_double_elements = |
4290 elements_kind() == EXTERNAL_FLOAT_ELEMENTS || | 4357 elements_kind() == EXTERNAL_FLOAT_ELEMENTS || |
4291 elements_kind() == EXTERNAL_DOUBLE_ELEMENTS; | 4358 elements_kind() == EXTERNAL_DOUBLE_ELEMENTS; |
4292 if (index == 2 && float_or_double_elements) { | 4359 if (index == 2 && float_or_double_elements) { |
4293 return Representation::Double(); | 4360 return Representation::Double(); |
4294 } else { | 4361 } else { |
4295 return Representation::Integer32(); | 4362 return Representation::Integer32(); |
4296 } | 4363 } |
4297 } | 4364 } |
4298 } | 4365 } |
4299 | 4366 |
4300 HValue* external_pointer() { return OperandAt(0); } | 4367 HValue* external_pointer() { return OperandAt(0); } |
4301 HValue* key() { return OperandAt(1); } | 4368 HValue* key() { return OperandAt(1); } |
4302 HValue* value() { return OperandAt(2); } | 4369 HValue* value() { return OperandAt(2); } |
4303 ElementsKind elements_kind() const { return elements_kind_; } | 4370 ElementsKind elements_kind() const { return elements_kind_; } |
| 4371 uint32_t index_offset() { return index_offset_; } |
| 4372 void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| 4373 HValue* GetKey() { return key(); } |
| 4374 void SetKey(HValue* key) { SetOperandAt(1, key); } |
| 4375 bool IsDehoisted() { return is_dehoisted_; } |
| 4376 void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
4304 | 4377 |
4305 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement) | 4378 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement) |
4306 | 4379 |
4307 private: | 4380 private: |
4308 ElementsKind elements_kind_; | 4381 ElementsKind elements_kind_; |
| 4382 uint32_t index_offset_; |
| 4383 bool is_dehoisted_; |
4309 }; | 4384 }; |
4310 | 4385 |
4311 | 4386 |
4312 class HStoreKeyedGeneric: public HTemplateInstruction<4> { | 4387 class HStoreKeyedGeneric: public HTemplateInstruction<4> { |
4313 public: | 4388 public: |
4314 HStoreKeyedGeneric(HValue* context, | 4389 HStoreKeyedGeneric(HValue* context, |
4315 HValue* object, | 4390 HValue* object, |
4316 HValue* key, | 4391 HValue* key, |
4317 HValue* value, | 4392 HValue* value, |
4318 StrictModeFlag strict_mode_flag) | 4393 StrictModeFlag strict_mode_flag) |
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4959 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); | 5034 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); |
4960 }; | 5035 }; |
4961 | 5036 |
4962 | 5037 |
4963 #undef DECLARE_INSTRUCTION | 5038 #undef DECLARE_INSTRUCTION |
4964 #undef DECLARE_CONCRETE_INSTRUCTION | 5039 #undef DECLARE_CONCRETE_INSTRUCTION |
4965 | 5040 |
4966 } } // namespace v8::internal | 5041 } } // namespace v8::internal |
4967 | 5042 |
4968 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 5043 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |