Changeset 226260 in webkit
- Timestamp:
- Dec 22, 2017 12:19:55 AM (6 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r226254 r226260 1 2017-12-22 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [DFG] Add JSValueRegsFlushedCallResult 4 https://bugs.webkit.org/show_bug.cgi?id=181075 5 6 Reviewed by Mark Lam. 7 8 Add JSValueRegsFlushedCallResult, which is appropriate for the JSValueRegs result 9 of the function call after flushing. We can remove bunch of `#if USE(JSVALUE32_64)` 10 code and simplify them. 11 12 * dfg/DFGSpeculativeJIT.cpp: 13 (JSC::DFG::SpeculativeJIT::compileFromCharCode): 14 (JSC::DFG::SpeculativeJIT::compileGetByValForObjectWithString): 15 (JSC::DFG::SpeculativeJIT::compileGetByValForObjectWithSymbol): 16 (JSC::DFG::SpeculativeJIT::compileParseInt): 17 (JSC::DFG::SpeculativeJIT::emitUntypedBitOp): 18 (JSC::DFG::SpeculativeJIT::emitUntypedRightShiftBitOp): 19 (JSC::DFG::SpeculativeJIT::compileValueAdd): 20 (JSC::DFG::SpeculativeJIT::compileArithMul): 21 (JSC::DFG::SpeculativeJIT::compileArithDiv): 22 (JSC::DFG::SpeculativeJIT::compileArithRounding): 23 (JSC::DFG::SpeculativeJIT::compileResolveScopeForHoistingFuncDeclInEval): 24 (JSC::DFG::SpeculativeJIT::compileGetDynamicVar): 25 * dfg/DFGSpeculativeJIT.h: 26 (JSC::DFG::SpeculativeJIT::callOperation): 27 (JSC::DFG::JSValueRegsFlushedCallResult::JSValueRegsFlushedCallResult): 28 (JSC::DFG::JSValueRegsFlushedCallResult::regs): 29 1 30 2017-12-21 Saam Barati <sbarati@apple.com> 2 31 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r226209 r226260 2256 2256 JSValueOperand opr(this, child); 2257 2257 JSValueRegs oprRegs = opr.jsValueRegs(); 2258 #if USE(JSVALUE64) 2259 GPRTemporary result(this); 2260 JSValueRegs resultRegs = JSValueRegs(result.gpr()); 2261 #else 2262 GPRTemporary resultTag(this); 2263 GPRTemporary resultPayload(this); 2264 JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr()); 2265 #endif 2258 2266 2259 flushRegisters(); 2260 JSValueRegsFlushedCallResult result(this); 2261 JSValueRegs resultRegs = result.regs(); 2267 2262 callOperation(operationStringFromCharCodeUntyped, resultRegs, oprRegs); 2268 2263 m_jit.exceptionCheck(); … … 3228 3223 speculateString(node->child2(), arg2GPR); 3229 3224 3230 GPRFlushedCallResult resultPayload(this);3231 GPRReg resultPayloadGPR = resultPayload.gpr();3232 #if USE(JSVALUE64)3233 JSValueRegs resultRegs(resultPayloadGPR);3234 #else3235 GPRFlushedCallResult2 resultTag(this);3236 GPRReg resultTagGPR = resultTag.gpr();3237 JSValueRegs resultRegs(resultTagGPR, resultPayloadGPR);3238 #endif3239 3240 3225 flushRegisters(); 3241 callOperation(operationGetByValObjectString, extractResult(resultRegs), arg1GPR, arg2GPR); 3226 JSValueRegsFlushedCallResult result(this); 3227 JSValueRegs resultRegs = result.regs(); 3228 callOperation(operationGetByValObjectString, resultRegs, arg1GPR, arg2GPR); 3242 3229 m_jit.exceptionCheck(); 3243 3230 … … 3256 3243 speculateSymbol(node->child2(), arg2GPR); 3257 3244 3258 GPRFlushedCallResult resultPayload(this);3259 GPRReg resultPayloadGPR = resultPayload.gpr();3260 #if USE(JSVALUE64)3261 JSValueRegs resultRegs(resultPayloadGPR);3262 #else3263 GPRFlushedCallResult2 resultTag(this);3264 GPRReg resultTagGPR = resultTag.gpr();3265 JSValueRegs resultRegs(resultTagGPR, resultPayloadGPR);3266 #endif3267 3268 3245 flushRegisters(); 3269 callOperation(operationGetByValObjectSymbol, extractResult(resultRegs), arg1GPR, arg2GPR); 3246 JSValueRegsFlushedCallResult result(this); 3247 JSValueRegs resultRegs = result.regs(); 3248 callOperation(operationGetByValObjectSymbol, resultRegs, arg1GPR, arg2GPR); 3270 3249 m_jit.exceptionCheck(); 3271 3250 … … 3389 3368 { 3390 3369 RELEASE_ASSERT(node->child1().useKind() == UntypedUse || node->child1().useKind() == StringUse); 3391 3392 GPRFlushedCallResult resultPayload(this);3393 GPRReg resultPayloadGPR = resultPayload.gpr();3394 #if USE(JSVALUE64)3395 JSValueRegs resultRegs(resultPayloadGPR);3396 #else3397 GPRFlushedCallResult2 resultTag(this);3398 GPRReg resultTagGPR = resultTag.gpr();3399 JSValueRegs resultRegs(resultTagGPR, resultPayloadGPR);3400 #endif3401 3402 3370 if (node->child2()) { 3403 3371 SpeculateInt32Operand radix(this, node->child2()); … … 3405 3373 if (node->child1().useKind() == UntypedUse) { 3406 3374 JSValueOperand value(this, node->child1()); 3407 #if USE(JSVALUE64) 3408 auto result = resultRegs.gpr(); 3409 auto valueReg = value.gpr(); 3410 #else 3411 auto result = resultRegs; 3412 auto valueReg = value.jsValueRegs(); 3413 #endif 3375 JSValueRegs valueRegs = value.jsValueRegs(); 3414 3376 3415 3377 flushRegisters(); 3416 callOperation(operationParseIntGeneric, result, valueReg, radixGPR); 3378 JSValueRegsFlushedCallResult result(this); 3379 JSValueRegs resultRegs = result.regs(); 3380 callOperation(operationParseIntGeneric, resultRegs, valueRegs, radixGPR); 3417 3381 m_jit.exceptionCheck(); 3418 } else {3419 SpeculateCellOperand value(this, node->child1());3420 GPRReg valueGPR = value.gpr();3421 speculateString(node->child1(), valueGPR); 3422 3423 #if USE(JSVALUE64) 3424 auto result = resultRegs.gpr();3425 #else 3426 auto result = resultRegs;3427 #endif 3428 3429 flushRegisters();3430 callOperation(operationParseIntString, result, valueGPR, radixGPR);3431 m_jit.exceptionCheck();3432 }3433 } else {3434 if (node->child1().useKind() == UntypedUse) { 3435 JSValueOperand value(this, node->child1());3436 #if USE(JSVALUE64) 3437 auto result = resultRegs.gpr();3438 #else 3439 auto result = resultRegs;3440 #endif 3441 JSValueRegs valueRegs = value.jsValueRegs();3442 3443 flushRegisters();3444 callOperation(operationParseIntNoRadixGeneric, result, valueRegs);3445 m_jit.exceptionCheck();3446 } else {3447 SpeculateCellOperand value(this, node->child1()); 3448 GPRReg valueGPR = value.gpr();3449 speculateString(node->child1(), valueGPR);3450 3451 flushRegisters(); 3452 callOperation(operationParseIntStringNoRadix, resultRegs, valueGPR);3453 m_jit.exceptionCheck();3454 }3455 }3456 3382 jsValueResult(resultRegs, node); 3383 return; 3384 } 3385 3386 SpeculateCellOperand value(this, node->child1()); 3387 GPRReg valueGPR = value.gpr(); 3388 speculateString(node->child1(), valueGPR); 3389 3390 flushRegisters(); 3391 JSValueRegsFlushedCallResult result(this); 3392 JSValueRegs resultRegs = result.regs(); 3393 callOperation(operationParseIntString, resultRegs, valueGPR, radixGPR); 3394 m_jit.exceptionCheck(); 3395 jsValueResult(resultRegs, node); 3396 return; 3397 } 3398 3399 if (node->child1().useKind() == UntypedUse) { 3400 JSValueOperand value(this, node->child1()); 3401 JSValueRegs valueRegs = value.jsValueRegs(); 3402 3403 flushRegisters(); 3404 JSValueRegsFlushedCallResult result(this); 3405 JSValueRegs resultRegs = result.regs(); 3406 callOperation(operationParseIntNoRadixGeneric, resultRegs, valueRegs); 3407 m_jit.exceptionCheck(); 3408 jsValueResult(resultRegs, node); 3409 return; 3410 } 3411 3412 SpeculateCellOperand value(this, node->child1()); 3413 GPRReg valueGPR = value.gpr(); 3414 speculateString(node->child1(), valueGPR); 3415 3416 flushRegisters(); 3417 JSValueRegsFlushedCallResult result(this); 3418 JSValueRegs resultRegs = result.regs(); 3419 callOperation(operationParseIntStringNoRadix, resultRegs, valueGPR); 3420 m_jit.exceptionCheck(); 3457 3421 jsValueResult(resultRegs, node); 3458 3422 } … … 3521 3485 JSValueRegs leftRegs = left.jsValueRegs(); 3522 3486 JSValueRegs rightRegs = right.jsValueRegs(); 3523 #if USE(JSVALUE64) 3524 GPRTemporary result(this); 3525 JSValueRegs resultRegs = JSValueRegs(result.gpr()); 3526 #else 3527 GPRTemporary resultTag(this); 3528 GPRTemporary resultPayload(this); 3529 JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr()); 3530 #endif 3487 3531 3488 flushRegisters(); 3489 JSValueRegsFlushedCallResult result(this); 3490 JSValueRegs resultRegs = result.regs(); 3532 3491 callOperation(snippetSlowPathFunction, resultRegs, leftRegs, rightRegs); 3533 3492 m_jit.exceptionCheck(); … … 3668 3627 JSValueRegs leftRegs = left.jsValueRegs(); 3669 3628 JSValueRegs rightRegs = right.jsValueRegs(); 3670 #if USE(JSVALUE64) 3671 GPRTemporary result(this); 3672 JSValueRegs resultRegs = JSValueRegs(result.gpr()); 3673 #else 3674 GPRTemporary resultTag(this); 3675 GPRTemporary resultPayload(this); 3676 JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr()); 3677 #endif 3629 3678 3630 flushRegisters(); 3631 JSValueRegsFlushedCallResult result(this); 3632 JSValueRegs resultRegs = result.regs(); 3679 3633 callOperation(snippetSlowPathFunction, resultRegs, leftRegs, rightRegs); 3680 3634 m_jit.exceptionCheck(); … … 3808 3762 JSValueRegs leftRegs = left.jsValueRegs(); 3809 3763 JSValueRegs rightRegs = right.jsValueRegs(); 3810 #if USE(JSVALUE64) 3811 GPRTemporary result(this); 3812 JSValueRegs resultRegs = JSValueRegs(result.gpr()); 3813 #else 3814 GPRTemporary resultTag(this); 3815 GPRTemporary resultPayload(this); 3816 JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr()); 3817 #endif 3764 3818 3765 flushRegisters(); 3766 JSValueRegsFlushedCallResult result(this); 3767 JSValueRegs resultRegs = result.regs(); 3819 3768 callOperation(operationValueAddNotNumber, resultRegs, leftRegs, rightRegs); 3820 3769 m_jit.exceptionCheck(); … … 4832 4781 JSValueRegs leftRegs = left.jsValueRegs(); 4833 4782 JSValueRegs rightRegs = right.jsValueRegs(); 4834 #if USE(JSVALUE64) 4835 GPRTemporary result(this); 4836 JSValueRegs resultRegs = JSValueRegs(result.gpr()); 4837 #else 4838 GPRTemporary resultTag(this); 4839 GPRTemporary resultPayload(this); 4840 JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr()); 4841 #endif 4783 4842 4784 flushRegisters(); 4785 JSValueRegsFlushedCallResult result(this); 4786 JSValueRegs resultRegs = result.regs(); 4843 4787 callOperation(operationValueMul, resultRegs, leftRegs, rightRegs); 4844 4788 m_jit.exceptionCheck(); … … 5014 4958 JSValueRegs leftRegs = left.jsValueRegs(); 5015 4959 JSValueRegs rightRegs = right.jsValueRegs(); 5016 #if USE(JSVALUE64) 5017 GPRTemporary result(this); 5018 JSValueRegs resultRegs = JSValueRegs(result.gpr()); 5019 #else 5020 GPRTemporary resultTag(this); 5021 GPRTemporary resultPayload(this); 5022 JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr()); 5023 #endif 4960 5024 4961 flushRegisters(); 4962 JSValueRegsFlushedCallResult result(this); 4963 JSValueRegs resultRegs = result.regs(); 5025 4964 callOperation(operationValueDiv, resultRegs, leftRegs, rightRegs); 5026 4965 m_jit.exceptionCheck(); … … 5520 5459 JSValueOperand argument(this, node->child1()); 5521 5460 JSValueRegs argumentRegs = argument.jsValueRegs(); 5522 #if USE(JSVALUE64) 5523 GPRTemporary result(this); 5524 JSValueRegs resultRegs = JSValueRegs(result.gpr()); 5525 #else 5526 GPRTemporary resultTag(this); 5527 GPRTemporary resultPayload(this); 5528 JSValueRegs resultRegs = JSValueRegs(resultPayload.gpr(), resultTag.gpr()); 5529 #endif 5461 5530 5462 flushRegisters(); 5463 JSValueRegsFlushedCallResult result(this); 5464 JSValueRegs resultRegs = result.regs(); 5531 5465 J_JITOperation_EJ operation = nullptr; 5532 5466 if (node->op() == ArithRound) … … 10395 10329 SpeculateCellOperand scope(this, node->child1()); 10396 10330 GPRReg scopeGPR = scope.gpr(); 10397 #if USE(JSVALUE64)10398 GPRFlushedCallResult result(this);10399 GPRReg resultGPR = result.gpr();10400 10331 flushRegisters(); 10401 callOperation(operationResolveScopeForHoistingFuncDeclInEval, resultGPR, scopeGPR, identifierUID(node->identifierNumber())); 10332 JSValueRegsFlushedCallResult result(this); 10333 JSValueRegs resultRegs = result.regs(); 10334 callOperation(operationResolveScopeForHoistingFuncDeclInEval, resultRegs, scopeGPR, identifierUID(node->identifierNumber())); 10402 10335 m_jit.exceptionCheck(); 10403 jsValueResult(result.gpr(), node); 10404 #else 10405 flushRegisters(); 10406 GPRFlushedCallResult2 resultTag(this); 10407 GPRFlushedCallResult resultPayload(this); 10408 callOperation(operationResolveScopeForHoistingFuncDeclInEval, JSValueRegs(resultTag.gpr(), resultPayload.gpr()), scopeGPR, identifierUID(node->identifierNumber())); 10409 m_jit.exceptionCheck(); 10410 jsValueResult(resultTag.gpr(), resultPayload.gpr(), node); 10411 #endif 10336 jsValueResult(resultRegs, node); 10412 10337 } 10413 10338 … … 10416 10341 SpeculateCellOperand scope(this, node->child1()); 10417 10342 GPRReg scopeGPR = scope.gpr(); 10418 #if USE(JSVALUE64)10419 10343 flushRegisters(); 10420 GPRFlushedCallResult result(this); 10421 callOperation(operationGetDynamicVar, result.gpr(), scopeGPR, identifierUID(node->identifierNumber()), node->getPutInfo()); 10344 JSValueRegsFlushedCallResult result(this); 10345 JSValueRegs resultRegs = result.regs(); 10346 callOperation(operationGetDynamicVar, resultRegs, scopeGPR, identifierUID(node->identifierNumber()), node->getPutInfo()); 10422 10347 m_jit.exceptionCheck(); 10423 jsValueResult(result.gpr(), node); 10424 #else 10425 flushRegisters(); 10426 GPRFlushedCallResult2 resultTag(this); 10427 GPRFlushedCallResult resultPayload(this); 10428 callOperation(operationGetDynamicVar, JSValueRegs(resultTag.gpr(), resultPayload.gpr()), scopeGPR, identifierUID(node->identifierNumber()), node->getPutInfo()); 10429 m_jit.exceptionCheck(); 10430 jsValueResult(resultTag.gpr(), resultPayload.gpr(), node); 10431 #endif 10348 jsValueResult(resultRegs, node); 10432 10349 } 10433 10350 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
r226134 r226260 1454 1454 return appendCallSetResult(operation, result); 1455 1455 } 1456 JITCompiler::Call callOperation(J_JITOperation_EJscI operation, JSValueRegs result, GPRReg arg1, UniquedStringImpl* impl) 1457 { 1458 m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(impl)); 1459 return appendCallSetResult(operation, result.payloadGPR()); 1460 } 1456 1461 JITCompiler::Call callOperation(J_JITOperation_EJscI operation, GPRReg result, GPRReg arg1, UniquedStringImpl* impl) 1457 1462 { … … 1513 1518 m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(impl), TrustedImm32(value)); 1514 1519 return appendCall(operation); 1520 } 1521 JITCompiler::Call callOperation(J_JITOperation_EOIUi operation, JSValueRegs result, GPRReg arg1, UniquedStringImpl* impl, unsigned value) 1522 { 1523 m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(impl), TrustedImm32(value)); 1524 return appendCallSetResult(operation, result.payloadGPR()); 1515 1525 } 1516 1526 JITCompiler::Call callOperation(J_JITOperation_EOIUi operation, GPRReg result, GPRReg arg1, UniquedStringImpl* impl, unsigned value) … … 1571 1581 return appendCallSetResult(operation, result); 1572 1582 } 1583 JITCompiler::Call callOperation(J_JITOperation_EJssZ operation, JSValueRegs result, GPRReg arg1, GPRReg arg2) 1584 { 1585 m_jit.setupArgumentsWithExecState(arg1, arg2); 1586 return appendCallSetResult(operation, result.payloadGPR()); 1587 } 1573 1588 JITCompiler::Call callOperation(J_JITOperation_EJssZ operation, GPRReg result, GPRReg arg1, GPRReg arg2) 1574 1589 { … … 1626 1641 return appendCallSetResult(operation, result); 1627 1642 } 1628 JITCompiler::Call callOperation(J_JITOperation_EJZ operation, GPRReg result, GPRReg arg1, GPRReg arg2) 1629 { 1630 m_jit.setupArgumentsWithExecState(arg1, arg2); 1643 JITCompiler::Call callOperation(J_JITOperation_EJZ operation, JSValueRegs result, JSValueRegs arg1, GPRReg arg2) 1644 { 1645 m_jit.setupArgumentsWithExecState(arg1.payloadGPR(), arg2); 1646 return appendCallSetResult(operation, result.payloadGPR()); 1647 } 1648 JITCompiler::Call callOperation(J_JITOperation_EJZ operation, GPRReg result, JSValueRegs arg1, GPRReg arg2) 1649 { 1650 m_jit.setupArgumentsWithExecState(arg1.payloadGPR(), arg2); 1631 1651 return appendCallSetResult(operation, result); 1632 1652 } … … 1871 1891 m_jit.setupArgumentsWithExecState(arg1, arg2, arg3, arg4); 1872 1892 return appendCallSetResult(operation, result); 1893 } 1894 JITCompiler::Call callOperation(J_JITOperation_ECC operation, JSValueRegs result, GPRReg arg1, GPRReg arg2) 1895 { 1896 m_jit.setupArgumentsWithExecState(arg1, arg2); 1897 return appendCallSetResult(operation, result.payloadGPR()); 1873 1898 } 1874 1899 JITCompiler::Call callOperation(J_JITOperation_ECC operation, GPRReg result, GPRReg arg1, GPRReg arg2) … … 3675 3700 }; 3676 3701 3702 class JSValueRegsFlushedCallResult { 3703 public: 3704 JSValueRegsFlushedCallResult(SpeculativeJIT* jit) 3705 #if USE(JSVALUE64) 3706 : m_gpr(jit) 3707 #else 3708 : m_payloadGPR(jit) 3709 , m_tagGPR(jit) 3710 #endif 3711 { 3712 } 3713 3714 JSValueRegs regs() 3715 { 3716 #if USE(JSVALUE64) 3717 return JSValueRegs { m_gpr.gpr() }; 3718 #else 3719 return JSValueRegs { m_tagGPR.gpr(), m_payloadGPR.gpr() }; 3720 #endif 3721 } 3722 3723 private: 3724 #if USE(JSVALUE64) 3725 GPRFlushedCallResult m_gpr; 3726 #else 3727 GPRFlushedCallResult m_payloadGPR; 3728 GPRFlushedCallResult2 m_tagGPR; 3729 #endif 3730 }; 3731 3677 3732 3678 3733 // === Speculative Operand types ===
Note: See TracChangeset
for help on using the changeset viewer.