Changeset 34171 in webkit for trunk/JavaScriptCore


Ignore:
Timestamp:
May 28, 2008, 3:48:04 AM (17 years ago)
Author:
[email protected]
Message:

Reviewed by Maciej.

Based on a patch by Oliver Hunt.

https://bugs.webkit.org/show_bug.cgi?id=19180
speed up SunSpider by optimizing immediate number cases

1.4% speedup on SunSpider.

  • VM/Machine.cpp: (KJS::Machine::privateExecute):
  • kjs/JSImmediate.h: (KJS::JSImmediate::incImmediateNumber): (KJS::JSImmediate::decImmediateNumber): Added fast paths for ++ and --.

(KJS::JSImmediate::canDoFastAdditiveOperations): Corrected a comment.

Location:
trunk/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r34170 r34171  
     12008-05-28  Alexey Proskuryakov  <[email protected]>
     2
     3        Reviewed by Maciej.
     4
     5        Based on a patch by Oliver Hunt.
     6
     7        https://bugs.webkit.org/show_bug.cgi?id=19180
     8        speed up SunSpider by optimizing immediate number cases
     9
     10        1.4% speedup on SunSpider.
     11
     12        * VM/Machine.cpp:
     13        (KJS::Machine::privateExecute):
     14        * kjs/JSImmediate.h:
     15        (KJS::JSImmediate::incImmediateNumber):
     16        (KJS::JSImmediate::decImmediateNumber):
     17        Added fast paths for ++ and --.
     18
     19        (KJS::JSImmediate::canDoFastAdditiveOperations): Corrected a comment.
     20
    1212008-05-28  Alexey Proskuryakov  <[email protected]>
    222
  • trunk/JavaScriptCore/VM/Machine.cpp

    r34170 r34171  
    10781078        */
    10791079        int srcDst = (++vPC)->u.operand;
    1080         JSValue* result = jsNumber(r[srcDst].u.jsValue->toNumber(exec) + 1);
     1080        JSValue* v = r[srcDst].u.jsValue;
     1081        JSValue* result;
     1082        if (JSImmediate::canDoFastAdditiveOperations(v))
     1083            result = JSImmediate::incImmediateNumber(v);
     1084        else
     1085            result = jsNumber(v->toNumber(exec) + 1);
    10811086        VM_CHECK_EXCEPTION();
    10821087        r[srcDst].u.jsValue = result;
     
    10921097        */
    10931098        int srcDst = (++vPC)->u.operand;
    1094         JSValue* result = jsNumber(r[srcDst].u.jsValue->toNumber(exec) - 1);
     1099        JSValue* v = r[srcDst].u.jsValue;
     1100        JSValue* result;
     1101        if (JSImmediate::canDoFastAdditiveOperations(v))
     1102            result = JSImmediate::decImmediateNumber(v);
     1103        else
     1104            result = jsNumber(v->toNumber(exec) - 1);
    10951105        VM_CHECK_EXCEPTION();
    10961106        r[srcDst].u.jsValue = result;
     
    11081118        int dst = (++vPC)->u.operand;
    11091119        int srcDst = (++vPC)->u.operand;
    1110         JSValue* number = r[srcDst].u.jsValue->toJSNumber(exec);
     1120        JSValue* v = r[srcDst].u.jsValue;
     1121        JSValue* result;
     1122        JSValue* number;
     1123        if (JSImmediate::canDoFastAdditiveOperations(v)) {
     1124            number = v;
     1125            result = JSImmediate::incImmediateNumber(v);
     1126        } else {
     1127            number = r[srcDst].u.jsValue->toJSNumber(exec);
     1128            result = jsNumber(number->uncheckedGetNumber() + 1);
     1129        }
    11111130        VM_CHECK_EXCEPTION();
    11121131
    11131132        r[dst].u.jsValue = number;
    1114         r[srcDst].u.jsValue = jsNumber(number->uncheckedGetNumber() + 1);
     1133        r[srcDst].u.jsValue = result;
    11151134
    11161135        ++vPC;
     
    11261145        int dst = (++vPC)->u.operand;
    11271146        int srcDst = (++vPC)->u.operand;
    1128         JSValue* number = r[srcDst].u.jsValue->toJSNumber(exec);
     1147        JSValue* v = r[srcDst].u.jsValue;
     1148        JSValue* result;
     1149        JSValue* number;
     1150        if (JSImmediate::canDoFastAdditiveOperations(v)) {
     1151            number = v;
     1152            result = JSImmediate::decImmediateNumber(v);
     1153        } else {
     1154            number = r[srcDst].u.jsValue->toJSNumber(exec);
     1155            result = jsNumber(number->uncheckedGetNumber() - 1);
     1156        }
    11291157        VM_CHECK_EXCEPTION();
    11301158
    11311159        r[dst].u.jsValue = number;
    1132         r[srcDst].u.jsValue = jsNumber(number->uncheckedGetNumber() - 1);
     1160        r[srcDst].u.jsValue = result;
    11331161
    11341162        ++vPC;
  • trunk/JavaScriptCore/kjs/JSImmediate.h

    r34170 r34171  
    121121    static ALWAYS_INLINE bool canDoFastAdditiveOperations(const JSValue* v)
    122122    {
    123         // Number is positive and an operation involving two of these can't overflow.
     123        // Number is non-negative and an operation involving two of these can't overflow.
    124124        // Checking for allowed negative numbers takes more time than it's worth on SunSpider.
    125125        return (reinterpret_cast<uintptr_t>(v) & (NumberType + (3 << 30))) == NumberType;
     
    138138        ASSERT(canDoFastAdditiveOperations(v2));
    139139        return reinterpret_cast<JSValue*>(reinterpret_cast<uintptr_t>(v1) - (reinterpret_cast<uintptr_t>(v2) & ~NumberType));
     140    }
     141
     142    static ALWAYS_INLINE JSValue* incImmediateNumber(const JSValue* v)
     143    {
     144        ASSERT(canDoFastAdditiveOperations(v));
     145        return reinterpret_cast<JSValue*>(reinterpret_cast<uintptr_t>(v) + TagMask + 1);
     146    }
     147
     148    static ALWAYS_INLINE JSValue* decImmediateNumber(const JSValue* v)
     149    {
     150        ASSERT(canDoFastAdditiveOperations(v));
     151        return reinterpret_cast<JSValue*>(reinterpret_cast<uintptr_t>(v) - (TagMask + 1));
    140152    }
    141153
Note: See TracChangeset for help on using the changeset viewer.