OLD | NEW |
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_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ |
6 #define V8_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_HYDROGEN_INSTRUCTIONS_H_ |
7 | 7 |
8 #include "v8.h" | 8 #include "v8.h" |
9 | 9 |
10 #include "allocation.h" | 10 #include "allocation.h" |
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 // This function must be overridden for instructions with flag kUseGVN, to | 942 // This function must be overridden for instructions with flag kUseGVN, to |
943 // compare the non-Operand parts of the instruction. | 943 // compare the non-Operand parts of the instruction. |
944 virtual bool DataEquals(HValue* other) { | 944 virtual bool DataEquals(HValue* other) { |
945 UNREACHABLE(); | 945 UNREACHABLE(); |
946 return false; | 946 return false; |
947 } | 947 } |
948 | 948 |
949 virtual Representation RepresentationFromInputs() { | 949 virtual Representation RepresentationFromInputs() { |
950 return representation(); | 950 return representation(); |
951 } | 951 } |
952 Representation RepresentationFromUses(); | 952 virtual Representation RepresentationFromUses(); |
953 Representation RepresentationFromUseRequirements(); | 953 Representation RepresentationFromUseRequirements(); |
954 bool HasNonSmiUse(); | 954 bool HasNonSmiUse(); |
955 virtual void UpdateRepresentation(Representation new_rep, | 955 virtual void UpdateRepresentation(Representation new_rep, |
956 HInferRepresentationPhase* h_infer, | 956 HInferRepresentationPhase* h_infer, |
957 const char* reason); | 957 const char* reason); |
958 void AddDependantsToWorklist(HInferRepresentationPhase* h_infer); | 958 void AddDependantsToWorklist(HInferRepresentationPhase* h_infer); |
959 | 959 |
960 virtual void RepresentationChanged(Representation to) { } | 960 virtual void RepresentationChanged(Representation to) { } |
961 | 961 |
962 virtual Range* InferRange(Zone* zone); | 962 virtual Range* InferRange(Zone* zone); |
(...skipping 1668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2631 default: | 2631 default: |
2632 UNREACHABLE(); | 2632 UNREACHABLE(); |
2633 return Representation::None(); | 2633 return Representation::None(); |
2634 } | 2634 } |
2635 } | 2635 } |
2636 } | 2636 } |
2637 | 2637 |
2638 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; | 2638 virtual Range* InferRange(Zone* zone) V8_OVERRIDE; |
2639 | 2639 |
2640 virtual HValue* Canonicalize() V8_OVERRIDE; | 2640 virtual HValue* Canonicalize() V8_OVERRIDE; |
| 2641 virtual Representation RepresentationFromUses() V8_OVERRIDE; |
2641 virtual Representation RepresentationFromInputs() V8_OVERRIDE; | 2642 virtual Representation RepresentationFromInputs() V8_OVERRIDE; |
2642 | 2643 |
2643 BuiltinFunctionId op() const { return op_; } | 2644 BuiltinFunctionId op() const { return op_; } |
2644 const char* OpName() const; | 2645 const char* OpName() const; |
2645 | 2646 |
2646 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) | 2647 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) |
2647 | 2648 |
2648 protected: | 2649 protected: |
2649 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 2650 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
2650 HUnaryMathOperation* b = HUnaryMathOperation::cast(other); | 2651 HUnaryMathOperation* b = HUnaryMathOperation::cast(other); |
2651 return op_ == b->op(); | 2652 return op_ == b->op(); |
2652 } | 2653 } |
2653 | 2654 |
2654 private: | 2655 private: |
| 2656 // Indicates if we support a double (and int32) output for Math.floor and |
| 2657 // Math.round. |
| 2658 bool SupportsFlexibleFloorAndRound() const { |
| 2659 #ifdef V8_TARGET_ARCH_ARM64 |
| 2660 return true; |
| 2661 #else |
| 2662 return false; |
| 2663 #endif |
| 2664 } |
2655 HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op) | 2665 HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op) |
2656 : HTemplateInstruction<2>(HType::TaggedNumber()), op_(op) { | 2666 : HTemplateInstruction<2>(HType::TaggedNumber()), op_(op) { |
2657 SetOperandAt(0, context); | 2667 SetOperandAt(0, context); |
2658 SetOperandAt(1, value); | 2668 SetOperandAt(1, value); |
2659 switch (op) { | 2669 switch (op) { |
2660 case kMathFloor: | 2670 case kMathFloor: |
2661 case kMathRound: | 2671 case kMathRound: |
| 2672 if (SupportsFlexibleFloorAndRound()) { |
| 2673 SetFlag(kFlexibleRepresentation); |
| 2674 } else { |
| 2675 set_representation(Representation::Integer32()); |
| 2676 } |
| 2677 break; |
2662 case kMathClz32: | 2678 case kMathClz32: |
2663 set_representation(Representation::Integer32()); | 2679 set_representation(Representation::Integer32()); |
2664 break; | 2680 break; |
2665 case kMathAbs: | 2681 case kMathAbs: |
2666 // Not setting representation here: it is None intentionally. | 2682 // Not setting representation here: it is None intentionally. |
2667 SetFlag(kFlexibleRepresentation); | 2683 SetFlag(kFlexibleRepresentation); |
2668 // TODO(svenpanne) This flag is actually only needed if representation() | 2684 // TODO(svenpanne) This flag is actually only needed if representation() |
2669 // is tagged, and not when it is an unboxed double or unboxed integer. | 2685 // is tagged, and not when it is an unboxed double or unboxed integer. |
2670 SetChangesFlag(kNewSpacePromotion); | 2686 SetChangesFlag(kNewSpacePromotion); |
2671 break; | 2687 break; |
(...skipping 4876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7548 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7564 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
7549 }; | 7565 }; |
7550 | 7566 |
7551 | 7567 |
7552 #undef DECLARE_INSTRUCTION | 7568 #undef DECLARE_INSTRUCTION |
7553 #undef DECLARE_CONCRETE_INSTRUCTION | 7569 #undef DECLARE_CONCRETE_INSTRUCTION |
7554 | 7570 |
7555 } } // namespace v8::internal | 7571 } } // namespace v8::internal |
7556 | 7572 |
7557 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 7573 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |