Changeset 37417 in webkit for trunk/JavaScriptCore
- Timestamp:
- Oct 8, 2008, 3:53:13 AM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r37415 r37417 1 2008-10-08 Maciej Stachowiak <[email protected]> 2 3 Reviewed by Oliver Hunt. 4 5 Re-landing the following fix with the crashing bug in it fixed (r37405): 6 7 - optimize away multiplication by constant 1.0 8 9 2.3% speedup on v8 RayTrace benchmark 10 11 Apparently it's not uncommon for JavaScript code to multiply by 12 constant 1.0 in the mistaken belief that this converts integer to 13 floating point and that there is any operational difference. 14 15 * VM/CTI.cpp: 16 (JSC::CTI::privateCompileMainPass): Optimize to_jsnumber for 17 case where parameter is already number. 18 (JSC::CTI::privateCompileSlowCases): ditto 19 * VM/Machine.cpp: 20 (JSC::Machine::privateExecute): ditto 21 * kjs/grammar.y: 22 (makeMultNode): Transform as follows: 23 +FOO * BAR ==> FOO * BAR 24 FOO * +BAR ==> FOO * BAR 25 FOO * 1 ==> +FOO 26 1 * FOO ==> +FOO 27 (makeDivNode): Transform as follows: 28 +FOO / BAR ==> FOO / BAR 29 FOO / +BAR ==> FOO / BAR 30 (makeSubNode): Transform as follows: 31 +FOO - BAR ==> FOO - BAR 32 FOO - +BAR ==> FOO - BAR 33 * kjs/nodes.h: 34 (JSC::ExpressionNode::stripUnaryPlus): Helper for above 35 grammar.y changes 36 (JSC::UnaryPlusNode::stripUnaryPlus): ditto 37 1 38 2008-10-08 Maciej Stachowiak <[email protected]> 2 39 -
trunk/JavaScriptCore/VM/CTI.cpp
r37408 r37417 1768 1768 } 1769 1769 case op_to_jsnumber: { 1770 emitGetPutArg(instruction[i + 2].u.operand, 0, X86::ecx); 1771 emitCall(i, Machine::cti_op_to_jsnumber); 1770 emitGetArg(instruction[i + 2].u.operand, X86::eax); 1771 1772 m_jit.testl_i32r(JSImmediate::TagBitTypeInteger, X86::eax); 1773 X86Assembler::JmpSrc wasImmediate = m_jit.emitUnlinkedJnz(); 1774 1775 emitJumpSlowCaseIfNotJSCell(X86::eax, i); 1776 1777 m_jit.movl_mr(OBJECT_OFFSET(JSCell, m_structureID), X86::eax, X86::ecx); 1778 m_jit.cmpl_i32m(NumberType, OBJECT_OFFSET(StructureID, m_typeInfo.m_type), X86::ecx); 1779 1780 m_slowCases.append(SlowCaseEntry(m_jit.emitUnlinkedJne(), i)); 1781 1782 m_jit.link(wasImmediate, m_jit.label()); 1783 1772 1784 emitPutResult(instruction[i + 1].u.operand); 1773 1785 i += 3; … … 2519 2531 break; 2520 2532 } 2533 case op_to_jsnumber: { 2534 m_jit.link(iter->from, m_jit.label()); 2535 m_jit.link(iter->from, m_jit.label()); 2536 2537 emitPutArg(X86::eax, 0); 2538 emitCall(i, Machine::cti_op_to_jsnumber); 2539 2540 emitPutResult(instruction[i + 1].u.operand); 2541 i += 3; 2542 break; 2543 } 2521 2544 2522 2545 default: -
trunk/JavaScriptCore/VM/Machine.cpp
r37408 r37417 1816 1816 int dst = (++vPC)->u.operand; 1817 1817 int src = (++vPC)->u.operand; 1818 JSValue* result = r[src].jsValue(exec)->toJSNumber(exec); 1819 VM_CHECK_EXCEPTION(); 1820 1821 r[dst] = result; 1818 1819 JSValue* srcVal = r[src].jsValue(exec); 1820 1821 if (LIKELY(JSImmediate::isNumber(srcVal) || static_cast<JSCell*>(srcVal)->structureID()->typeInfo().type() == NumberType)) { 1822 r[dst] = r[src]; 1823 } else { 1824 JSValue* result = srcVal->toJSNumber(exec); 1825 VM_CHECK_EXCEPTION(); 1826 r[dst] = result; 1827 } 1822 1828 1823 1829 ++vPC; -
trunk/JavaScriptCore/kjs/grammar.y
r37408 r37417 1425 1425 static ExpressionNode* makeMultNode(void* globalPtr, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1426 1426 { 1427 expr1 = expr1->stripUnaryPlus(); 1428 expr2 = expr2->stripUnaryPlus(); 1429 1427 1430 if (expr1->isNumber() && expr2->isNumber()) 1428 1431 return makeNumberNode(globalPtr, static_cast<NumberNode*>(expr1)->value() * static_cast<NumberNode*>(expr2)->value()); 1432 1433 if (expr1->isNumber() && static_cast<NumberNode*>(expr1)->value() == 1) 1434 return new UnaryPlusNode(GLOBAL_DATA, expr2); 1435 1436 if (expr2->isNumber() && static_cast<NumberNode*>(expr2)->value() == 1) 1437 return new UnaryPlusNode(GLOBAL_DATA, expr1); 1438 1429 1439 return new MultNode(GLOBAL_DATA, expr1, expr2, rightHasAssignments); 1430 1440 } … … 1432 1442 static ExpressionNode* makeDivNode(void* globalPtr, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1433 1443 { 1444 expr1 = expr1->stripUnaryPlus(); 1445 expr2 = expr2->stripUnaryPlus(); 1446 1434 1447 if (expr1->isNumber() && expr2->isNumber()) 1435 1448 return makeNumberNode(globalPtr, static_cast<NumberNode*>(expr1)->value() / static_cast<NumberNode*>(expr2)->value()); … … 1446 1459 static ExpressionNode* makeSubNode(void* globalPtr, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1447 1460 { 1461 expr1 = expr1->stripUnaryPlus(); 1462 expr2 = expr2->stripUnaryPlus(); 1463 1448 1464 if (expr1->isNumber() && expr2->isNumber()) 1449 1465 return makeNumberNode(globalPtr, static_cast<NumberNode*>(expr1)->value() - static_cast<NumberNode*>(expr2)->value()); -
trunk/JavaScriptCore/kjs/nodes.h
r37408 r37417 227 227 virtual bool isDotAccessorNode() const JSC_FAST_CALL { return false; } 228 228 229 virtual ExpressionNode* stripUnaryPlus() { return this; } 230 229 231 ResultType resultDescriptor() const JSC_FAST_CALL { return m_resultDesc; } 230 232 … … 1179 1181 { 1180 1182 } 1183 1184 virtual ExpressionNode* stripUnaryPlus() { return m_expr.get(); } 1181 1185 1182 1186 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_to_jsnumber; }
Note:
See TracChangeset
for help on using the changeset viewer.