| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 1592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1603 | 1603 |
| 1604 private: | 1604 private: |
| 1605 inline Object* Get(double input) { | 1605 inline Object* Get(double input) { |
| 1606 Converter c; | 1606 Converter c; |
| 1607 c.dbl = input; | 1607 c.dbl = input; |
| 1608 int hash = Hash(c); | 1608 int hash = Hash(c); |
| 1609 Element e = elements_[hash]; | 1609 Element e = elements_[hash]; |
| 1610 if (e.in[0] == c.integers[0] && | 1610 if (e.in[0] == c.integers[0] && |
| 1611 e.in[1] == c.integers[1]) { | 1611 e.in[1] == c.integers[1]) { |
| 1612 ASSERT(e.output != NULL); | 1612 ASSERT(e.output != NULL); |
| 1613 Counters::transcendental_cache_hit.Increment(); |
| 1613 return e.output; | 1614 return e.output; |
| 1614 } | 1615 } |
| 1615 double answer = Calculate(input); | 1616 double answer = Calculate(input); |
| 1616 Object* heap_number = Heap::AllocateHeapNumber(answer); | 1617 Object* heap_number = Heap::AllocateHeapNumber(answer); |
| 1617 if (!heap_number->IsFailure()) { | 1618 if (!heap_number->IsFailure()) { |
| 1618 elements_[hash].in[0] = c.integers[0]; | 1619 elements_[hash].in[0] = c.integers[0]; |
| 1619 elements_[hash].in[1] = c.integers[1]; | 1620 elements_[hash].in[1] = c.integers[1]; |
| 1620 elements_[hash].output = heap_number; | 1621 elements_[hash].output = heap_number; |
| 1621 } | 1622 } |
| 1623 Counters::transcendental_cache_miss.Increment(); |
| 1622 return heap_number; | 1624 return heap_number; |
| 1623 } | 1625 } |
| 1624 | 1626 |
| 1625 inline double Calculate(double input) { | 1627 inline double Calculate(double input) { |
| 1626 switch (type_) { | 1628 switch (type_) { |
| 1627 case ACOS: | 1629 case ACOS: |
| 1628 return acos(input); | 1630 return acos(input); |
| 1629 case ASIN: | 1631 case ASIN: |
| 1630 return asin(input); | 1632 return asin(input); |
| 1631 case ATAN: | 1633 case ATAN: |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1652 union Converter { | 1654 union Converter { |
| 1653 double dbl; | 1655 double dbl; |
| 1654 uint32_t integers[2]; | 1656 uint32_t integers[2]; |
| 1655 }; | 1657 }; |
| 1656 inline static int Hash(const Converter& c) { | 1658 inline static int Hash(const Converter& c) { |
| 1657 uint32_t hash = (c.integers[0] ^ c.integers[1]); | 1659 uint32_t hash = (c.integers[0] ^ c.integers[1]); |
| 1658 hash ^= hash >> 16; | 1660 hash ^= hash >> 16; |
| 1659 hash ^= hash >> 8; | 1661 hash ^= hash >> 8; |
| 1660 return (hash & (kCacheSize - 1)); | 1662 return (hash & (kCacheSize - 1)); |
| 1661 } | 1663 } |
| 1664 |
| 1665 static Address cache_array_address() { |
| 1666 // Used to create an external reference. |
| 1667 return reinterpret_cast<Address>(caches_); |
| 1668 } |
| 1669 |
| 1670 // Allow access to the caches_ array as an ExternalReference. |
| 1671 friend class ExternalReference; |
| 1672 // Inline implementation of the caching. |
| 1673 friend class TranscendentalCacheStub; |
| 1674 |
| 1662 static TranscendentalCache* caches_[kNumberOfCaches]; | 1675 static TranscendentalCache* caches_[kNumberOfCaches]; |
| 1663 Element elements_[kCacheSize]; | 1676 Element elements_[kCacheSize]; |
| 1664 Type type_; | 1677 Type type_; |
| 1665 }; | 1678 }; |
| 1666 | 1679 |
| 1667 | 1680 |
| 1668 // External strings table is a place where all external strings are | 1681 // External strings table is a place where all external strings are |
| 1669 // registered. We need to keep track of such strings to properly | 1682 // registered. We need to keep track of such strings to properly |
| 1670 // finalize them. | 1683 // finalize them. |
| 1671 class ExternalStringTable : public AllStatic { | 1684 class ExternalStringTable : public AllStatic { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1694 | 1707 |
| 1695 // To speed up scavenge collections new space string are kept | 1708 // To speed up scavenge collections new space string are kept |
| 1696 // separate from old space strings. | 1709 // separate from old space strings. |
| 1697 static List<Object*> new_space_strings_; | 1710 static List<Object*> new_space_strings_; |
| 1698 static List<Object*> old_space_strings_; | 1711 static List<Object*> old_space_strings_; |
| 1699 }; | 1712 }; |
| 1700 | 1713 |
| 1701 } } // namespace v8::internal | 1714 } } // namespace v8::internal |
| 1702 | 1715 |
| 1703 #endif // V8_HEAP_H_ | 1716 #endif // V8_HEAP_H_ |
| OLD | NEW |