Changeset 91041 in webkit
- Timestamp:
- Jul 14, 2011 7:06:10 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r91039 r91041 1 2011-07-14 Filip Pizlo <fpizlo@apple.com> 2 3 DFG JIT does not optimize Branch as well as it could. 4 https://bugs.webkit.org/show_bug.cgi?id=64574 5 6 Reviewed by Gavin Barraclough. 7 8 This creates a common code path for emitting unfused branches, which does 9 no speculation, and only performs a slow call if absolutely necessary. 10 11 * dfg/DFGJITCodeGenerator.cpp: 12 (JSC::DFG::JITCodeGenerator::emitBranch): 13 * dfg/DFGJITCodeGenerator.h: 14 * dfg/DFGNonSpeculativeJIT.cpp: 15 (JSC::DFG::NonSpeculativeJIT::compile): 16 * dfg/DFGSpeculativeJIT.cpp: 17 (JSC::DFG::SpeculativeJIT::compile): 18 1 19 2011-07-14 Filip Pizlo <fpizlo@apple.com> 2 20 -
trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.cpp
r91010 r91041 469 469 } 470 470 471 void JITCodeGenerator::emitBranch(Node& node) 472 { 473 JSValueOperand value(this, node.child1()); 474 GPRReg valueGPR = value.gpr(); 475 476 GPRTemporary result(this); 477 GPRReg resultGPR = result.gpr(); 478 479 BlockIndex taken = m_jit.graph().blockIndexForBytecodeOffset(node.takenBytecodeOffset()); 480 BlockIndex notTaken = m_jit.graph().blockIndexForBytecodeOffset(node.notTakenBytecodeOffset()); 481 482 addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsNumber(0)))), notTaken); 483 addBranch(m_jit.branchPtr(MacroAssembler::AboveOrEqual, valueGPR, GPRInfo::tagTypeNumberRegister), taken); 484 addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(false)))), notTaken); 485 addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(true)))), taken); 486 487 silentSpillAllRegisters(resultGPR); 488 m_jit.move(valueGPR, GPRInfo::argumentGPR1); 489 m_jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); 490 appendCallWithExceptionCheck(dfgConvertJSValueToBoolean); 491 m_jit.move(GPRInfo::returnValueGPR, resultGPR); 492 silentFillAllRegisters(resultGPR); 493 494 addBranch(m_jit.branchTest8(MacroAssembler::NonZero, resultGPR), taken); 495 if (notTaken != (m_block + 1)) 496 addBranch(m_jit.jump(), notTaken); 497 498 noResult(m_compileIndex); 499 } 500 471 501 void JITCodeGenerator::emitCall(Node& node) 472 502 { -
trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.h
r91010 r91041 536 536 void cachedGetMethod(GPRReg baseGPR, GPRReg resultGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget = JITCompiler::Jump()); 537 537 538 void emitBranch(Node&); 539 538 540 MacroAssembler::Address addressOfCallData(int idx) 539 541 { -
trunk/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.cpp
r91010 r91041 921 921 } 922 922 923 case Branch: { 924 JSValueOperand value(this, node.child1()); 925 GPRReg valueGPR = value.gpr(); 926 flushRegisters(); 927 928 GPRResult result(this); 929 callOperation(dfgConvertJSValueToBoolean, result.gpr(), valueGPR); 930 931 BlockIndex taken = m_jit.graph().blockIndexForBytecodeOffset(node.takenBytecodeOffset()); 932 BlockIndex notTaken = m_jit.graph().blockIndexForBytecodeOffset(node.notTakenBytecodeOffset()); 933 934 addBranch(m_jit.branchTest8(MacroAssembler::NonZero, result.gpr()), taken); 935 if (notTaken != (m_block + 1)) 936 addBranch(m_jit.jump(), notTaken); 937 938 noResult(m_compileIndex); 939 break; 940 } 923 case Branch: 924 emitBranch(node); 925 break; 941 926 942 927 case Return: { -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r91010 r91041 944 944 } 945 945 946 case Branch: { 947 JSValueOperand value(this, node.child1()); 948 GPRReg valueReg = value.gpr(); 949 950 BlockIndex taken = m_jit.graph().blockIndexForBytecodeOffset(node.takenBytecodeOffset()); 951 BlockIndex notTaken = m_jit.graph().blockIndexForBytecodeOffset(node.notTakenBytecodeOffset()); 952 953 // Integers 954 addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueReg, MacroAssembler::ImmPtr(JSValue::encode(jsNumber(0)))), notTaken); 955 MacroAssembler::Jump isNonZeroInteger = m_jit.branchPtr(MacroAssembler::AboveOrEqual, valueReg, GPRInfo::tagTypeNumberRegister); 956 957 // Booleans 958 addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueReg, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(false)))), notTaken); 959 speculationCheck(m_jit.branchPtr(MacroAssembler::NotEqual, valueReg, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(true))))); 960 961 if (taken == (m_block + 1)) 962 isNonZeroInteger.link(&m_jit); 963 else { 964 addBranch(isNonZeroInteger, taken); 965 addBranch(m_jit.jump(), taken); 966 } 967 968 noResult(m_compileIndex); 969 break; 970 } 946 case Branch: 947 emitBranch(node); 948 break; 971 949 972 950 case Return: {
Note: See TracChangeset
for help on using the changeset viewer.