Changeset 226260 in webkit


Ignore:
Timestamp:
Dec 22, 2017 12:19:55 AM (6 years ago)
Author:
Yusuke Suzuki
Message:

[DFG] Add JSValueRegsFlushedCallResult
https://bugs.webkit.org/show_bug.cgi?id=181075

Reviewed by Mark Lam.

Add JSValueRegsFlushedCallResult, which is appropriate for the JSValueRegs result
of the function call after flushing. We can remove bunch of #if USE(JSVALUE32_64)
code and simplify them.

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compileFromCharCode):
(JSC::DFG::SpeculativeJIT::compileGetByValForObjectWithString):
(JSC::DFG::SpeculativeJIT::compileGetByValForObjectWithSymbol):
(JSC::DFG::SpeculativeJIT::compileParseInt):
(JSC::DFG::SpeculativeJIT::emitUntypedBitOp):
(JSC::DFG::SpeculativeJIT::emitUntypedRightShiftBitOp):
(JSC::DFG::SpeculativeJIT::compileValueAdd):
(JSC::DFG::SpeculativeJIT::compileArithMul):
(JSC::DFG::SpeculativeJIT::compileArithDiv):
(JSC::DFG::SpeculativeJIT::compileArithRounding):
(JSC::DFG::SpeculativeJIT::compileResolveScopeForHoistingFuncDeclInEval):
(JSC::DFG::SpeculativeJIT::compileGetDynamicVar):

  • dfg/DFGSpeculativeJIT.h:

(JSC::DFG::SpeculativeJIT::callOperation):
(JSC::DFG::JSValueRegsFlushedCallResult::JSValueRegsFlushedCallResult):
(JSC::DFG::JSValueRegsFlushedCallResult::regs):

Location:
trunk/Source/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r226254 r226260  
     12017-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
    1302017-12-21  Saam Barati  <sbarati@apple.com>
    231
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r226209 r226260  
    22562256        JSValueOperand opr(this, child);
    22572257        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
    22662259        flushRegisters();
     2260        JSValueRegsFlushedCallResult result(this);
     2261        JSValueRegs resultRegs = result.regs();
    22672262        callOperation(operationStringFromCharCodeUntyped, resultRegs, oprRegs);
    22682263        m_jit.exceptionCheck();
     
    32283223    speculateString(node->child2(), arg2GPR);
    32293224
    3230     GPRFlushedCallResult resultPayload(this);
    3231     GPRReg resultPayloadGPR = resultPayload.gpr();
    3232 #if USE(JSVALUE64)
    3233     JSValueRegs resultRegs(resultPayloadGPR);
    3234 #else
    3235     GPRFlushedCallResult2 resultTag(this);
    3236     GPRReg resultTagGPR = resultTag.gpr();
    3237     JSValueRegs resultRegs(resultTagGPR, resultPayloadGPR);
    3238 #endif
    3239 
    32403225    flushRegisters();
    3241     callOperation(operationGetByValObjectString, extractResult(resultRegs), arg1GPR, arg2GPR);
     3226    JSValueRegsFlushedCallResult result(this);
     3227    JSValueRegs resultRegs = result.regs();
     3228    callOperation(operationGetByValObjectString, resultRegs, arg1GPR, arg2GPR);
    32423229    m_jit.exceptionCheck();
    32433230
     
    32563243    speculateSymbol(node->child2(), arg2GPR);
    32573244
    3258     GPRFlushedCallResult resultPayload(this);
    3259     GPRReg resultPayloadGPR = resultPayload.gpr();
    3260 #if USE(JSVALUE64)
    3261     JSValueRegs resultRegs(resultPayloadGPR);
    3262 #else
    3263     GPRFlushedCallResult2 resultTag(this);
    3264     GPRReg resultTagGPR = resultTag.gpr();
    3265     JSValueRegs resultRegs(resultTagGPR, resultPayloadGPR);
    3266 #endif
    3267 
    32683245    flushRegisters();
    3269     callOperation(operationGetByValObjectSymbol, extractResult(resultRegs), arg1GPR, arg2GPR);
     3246    JSValueRegsFlushedCallResult result(this);
     3247    JSValueRegs resultRegs = result.regs();
     3248    callOperation(operationGetByValObjectSymbol, resultRegs, arg1GPR, arg2GPR);
    32703249    m_jit.exceptionCheck();
    32713250
     
    33893368{
    33903369    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 #else
    3397     GPRFlushedCallResult2 resultTag(this);
    3398     GPRReg resultTagGPR = resultTag.gpr();
    3399     JSValueRegs resultRegs(resultTagGPR, resultPayloadGPR);
    3400 #endif
    3401 
    34023370    if (node->child2()) {
    34033371        SpeculateInt32Operand radix(this, node->child2());
     
    34053373        if (node->child1().useKind() == UntypedUse) {
    34063374            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();
    34143376
    34153377            flushRegisters();
    3416             callOperation(operationParseIntGeneric, result, valueReg, radixGPR);
     3378            JSValueRegsFlushedCallResult result(this);
     3379            JSValueRegs resultRegs = result.regs();
     3380            callOperation(operationParseIntGeneric, resultRegs, valueRegs, radixGPR);
    34173381            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();
    34573421    jsValueResult(resultRegs, node);
    34583422}
     
    35213485        JSValueRegs leftRegs = left.jsValueRegs();
    35223486        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
    35313488        flushRegisters();
     3489        JSValueRegsFlushedCallResult result(this);
     3490        JSValueRegs resultRegs = result.regs();
    35323491        callOperation(snippetSlowPathFunction, resultRegs, leftRegs, rightRegs);
    35333492        m_jit.exceptionCheck();
     
    36683627        JSValueRegs leftRegs = left.jsValueRegs();
    36693628        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
    36783630        flushRegisters();
     3631        JSValueRegsFlushedCallResult result(this);
     3632        JSValueRegs resultRegs = result.regs();
    36793633        callOperation(snippetSlowPathFunction, resultRegs, leftRegs, rightRegs);
    36803634        m_jit.exceptionCheck();
     
    38083762        JSValueRegs leftRegs = left.jsValueRegs();
    38093763        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
    38183765        flushRegisters();
     3766        JSValueRegsFlushedCallResult result(this);
     3767        JSValueRegs resultRegs = result.regs();
    38193768        callOperation(operationValueAddNotNumber, resultRegs, leftRegs, rightRegs);
    38203769        m_jit.exceptionCheck();
     
    48324781            JSValueRegs leftRegs = left.jsValueRegs();
    48334782            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
    48424784            flushRegisters();
     4785            JSValueRegsFlushedCallResult result(this);
     4786            JSValueRegs resultRegs = result.regs();
    48434787            callOperation(operationValueMul, resultRegs, leftRegs, rightRegs);
    48444788            m_jit.exceptionCheck();
     
    50144958            JSValueRegs leftRegs = left.jsValueRegs();
    50154959            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
    50244961            flushRegisters();
     4962            JSValueRegsFlushedCallResult result(this);
     4963            JSValueRegs resultRegs = result.regs();
    50254964            callOperation(operationValueDiv, resultRegs, leftRegs, rightRegs);
    50264965            m_jit.exceptionCheck();
     
    55205459    JSValueOperand argument(this, node->child1());
    55215460    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
    55305462    flushRegisters();
     5463    JSValueRegsFlushedCallResult result(this);
     5464    JSValueRegs resultRegs = result.regs();
    55315465    J_JITOperation_EJ operation = nullptr;
    55325466    if (node->op() == ArithRound)
     
    1039510329    SpeculateCellOperand scope(this, node->child1());
    1039610330    GPRReg scopeGPR = scope.gpr();
    10397 #if USE(JSVALUE64)
    10398     GPRFlushedCallResult result(this);
    10399     GPRReg resultGPR = result.gpr();
    1040010331    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()));
    1040210335    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);
    1041210337}
    1041310338   
     
    1041610341    SpeculateCellOperand scope(this, node->child1());
    1041710342    GPRReg scopeGPR = scope.gpr();
    10418 #if USE(JSVALUE64)
    1041910343    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());
    1042210347    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);
    1043210349}
    1043310350
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h

    r226134 r226260  
    14541454        return appendCallSetResult(operation, result);
    14551455    }
     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    }
    14561461    JITCompiler::Call callOperation(J_JITOperation_EJscI operation, GPRReg result, GPRReg arg1, UniquedStringImpl* impl)
    14571462    {
     
    15131518        m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(impl), TrustedImm32(value));
    15141519        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());
    15151525    }
    15161526    JITCompiler::Call callOperation(J_JITOperation_EOIUi operation, GPRReg result, GPRReg arg1, UniquedStringImpl* impl, unsigned value)
     
    15711581        return appendCallSetResult(operation, result);
    15721582    }
     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    }
    15731588    JITCompiler::Call callOperation(J_JITOperation_EJssZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
    15741589    {
     
    16261641        return appendCallSetResult(operation, result);
    16271642    }
    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);
    16311651        return appendCallSetResult(operation, result);
    16321652    }
     
    18711891        m_jit.setupArgumentsWithExecState(arg1, arg2, arg3, arg4);
    18721892        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());
    18731898    }
    18741899    JITCompiler::Call callOperation(J_JITOperation_ECC operation, GPRReg result, GPRReg arg1, GPRReg arg2)
     
    36753700};
    36763701
     3702class JSValueRegsFlushedCallResult {
     3703public:
     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
     3723private:
     3724#if USE(JSVALUE64)
     3725    GPRFlushedCallResult m_gpr;
     3726#else
     3727    GPRFlushedCallResult m_payloadGPR;
     3728    GPRFlushedCallResult2 m_tagGPR;
     3729#endif
     3730};
     3731
    36773732
    36783733// === Speculative Operand types ===
Note: See TracChangeset for help on using the changeset viewer.