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

Side by Side Diff: src/crankshaft/hydrogen-instructions.h

Issue 1693833002: Remove strong mode support from binary operations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments. Created 4 years, 10 months 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 unified diff | Download patch
« no previous file with comments | « src/crankshaft/hydrogen.cc ('k') | src/crankshaft/hydrogen-instructions.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ 5 #ifndef V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_
6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ 6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_
7 7
8 #include <cstring> 8 #include <cstring>
9 #include <iosfwd> 9 #include <iosfwd>
10 10
(...skipping 3714 matching lines...) Expand 10 before | Expand all | Expand 10 after
3725 3725
3726 int32_t int32_value_; 3726 int32_t int32_value_;
3727 double double_value_; 3727 double double_value_;
3728 ExternalReference external_reference_value_; 3728 ExternalReference external_reference_value_;
3729 }; 3729 };
3730 3730
3731 3731
3732 class HBinaryOperation : public HTemplateInstruction<3> { 3732 class HBinaryOperation : public HTemplateInstruction<3> {
3733 public: 3733 public:
3734 HBinaryOperation(HValue* context, HValue* left, HValue* right, 3734 HBinaryOperation(HValue* context, HValue* left, HValue* right,
3735 Strength strength, HType type = HType::Tagged()) 3735 HType type = HType::Tagged())
3736 : HTemplateInstruction<3>(type), 3736 : HTemplateInstruction<3>(type),
3737 strength_(strength),
3738 observed_output_representation_(Representation::None()) { 3737 observed_output_representation_(Representation::None()) {
3739 DCHECK(left != NULL && right != NULL); 3738 DCHECK(left != NULL && right != NULL);
3740 SetOperandAt(0, context); 3739 SetOperandAt(0, context);
3741 SetOperandAt(1, left); 3740 SetOperandAt(1, left);
3742 SetOperandAt(2, right); 3741 SetOperandAt(2, right);
3743 observed_input_representation_[0] = Representation::None(); 3742 observed_input_representation_[0] = Representation::None();
3744 observed_input_representation_[1] = Representation::None(); 3743 observed_input_representation_[1] = Representation::None();
3745 } 3744 }
3746 3745
3747 HValue* context() const { return OperandAt(0); } 3746 HValue* context() const { return OperandAt(0); }
3748 HValue* left() const { return OperandAt(1); } 3747 HValue* left() const { return OperandAt(1); }
3749 HValue* right() const { return OperandAt(2); } 3748 HValue* right() const { return OperandAt(2); }
3750 Strength strength() const { return strength_; }
3751 3749
3752 // True if switching left and right operands likely generates better code. 3750 // True if switching left and right operands likely generates better code.
3753 bool AreOperandsBetterSwitched() { 3751 bool AreOperandsBetterSwitched() {
3754 if (!IsCommutative()) return false; 3752 if (!IsCommutative()) return false;
3755 3753
3756 // Constant operands are better off on the right, they can be inlined in 3754 // Constant operands are better off on the right, they can be inlined in
3757 // many situations on most platforms. 3755 // many situations on most platforms.
3758 if (left()->IsConstant()) return true; 3756 if (left()->IsConstant()) return true;
3759 if (right()->IsConstant()) return false; 3757 if (right()->IsConstant()) return false;
3760 3758
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3816 3814
3817 bool RightIsPowerOf2() { 3815 bool RightIsPowerOf2() {
3818 if (!right()->IsInteger32Constant()) return false; 3816 if (!right()->IsInteger32Constant()) return false;
3819 int32_t value = right()->GetInteger32Constant(); 3817 int32_t value = right()->GetInteger32Constant();
3820 if (value < 0) { 3818 if (value < 0) {
3821 return base::bits::IsPowerOfTwo32(static_cast<uint32_t>(-value)); 3819 return base::bits::IsPowerOfTwo32(static_cast<uint32_t>(-value));
3822 } 3820 }
3823 return base::bits::IsPowerOfTwo32(static_cast<uint32_t>(value)); 3821 return base::bits::IsPowerOfTwo32(static_cast<uint32_t>(value));
3824 } 3822 }
3825 3823
3826 Strength strength() { return strength_; }
3827
3828 DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation) 3824 DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation)
3829 3825
3830 private: 3826 private:
3831 bool IgnoreObservedOutputRepresentation(Representation current_rep); 3827 bool IgnoreObservedOutputRepresentation(Representation current_rep);
3832 Strength strength_;
3833 3828
3834 Representation observed_input_representation_[2]; 3829 Representation observed_input_representation_[2];
3835 Representation observed_output_representation_; 3830 Representation observed_output_representation_;
3836 }; 3831 };
3837 3832
3838 3833
3839 class HWrapReceiver final : public HTemplateInstruction<2> { 3834 class HWrapReceiver final : public HTemplateInstruction<2> {
3840 public: 3835 public:
3841 DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*); 3836 DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*);
3842 3837
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
4092 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT 4087 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT
4093 4088
4094 int RedefinedOperandIndex() override { return 0; } 4089 int RedefinedOperandIndex() override { return 0; }
4095 bool IsPurelyInformativeDefinition() override { return true; } 4090 bool IsPurelyInformativeDefinition() override { return true; }
4096 }; 4091 };
4097 4092
4098 4093
4099 class HBitwiseBinaryOperation : public HBinaryOperation { 4094 class HBitwiseBinaryOperation : public HBinaryOperation {
4100 public: 4095 public:
4101 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right, 4096 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right,
4102 Strength strength, HType type = HType::TaggedNumber()) 4097 HType type = HType::TaggedNumber())
4103 : HBinaryOperation(context, left, right, strength, type) { 4098 : HBinaryOperation(context, left, right, type) {
4104 SetFlag(kFlexibleRepresentation); 4099 SetFlag(kFlexibleRepresentation);
4105 SetFlag(kTruncatingToInt32); 4100 SetFlag(kTruncatingToInt32);
4106 if (!is_strong(strength)) SetFlag(kAllowUndefinedAsNaN);
adamk 2016/06/22 19:57:18 This deletion looks wrong: it should have instead
rossberg 2016/06/23 06:28:31 C negation syntax, made easy to overlook since 197
4107 SetAllSideEffects(); 4101 SetAllSideEffects();
4108 } 4102 }
4109 4103
4110 void RepresentationChanged(Representation to) override { 4104 void RepresentationChanged(Representation to) override {
4111 if (to.IsTagged() && 4105 if (to.IsTagged() &&
4112 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { 4106 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) {
4113 SetAllSideEffects(); 4107 SetAllSideEffects();
4114 ClearFlag(kUseGVN); 4108 ClearFlag(kUseGVN);
4115 } else { 4109 } else {
4116 ClearAllSideEffects(); 4110 ClearAllSideEffects();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4151 HValue*, 4145 HValue*,
4152 HValue*); 4146 HValue*);
4153 4147
4154 DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv) 4148 DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv)
4155 4149
4156 protected: 4150 protected:
4157 bool DataEquals(HValue* other) override { return true; } 4151 bool DataEquals(HValue* other) override { return true; }
4158 4152
4159 private: 4153 private:
4160 HMathFloorOfDiv(HValue* context, HValue* left, HValue* right) 4154 HMathFloorOfDiv(HValue* context, HValue* left, HValue* right)
4161 : HBinaryOperation(context, left, right, Strength::WEAK) { 4155 : HBinaryOperation(context, left, right) {
4162 set_representation(Representation::Integer32()); 4156 set_representation(Representation::Integer32());
4163 SetFlag(kUseGVN); 4157 SetFlag(kUseGVN);
4164 SetFlag(kCanOverflow); 4158 SetFlag(kCanOverflow);
4165 SetFlag(kCanBeDivByZero); 4159 SetFlag(kCanBeDivByZero);
4166 SetFlag(kLeftCanBeMinInt); 4160 SetFlag(kLeftCanBeMinInt);
4167 SetFlag(kLeftCanBeNegative); 4161 SetFlag(kLeftCanBeNegative);
4168 SetFlag(kLeftCanBePositive); 4162 SetFlag(kLeftCanBePositive);
4169 SetFlag(kAllowUndefinedAsNaN); 4163 SetFlag(kAllowUndefinedAsNaN);
4170 } 4164 }
4171 4165
4172 Range* InferRange(Zone* zone) override; 4166 Range* InferRange(Zone* zone) override;
4173 4167
4174 bool IsDeletable() const override { return true; } 4168 bool IsDeletable() const override { return true; }
4175 }; 4169 };
4176 4170
4177 4171
4178 class HArithmeticBinaryOperation : public HBinaryOperation { 4172 class HArithmeticBinaryOperation : public HBinaryOperation {
4179 public: 4173 public:
4180 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right, 4174 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right)
4181 Strength strength) 4175 : HBinaryOperation(context, left, right, HType::TaggedNumber()) {
4182 : HBinaryOperation(context, left, right, strength,
4183 HType::TaggedNumber()) {
4184 SetAllSideEffects(); 4176 SetAllSideEffects();
4185 SetFlag(kFlexibleRepresentation); 4177 SetFlag(kFlexibleRepresentation);
4186 if (!is_strong(strength)) SetFlag(kAllowUndefinedAsNaN); 4178 SetFlag(kAllowUndefinedAsNaN);
4187 } 4179 }
4188 4180
4189 void RepresentationChanged(Representation to) override { 4181 void RepresentationChanged(Representation to) override {
4190 if (to.IsTagged() && 4182 if (to.IsTagged() &&
4191 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { 4183 (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) {
4192 SetAllSideEffects(); 4184 SetAllSideEffects();
4193 ClearFlag(kUseGVN); 4185 ClearFlag(kUseGVN);
4194 } else { 4186 } else {
4195 ClearAllSideEffects(); 4187 ClearAllSideEffects();
4196 SetFlag(kUseGVN); 4188 SetFlag(kUseGVN);
4197 } 4189 }
4198 if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); 4190 if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion);
4199 } 4191 }
4200 4192
4201 DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation) 4193 DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation)
4202 4194
4203 private: 4195 private:
4204 bool IsDeletable() const override { return true; } 4196 bool IsDeletable() const override { return true; }
4205 }; 4197 };
4206 4198
4207 4199
4208 class HCompareGeneric final : public HBinaryOperation { 4200 class HCompareGeneric final : public HBinaryOperation {
4209 public: 4201 public:
4210 static HCompareGeneric* New(Isolate* isolate, Zone* zone, HValue* context, 4202 static HCompareGeneric* New(Isolate* isolate, Zone* zone, HValue* context,
4211 HValue* left, HValue* right, Token::Value token, 4203 HValue* left, HValue* right, Token::Value token) {
4212 Strength strength = Strength::WEAK) { 4204 return new (zone) HCompareGeneric(context, left, right, token);
4213 return new (zone) HCompareGeneric(context, left, right, token, strength);
4214 } 4205 }
4215 4206
4216 Representation RequiredInputRepresentation(int index) override { 4207 Representation RequiredInputRepresentation(int index) override {
4217 return index == 0 4208 return index == 0
4218 ? Representation::Tagged() 4209 ? Representation::Tagged()
4219 : representation(); 4210 : representation();
4220 } 4211 }
4221 4212
4222 Token::Value token() const { return token_; } 4213 Token::Value token() const { return token_; }
4223 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT 4214 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT
4224 4215
4225 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) 4216 DECLARE_CONCRETE_INSTRUCTION(CompareGeneric)
4226 4217
4227 private: 4218 private:
4228 HCompareGeneric(HValue* context, HValue* left, HValue* right, 4219 HCompareGeneric(HValue* context, HValue* left, HValue* right,
4229 Token::Value token, Strength strength) 4220 Token::Value token)
4230 : HBinaryOperation(context, left, right, strength, HType::Boolean()), 4221 : HBinaryOperation(context, left, right, HType::Boolean()),
4231 token_(token) { 4222 token_(token) {
4232 DCHECK(Token::IsCompareOp(token)); 4223 DCHECK(Token::IsCompareOp(token));
4233 set_representation(Representation::Tagged()); 4224 set_representation(Representation::Tagged());
4234 SetAllSideEffects(); 4225 SetAllSideEffects();
4235 } 4226 }
4236 4227
4237 Token::Value token_; 4228 Token::Value token_;
4238 }; 4229 };
4239 4230
4240 4231
4241 class HCompareNumericAndBranch : public HTemplateControlInstruction<2, 2> { 4232 class HCompareNumericAndBranch : public HTemplateControlInstruction<2, 2> {
4242 public: 4233 public:
4243 static HCompareNumericAndBranch* New(Isolate* isolate, Zone* zone, 4234 static HCompareNumericAndBranch* New(Isolate* isolate, Zone* zone,
4244 HValue* context, HValue* left, 4235 HValue* context, HValue* left,
4245 HValue* right, Token::Value token, 4236 HValue* right, Token::Value token,
4246 HBasicBlock* true_target = NULL, 4237 HBasicBlock* true_target = NULL,
4247 HBasicBlock* false_target = NULL, 4238 HBasicBlock* false_target = NULL) {
4248 Strength strength = Strength::WEAK) {
4249 return new (zone) HCompareNumericAndBranch(left, right, token, true_target,
4250 false_target, strength);
4251 }
4252 static HCompareNumericAndBranch* New(Isolate* isolate, Zone* zone,
4253 HValue* context, HValue* left,
4254 HValue* right, Token::Value token,
4255 Strength strength) {
4256 return new (zone) 4239 return new (zone)
4257 HCompareNumericAndBranch(left, right, token, NULL, NULL, strength); 4240 HCompareNumericAndBranch(left, right, token, true_target, false_target);
4258 } 4241 }
4259 4242
4260 HValue* left() const { return OperandAt(0); } 4243 HValue* left() const { return OperandAt(0); }
4261 HValue* right() const { return OperandAt(1); } 4244 HValue* right() const { return OperandAt(1); }
4262 Token::Value token() const { return token_; } 4245 Token::Value token() const { return token_; }
4263 4246
4264 void set_observed_input_representation(Representation left, 4247 void set_observed_input_representation(Representation left,
4265 Representation right) { 4248 Representation right) {
4266 observed_input_representation_[0] = left; 4249 observed_input_representation_[0] = left;
4267 observed_input_representation_[1] = right; 4250 observed_input_representation_[1] = right;
4268 } 4251 }
4269 4252
4270 void InferRepresentation(HInferRepresentationPhase* h_infer) override; 4253 void InferRepresentation(HInferRepresentationPhase* h_infer) override;
4271 4254
4272 Representation RequiredInputRepresentation(int index) override { 4255 Representation RequiredInputRepresentation(int index) override {
4273 return representation(); 4256 return representation();
4274 } 4257 }
4275 Representation observed_input_representation(int index) override { 4258 Representation observed_input_representation(int index) override {
4276 return observed_input_representation_[index]; 4259 return observed_input_representation_[index];
4277 } 4260 }
4278 4261
4279 bool KnownSuccessorBlock(HBasicBlock** block) override; 4262 bool KnownSuccessorBlock(HBasicBlock** block) override;
4280 4263
4281 Strength strength() const { return strength_; }
4282
4283 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT 4264 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT
4284 4265
4285 void SetOperandPositions(Zone* zone, SourcePosition left_pos, 4266 void SetOperandPositions(Zone* zone, SourcePosition left_pos,
4286 SourcePosition right_pos) { 4267 SourcePosition right_pos) {
4287 set_operand_position(zone, 0, left_pos); 4268 set_operand_position(zone, 0, left_pos);
4288 set_operand_position(zone, 1, right_pos); 4269 set_operand_position(zone, 1, right_pos);
4289 } 4270 }
4290 4271
4291 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch) 4272 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch)
4292 4273
4293 private: 4274 private:
4294 HCompareNumericAndBranch(HValue* left, HValue* right, Token::Value token, 4275 HCompareNumericAndBranch(HValue* left, HValue* right, Token::Value token,
4295 HBasicBlock* true_target, HBasicBlock* false_target, 4276 HBasicBlock* true_target, HBasicBlock* false_target)
4296 Strength strength) 4277 : token_(token) {
4297 : token_(token), strength_(strength) {
4298 SetFlag(kFlexibleRepresentation); 4278 SetFlag(kFlexibleRepresentation);
4299 DCHECK(Token::IsCompareOp(token)); 4279 DCHECK(Token::IsCompareOp(token));
4300 SetOperandAt(0, left); 4280 SetOperandAt(0, left);
4301 SetOperandAt(1, right); 4281 SetOperandAt(1, right);
4302 SetSuccessorAt(0, true_target); 4282 SetSuccessorAt(0, true_target);
4303 SetSuccessorAt(1, false_target); 4283 SetSuccessorAt(1, false_target);
4304 } 4284 }
4305 4285
4306 Representation observed_input_representation_[2]; 4286 Representation observed_input_representation_[2];
4307 Token::Value token_; 4287 Token::Value token_;
4308 Strength strength_;
4309 }; 4288 };
4310 4289
4311 4290
4312 class HCompareHoleAndBranch final : public HUnaryControlInstruction { 4291 class HCompareHoleAndBranch final : public HUnaryControlInstruction {
4313 public: 4292 public:
4314 DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*); 4293 DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*);
4315 DECLARE_INSTRUCTION_FACTORY_P3(HCompareHoleAndBranch, HValue*, 4294 DECLARE_INSTRUCTION_FACTORY_P3(HCompareHoleAndBranch, HValue*,
4316 HBasicBlock*, HBasicBlock*); 4295 HBasicBlock*, HBasicBlock*);
4317 4296
4318 void InferRepresentation(HInferRepresentationPhase* h_infer) override; 4297 void InferRepresentation(HInferRepresentationPhase* h_infer) override;
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
4630 Representation RequiredInputRepresentation(int index) override { 4609 Representation RequiredInputRepresentation(int index) override {
4631 return Representation::Tagged(); 4610 return Representation::Tagged();
4632 } 4611 }
4633 4612
4634 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT 4613 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT
4635 4614
4636 DECLARE_CONCRETE_INSTRUCTION(InstanceOf) 4615 DECLARE_CONCRETE_INSTRUCTION(InstanceOf)
4637 4616
4638 private: 4617 private:
4639 HInstanceOf(HValue* context, HValue* left, HValue* right) 4618 HInstanceOf(HValue* context, HValue* left, HValue* right)
4640 : HBinaryOperation(context, left, right, Strength::WEAK, 4619 : HBinaryOperation(context, left, right, HType::Boolean()) {
4641 HType::Boolean()) {
4642 set_representation(Representation::Tagged()); 4620 set_representation(Representation::Tagged());
4643 SetAllSideEffects(); 4621 SetAllSideEffects();
4644 } 4622 }
4645 }; 4623 };
4646 4624
4647 4625
4648 class HHasInPrototypeChainAndBranch final 4626 class HHasInPrototypeChainAndBranch final
4649 : public HTemplateControlInstruction<2, 2> { 4627 : public HTemplateControlInstruction<2, 2> {
4650 public: 4628 public:
4651 DECLARE_INSTRUCTION_FACTORY_P2(HHasInPrototypeChainAndBranch, HValue*, 4629 DECLARE_INSTRUCTION_FACTORY_P2(HHasInPrototypeChainAndBranch, HValue*,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
4714 enum ExternalAddType { 4692 enum ExternalAddType {
4715 AddOfExternalAndTagged, 4693 AddOfExternalAndTagged,
4716 AddOfExternalAndInt32, 4694 AddOfExternalAndInt32,
4717 NoExternalAdd 4695 NoExternalAdd
4718 }; 4696 };
4719 4697
4720 4698
4721 class HAdd final : public HArithmeticBinaryOperation { 4699 class HAdd final : public HArithmeticBinaryOperation {
4722 public: 4700 public:
4723 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 4701 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
4702 HValue* left, HValue* right);
4703 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
4724 HValue* left, HValue* right, 4704 HValue* left, HValue* right,
4725 Strength strength = Strength::WEAK);
4726 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
4727 HValue* left, HValue* right, Strength strength,
4728 ExternalAddType external_add_type); 4705 ExternalAddType external_add_type);
4729 4706
4730 // Add is only commutative if two integer values are added and not if two 4707 // Add is only commutative if two integer values are added and not if two
4731 // tagged values are added (because it might be a String concatenation). 4708 // tagged values are added (because it might be a String concatenation).
4732 // We also do not commute (pointer + offset). 4709 // We also do not commute (pointer + offset).
4733 bool IsCommutative() const override { 4710 bool IsCommutative() const override {
4734 return !representation().IsTagged() && !representation().IsExternal(); 4711 return !representation().IsTagged() && !representation().IsExternal();
4735 } 4712 }
4736 4713
4737 HValue* Canonicalize() override; 4714 HValue* Canonicalize() override;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4779 ExternalAddType external_add_type() const { return external_add_type_; } 4756 ExternalAddType external_add_type() const { return external_add_type_; }
4780 4757
4781 DECLARE_CONCRETE_INSTRUCTION(Add) 4758 DECLARE_CONCRETE_INSTRUCTION(Add)
4782 4759
4783 protected: 4760 protected:
4784 bool DataEquals(HValue* other) override { return true; } 4761 bool DataEquals(HValue* other) override { return true; }
4785 4762
4786 Range* InferRange(Zone* zone) override; 4763 Range* InferRange(Zone* zone) override;
4787 4764
4788 private: 4765 private:
4789 HAdd(HValue* context, HValue* left, HValue* right, Strength strength, 4766 HAdd(HValue* context, HValue* left, HValue* right,
4790 ExternalAddType external_add_type = NoExternalAdd) 4767 ExternalAddType external_add_type = NoExternalAdd)
4791 : HArithmeticBinaryOperation(context, left, right, strength), 4768 : HArithmeticBinaryOperation(context, left, right),
4792 external_add_type_(external_add_type) { 4769 external_add_type_(external_add_type) {
4793 SetFlag(kCanOverflow); 4770 SetFlag(kCanOverflow);
4794 switch (external_add_type_) { 4771 switch (external_add_type_) {
4795 case AddOfExternalAndTagged: 4772 case AddOfExternalAndTagged:
4796 DCHECK(left->representation().IsExternal()); 4773 DCHECK(left->representation().IsExternal());
4797 DCHECK(right->representation().IsTagged()); 4774 DCHECK(right->representation().IsTagged());
4798 SetDependsOnFlag(kNewSpacePromotion); 4775 SetDependsOnFlag(kNewSpacePromotion);
4799 ClearFlag(HValue::kCanOverflow); 4776 ClearFlag(HValue::kCanOverflow);
4800 SetFlag(kHasNoObservableSideEffects); 4777 SetFlag(kHasNoObservableSideEffects);
4801 break; 4778 break;
(...skipping 14 matching lines...) Expand all
4816 } 4793 }
4817 } 4794 }
4818 4795
4819 ExternalAddType external_add_type_; 4796 ExternalAddType external_add_type_;
4820 }; 4797 };
4821 4798
4822 4799
4823 class HSub final : public HArithmeticBinaryOperation { 4800 class HSub final : public HArithmeticBinaryOperation {
4824 public: 4801 public:
4825 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 4802 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
4826 HValue* left, HValue* right, 4803 HValue* left, HValue* right);
4827 Strength strength = Strength::WEAK);
4828 4804
4829 HValue* Canonicalize() override; 4805 HValue* Canonicalize() override;
4830 4806
4831 bool TryDecompose(DecompositionResult* decomposition) override { 4807 bool TryDecompose(DecompositionResult* decomposition) override {
4832 if (right()->IsInteger32Constant()) { 4808 if (right()->IsInteger32Constant()) {
4833 decomposition->Apply(left(), -right()->GetInteger32Constant()); 4809 decomposition->Apply(left(), -right()->GetInteger32Constant());
4834 return true; 4810 return true;
4835 } else { 4811 } else {
4836 return false; 4812 return false;
4837 } 4813 }
4838 } 4814 }
4839 4815
4840 DECLARE_CONCRETE_INSTRUCTION(Sub) 4816 DECLARE_CONCRETE_INSTRUCTION(Sub)
4841 4817
4842 protected: 4818 protected:
4843 bool DataEquals(HValue* other) override { return true; } 4819 bool DataEquals(HValue* other) override { return true; }
4844 4820
4845 Range* InferRange(Zone* zone) override; 4821 Range* InferRange(Zone* zone) override;
4846 4822
4847 private: 4823 private:
4848 HSub(HValue* context, HValue* left, HValue* right, Strength strength) 4824 HSub(HValue* context, HValue* left, HValue* right)
4849 : HArithmeticBinaryOperation(context, left, right, strength) { 4825 : HArithmeticBinaryOperation(context, left, right) {
4850 SetFlag(kCanOverflow); 4826 SetFlag(kCanOverflow);
4851 } 4827 }
4852 }; 4828 };
4853 4829
4854 4830
4855 class HMul final : public HArithmeticBinaryOperation { 4831 class HMul final : public HArithmeticBinaryOperation {
4856 public: 4832 public:
4857 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 4833 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
4858 HValue* left, HValue* right, 4834 HValue* left, HValue* right);
4859 Strength strength = Strength::WEAK);
4860 4835
4861 static HInstruction* NewImul(Isolate* isolate, Zone* zone, HValue* context, 4836 static HInstruction* NewImul(Isolate* isolate, Zone* zone, HValue* context,
4862 HValue* left, HValue* right, 4837 HValue* left, HValue* right) {
4863 Strength strength = Strength::WEAK) { 4838 HInstruction* instr = HMul::New(isolate, zone, context, left, right);
4864 HInstruction* instr =
4865 HMul::New(isolate, zone, context, left, right, strength);
4866 if (!instr->IsMul()) return instr; 4839 if (!instr->IsMul()) return instr;
4867 HMul* mul = HMul::cast(instr); 4840 HMul* mul = HMul::cast(instr);
4868 // TODO(mstarzinger): Prevent bailout on minus zero for imul. 4841 // TODO(mstarzinger): Prevent bailout on minus zero for imul.
4869 mul->AssumeRepresentation(Representation::Integer32()); 4842 mul->AssumeRepresentation(Representation::Integer32());
4870 mul->ClearFlag(HValue::kCanOverflow); 4843 mul->ClearFlag(HValue::kCanOverflow);
4871 return mul; 4844 return mul;
4872 } 4845 }
4873 4846
4874 HValue* Canonicalize() override; 4847 HValue* Canonicalize() override;
4875 4848
4876 // Only commutative if it is certain that not two objects are multiplicated. 4849 // Only commutative if it is certain that not two objects are multiplicated.
4877 bool IsCommutative() const override { return !representation().IsTagged(); } 4850 bool IsCommutative() const override { return !representation().IsTagged(); }
4878 4851
4879 void UpdateRepresentation(Representation new_rep, 4852 void UpdateRepresentation(Representation new_rep,
4880 HInferRepresentationPhase* h_infer, 4853 HInferRepresentationPhase* h_infer,
4881 const char* reason) override { 4854 const char* reason) override {
4882 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4855 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4883 } 4856 }
4884 4857
4885 bool MulMinusOne(); 4858 bool MulMinusOne();
4886 4859
4887 DECLARE_CONCRETE_INSTRUCTION(Mul) 4860 DECLARE_CONCRETE_INSTRUCTION(Mul)
4888 4861
4889 protected: 4862 protected:
4890 bool DataEquals(HValue* other) override { return true; } 4863 bool DataEquals(HValue* other) override { return true; }
4891 4864
4892 Range* InferRange(Zone* zone) override; 4865 Range* InferRange(Zone* zone) override;
4893 4866
4894 private: 4867 private:
4895 HMul(HValue* context, HValue* left, HValue* right, Strength strength) 4868 HMul(HValue* context, HValue* left, HValue* right)
4896 : HArithmeticBinaryOperation(context, left, right, strength) { 4869 : HArithmeticBinaryOperation(context, left, right) {
4897 SetFlag(kCanOverflow); 4870 SetFlag(kCanOverflow);
4898 } 4871 }
4899 }; 4872 };
4900 4873
4901 4874
4902 class HMod final : public HArithmeticBinaryOperation { 4875 class HMod final : public HArithmeticBinaryOperation {
4903 public: 4876 public:
4904 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 4877 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
4905 HValue* left, HValue* right, 4878 HValue* left, HValue* right);
4906 Strength strength = Strength::WEAK);
4907 4879
4908 HValue* Canonicalize() override; 4880 HValue* Canonicalize() override;
4909 4881
4910 void UpdateRepresentation(Representation new_rep, 4882 void UpdateRepresentation(Representation new_rep,
4911 HInferRepresentationPhase* h_infer, 4883 HInferRepresentationPhase* h_infer,
4912 const char* reason) override { 4884 const char* reason) override {
4913 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 4885 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
4914 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4886 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4915 } 4887 }
4916 4888
4917 DECLARE_CONCRETE_INSTRUCTION(Mod) 4889 DECLARE_CONCRETE_INSTRUCTION(Mod)
4918 4890
4919 protected: 4891 protected:
4920 bool DataEquals(HValue* other) override { return true; } 4892 bool DataEquals(HValue* other) override { return true; }
4921 4893
4922 Range* InferRange(Zone* zone) override; 4894 Range* InferRange(Zone* zone) override;
4923 4895
4924 private: 4896 private:
4925 HMod(HValue* context, HValue* left, HValue* right, Strength strength) 4897 HMod(HValue* context, HValue* left, HValue* right)
4926 : HArithmeticBinaryOperation(context, left, right, strength) { 4898 : HArithmeticBinaryOperation(context, left, right) {
4927 SetFlag(kCanBeDivByZero); 4899 SetFlag(kCanBeDivByZero);
4928 SetFlag(kCanOverflow); 4900 SetFlag(kCanOverflow);
4929 SetFlag(kLeftCanBeNegative); 4901 SetFlag(kLeftCanBeNegative);
4930 } 4902 }
4931 }; 4903 };
4932 4904
4933 4905
4934 class HDiv final : public HArithmeticBinaryOperation { 4906 class HDiv final : public HArithmeticBinaryOperation {
4935 public: 4907 public:
4936 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 4908 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
4937 HValue* left, HValue* right, 4909 HValue* left, HValue* right);
4938 Strength strength = Strength::WEAK);
4939 4910
4940 HValue* Canonicalize() override; 4911 HValue* Canonicalize() override;
4941 4912
4942 void UpdateRepresentation(Representation new_rep, 4913 void UpdateRepresentation(Representation new_rep,
4943 HInferRepresentationPhase* h_infer, 4914 HInferRepresentationPhase* h_infer,
4944 const char* reason) override { 4915 const char* reason) override {
4945 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 4916 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
4946 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4917 HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4947 } 4918 }
4948 4919
4949 DECLARE_CONCRETE_INSTRUCTION(Div) 4920 DECLARE_CONCRETE_INSTRUCTION(Div)
4950 4921
4951 protected: 4922 protected:
4952 bool DataEquals(HValue* other) override { return true; } 4923 bool DataEquals(HValue* other) override { return true; }
4953 4924
4954 Range* InferRange(Zone* zone) override; 4925 Range* InferRange(Zone* zone) override;
4955 4926
4956 private: 4927 private:
4957 HDiv(HValue* context, HValue* left, HValue* right, Strength strength) 4928 HDiv(HValue* context, HValue* left, HValue* right)
4958 : HArithmeticBinaryOperation(context, left, right, strength) { 4929 : HArithmeticBinaryOperation(context, left, right) {
4959 SetFlag(kCanBeDivByZero); 4930 SetFlag(kCanBeDivByZero);
4960 SetFlag(kCanOverflow); 4931 SetFlag(kCanOverflow);
4961 } 4932 }
4962 }; 4933 };
4963 4934
4964 4935
4965 class HMathMinMax final : public HArithmeticBinaryOperation { 4936 class HMathMinMax final : public HArithmeticBinaryOperation {
4966 public: 4937 public:
4967 enum Operation { kMathMin, kMathMax }; 4938 enum Operation { kMathMin, kMathMax };
4968 4939
(...skipping 25 matching lines...) Expand all
4994 protected: 4965 protected:
4995 bool DataEquals(HValue* other) override { 4966 bool DataEquals(HValue* other) override {
4996 return other->IsMathMinMax() && 4967 return other->IsMathMinMax() &&
4997 HMathMinMax::cast(other)->operation_ == operation_; 4968 HMathMinMax::cast(other)->operation_ == operation_;
4998 } 4969 }
4999 4970
5000 Range* InferRange(Zone* zone) override; 4971 Range* InferRange(Zone* zone) override;
5001 4972
5002 private: 4973 private:
5003 HMathMinMax(HValue* context, HValue* left, HValue* right, Operation op) 4974 HMathMinMax(HValue* context, HValue* left, HValue* right, Operation op)
5004 : HArithmeticBinaryOperation(context, left, right, Strength::WEAK), 4975 : HArithmeticBinaryOperation(context, left, right), operation_(op) {}
5005 operation_(op) {}
5006 4976
5007 Operation operation_; 4977 Operation operation_;
5008 }; 4978 };
5009 4979
5010 4980
5011 class HBitwise final : public HBitwiseBinaryOperation { 4981 class HBitwise final : public HBitwiseBinaryOperation {
5012 public: 4982 public:
5013 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 4983 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
5014 Token::Value op, HValue* left, HValue* right, 4984 Token::Value op, HValue* left, HValue* right);
5015 Strength strength = Strength::WEAK);
5016 4985
5017 Token::Value op() const { return op_; } 4986 Token::Value op() const { return op_; }
5018 4987
5019 bool IsCommutative() const override { return true; } 4988 bool IsCommutative() const override { return true; }
5020 4989
5021 HValue* Canonicalize() override; 4990 HValue* Canonicalize() override;
5022 4991
5023 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT 4992 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT
5024 4993
5025 DECLARE_CONCRETE_INSTRUCTION(Bitwise) 4994 DECLARE_CONCRETE_INSTRUCTION(Bitwise)
5026 4995
5027 protected: 4996 protected:
5028 bool DataEquals(HValue* other) override { 4997 bool DataEquals(HValue* other) override {
5029 return op() == HBitwise::cast(other)->op(); 4998 return op() == HBitwise::cast(other)->op();
5030 } 4999 }
5031 5000
5032 Range* InferRange(Zone* zone) override; 5001 Range* InferRange(Zone* zone) override;
5033 5002
5034 private: 5003 private:
5035 HBitwise(HValue* context, Token::Value op, HValue* left, HValue* right, 5004 HBitwise(HValue* context, Token::Value op, HValue* left, HValue* right)
5036 Strength strength) 5005 : HBitwiseBinaryOperation(context, left, right), op_(op) {
5037 : HBitwiseBinaryOperation(context, left, right, strength), op_(op) {
5038 DCHECK(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR); 5006 DCHECK(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR);
5039 // BIT_AND with a smi-range positive value will always unset the 5007 // BIT_AND with a smi-range positive value will always unset the
5040 // entire sign-extension of the smi-sign. 5008 // entire sign-extension of the smi-sign.
5041 if (op == Token::BIT_AND && 5009 if (op == Token::BIT_AND &&
5042 ((left->IsConstant() && 5010 ((left->IsConstant() &&
5043 left->representation().IsSmi() && 5011 left->representation().IsSmi() &&
5044 HConstant::cast(left)->Integer32Value() >= 0) || 5012 HConstant::cast(left)->Integer32Value() >= 0) ||
5045 (right->IsConstant() && 5013 (right->IsConstant() &&
5046 right->representation().IsSmi() && 5014 right->representation().IsSmi() &&
5047 HConstant::cast(right)->Integer32Value() >= 0))) { 5015 HConstant::cast(right)->Integer32Value() >= 0))) {
(...skipping 13 matching lines...) Expand all
5061 } 5029 }
5062 } 5030 }
5063 5031
5064 Token::Value op_; 5032 Token::Value op_;
5065 }; 5033 };
5066 5034
5067 5035
5068 class HShl final : public HBitwiseBinaryOperation { 5036 class HShl final : public HBitwiseBinaryOperation {
5069 public: 5037 public:
5070 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 5038 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
5071 HValue* left, HValue* right, 5039 HValue* left, HValue* right);
5072 Strength strength = Strength::WEAK);
5073 5040
5074 Range* InferRange(Zone* zone) override; 5041 Range* InferRange(Zone* zone) override;
5075 5042
5076 void UpdateRepresentation(Representation new_rep, 5043 void UpdateRepresentation(Representation new_rep,
5077 HInferRepresentationPhase* h_infer, 5044 HInferRepresentationPhase* h_infer,
5078 const char* reason) override { 5045 const char* reason) override {
5079 if (new_rep.IsSmi() && 5046 if (new_rep.IsSmi() &&
5080 !(right()->IsInteger32Constant() && 5047 !(right()->IsInteger32Constant() &&
5081 right()->GetInteger32Constant() >= 0)) { 5048 right()->GetInteger32Constant() >= 0)) {
5082 new_rep = Representation::Integer32(); 5049 new_rep = Representation::Integer32();
5083 } 5050 }
5084 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 5051 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
5085 } 5052 }
5086 5053
5087 DECLARE_CONCRETE_INSTRUCTION(Shl) 5054 DECLARE_CONCRETE_INSTRUCTION(Shl)
5088 5055
5089 protected: 5056 protected:
5090 bool DataEquals(HValue* other) override { return true; } 5057 bool DataEquals(HValue* other) override { return true; }
5091 5058
5092 private: 5059 private:
5093 HShl(HValue* context, HValue* left, HValue* right, Strength strength) 5060 HShl(HValue* context, HValue* left, HValue* right)
5094 : HBitwiseBinaryOperation(context, left, right, strength) {} 5061 : HBitwiseBinaryOperation(context, left, right) {}
5095 }; 5062 };
5096 5063
5097 5064
5098 class HShr final : public HBitwiseBinaryOperation { 5065 class HShr final : public HBitwiseBinaryOperation {
5099 public: 5066 public:
5100 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 5067 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
5101 HValue* left, HValue* right, 5068 HValue* left, HValue* right);
5102 Strength strength = Strength::WEAK);
5103 5069
5104 bool TryDecompose(DecompositionResult* decomposition) override { 5070 bool TryDecompose(DecompositionResult* decomposition) override {
5105 if (right()->IsInteger32Constant()) { 5071 if (right()->IsInteger32Constant()) {
5106 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { 5072 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) {
5107 // This is intended to look for HAdd and HSub, to handle compounds 5073 // This is intended to look for HAdd and HSub, to handle compounds
5108 // like ((base + offset) >> scale) with one single decomposition. 5074 // like ((base + offset) >> scale) with one single decomposition.
5109 left()->TryDecompose(decomposition); 5075 left()->TryDecompose(decomposition);
5110 return true; 5076 return true;
5111 } 5077 }
5112 } 5078 }
5113 return false; 5079 return false;
5114 } 5080 }
5115 5081
5116 Range* InferRange(Zone* zone) override; 5082 Range* InferRange(Zone* zone) override;
5117 5083
5118 void UpdateRepresentation(Representation new_rep, 5084 void UpdateRepresentation(Representation new_rep,
5119 HInferRepresentationPhase* h_infer, 5085 HInferRepresentationPhase* h_infer,
5120 const char* reason) override { 5086 const char* reason) override {
5121 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 5087 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
5122 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 5088 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
5123 } 5089 }
5124 5090
5125 DECLARE_CONCRETE_INSTRUCTION(Shr) 5091 DECLARE_CONCRETE_INSTRUCTION(Shr)
5126 5092
5127 protected: 5093 protected:
5128 bool DataEquals(HValue* other) override { return true; } 5094 bool DataEquals(HValue* other) override { return true; }
5129 5095
5130 private: 5096 private:
5131 HShr(HValue* context, HValue* left, HValue* right, Strength strength) 5097 HShr(HValue* context, HValue* left, HValue* right)
5132 : HBitwiseBinaryOperation(context, left, right, strength) {} 5098 : HBitwiseBinaryOperation(context, left, right) {}
5133 }; 5099 };
5134 5100
5135 5101
5136 class HSar final : public HBitwiseBinaryOperation { 5102 class HSar final : public HBitwiseBinaryOperation {
5137 public: 5103 public:
5138 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 5104 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
5139 HValue* left, HValue* right, 5105 HValue* left, HValue* right);
5140 Strength strength = Strength::WEAK);
5141 5106
5142 bool TryDecompose(DecompositionResult* decomposition) override { 5107 bool TryDecompose(DecompositionResult* decomposition) override {
5143 if (right()->IsInteger32Constant()) { 5108 if (right()->IsInteger32Constant()) {
5144 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { 5109 if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) {
5145 // This is intended to look for HAdd and HSub, to handle compounds 5110 // This is intended to look for HAdd and HSub, to handle compounds
5146 // like ((base + offset) >> scale) with one single decomposition. 5111 // like ((base + offset) >> scale) with one single decomposition.
5147 left()->TryDecompose(decomposition); 5112 left()->TryDecompose(decomposition);
5148 return true; 5113 return true;
5149 } 5114 }
5150 } 5115 }
5151 return false; 5116 return false;
5152 } 5117 }
5153 5118
5154 Range* InferRange(Zone* zone) override; 5119 Range* InferRange(Zone* zone) override;
5155 5120
5156 void UpdateRepresentation(Representation new_rep, 5121 void UpdateRepresentation(Representation new_rep,
5157 HInferRepresentationPhase* h_infer, 5122 HInferRepresentationPhase* h_infer,
5158 const char* reason) override { 5123 const char* reason) override {
5159 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 5124 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
5160 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 5125 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
5161 } 5126 }
5162 5127
5163 DECLARE_CONCRETE_INSTRUCTION(Sar) 5128 DECLARE_CONCRETE_INSTRUCTION(Sar)
5164 5129
5165 protected: 5130 protected:
5166 bool DataEquals(HValue* other) override { return true; } 5131 bool DataEquals(HValue* other) override { return true; }
5167 5132
5168 private: 5133 private:
5169 HSar(HValue* context, HValue* left, HValue* right, Strength strength) 5134 HSar(HValue* context, HValue* left, HValue* right)
5170 : HBitwiseBinaryOperation(context, left, right, strength) {} 5135 : HBitwiseBinaryOperation(context, left, right) {}
5171 }; 5136 };
5172 5137
5173 5138
5174 class HRor final : public HBitwiseBinaryOperation { 5139 class HRor final : public HBitwiseBinaryOperation {
5175 public: 5140 public:
5176 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, 5141 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context,
5177 HValue* left, HValue* right, 5142 HValue* left, HValue* right) {
5178 Strength strength = Strength::WEAK) { 5143 return new (zone) HRor(context, left, right);
5179 return new (zone) HRor(context, left, right, strength);
5180 } 5144 }
5181 5145
5182 void UpdateRepresentation(Representation new_rep, 5146 void UpdateRepresentation(Representation new_rep,
5183 HInferRepresentationPhase* h_infer, 5147 HInferRepresentationPhase* h_infer,
5184 const char* reason) override { 5148 const char* reason) override {
5185 if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 5149 if (new_rep.IsSmi()) new_rep = Representation::Integer32();
5186 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 5150 HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
5187 } 5151 }
5188 5152
5189 DECLARE_CONCRETE_INSTRUCTION(Ror) 5153 DECLARE_CONCRETE_INSTRUCTION(Ror)
5190 5154
5191 protected: 5155 protected:
5192 bool DataEquals(HValue* other) override { return true; } 5156 bool DataEquals(HValue* other) override { return true; }
5193 5157
5194 private: 5158 private:
5195 HRor(HValue* context, HValue* left, HValue* right, Strength strength) 5159 HRor(HValue* context, HValue* left, HValue* right)
5196 : HBitwiseBinaryOperation(context, left, right, strength) { 5160 : HBitwiseBinaryOperation(context, left, right) {
5197 ChangeRepresentation(Representation::Integer32()); 5161 ChangeRepresentation(Representation::Integer32());
5198 } 5162 }
5199 }; 5163 };
5200 5164
5201 5165
5202 class HOsrEntry final : public HTemplateInstruction<0> { 5166 class HOsrEntry final : public HTemplateInstruction<0> {
5203 public: 5167 public:
5204 DECLARE_INSTRUCTION_FACTORY_P1(HOsrEntry, BailoutId); 5168 DECLARE_INSTRUCTION_FACTORY_P1(HOsrEntry, BailoutId);
5205 5169
5206 BailoutId ast_id() const { return ast_id_; } 5170 BailoutId ast_id() const { return ast_id_; }
(...skipping 2044 matching lines...) Expand 10 before | Expand all | Expand 10 after
7251 protected: 7215 protected:
7252 bool DataEquals(HValue* other) override { 7216 bool DataEquals(HValue* other) override {
7253 return flags_ == HStringAdd::cast(other)->flags_ && 7217 return flags_ == HStringAdd::cast(other)->flags_ &&
7254 pretenure_flag_ == HStringAdd::cast(other)->pretenure_flag_; 7218 pretenure_flag_ == HStringAdd::cast(other)->pretenure_flag_;
7255 } 7219 }
7256 7220
7257 private: 7221 private:
7258 HStringAdd(HValue* context, HValue* left, HValue* right, 7222 HStringAdd(HValue* context, HValue* left, HValue* right,
7259 PretenureFlag pretenure_flag, StringAddFlags flags, 7223 PretenureFlag pretenure_flag, StringAddFlags flags,
7260 Handle<AllocationSite> allocation_site) 7224 Handle<AllocationSite> allocation_site)
7261 : HBinaryOperation(context, left, right, Strength::WEAK, HType::String()), 7225 : HBinaryOperation(context, left, right, HType::String()),
7262 flags_(flags), 7226 flags_(flags),
7263 pretenure_flag_(pretenure_flag) { 7227 pretenure_flag_(pretenure_flag) {
7264 set_representation(Representation::Tagged()); 7228 set_representation(Representation::Tagged());
7265 if ((flags & STRING_ADD_CONVERT) == STRING_ADD_CONVERT) { 7229 if ((flags & STRING_ADD_CONVERT) == STRING_ADD_CONVERT) {
7266 SetAllSideEffects(); 7230 SetAllSideEffects();
7267 ClearFlag(kUseGVN); 7231 ClearFlag(kUseGVN);
7268 } else { 7232 } else {
7269 SetChangesFlag(kNewSpacePromotion); 7233 SetChangesFlag(kNewSpacePromotion);
7270 SetFlag(kUseGVN); 7234 SetFlag(kUseGVN);
7271 } 7235 }
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
7769 7733
7770 7734
7771 7735
7772 #undef DECLARE_INSTRUCTION 7736 #undef DECLARE_INSTRUCTION
7773 #undef DECLARE_CONCRETE_INSTRUCTION 7737 #undef DECLARE_CONCRETE_INSTRUCTION
7774 7738
7775 } // namespace internal 7739 } // namespace internal
7776 } // namespace v8 7740 } // namespace v8
7777 7741
7778 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ 7742 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « src/crankshaft/hydrogen.cc ('k') | src/crankshaft/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698