Changeset 34171 in webkit for trunk/JavaScriptCore/VM/Machine.cpp


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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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;
Note: See TracChangeset for help on using the changeset viewer.