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

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

Issue 7170012: Crankshaft support for polymorphic array handling (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 6 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 | Annotate | Revision Log
OLDNEW
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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 V(CheckMap) \ 87 V(CheckMap) \
88 V(CheckNonSmi) \ 88 V(CheckNonSmi) \
89 V(CheckPrototypeMaps) \ 89 V(CheckPrototypeMaps) \
90 V(CheckSmi) \ 90 V(CheckSmi) \
91 V(ClampToUint8) \ 91 V(ClampToUint8) \
92 V(ClassOfTest) \ 92 V(ClassOfTest) \
93 V(Compare) \ 93 V(Compare) \
94 V(CompareJSObjectEq) \ 94 V(CompareJSObjectEq) \
95 V(CompareMap) \ 95 V(CompareMap) \
96 V(CompareSymbolEq) \ 96 V(CompareSymbolEq) \
97 V(CompareWithConstant) \
97 V(Constant) \ 98 V(Constant) \
98 V(Context) \ 99 V(Context) \
99 V(DeleteProperty) \ 100 V(DeleteProperty) \
100 V(Deoptimize) \ 101 V(Deoptimize) \
101 V(Div) \ 102 V(Div) \
103 V(ElementsKind) \
102 V(EnterInlined) \ 104 V(EnterInlined) \
103 V(ExternalArrayLength) \ 105 V(ExternalArrayLength) \
104 V(FixedArrayLength) \ 106 V(FixedArrayLength) \
105 V(ForceRepresentation) \ 107 V(ForceRepresentation) \
106 V(FunctionLiteral) \ 108 V(FunctionLiteral) \
107 V(GetCachedArrayIndex) \ 109 V(GetCachedArrayIndex) \
108 V(GlobalObject) \ 110 V(GlobalObject) \
109 V(GlobalReceiver) \ 111 V(GlobalReceiver) \
110 V(Goto) \ 112 V(Goto) \
111 V(HasCachedArrayIndex) \ 113 V(HasCachedArrayIndex) \
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 enum Type { 397 enum Type {
396 kTagged = 0x1, // 0000 0000 0000 0001 398 kTagged = 0x1, // 0000 0000 0000 0001
397 kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 399 kTaggedPrimitive = 0x5, // 0000 0000 0000 0101
398 kTaggedNumber = 0xd, // 0000 0000 0000 1101 400 kTaggedNumber = 0xd, // 0000 0000 0000 1101
399 kSmi = 0x1d, // 0000 0000 0001 1101 401 kSmi = 0x1d, // 0000 0000 0001 1101
400 kHeapNumber = 0x2d, // 0000 0000 0010 1101 402 kHeapNumber = 0x2d, // 0000 0000 0010 1101
401 kString = 0x45, // 0000 0000 0100 0101 403 kString = 0x45, // 0000 0000 0100 0101
402 kBoolean = 0x85, // 0000 0000 1000 0101 404 kBoolean = 0x85, // 0000 0000 1000 0101
403 kNonPrimitive = 0x101, // 0000 0001 0000 0001 405 kNonPrimitive = 0x101, // 0000 0001 0000 0001
404 kJSObject = 0x301, // 0000 0011 0000 0001 406 kJSObject = 0x301, // 0000 0011 0000 0001
405 kJSArray = 0x701, // 0000 0111 1000 0001 407 kJSArray = 0x701, // 0000 0111 0000 0001
fschneider 2011/06/15 12:11:46 Accidental edit?
Jakob Kummerow 2011/06/15 12:28:58 Nope. In a drive-by fashion, I noticed that commen
406 kUninitialized = 0x1fff // 0001 1111 1111 1111 408 kUninitialized = 0x1fff // 0001 1111 1111 1111
407 }; 409 };
408 410
409 // Make sure type fits in int16. 411 // Make sure type fits in int16.
410 STATIC_ASSERT(kUninitialized < (1 << (2 * kBitsPerByte))); 412 STATIC_ASSERT(kUninitialized < (1 << (2 * kBitsPerByte)));
411 413
412 explicit HType(Type t) : type_(t) { } 414 explicit HType(Type t) : type_(t) { }
413 415
414 int16_t type_; 416 int16_t type_;
415 }; 417 };
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 479
478 // There must be one corresponding kDepends flag for every kChanges flag and 480 // There must be one corresponding kDepends flag for every kChanges flag and
479 // the order of the kChanges flags must be exactly the same as of the kDepends 481 // the order of the kChanges flags must be exactly the same as of the kDepends
480 // flags. 482 // flags.
481 enum Flag { 483 enum Flag {
482 // Declare global value numbering flags. 484 // Declare global value numbering flags.
483 #define DECLARE_DO(type) kChanges##type, kDependsOn##type, 485 #define DECLARE_DO(type) kChanges##type, kDependsOn##type,
484 GVN_FLAG_LIST(DECLARE_DO) 486 GVN_FLAG_LIST(DECLARE_DO)
485 #undef DECLARE_DO 487 #undef DECLARE_DO
486 kFlexibleRepresentation, 488 kFlexibleRepresentation,
487 kUseGVN, 489 kUseGVN, // Participate in Global Value Numbering, i.e. elimination of
fschneider 2011/06/15 12:11:46 I'd insert the comment in a separate line before k
Jakob Kummerow 2011/06/15 12:28:58 Done.
490 // unnecessary recomputations. If an instruction sets this flag, it must
491 // implement DataEquals(), which will be used to determine if other
492 // occurrences of the instruction are indeed the same.
488 kCanOverflow, 493 kCanOverflow,
489 kBailoutOnMinusZero, 494 kBailoutOnMinusZero,
490 kCanBeDivByZero, 495 kCanBeDivByZero,
491 kDeoptimizeOnUndefined, 496 kDeoptimizeOnUndefined,
492 kIsArguments, 497 kIsArguments,
493 kTruncatingToInt32, 498 kTruncatingToInt32,
494 kLastFlag = kTruncatingToInt32 499 kLastFlag = kTruncatingToInt32
495 }; 500 };
496 501
497 STATIC_ASSERT(kLastFlag < kBitsPerInt); 502 STATIC_ASSERT(kLastFlag < kBitsPerInt);
(...skipping 1202 matching lines...) Expand 10 before | Expand all | Expand 10 after
1700 return Representation::Tagged(); 1705 return Representation::Tagged();
1701 } 1706 }
1702 1707
1703 DECLARE_CONCRETE_INSTRUCTION(ExternalArrayLength) 1708 DECLARE_CONCRETE_INSTRUCTION(ExternalArrayLength)
1704 1709
1705 protected: 1710 protected:
1706 virtual bool DataEquals(HValue* other) { return true; } 1711 virtual bool DataEquals(HValue* other) { return true; }
1707 }; 1712 };
1708 1713
1709 1714
1715 class HElementsKind: public HUnaryOperation {
1716 public:
1717 explicit HElementsKind(HValue* value) : HUnaryOperation(value) {
1718 set_representation(Representation::Integer32());
1719 SetFlag(kUseGVN);
1720 SetFlag(kDependsOnMaps);
1721 }
1722
1723 virtual Representation RequiredInputRepresentation(int index) const {
1724 return Representation::Tagged();
1725 }
1726
1727 DECLARE_CONCRETE_INSTRUCTION(ElementsKind)
1728
1729 protected:
1730 virtual bool DataEquals(HValue* other) { return true; }
1731 };
1732
1733
1710 class HBitNot: public HUnaryOperation { 1734 class HBitNot: public HUnaryOperation {
1711 public: 1735 public:
1712 explicit HBitNot(HValue* value) : HUnaryOperation(value) { 1736 explicit HBitNot(HValue* value) : HUnaryOperation(value) {
1713 set_representation(Representation::Integer32()); 1737 set_representation(Representation::Integer32());
1714 SetFlag(kUseGVN); 1738 SetFlag(kUseGVN);
1715 SetFlag(kTruncatingToInt32); 1739 SetFlag(kTruncatingToInt32);
1716 } 1740 }
1717 1741
1718 virtual Representation RequiredInputRepresentation(int index) const { 1742 virtual Representation RequiredInputRepresentation(int index) const {
1719 return Representation::Integer32(); 1743 return Representation::Integer32();
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after
2582 protected: 2606 protected:
2583 virtual bool DataEquals(HValue* other) { 2607 virtual bool DataEquals(HValue* other) {
2584 return op_ == HCompareSymbolEq::cast(other)->op_; 2608 return op_ == HCompareSymbolEq::cast(other)->op_;
2585 } 2609 }
2586 2610
2587 private: 2611 private:
2588 const Token::Value op_; 2612 const Token::Value op_;
2589 }; 2613 };
2590 2614
2591 2615
2616 class HCompareWithConstant: public HUnaryOperation {
2617 public:
2618 HCompareWithConstant(HValue* left, int right, Token::Value op)
2619 : HUnaryOperation(left), op_(op), right_(right) {
2620 ASSERT(op == Token::EQ || op == Token::EQ_STRICT);
2621 set_representation(Representation::Tagged());
2622 SetFlag(kUseGVN);
2623 }
2624
2625 Token::Value op() const { return op_; }
2626 int right() const { return right_; }
2627
2628 virtual bool EmitAtUses() {
2629 return !HasSideEffects() && !HasMultipleUses();
2630 }
2631
2632 virtual Representation RequiredInputRepresentation(int index) const {
2633 return Representation::Integer32();
2634 }
2635
2636 virtual HType CalculateInferredType() { return HType::Boolean(); }
2637
2638 DECLARE_CONCRETE_INSTRUCTION(CompareWithConstant);
2639
2640 protected:
2641 virtual bool DataEquals(HValue* other) {
2642 HCompareWithConstant* other_instr = HCompareWithConstant::cast(other);
2643 return (op_ == other_instr->op_ &&
2644 right_ == other_instr->right_);
2645 }
2646
2647 private:
2648 const Token::Value op_;
2649 const int right_;
2650 };
2651
2652
2592 class HUnaryPredicate: public HUnaryOperation { 2653 class HUnaryPredicate: public HUnaryOperation {
2593 public: 2654 public:
2594 explicit HUnaryPredicate(HValue* value) : HUnaryOperation(value) { 2655 explicit HUnaryPredicate(HValue* value) : HUnaryOperation(value) {
2595 set_representation(Representation::Tagged()); 2656 set_representation(Representation::Tagged());
2596 SetFlag(kUseGVN); 2657 SetFlag(kUseGVN);
2597 } 2658 }
2598 2659
2599 virtual bool EmitAtUses() { 2660 virtual bool EmitAtUses() {
2600 return !HasSideEffects() && !HasMultipleUses(); 2661 return !HasSideEffects() && !HasMultipleUses();
2601 } 2662 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
2687 HHasInstanceType(HValue* value, InstanceType type) 2748 HHasInstanceType(HValue* value, InstanceType type)
2688 : HUnaryPredicate(value), from_(type), to_(type) { } 2749 : HUnaryPredicate(value), from_(type), to_(type) { }
2689 HHasInstanceType(HValue* value, InstanceType from, InstanceType to) 2750 HHasInstanceType(HValue* value, InstanceType from, InstanceType to)
2690 : HUnaryPredicate(value), from_(from), to_(to) { 2751 : HUnaryPredicate(value), from_(from), to_(to) {
2691 ASSERT(to == LAST_TYPE); // Others not implemented yet in backend. 2752 ASSERT(to == LAST_TYPE); // Others not implemented yet in backend.
2692 } 2753 }
2693 2754
2694 InstanceType from() { return from_; } 2755 InstanceType from() { return from_; }
2695 InstanceType to() { return to_; } 2756 InstanceType to() { return to_; }
2696 2757
2758 virtual bool EmitAtUses() {
2759 return !HasSideEffects() && !HasMultipleUses();
2760 }
2761
2697 virtual void PrintDataTo(StringStream* stream); 2762 virtual void PrintDataTo(StringStream* stream);
2698 2763
2699 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType) 2764 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType)
2700 2765
2701 protected: 2766 protected:
2702 virtual bool DataEquals(HValue* other) { 2767 virtual bool DataEquals(HValue* other) {
2703 HHasInstanceType* b = HHasInstanceType::cast(other); 2768 HHasInstanceType* b = HHasInstanceType::cast(other);
2704 return (from_ == b->from()) && (to_ == b->to()); 2769 return (from_ == b->from()) && (to_ == b->to());
2705 } 2770 }
2706 2771
(...skipping 1329 matching lines...) Expand 10 before | Expand all | Expand 10 after
4036 4101
4037 DECLARE_CONCRETE_INSTRUCTION(In) 4102 DECLARE_CONCRETE_INSTRUCTION(In)
4038 }; 4103 };
4039 4104
4040 #undef DECLARE_INSTRUCTION 4105 #undef DECLARE_INSTRUCTION
4041 #undef DECLARE_CONCRETE_INSTRUCTION 4106 #undef DECLARE_CONCRETE_INSTRUCTION
4042 4107
4043 } } // namespace v8::internal 4108 } } // namespace v8::internal
4044 4109
4045 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 4110 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698