Chromium Code Reviews| 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 1739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1750 return target_.is_identical_to(b->target()); | 1750 return target_.is_identical_to(b->target()); |
| 1751 } | 1751 } |
| 1752 | 1752 |
| 1753 private: | 1753 private: |
| 1754 Handle<JSFunction> target_; | 1754 Handle<JSFunction> target_; |
| 1755 }; | 1755 }; |
| 1756 | 1756 |
| 1757 | 1757 |
| 1758 class HCheckInstanceType: public HUnaryOperation { | 1758 class HCheckInstanceType: public HUnaryOperation { |
| 1759 public: | 1759 public: |
| 1760 // Check that the instance type is in the range [first, last] where | 1760 static HCheckInstanceType* NewIsJSObjectOrJSFunction(HValue* value); |
| 1761 // both first and last are included. | 1761 static HCheckInstanceType* NewIsJSArray(HValue* value) { |
| 1762 HCheckInstanceType(HValue* value, InstanceType first, InstanceType last) | 1762 return new HCheckInstanceType(value, JS_ARRAY_TYPE, JS_ARRAY_TYPE, 0, 0); |
| 1763 : HUnaryOperation(value), first_(first), last_(last) { | 1763 } |
| 1764 ASSERT(first <= last); | 1764 static HCheckInstanceType* NewIsString(HValue* value) { |
| 1765 set_representation(Representation::Tagged()); | 1765 return new HCheckInstanceType(value, |
| 1766 SetFlag(kUseGVN); | 1766 FIRST_TYPE, FIRST_TYPE, |
| 1767 if ((FIRST_STRING_TYPE < first && last <= LAST_STRING_TYPE) || | 1767 kIsNotStringMask, kStringTag); |
| 1768 (FIRST_STRING_TYPE <= first && last < LAST_STRING_TYPE)) { | 1768 } |
| 1769 // A particular string instance type can change because of GC or | 1769 static HCheckInstanceType* NewIsSymbol(HValue* value) { |
| 1770 // externalization, but the value still remains a string. | 1770 return new HCheckInstanceType(value, |
| 1771 SetFlag(kDependsOnMaps); | 1771 FIRST_TYPE, FIRST_TYPE, |
| 1772 } | 1772 kIsSymbolMask, kSymbolTag); |
| 1773 } | 1773 } |
| 1774 | 1774 |
| 1775 virtual bool IsCheckInstruction() const { return true; } | 1775 virtual bool IsCheckInstruction() const { return true; } |
| 1776 | 1776 |
| 1777 virtual Representation RequiredInputRepresentation(int index) const { | 1777 virtual Representation RequiredInputRepresentation(int index) const { |
| 1778 return Representation::Tagged(); | 1778 return Representation::Tagged(); |
| 1779 } | 1779 } |
| 1780 | 1780 |
| 1781 #ifdef DEBUG | 1781 #ifdef DEBUG |
| 1782 virtual void Verify(); | 1782 virtual void Verify(); |
| 1783 #endif | 1783 #endif |
| 1784 | 1784 |
| 1785 virtual HValue* Canonicalize() { | 1785 virtual HValue* Canonicalize() { |
| 1786 if (!value()->type().IsUninitialized() && | 1786 if (!value()->type().IsUninitialized() && |
| 1787 value()->type().IsString() && | 1787 value()->type().IsString() && |
| 1788 first() == FIRST_STRING_TYPE && | 1788 !is_range() && |
| 1789 last() == LAST_STRING_TYPE) { | 1789 mask() == kIsNotStringMask && |
| 1790 tag() == kStringTag) { | |
| 1790 return NULL; | 1791 return NULL; |
| 1791 } | 1792 } |
| 1792 return this; | 1793 return this; |
| 1793 } | 1794 } |
| 1794 | 1795 |
| 1795 static HCheckInstanceType* NewIsJSObjectOrJSFunction(HValue* value); | 1796 bool is_range() const { return mask_ == 0; } |
| 1796 | 1797 |
| 1797 InstanceType first() const { return first_; } | 1798 InstanceType first() const { |
| 1798 InstanceType last() const { return last_; } | 1799 ASSERT(is_range()); |
| 1800 return first_; | |
| 1801 } | |
| 1802 | |
| 1803 InstanceType last() { | |
| 1804 ASSERT(is_range()); | |
| 1805 return last_; | |
| 1806 } | |
| 1807 | |
| 1808 uint8_t mask() const { | |
| 1809 ASSERT(!is_range()); | |
| 1810 return mask_; | |
| 1811 } | |
| 1812 | |
| 1813 uint8_t tag() const { | |
| 1814 ASSERT(!is_range()); | |
| 1815 return tag_; | |
| 1816 } | |
| 1799 | 1817 |
| 1800 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) | 1818 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) |
| 1801 | 1819 |
| 1802 protected: | 1820 protected: |
| 1803 // TODO(ager): It could be nice to allow the ommision of instance | 1821 // TODO(ager): It could be nice to allow the ommision of instance |
| 1804 // type checks if we have already performed an instance type check | 1822 // type checks if we have already performed an instance type check |
| 1805 // with a larger range. | 1823 // with a larger range. |
| 1806 virtual bool DataEquals(HValue* other) { | 1824 virtual bool DataEquals(HValue* other) { |
| 1807 HCheckInstanceType* b = HCheckInstanceType::cast(other); | 1825 HCheckInstanceType* b = HCheckInstanceType::cast(other); |
| 1808 return (first_ == b->first()) && (last_ == b->last()); | 1826 return first_ == b->first_ && last_ == b->last_ && |
| 1827 mask_ == b->mask_ && tag_ == b->tag_; | |
| 1809 } | 1828 } |
| 1810 | 1829 |
| 1811 private: | 1830 private: |
| 1831 // Check that the instance type is in the range [first, last] where | |
|
Mads Ager (chromium)
2011/05/09 16:57:51
Comment needs updating.
| |
| 1832 // both first and last are included. | |
| 1833 HCheckInstanceType(HValue* value, | |
| 1834 InstanceType first, InstanceType last, | |
| 1835 uint8_t mask, uint8_t tag) | |
| 1836 : HUnaryOperation(value), | |
| 1837 first_(first), last_(last), | |
| 1838 mask_(mask), tag_(tag) { | |
| 1839 ASSERT(first <= last); | |
| 1840 set_representation(Representation::Tagged()); | |
| 1841 SetFlag(kUseGVN); | |
| 1842 if (is_range() && first_ < FIRST_NONSTRING_TYPE) { | |
| 1843 // A particular string instance type can change because of GC or | |
| 1844 // externalization, but the value still remains a string. | |
| 1845 SetFlag(kDependsOnMaps); | |
| 1846 } | |
| 1847 } | |
| 1848 | |
| 1812 InstanceType first_; | 1849 InstanceType first_; |
| 1813 InstanceType last_; | 1850 InstanceType last_; |
| 1851 uint8_t mask_; | |
|
Mads Ager (chromium)
2011/05/09 16:57:51
I don't like this much. Create two types of instru
| |
| 1852 uint8_t tag_; | |
| 1814 }; | 1853 }; |
| 1815 | 1854 |
| 1816 | 1855 |
| 1817 class HCheckNonSmi: public HUnaryOperation { | 1856 class HCheckNonSmi: public HUnaryOperation { |
| 1818 public: | 1857 public: |
| 1819 explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) { | 1858 explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) { |
| 1820 set_representation(Representation::Tagged()); | 1859 set_representation(Representation::Tagged()); |
| 1821 SetFlag(kUseGVN); | 1860 SetFlag(kUseGVN); |
| 1822 } | 1861 } |
| 1823 | 1862 |
| (...skipping 2004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3828 | 3867 |
| 3829 DECLARE_CONCRETE_INSTRUCTION(In) | 3868 DECLARE_CONCRETE_INSTRUCTION(In) |
| 3830 }; | 3869 }; |
| 3831 | 3870 |
| 3832 #undef DECLARE_INSTRUCTION | 3871 #undef DECLARE_INSTRUCTION |
| 3833 #undef DECLARE_CONCRETE_INSTRUCTION | 3872 #undef DECLARE_CONCRETE_INSTRUCTION |
| 3834 | 3873 |
| 3835 } } // namespace v8::internal | 3874 } } // namespace v8::internal |
| 3836 | 3875 |
| 3837 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 3876 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |