Changeset 34171 in webkit for trunk/JavaScriptCore
- Timestamp:
- May 28, 2008, 3:48:04 AM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r34170 r34171 1 2008-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 1 21 2008-05-28 Alexey Proskuryakov <[email protected]> 2 22 -
trunk/JavaScriptCore/VM/Machine.cpp
r34170 r34171 1078 1078 */ 1079 1079 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); 1081 1086 VM_CHECK_EXCEPTION(); 1082 1087 r[srcDst].u.jsValue = result; … … 1092 1097 */ 1093 1098 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); 1095 1105 VM_CHECK_EXCEPTION(); 1096 1106 r[srcDst].u.jsValue = result; … … 1108 1118 int dst = (++vPC)->u.operand; 1109 1119 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 } 1111 1130 VM_CHECK_EXCEPTION(); 1112 1131 1113 1132 r[dst].u.jsValue = number; 1114 r[srcDst].u.jsValue = jsNumber(number->uncheckedGetNumber() + 1);1133 r[srcDst].u.jsValue = result; 1115 1134 1116 1135 ++vPC; … … 1126 1145 int dst = (++vPC)->u.operand; 1127 1146 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 } 1129 1157 VM_CHECK_EXCEPTION(); 1130 1158 1131 1159 r[dst].u.jsValue = number; 1132 r[srcDst].u.jsValue = jsNumber(number->uncheckedGetNumber() - 1);1160 r[srcDst].u.jsValue = result; 1133 1161 1134 1162 ++vPC; -
trunk/JavaScriptCore/kjs/JSImmediate.h
r34170 r34171 121 121 static ALWAYS_INLINE bool canDoFastAdditiveOperations(const JSValue* v) 122 122 { 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. 124 124 // Checking for allowed negative numbers takes more time than it's worth on SunSpider. 125 125 return (reinterpret_cast<uintptr_t>(v) & (NumberType + (3 << 30))) == NumberType; … … 138 138 ASSERT(canDoFastAdditiveOperations(v2)); 139 139 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)); 140 152 } 141 153
Note:
See TracChangeset
for help on using the changeset viewer.