Changeset 147985 in webkit
- Timestamp:
- Apr 8, 2013 11:45:16 PM (11 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r147979 r147985 1 2013-04-08 Vahag Vardanyan <vaag@ispras.ru> 2 3 Adds fromCharCode intrinsic support. 4 https://bugs.webkit.org/show_bug.cgi?id=104807 5 6 Reviewed by Oliver Hunt. 7 8 Switch to using fromCharCode intrinsic instead of call operation in some cases. 9 10 * dfg/DFGAbstractState.cpp: 11 (JSC::DFG::AbstractState::executeEffects): 12 * dfg/DFGByteCodeParser.cpp: 13 (JSC::DFG::ByteCodeParser::handleIntrinsic): 14 * dfg/DFGFixupPhase.cpp: 15 (JSC::DFG::FixupPhase::fixupNode): 16 * dfg/DFGNodeType.h: 17 (DFG): 18 * dfg/DFGOperations.cpp: 19 * dfg/DFGOperations.h: 20 * dfg/DFGPredictionPropagationPhase.cpp: 21 (JSC::DFG::PredictionPropagationPhase::propagate): 22 * dfg/DFGSpeculativeJIT.cpp: 23 (JSC::DFG::SpeculativeJIT::compileFromCharCode): 24 (DFG): 25 * dfg/DFGSpeculativeJIT.h: 26 (JSC::DFG::SpeculativeJIT::callOperation): 27 (SpeculativeJIT): 28 * dfg/DFGSpeculativeJIT32_64.cpp: 29 (JSC::DFG::SpeculativeJIT::compile): 30 * dfg/DFGSpeculativeJIT64.cpp: 31 (JSC::DFG::SpeculativeJIT::compile): 32 * runtime/StringConstructor.cpp: 33 (JSC::stringFromCharCode): 34 (JSC): 35 * runtime/StringConstructor.h: 36 (JSC): 37 1 38 2013-04-08 Benjamin Poulain <benjamin@webkit.org> 2 39 -
trunk/Source/JavaScriptCore/dfg/DFGAbstractState.cpp
r146382 r147985 862 862 break; 863 863 864 case StringFromCharCode: 865 forNode(node).set(SpecString); 866 break; 867 864 868 case StringCharAt: 865 869 node->setCanExit(true); -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r147190 r147985 1563 1563 if (usesResult) 1564 1564 set(resultOperand, charCode); 1565 return true; 1566 } 1567 case FromCharCodeIntrinsic: { 1568 if (argumentCountIncludingThis != 2) 1569 return false; 1570 1571 int indexOperand = registerOffset + argumentToOperand(1); 1572 Node* charCode = addToGraph(StringFromCharCode, getToInt32(indexOperand)); 1573 1574 if (usesResult) 1575 set(resultOperand, charCode); 1576 1565 1577 return true; 1566 1578 } -
trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
r147965 r147985 356 356 break; 357 357 } 358 359 case StringFromCharCode: 360 setUseKindAndUnboxIfProfitable<Int32Use>(node->child1()); 361 break; 358 362 359 363 case StringCharAt: -
trunk/Source/JavaScriptCore/dfg/DFGNodeType.h
r146382 r147985 182 182 macro(StringCharCodeAt, NodeResultInt32) \ 183 183 macro(StringCharAt, NodeResultJS) \ 184 macro(StringFromCharCode, NodeResultJS) \ 184 185 \ 185 186 /* Nodes for comparison operations. */\ -
trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp
r147965 r147985 45 45 #include "ObjectConstructor.h" 46 46 #include "Operations.h" 47 #include "StringConstructor.h" 47 48 #include <wtf/InlineASM.h> 48 49 … … 1600 1601 { 1601 1602 return fmod(a, b); 1603 } 1604 1605 JSCell* DFG_OPERATION operationStringFromCharCode(ExecState* exec, int32_t op1) 1606 { 1607 JSGlobalData* globalData = &exec->globalData(); 1608 NativeCallFrameTracer tracer(globalData, exec); 1609 return JSC::stringFromCharCode(exec, op1); 1602 1610 } 1603 1611 -
trunk/Source/JavaScriptCore/dfg/DFGOperations.h
r147965 r147985 83 83 typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EZZ)(ExecState*, int32_t, int32_t); 84 84 typedef JSCell* DFG_OPERATION (*C_DFGOperation_E)(ExecState*); 85 typedef JSCell* DFG_OPERATION (*C_DFGOperation_EZ)(ExecState*, int32_t); 85 86 typedef JSCell* DFG_OPERATION (*C_DFGOperation_EC)(ExecState*, JSCell*); 86 87 typedef JSCell* DFG_OPERATION (*C_DFGOperation_ECC)(ExecState*, JSCell*, JSCell*); … … 92 93 typedef JSCell* DFG_OPERATION (*C_DFGOperation_EOZ)(ExecState*, JSObject*, int32_t); 93 94 typedef JSCell* DFG_OPERATION (*C_DFGOperation_ESt)(ExecState*, Structure*); 95 typedef JSCell* DFG_OPERATION (*C_DFGOperation_EZ)(ExecState*, int32_t); 94 96 typedef double DFG_OPERATION (*D_DFGOperation_DD)(double, double); 95 97 typedef double DFG_OPERATION (*D_DFGOperation_ZZ)(int32_t, int32_t); … … 125 127 typedef char* DFG_OPERATION (*P_DFGOperation_EStZ)(ExecState*, Structure*, int32_t); 126 128 typedef StringImpl* DFG_OPERATION (*Str_DFGOperation_EJss)(ExecState*, JSString*); 129 JSCell* DFG_OPERATION operationStringFromCharCode(ExecState*, int32_t) WTF_INTERNAL; 127 130 128 131 // These routines are provide callbacks out to C++ implementations of operations too complex to JIT. -
trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
r146400 r147985 424 424 } 425 425 426 case StringFromCharCode: { 427 changed |= setPrediction(SpecString); 428 changed |= node->child1()->mergeFlags(NodeUsedAsNumber | NodeUsedAsInt); 429 break; 430 } 426 431 case StringCharAt: 427 432 case ToString: -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r147965 r147985 2089 2089 } 2090 2090 2091 void SpeculativeJIT::compileFromCharCode(Node* node) 2092 { 2093 SpeculateStrictInt32Operand property(this, node->child1()); 2094 GPRReg propertyReg = property.gpr(); 2095 GPRTemporary smallStrings(this); 2096 GPRTemporary scratch(this); 2097 GPRReg scratchReg = scratch.gpr(); 2098 GPRReg smallStringsReg = smallStrings.gpr(); 2099 2100 JITCompiler::JumpList slowCases; 2101 slowCases.append(m_jit.branch32(MacroAssembler::AboveOrEqual, propertyReg, TrustedImm32(0xff))); 2102 m_jit.move(MacroAssembler::TrustedImmPtr(m_jit.globalData()->smallStrings.singleCharacterStrings()), smallStringsReg); 2103 m_jit.loadPtr(MacroAssembler::BaseIndex(smallStringsReg, propertyReg, MacroAssembler::ScalePtr, 0), scratchReg); 2104 2105 slowCases.append(m_jit.branchTest32(MacroAssembler::Zero, scratchReg)); 2106 addSlowPathGenerator(slowPathCall(slowCases, this, operationStringFromCharCode, scratchReg, propertyReg)); 2107 cellResult(scratchReg, m_currentNode); 2108 } 2109 2091 2110 GeneratedOperandType SpeculativeJIT::checkGeneratedTypeForToInt32(Node* node) 2092 2111 { -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
r147965 r147985 1264 1264 return appendCallWithExceptionCheckSetResult(operation, result); 1265 1265 } 1266 JITCompiler::Call callOperation(C_DFGOperation_EZ operation, GPRReg result, GPRReg arg1) 1267 { 1268 m_jit.setupArgumentsWithExecState(arg1); 1269 return appendCallWithExceptionCheckSetResult(operation, result); 1270 } 1266 1271 #else 1267 1272 … … 1687 1692 return appendCallWithExceptionCheckSetResult(operation, result); 1688 1693 } 1694 JITCompiler::Call callOperation(C_DFGOperation_EZ operation, GPRReg result, GPRReg arg1) 1695 { 1696 m_jit.setupArgumentsWithExecState(arg1); 1697 return appendCallWithExceptionCheckSetResult(operation, result); 1698 } 1699 1689 1700 1690 1701 #undef EABI_32BIT_DUMMY_ARG … … 2106 2117 void compileGetCharCodeAt(Node*); 2107 2118 void compileGetByValOnString(Node*); 2119 void compileFromCharCode(Node*); 2108 2120 2109 2121 void compileGetByValOnArguments(Node*); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r146945 r147985 2450 2450 // Relies on StringCharAt node having same basic layout as GetByVal 2451 2451 compileGetByValOnString(node); 2452 break; 2453 } 2454 2455 case StringFromCharCode: { 2456 compileFromCharCode(node); 2452 2457 break; 2453 2458 } -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r146382 r147985 2377 2377 // Relies on StringCharAt node having same basic layout as GetByVal 2378 2378 compileGetByValOnString(node); 2379 break; 2380 } 2381 2382 case StringFromCharCode: { 2383 compileFromCharCode(node); 2379 2384 break; 2380 2385 } -
trunk/Source/JavaScriptCore/runtime/StringConstructor.cpp
r139541 r147985 90 90 } 91 91 92 JSCell* JSC_HOST_CALL stringFromCharCode(ExecState* exec, int32_t arg) 93 { 94 return jsSingleCharacterString(exec, arg); 95 } 96 92 97 static EncodedJSValue JSC_HOST_CALL constructWithStringConstructor(ExecState* exec) 93 98 { -
trunk/Source/JavaScriptCore/runtime/StringConstructor.h
r116828 r147985 58 58 static bool getOwnPropertyDescriptor(JSObject*, ExecState*, PropertyName, PropertyDescriptor&); 59 59 }; 60 61 JSCell* JSC_HOST_CALL stringFromCharCode(ExecState*, int32_t); 60 62 61 63 } // namespace JSC
Note: See TracChangeset
for help on using the changeset viewer.