Changeset 39851 in webkit for trunk/JavaScriptCore/interpreter/Interpreter.cpp
- Timestamp:
- Jan 12, 2009, 8:51:16 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/interpreter/Interpreter.cpp
r39800 r39851 108 108 } 109 109 110 // FIXME: This operation should be called "getNumber", not "isNumber" (as it is in JSValue.h).111 // FIXME: There's no need to have a "slow" version of this. All versions should be fast.112 static ALWAYS_INLINE bool fastIsNumber(JSValuePtr value, double& arg)113 {114 if (JSImmediate::isNumber(value))115 arg = JSImmediate::getTruncatedInt32(value);116 else if (LIKELY(!JSImmediate::isImmediate(value)) && LIKELY(Heap::isNumber(asCell(value))))117 arg = asNumberCell(value)->value();118 else119 return false;120 return true;121 }122 123 // FIXME: Why doesn't JSValuePtr::toInt32 have the Heap::isNumber optimization?124 static bool fastToInt32(JSValuePtr value, int32_t& arg)125 {126 if (JSImmediate::isNumber(value))127 arg = JSImmediate::getTruncatedInt32(value);128 else if (LIKELY(!JSImmediate::isImmediate(value)) && LIKELY(Heap::isNumber(asCell(value))))129 arg = asNumberCell(value)->toInt32();130 else131 return false;132 return true;133 }134 135 static ALWAYS_INLINE bool fastToUInt32(JSValuePtr value, uint32_t& arg)136 {137 if (JSImmediate::isNumber(value)) {138 if (JSImmediate::getTruncatedUInt32(value, arg))139 return true;140 bool scratch;141 arg = toUInt32SlowCase(JSImmediate::getTruncatedInt32(value), scratch);142 return true;143 } else if (!JSImmediate::isImmediate(value) && Heap::isNumber(asCell(value)))144 arg = asNumberCell(value)->toUInt32();145 else146 return false;147 return true;148 }149 150 110 static inline bool jsLess(CallFrame* callFrame, JSValuePtr v1, JSValuePtr v2) 151 111 { 152 if (JS Immediate::areBothImmediateNumbers(v1, v2))153 return JSImmediate::getTruncatedInt32(v1) < JSImmediate::getTruncatedInt32(v2);112 if (JSValuePtr::areBothInt32Fast(v1, v2)) 113 return v1->getInt32Fast() < v2->getInt32Fast(); 154 114 155 115 double n1; 156 116 double n2; 157 if ( fastIsNumber(v1, n1) && fastIsNumber(v2,n2))117 if (v1->getNumber(n1) && v2->getNumber(n2)) 158 118 return n1 < n2; 159 119 … … 175 135 static inline bool jsLessEq(CallFrame* callFrame, JSValuePtr v1, JSValuePtr v2) 176 136 { 177 if (JS Immediate::areBothImmediateNumbers(v1, v2))178 return JSImmediate::getTruncatedInt32(v1) <= JSImmediate::getTruncatedInt32(v2);137 if (JSValuePtr::areBothInt32Fast(v1, v2)) 138 return v1->getInt32Fast() <= v2->getInt32Fast(); 179 139 180 140 double n1; 181 141 double n2; 182 if ( fastIsNumber(v1, n1) && fastIsNumber(v2,n2))142 if (v1->getNumber(n1) && v2->getNumber(n2)) 183 143 return n1 <= n2; 184 144 … … 228 188 double right = 0.0; 229 189 230 bool rightIsNumber = fastIsNumber(v2,right);231 if (rightIsNumber && fastIsNumber(v1,left))190 bool rightIsNumber = v2->getNumber(right); 191 if (rightIsNumber && v1->getNumber(left)) 232 192 return jsNumber(callFrame, left + right); 233 193 … … 241 201 242 202 if (rightIsNumber & leftIsString) { 243 RefPtr<UString::Rep> value = JSImmediate::isImmediate(v2) ?244 concatenate(asString(v1)->value().rep(), JSImmediate::getTruncatedInt32(v2)) :203 RefPtr<UString::Rep> value = v2->isInt32Fast() ? 204 concatenate(asString(v1)->value().rep(), v2->getInt32Fast()) : 245 205 concatenate(asString(v1)->value().rep(), right); 246 206 … … 278 238 static bool jsIsObjectType(JSValuePtr v) 279 239 { 280 if ( JSImmediate::isImmediate(v))240 if (!v->isCell()) 281 241 return v->isNull(); 282 242 … … 1208 1168 { 1209 1169 JSValuePtr prototype = structure->prototypeForLookup(callFrame); 1210 if ( JSImmediate::isImmediate(prototype))1170 if (!prototype->isCell()) 1211 1171 return 0; 1212 1172 RefPtr<StructureChain> chain = StructureChain::create(asObject(prototype)->structure()); … … 1221 1181 return; 1222 1182 1223 if ( JSImmediate::isImmediate(baseValue))1183 if (!baseValue->isCell()) 1224 1184 return; 1225 1185 … … 1330 1290 1331 1291 // FIXME: Cache property access for immediates. 1332 if ( JSImmediate::isImmediate(baseValue)) {1292 if (!baseValue->isCell()) { 1333 1293 vPC[0] = getOpcode(op_get_by_id_generic); 1334 1294 return; … … 1574 1534 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1575 1535 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1576 if (JS Immediate::areBothImmediateNumbers(src1, src2))1577 callFrame[dst] = jsBoolean(src1 ==src2);1536 if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) 1537 callFrame[dst] = JSFastMath::equal(src1, src2); 1578 1538 else { 1579 JSValuePtr result = jsBoolean( equalSlowCase(callFrame, src1, src2));1539 JSValuePtr result = jsBoolean(JSValuePtr::equalSlowCase(callFrame, src1, src2)); 1580 1540 CHECK_FOR_EXCEPTION(); 1581 1541 callFrame[dst] = result; … … 1600 1560 } 1601 1561 1602 callFrame[dst] = jsBoolean( !JSImmediate::isImmediate(src) && src->asCell()->structure()->typeInfo().masqueradesAsUndefined());1562 callFrame[dst] = jsBoolean(src->isCell() && src->asCell()->structure()->typeInfo().masqueradesAsUndefined()); 1603 1563 ++vPC; 1604 1564 NEXT_INSTRUCTION(); … … 1614 1574 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1615 1575 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1616 if (JS Immediate::areBothImmediateNumbers(src1, src2))1617 callFrame[dst] = jsBoolean(src1 !=src2);1576 if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) 1577 callFrame[dst] = JSFastMath::notEqual(src1, src2); 1618 1578 else { 1619 JSValuePtr result = jsBoolean(! equalSlowCase(callFrame, src1, src2));1579 JSValuePtr result = jsBoolean(!JSValuePtr::equalSlowCase(callFrame, src1, src2)); 1620 1580 CHECK_FOR_EXCEPTION(); 1621 1581 callFrame[dst] = result; … … 1640 1600 } 1641 1601 1642 callFrame[dst] = jsBoolean( JSImmediate::isImmediate(src) || !asCell(src)->structure()->typeInfo().masqueradesAsUndefined());1602 callFrame[dst] = jsBoolean(src->isCell() || !asCell(src)->structure()->typeInfo().masqueradesAsUndefined()); 1643 1603 ++vPC; 1644 1604 NEXT_INSTRUCTION(); … … 1654 1614 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1655 1615 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1656 if (JSImmediate::areBothImmediate(src1, src2)) 1657 callFrame[dst] = jsBoolean(src1 == src2); 1658 else if (JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate())) 1659 callFrame[dst] = jsBoolean(false); 1660 else 1661 callFrame[dst] = jsBoolean(strictEqualSlowCase(src1, src2)); 1616 callFrame[dst] = jsBoolean(JSValuePtr::strictEqual(src1, src2)); 1662 1617 1663 1618 ++vPC; … … 1674 1629 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1675 1630 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1676 1677 if (JSImmediate::areBothImmediate(src1, src2)) 1678 callFrame[dst] = jsBoolean(src1 != src2); 1679 else if (JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate())) 1680 callFrame[dst] = jsBoolean(true); 1681 else 1682 callFrame[dst] = jsBoolean(!strictEqualSlowCase(src1, src2)); 1631 callFrame[dst] = jsBoolean(!JSValuePtr::strictEqual(src1, src2)); 1683 1632 1684 1633 ++vPC; … … 1727 1676 int srcDst = (++vPC)->u.operand; 1728 1677 JSValuePtr v = callFrame[srcDst].jsValue(callFrame); 1729 if (JS Immediate::canDoFastAdditiveOperations(v))1730 callFrame[srcDst] = JSValuePtr(JS Immediate::incImmediateNumber(v));1678 if (JSFastMath::canDoFastAdditiveOperations(v)) 1679 callFrame[srcDst] = JSValuePtr(JSFastMath::incImmediateNumber(v)); 1731 1680 else { 1732 1681 JSValuePtr result = jsNumber(callFrame, v->toNumber(callFrame) + 1); … … 1746 1695 int srcDst = (++vPC)->u.operand; 1747 1696 JSValuePtr v = callFrame[srcDst].jsValue(callFrame); 1748 if (JS Immediate::canDoFastAdditiveOperations(v))1749 callFrame[srcDst] = JSValuePtr(JS Immediate::decImmediateNumber(v));1697 if (JSFastMath::canDoFastAdditiveOperations(v)) 1698 callFrame[srcDst] = JSValuePtr(JSFastMath::decImmediateNumber(v)); 1750 1699 else { 1751 1700 JSValuePtr result = jsNumber(callFrame, v->toNumber(callFrame) - 1); … … 1767 1716 int srcDst = (++vPC)->u.operand; 1768 1717 JSValuePtr v = callFrame[srcDst].jsValue(callFrame); 1769 if (JS Immediate::canDoFastAdditiveOperations(v)) {1718 if (JSFastMath::canDoFastAdditiveOperations(v)) { 1770 1719 callFrame[dst] = v; 1771 callFrame[srcDst] = JSValuePtr(JS Immediate::incImmediateNumber(v));1720 callFrame[srcDst] = JSValuePtr(JSFastMath::incImmediateNumber(v)); 1772 1721 } else { 1773 1722 JSValuePtr number = callFrame[srcDst].jsValue(callFrame)->toJSNumber(callFrame); … … 1790 1739 int srcDst = (++vPC)->u.operand; 1791 1740 JSValuePtr v = callFrame[srcDst].jsValue(callFrame); 1792 if (JS Immediate::canDoFastAdditiveOperations(v)) {1741 if (JSFastMath::canDoFastAdditiveOperations(v)) { 1793 1742 callFrame[dst] = v; 1794 callFrame[srcDst] = JSValuePtr(JS Immediate::decImmediateNumber(v));1743 callFrame[srcDst] = JSValuePtr(JSFastMath::decImmediateNumber(v)); 1795 1744 } else { 1796 1745 JSValuePtr number = callFrame[srcDst].jsValue(callFrame)->toJSNumber(callFrame); … … 1835 1784 ++vPC; 1836 1785 double v; 1837 if ( fastIsNumber(src,v))1786 if (src->getNumber(v)) 1838 1787 callFrame[dst] = JSValuePtr(jsNumber(callFrame, -v)); 1839 1788 else { … … 1855 1804 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1856 1805 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1857 if (JS Immediate::canDoFastAdditiveOperations(src1) && JSImmediate::canDoFastAdditiveOperations(src2))1858 callFrame[dst] = JSValuePtr(JS Immediate::addImmediateNumbers(src1, src2));1806 if (JSFastMath::canDoFastAdditiveOperations(src1, src2)) 1807 callFrame[dst] = JSValuePtr(JSFastMath::addImmediateNumbers(src1, src2)); 1859 1808 else { 1860 1809 JSValuePtr result = jsAdd(callFrame, src1, src2); … … 1876 1825 double left; 1877 1826 double right; 1878 if (JS Immediate::areBothImmediateNumbers(src1, src2)) {1879 int32_t left = JSImmediate::getTruncatedInt32(src1);1880 int32_t right = JSImmediate::getTruncatedInt32(src2);1827 if (JSValuePtr::areBothInt32Fast(src1, src2)) { 1828 int32_t left = src1->getInt32Fast(); 1829 int32_t right = src2->getInt32Fast(); 1881 1830 if ((left | right) >> 15 == 0) 1882 1831 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left * right)); 1883 1832 else 1884 1833 callFrame[dst] = JSValuePtr(jsNumber(callFrame, static_cast<double>(left) * static_cast<double>(right))); 1885 } else if ( fastIsNumber(src1, left) && fastIsNumber(src2,right))1834 } else if (src1->getNumber(left) && src2->getNumber(right)) 1886 1835 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left * right)); 1887 1836 else { … … 1906 1855 double left; 1907 1856 double right; 1908 if ( fastIsNumber(dividend, left) && fastIsNumber(divisor,right))1857 if (dividend->getNumber(left) && divisor->getNumber(right)) 1909 1858 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left / right)); 1910 1859 else { … … 1930 1879 JSValuePtr divisorValue = callFrame[divisor].jsValue(callFrame); 1931 1880 1932 if (JSImmediate::areBothImmediateNumbers(dividendValue, divisorValue) && divisorValue != JSImmediate::from(0)) { 1933 callFrame[dst] = JSValuePtr(JSImmediate::from(JSImmediate::getTruncatedInt32(dividendValue) % JSImmediate::getTruncatedInt32(divisorValue))); 1881 if (JSValuePtr::areBothInt32Fast(dividendValue, divisorValue) && divisorValue != js0()) { 1882 // We expect the result of the modulus of a number that was representable as an int32 to also be representable 1883 // as an int32. 1884 JSValuePtr result = JSValuePtr::makeInt32Fast(dividendValue->getInt32Fast() % divisorValue->getInt32Fast()); 1885 ASSERT(result); 1886 callFrame[dst] = result; 1934 1887 ++vPC; 1935 1888 NEXT_INSTRUCTION(); … … 1955 1908 double left; 1956 1909 double right; 1957 if (JS Immediate::canDoFastAdditiveOperations(src1) && JSImmediate::canDoFastAdditiveOperations(src2))1958 callFrame[dst] = JSValuePtr(JS Immediate::subImmediateNumbers(src1, src2));1959 else if ( fastIsNumber(src1, left) && fastIsNumber(src2,right))1910 if (JSFastMath::canDoFastAdditiveOperations(src1, src2)) 1911 callFrame[dst] = JSValuePtr(JSFastMath::subImmediateNumbers(src1, src2)); 1912 else if (src1->getNumber(left) && src2->getNumber(right)) 1960 1913 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left - right)); 1961 1914 else { … … 1979 1932 int32_t left; 1980 1933 uint32_t right; 1981 if (JS Immediate::areBothImmediateNumbers(val, shift))1982 callFrame[dst] = JSValuePtr(jsNumber(callFrame, JSImmediate::getTruncatedInt32(val) << (JSImmediate::getTruncatedUInt32(shift) & 0x1f)));1983 else if ( fastToInt32(val, left) && fastToUInt32(shift,right))1934 if (JSValuePtr::areBothInt32Fast(val, shift)) 1935 callFrame[dst] = JSValuePtr(jsNumber(callFrame, val->getInt32Fast() << (shift->getInt32Fast() & 0x1f))); 1936 else if (val->numberToInt32(left) && shift->numberToUInt32(right)) 1984 1937 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left << (right & 0x1f))); 1985 1938 else { … … 2004 1957 int32_t left; 2005 1958 uint32_t right; 2006 if (JS Immediate::areBothImmediateNumbers(val, shift))2007 callFrame[dst] = JSValuePtr(JS Immediate::rightShiftImmediateNumbers(val, shift));2008 else if ( fastToInt32(val, left) && fastToUInt32(shift,right))1959 if (JSFastMath::canDoFastRshift(val, shift)) 1960 callFrame[dst] = JSValuePtr(JSFastMath::rightShiftImmediateNumbers(val, shift)); 1961 else if (val->numberToInt32(left) && shift->numberToUInt32(right)) 2009 1962 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left >> (right & 0x1f))); 2010 1963 else { … … 2027 1980 JSValuePtr val = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2028 1981 JSValuePtr shift = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2029 if (JS Immediate::areBothImmediateNumbers(val, shift) && !JSImmediate::isNegative(val))2030 callFrame[dst] = JSValuePtr(JS Immediate::rightShiftImmediateNumbers(val, shift));1982 if (JSFastMath::canDoFastUrshift(val, shift)) 1983 callFrame[dst] = JSValuePtr(JSFastMath::rightShiftImmediateNumbers(val, shift)); 2031 1984 else { 2032 1985 JSValuePtr result = jsNumber(callFrame, (val->toUInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f)); … … 2050 2003 int32_t left; 2051 2004 int32_t right; 2052 if (JS Immediate::areBothImmediateNumbers(src1, src2))2053 callFrame[dst] = JSValuePtr(JS Immediate::andImmediateNumbers(src1, src2));2054 else if ( fastToInt32(src1, left) && fastToInt32(src2,right))2005 if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) 2006 callFrame[dst] = JSValuePtr(JSFastMath::andImmediateNumbers(src1, src2)); 2007 else if (src1->numberToInt32(left) && src2->numberToInt32(right)) 2055 2008 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left & right)); 2056 2009 else { … … 2075 2028 int32_t left; 2076 2029 int32_t right; 2077 if (JS Immediate::areBothImmediateNumbers(src1, src2))2078 callFrame[dst] = JSValuePtr(JS Immediate::xorImmediateNumbers(src1, src2));2079 else if ( fastToInt32(src1, left) && fastToInt32(src2,right))2030 if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) 2031 callFrame[dst] = JSValuePtr(JSFastMath::xorImmediateNumbers(src1, src2)); 2032 else if (src1->numberToInt32(left) && src2->numberToInt32(right)) 2080 2033 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left ^ right)); 2081 2034 else { … … 2100 2053 int32_t left; 2101 2054 int32_t right; 2102 if (JS Immediate::areBothImmediateNumbers(src1, src2))2103 callFrame[dst] = JSValuePtr(JS Immediate::orImmediateNumbers(src1, src2));2104 else if ( fastToInt32(src1, left) && fastToInt32(src2,right))2055 if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) 2056 callFrame[dst] = JSValuePtr(JSFastMath::orImmediateNumbers(src1, src2)); 2057 else if (src1->numberToInt32(left) && src2->numberToInt32(right)) 2105 2058 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left | right)); 2106 2059 else { … … 2122 2075 JSValuePtr src = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2123 2076 int32_t value; 2124 if ( fastToInt32(src,value))2077 if (src->numberToInt32(value)) 2125 2078 callFrame[dst] = JSValuePtr(jsNumber(callFrame, ~value)); 2126 2079 else { … … 2199 2152 int src = (++vPC)->u.operand; 2200 2153 JSValuePtr v = callFrame[src].jsValue(callFrame); 2201 callFrame[dst] = jsBoolean( JSImmediate::isImmediate(v) ? v->isUndefined() : v->asCell()->structure()->typeInfo().masqueradesAsUndefined());2154 callFrame[dst] = jsBoolean(v->isCell() ? v->asCell()->structure()->typeInfo().masqueradesAsUndefined() : v->isUndefined()); 2202 2155 2203 2156 ++vPC; … … 2510 2463 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2511 2464 2512 if (LIKELY( !JSImmediate::isImmediate(baseValue))) {2465 if (LIKELY(baseValue->isCell())) { 2513 2466 JSCell* baseCell = asCell(baseValue); 2514 2467 Structure* structure = vPC[4].u.structure; … … 2541 2494 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2542 2495 2543 if (LIKELY( !JSImmediate::isImmediate(baseValue))) {2496 if (LIKELY(baseValue->isCell())) { 2544 2497 JSCell* baseCell = asCell(baseValue); 2545 2498 Structure* structure = vPC[4].u.structure; … … 2590 2543 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2591 2544 2592 if (LIKELY( !JSImmediate::isImmediate(baseValue))) {2545 if (LIKELY(baseValue->isCell())) { 2593 2546 JSCell* baseCell = asCell(baseValue); 2594 2547 Structure* structure = vPC[4].u.structure; … … 2722 2675 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2723 2676 2724 if (LIKELY( !JSImmediate::isImmediate(baseValue))) {2677 if (LIKELY(baseValue->isCell())) { 2725 2678 JSCell* baseCell = asCell(baseValue); 2726 2679 Structure* oldStructure = vPC[4].u.structure; … … 2772 2725 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2773 2726 2774 if (LIKELY( !JSImmediate::isImmediate(baseValue))) {2727 if (LIKELY(baseValue->isCell())) { 2775 2728 JSCell* baseCell = asCell(baseValue); 2776 2729 Structure* structure = vPC[4].u.structure; … … 2851 2804 2852 2805 JSValuePtr result; 2853 unsigned i; 2854 2855 bool isUInt32 = JSImmediate::getUInt32(subscript, i); 2856 if (LIKELY(isUInt32)) { 2806 2807 if (LIKELY(subscript->isUInt32Fast())) { 2808 uint32_t i = subscript->getUInt32Fast(); 2857 2809 if (isJSArray(baseValue)) { 2858 2810 JSArray* jsArray = asArray(baseValue); … … 2864 2816 result = asString(baseValue)->getIndex(&callFrame->globalData(), i); 2865 2817 else if (isJSByteArray(baseValue) && asByteArray(baseValue)->canAccessIndex(i)) 2866 result = asByteArray(baseValue)->getIndex( i);2818 result = asByteArray(baseValue)->getIndex(callFrame, i); 2867 2819 else 2868 2820 result = baseValue->get(callFrame, i); … … 2895 2847 JSValuePtr subscript = callFrame[property].jsValue(callFrame); 2896 2848 2897 unsigned i; 2898 2899 bool isUInt32 = JSImmediate::getUInt32(subscript, i); 2900 if (LIKELY(isUInt32)) { 2849 if (LIKELY(subscript->isUInt32Fast())) { 2850 uint32_t i = subscript->getUInt32Fast(); 2901 2851 if (isJSArray(baseValue)) { 2902 2852 JSArray* jsArray = asArray(baseValue); … … 2909 2859 double dValue = 0; 2910 2860 JSValuePtr jsValue = callFrame[value].jsValue(callFrame); 2911 if ( JSImmediate::isNumber(jsValue))2912 jsByteArray->setIndex(i, JSImmediate::getTruncatedInt32(jsValue));2913 else if ( fastIsNumber(jsValue,dValue))2861 if (jsValue->isInt32Fast()) 2862 jsByteArray->setIndex(i, jsValue->getInt32Fast()); 2863 else if (jsValue->getNumber(dValue)) 2914 2864 jsByteArray->setIndex(i, dValue); 2915 2865 else … … 3074 3024 JSValuePtr srcValue = callFrame[src].jsValue(callFrame); 3075 3025 3076 if (srcValue->isUndefinedOrNull() || ( !JSImmediate::isImmediate(srcValue) && srcValue->asCell()->structure()->typeInfo().masqueradesAsUndefined())) {3026 if (srcValue->isUndefinedOrNull() || (srcValue->isCell() && srcValue->asCell()->structure()->typeInfo().masqueradesAsUndefined())) { 3077 3027 vPC += target; 3078 3028 NEXT_INSTRUCTION(); … … 3092 3042 JSValuePtr srcValue = callFrame[src].jsValue(callFrame); 3093 3043 3094 if (!srcValue->isUndefinedOrNull() || ( !JSImmediate::isImmediate(srcValue) && !srcValue->asCell()->structure()->typeInfo().masqueradesAsUndefined())) {3044 if (!srcValue->isUndefinedOrNull() || (srcValue->isCell() && !srcValue->asCell()->structure()->typeInfo().masqueradesAsUndefined())) { 3095 3045 vPC += target; 3096 3046 NEXT_INSTRUCTION(); … … 3189 3139 int defaultOffset = (++vPC)->u.operand; 3190 3140 JSValuePtr scrutinee = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3191 if (!JSImmediate::isNumber(scrutinee)) 3141 if (scrutinee->isInt32Fast()) 3142 vPC += callFrame->codeBlock()->immediateSwitchJumpTable(tableIndex).offsetForValue(scrutinee->getInt32Fast(), defaultOffset); 3143 else 3192 3144 vPC += defaultOffset; 3193 else {3194 int32_t value = JSImmediate::getTruncatedInt32(scrutinee);3195 vPC += callFrame->codeBlock()->immediateSwitchJumpTable(tableIndex).offsetForValue(value, defaultOffset);3196 }3197 3145 NEXT_INSTRUCTION(); 3198 3146 } … … 4057 4005 // The interpreter checks for recursion here; I do not believe this can occur in CTI. 4058 4006 4059 if ( JSImmediate::isImmediate(baseValue))4007 if (!baseValue->isCell()) 4060 4008 return; 4061 4009 … … 4116 4064 4117 4065 // FIXME: Cache property access for immediates. 4118 if ( JSImmediate::isImmediate(baseValue)) {4066 if (!baseValue->isCell()) { 4119 4067 ctiPatchCallByReturnAddress(returnAddress, reinterpret_cast<void*>(cti_op_get_by_id_generic)); 4120 4068 return; … … 4332 4280 double right = 0.0; 4333 4281 4334 bool rightIsNumber = fastIsNumber(v2,right);4335 if (rightIsNumber && fastIsNumber(v1,left))4282 bool rightIsNumber = v2->getNumber(right); 4283 if (rightIsNumber && v1->getNumber(left)) 4336 4284 return JSValuePtr::encode(jsNumber(ARG_globalData, left + right)); 4337 4285 … … 4350 4298 4351 4299 if (rightIsNumber & leftIsString) { 4352 RefPtr<UString::Rep> value = JSImmediate::isImmediate(v2) ?4353 concatenate(asString(v1)->value().rep(), JSImmediate::getTruncatedInt32(v2)) :4300 RefPtr<UString::Rep> value = v2->isInt32Fast() ? 4301 concatenate(asString(v1)->value().rep(), v2->getInt32Fast()) : 4354 4302 concatenate(asString(v1)->value().rep(), right); 4355 4303 … … 4550 4498 CHECK_FOR_EXCEPTION(); 4551 4499 4552 if ( !JSImmediate::isImmediate(baseValue)4500 if (baseValue->isCell() 4553 4501 && slot.isCacheable() 4554 4502 && !asCell(baseValue)->structure()->isDictionary() … … 4624 4572 CHECK_FOR_EXCEPTION(); 4625 4573 4626 if ( JSImmediate::isImmediate(baseValue) || !slot.isCacheable() || asCell(baseValue)->structure()->isDictionary()) {4574 if (!baseValue->isCell() || !slot.isCacheable() || asCell(baseValue)->structure()->isDictionary()) { 4627 4575 ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_get_by_id_proto_fail)); 4628 4576 return JSValuePtr::encode(result); … … 4733 4681 4734 4682 // at least one of these checks must have failed to get to the slow case 4735 ASSERT( JSImmediate::isAnyImmediate(value, baseVal, proto)4683 ASSERT(!value->isCell() || !baseVal->isCell() || !proto->isCell() 4736 4684 || !value->isObject() || !baseVal->isObject() || !proto->isObject() 4737 4685 || (asObject(baseVal)->structure()->typeInfo().flags() & (ImplementsHasInstance | OverridesHasInstance)) != ImplementsHasInstance); … … 4784 4732 double left; 4785 4733 double right; 4786 if ( fastIsNumber(src1, left) && fastIsNumber(src2,right))4734 if (src1->getNumber(left) && src2->getNumber(right)) 4787 4735 return JSValuePtr::encode(jsNumber(ARG_globalData, left * right)); 4788 4736 … … 5106 5054 5107 5055 JSValuePtr result; 5108 unsigned i; 5109 5110 bool isUInt32 = JSImmediate::getUInt32(subscript, i); 5111 if (LIKELY(isUInt32)) { 5056 5057 if (LIKELY(subscript->isUInt32Fast())) { 5058 uint32_t i = subscript->getUInt32Fast(); 5112 5059 if (interpreter->isJSArray(baseValue)) { 5113 5060 JSArray* jsArray = asArray(baseValue); … … 5121 5068 // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. 5122 5069 ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_get_by_val_byte_array)); 5123 return JSValuePtr::encode(asByteArray(baseValue)->getIndex( i));5070 return JSValuePtr::encode(asByteArray(baseValue)->getIndex(callFrame, i)); 5124 5071 } else 5125 5072 result = baseValue->get(callFrame, i); … … 5144 5091 5145 5092 JSValuePtr result; 5146 unsigned i; 5147 5148 bool isUInt32 = JSImmediate::getUInt32(subscript, i); 5149 if (LIKELY(isUInt32)) { 5093 5094 if (LIKELY(subscript->isUInt32Fast())) { 5095 uint32_t i = subscript->getUInt32Fast(); 5150 5096 if (interpreter->isJSByteArray(baseValue) && asByteArray(baseValue)->canAccessIndex(i)) { 5151 5097 // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. 5152 return JSValuePtr::encode(asByteArray(baseValue)->getIndex( i));5098 return JSValuePtr::encode(asByteArray(baseValue)->getIndex(callFrame, i)); 5153 5099 } 5154 5100 … … 5216 5162 double left; 5217 5163 double right; 5218 if ( fastIsNumber(src1, left) && fastIsNumber(src2,right))5164 if (src1->getNumber(left) && src2->getNumber(right)) 5219 5165 return JSValuePtr::encode(jsNumber(ARG_globalData, left - right)); 5220 5166 … … 5236 5182 JSValuePtr value = ARG_src3; 5237 5183 5238 unsigned i; 5239 5240 bool isUInt32 = JSImmediate::getUInt32(subscript, i); 5241 if (LIKELY(isUInt32)) { 5184 if (LIKELY(subscript->isUInt32Fast())) { 5185 uint32_t i = subscript->getUInt32Fast(); 5242 5186 if (interpreter->isJSArray(baseValue)) { 5243 5187 JSArray* jsArray = asArray(baseValue); … … 5250 5194 ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_put_by_val_byte_array)); 5251 5195 // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. 5252 if ( JSImmediate::isNumber(value)) {5253 jsByteArray->setIndex(i, JSImmediate::getTruncatedInt32(value));5196 if (value->isInt32Fast()) { 5197 jsByteArray->setIndex(i, value->getInt32Fast()); 5254 5198 return; 5255 5199 } else { 5256 5200 double dValue = 0; 5257 if ( fastIsNumber(value,dValue)) {5201 if (value->getNumber(dValue)) { 5258 5202 jsByteArray->setIndex(i, dValue); 5259 5203 return; … … 5290 5234 asArray(baseValue)->JSArray::put(callFrame, i, value); 5291 5235 else { 5292 Identifier property(callFrame, JSImmediate::from(i)->toString(callFrame)); 5236 // This should work since we're re-boxing an immediate unboxed in JIT code. 5237 ASSERT(JSValuePtr::makeInt32Fast(i)); 5238 Identifier property(callFrame, JSValuePtr::makeInt32Fast(i)->toString(callFrame)); 5293 5239 // FIXME: can toString throw an exception here? 5294 5240 if (!ARG_globalData->exception) { // Don't put to an object if toString threw an exception. … … 5312 5258 JSValuePtr value = ARG_src3; 5313 5259 5314 unsigned i; 5315 5316 bool isUInt32 = JSImmediate::getUInt32(subscript, i); 5317 if (LIKELY(isUInt32)) { 5260 if (LIKELY(subscript->isUInt32Fast())) { 5261 uint32_t i = subscript->getUInt32Fast(); 5318 5262 if (interpreter->isJSByteArray(baseValue) && asByteArray(baseValue)->canAccessIndex(i)) { 5319 5263 JSByteArray* jsByteArray = asByteArray(baseValue); 5320 5264 5321 5265 // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. 5322 if ( JSImmediate::isNumber(value)) {5323 jsByteArray->setIndex(i, JSImmediate::getTruncatedInt32(value));5266 if (value->isInt32Fast()) { 5267 jsByteArray->setIndex(i, value->getInt32Fast()); 5324 5268 return; 5325 5269 } else { 5326 5270 double dValue = 0; 5327 if ( fastIsNumber(value,dValue)) {5271 if (value->getNumber(dValue)) { 5328 5272 jsByteArray->setIndex(i, dValue); 5329 5273 return; … … 5376 5320 5377 5321 double v; 5378 if ( fastIsNumber(src,v))5322 if (src->getNumber(v)) 5379 5323 return JSValuePtr::encode(jsNumber(ARG_globalData, -v)); 5380 5324 … … 5466 5410 double left; 5467 5411 double right; 5468 if ( fastIsNumber(src1, left) && fastIsNumber(src2,right))5412 if (src1->getNumber(left) && src2->getNumber(right)) 5469 5413 return JSValuePtr::encode(jsNumber(ARG_globalData, left / right)); 5470 5414 … … 5549 5493 CallFrame* callFrame = ARG_callFrame; 5550 5494 5551 ASSERT(!JS Immediate::areBothImmediateNumbers(src1, src2));5552 JSValuePtr result = jsBoolean( equalSlowCaseInline(callFrame, src1, src2));5495 ASSERT(!JSValuePtr::areBothInt32Fast(src1, src2)); 5496 JSValuePtr result = jsBoolean(JSValuePtr::equalSlowCaseInline(callFrame, src1, src2)); 5553 5497 CHECK_FOR_EXCEPTION_AT_END(); 5554 5498 return JSValuePtr::encode(result); … … 5564 5508 int32_t left; 5565 5509 uint32_t right; 5566 if (JS Immediate::areBothImmediateNumbers(val, shift))5567 return JSValuePtr::encode(jsNumber(ARG_globalData, JSImmediate::getTruncatedInt32(val) << (JSImmediate::getTruncatedUInt32(shift) & 0x1f)));5568 if ( fastToInt32(val, left) && fastToUInt32(shift,right))5510 if (JSValuePtr::areBothInt32Fast(val, shift)) 5511 return JSValuePtr::encode(jsNumber(ARG_globalData, val->getInt32Fast() << (shift->getInt32Fast() & 0x1f))); 5512 if (val->numberToInt32(left) && shift->numberToUInt32(right)) 5569 5513 return JSValuePtr::encode(jsNumber(ARG_globalData, left << (right & 0x1f))); 5570 5514 … … 5584 5528 int32_t left; 5585 5529 int32_t right; 5586 if ( fastToInt32(src1, left) && fastToInt32(src2,right))5530 if (src1->numberToInt32(left) && src2->numberToInt32(right)) 5587 5531 return JSValuePtr::encode(jsNumber(ARG_globalData, left & right)); 5588 5532 … … 5602 5546 int32_t left; 5603 5547 uint32_t right; 5604 if (JS Immediate::areBothImmediateNumbers(val, shift))5605 return JSValuePtr::encode(JS Immediate::rightShiftImmediateNumbers(val, shift));5606 if ( fastToInt32(val, left) && fastToUInt32(shift,right))5548 if (JSFastMath::canDoFastRshift(val, shift)) 5549 return JSValuePtr::encode(JSFastMath::rightShiftImmediateNumbers(val, shift)); 5550 if (val->numberToInt32(left) && shift->numberToUInt32(right)) 5607 5551 return JSValuePtr::encode(jsNumber(ARG_globalData, left >> (right & 0x1f))); 5608 5552 … … 5620 5564 5621 5565 int value; 5622 if ( fastToInt32(src,value))5566 if (src->numberToInt32(value)) 5623 5567 return JSValuePtr::encode(jsNumber(ARG_globalData, ~value)); 5624 5568 … … 5701 5645 JSValuePtr src2 = ARG_src2; 5702 5646 5703 ASSERT(!JS Immediate::areBothImmediateNumbers(src1, src2));5704 5705 CallFrame* callFrame = ARG_callFrame; 5706 JSValuePtr result = jsBoolean(! equalSlowCaseInline(callFrame, src1, src2));5647 ASSERT(!JSValuePtr::areBothInt32Fast(src1, src2)); 5648 5649 CallFrame* callFrame = ARG_callFrame; 5650 JSValuePtr result = jsBoolean(!JSValuePtr::equalSlowCaseInline(callFrame, src1, src2)); 5707 5651 CHECK_FOR_EXCEPTION_AT_END(); 5708 5652 return JSValuePtr::encode(result); … … 5732 5676 CallFrame* callFrame = ARG_callFrame; 5733 5677 5734 if (JS Immediate::areBothImmediateNumbers(val, shift) && !JSImmediate::isNegative(val))5735 return JSValuePtr::encode(JS Immediate::rightShiftImmediateNumbers(val, shift));5678 if (JSFastMath::canDoFastUrshift(val, shift)) 5679 return JSValuePtr::encode(JSFastMath::rightShiftImmediateNumbers(val, shift)); 5736 5680 else { 5737 5681 JSValuePtr result = jsNumber(ARG_globalData, (val->toUInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f)); … … 5804 5748 } 5805 5749 5806 return JSValuePtr::encode( JSImmediate::impossibleValue());5750 return JSValuePtr::encode(jsImpossibleValue()); 5807 5751 } 5808 5752 … … 5823 5767 if (!handler) { 5824 5768 *ARG_exception = exceptionValue; 5825 return JSValuePtr::encode( JSImmediate::nullImmediate());5769 return JSValuePtr::encode(jsNull()); 5826 5770 } 5827 5771 … … 5880 5824 5881 5825 JSValuePtr v = ARG_src1; 5882 return JSValuePtr::encode(jsBoolean( JSImmediate::isImmediate(v) ? v->isUndefined() : v->asCell()->structure()->typeInfo().masqueradesAsUndefined()));5826 return JSValuePtr::encode(jsBoolean(v->isCell() ? v->asCell()->structure()->typeInfo().masqueradesAsUndefined() : v->isUndefined())); 5883 5827 } 5884 5828 … … 5926 5870 5927 5871 // handled inline as fast cases 5928 ASSERT(!JSImmediate::areBothImmediate(src1, src2)); 5929 ASSERT(!(JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate()))); 5930 5931 return JSValuePtr::encode(jsBoolean(strictEqualSlowCaseInline(src1, src2))); 5872 ASSERT(!JIT::isStrictEqCaseHandledInJITCode(src1, src2)); 5873 5874 return JSValuePtr::encode(jsBoolean(JSValuePtr::strictEqualSlowCaseInline(src1, src2))); 5932 5875 } 5933 5876 … … 5940 5883 5941 5884 // handled inline as fast cases 5942 ASSERT(!JSImmediate::areBothImmediate(src1, src2)); 5943 ASSERT(!(JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate()))); 5885 ASSERT(!JIT::isStrictEqCaseHandledInJITCode(src1, src2)); 5944 5886 5945 return JSValuePtr::encode(jsBoolean(! strictEqualSlowCaseInline(src1, src2)));5887 return JSValuePtr::encode(jsBoolean(!JSValuePtr::strictEqualSlowCaseInline(src1, src2))); 5946 5888 } 5947 5889 … … 6028 5970 CodeBlock* codeBlock = callFrame->codeBlock(); 6029 5971 6030 if (JSImmediate::isNumber(scrutinee)) { 6031 int32_t value = JSImmediate::getTruncatedInt32(scrutinee); 6032 return codeBlock->immediateSwitchJumpTable(tableIndex).ctiForValue(value); 6033 } 5972 if (scrutinee->isInt32Fast()) 5973 return codeBlock->immediateSwitchJumpTable(tableIndex).ctiForValue(scrutinee->getInt32Fast()); 6034 5974 6035 5975 return codeBlock->immediateSwitchJumpTable(tableIndex).ctiDefault; … … 6169 6109 if (!handler) { 6170 6110 *ARG_exception = exceptionValue; 6171 return JSValuePtr::encode( JSImmediate::nullImmediate());6111 return JSValuePtr::encode(jsNull()); 6172 6112 } 6173 6113
Note:
See TracChangeset
for help on using the changeset viewer.