Changeset 147985 in webkit


Ignore:
Timestamp:
Apr 8, 2013 11:45:16 PM (11 years ago)
Author:
commit-queue@webkit.org
Message:

Adds fromCharCode intrinsic support.
https://bugs.webkit.org/show_bug.cgi?id=104807

Patch by Vahag Vardanyan <vaag@ispras.ru> on 2013-04-08
Reviewed by Oliver Hunt.

Switch to using fromCharCode intrinsic instead of call operation in some cases.

  • dfg/DFGAbstractState.cpp:

(JSC::DFG::AbstractState::executeEffects):

  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::handleIntrinsic):

  • dfg/DFGFixupPhase.cpp:

(JSC::DFG::FixupPhase::fixupNode):

  • dfg/DFGNodeType.h:

(DFG):

  • dfg/DFGOperations.cpp:
  • dfg/DFGOperations.h:
  • dfg/DFGPredictionPropagationPhase.cpp:

(JSC::DFG::PredictionPropagationPhase::propagate):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compileFromCharCode):
(DFG):

  • dfg/DFGSpeculativeJIT.h:

(JSC::DFG::SpeculativeJIT::callOperation):
(SpeculativeJIT):

  • dfg/DFGSpeculativeJIT32_64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • runtime/StringConstructor.cpp:

(JSC::stringFromCharCode):
(JSC):

  • runtime/StringConstructor.h:

(JSC):

Location:
trunk/Source/JavaScriptCore
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r147979 r147985  
     12013-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
    1382013-04-08  Benjamin Poulain  <benjamin@webkit.org>
    239
  • trunk/Source/JavaScriptCore/dfg/DFGAbstractState.cpp

    r146382 r147985  
    862862        break;
    863863       
     864    case StringFromCharCode:
     865        forNode(node).set(SpecString);
     866        break;
     867
    864868    case StringCharAt:
    865869        node->setCanExit(true);
  • trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp

    r147190 r147985  
    15631563        if (usesResult)
    15641564            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
    15651577        return true;
    15661578    }
  • trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp

    r147965 r147985  
    356356            break;
    357357        }
     358
     359        case StringFromCharCode:
     360            setUseKindAndUnboxIfProfitable<Int32Use>(node->child1());
     361            break;
    358362
    359363        case StringCharAt:
  • trunk/Source/JavaScriptCore/dfg/DFGNodeType.h

    r146382 r147985  
    182182    macro(StringCharCodeAt, NodeResultInt32) \
    183183    macro(StringCharAt, NodeResultJS) \
     184    macro(StringFromCharCode, NodeResultJS) \
    184185    \
    185186    /* Nodes for comparison operations. */\
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp

    r147965 r147985  
    4545#include "ObjectConstructor.h"
    4646#include "Operations.h"
     47#include "StringConstructor.h"
    4748#include <wtf/InlineASM.h>
    4849
     
    16001601{
    16011602    return fmod(a, b);
     1603}
     1604
     1605JSCell* 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);
    16021610}
    16031611
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.h

    r147965 r147985  
    8383typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EZZ)(ExecState*, int32_t, int32_t);
    8484typedef JSCell* DFG_OPERATION (*C_DFGOperation_E)(ExecState*);
     85typedef JSCell* DFG_OPERATION (*C_DFGOperation_EZ)(ExecState*, int32_t);
    8586typedef JSCell* DFG_OPERATION (*C_DFGOperation_EC)(ExecState*, JSCell*);
    8687typedef JSCell* DFG_OPERATION (*C_DFGOperation_ECC)(ExecState*, JSCell*, JSCell*);
     
    9293typedef JSCell* DFG_OPERATION (*C_DFGOperation_EOZ)(ExecState*, JSObject*, int32_t);
    9394typedef JSCell* DFG_OPERATION (*C_DFGOperation_ESt)(ExecState*, Structure*);
     95typedef JSCell* DFG_OPERATION (*C_DFGOperation_EZ)(ExecState*, int32_t);
    9496typedef double DFG_OPERATION (*D_DFGOperation_DD)(double, double);
    9597typedef double DFG_OPERATION (*D_DFGOperation_ZZ)(int32_t, int32_t);
     
    125127typedef char* DFG_OPERATION (*P_DFGOperation_EStZ)(ExecState*, Structure*, int32_t);
    126128typedef StringImpl* DFG_OPERATION (*Str_DFGOperation_EJss)(ExecState*, JSString*);
     129JSCell* DFG_OPERATION operationStringFromCharCode(ExecState*, int32_t)  WTF_INTERNAL;
    127130
    128131// These routines are provide callbacks out to C++ implementations of operations too complex to JIT.
  • trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp

    r146400 r147985  
    424424        }
    425425       
     426        case StringFromCharCode: {
     427            changed |= setPrediction(SpecString);
     428            changed |= node->child1()->mergeFlags(NodeUsedAsNumber | NodeUsedAsInt);           
     429            break;
     430        }
    426431        case StringCharAt:
    427432        case ToString:
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r147965 r147985  
    20892089}
    20902090
     2091void 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
    20912110GeneratedOperandType SpeculativeJIT::checkGeneratedTypeForToInt32(Node* node)
    20922111{
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h

    r147965 r147985  
    12641264        return appendCallWithExceptionCheckSetResult(operation, result);
    12651265    }
     1266    JITCompiler::Call callOperation(C_DFGOperation_EZ operation, GPRReg result, GPRReg arg1)
     1267    {
     1268        m_jit.setupArgumentsWithExecState(arg1);
     1269        return appendCallWithExceptionCheckSetResult(operation, result);
     1270    }
    12661271#else
    12671272
     
    16871692        return appendCallWithExceptionCheckSetResult(operation, result);
    16881693    }
     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
    16891700
    16901701#undef EABI_32BIT_DUMMY_ARG
     
    21062117    void compileGetCharCodeAt(Node*);
    21072118    void compileGetByValOnString(Node*);
     2119    void compileFromCharCode(Node*);
    21082120
    21092121    void compileGetByValOnArguments(Node*);
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp

    r146945 r147985  
    24502450        // Relies on StringCharAt node having same basic layout as GetByVal
    24512451        compileGetByValOnString(node);
     2452        break;
     2453    }
     2454
     2455    case StringFromCharCode: {
     2456        compileFromCharCode(node);
    24522457        break;
    24532458    }
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp

    r146382 r147985  
    23772377        // Relies on StringCharAt node having same basic layout as GetByVal
    23782378        compileGetByValOnString(node);
     2379        break;
     2380    }
     2381
     2382    case StringFromCharCode: {
     2383        compileFromCharCode(node);
    23792384        break;
    23802385    }
  • trunk/Source/JavaScriptCore/runtime/StringConstructor.cpp

    r139541 r147985  
    9090}
    9191
     92JSCell* JSC_HOST_CALL stringFromCharCode(ExecState* exec, int32_t arg)
     93{
     94    return jsSingleCharacterString(exec, arg);
     95}
     96
    9297static EncodedJSValue JSC_HOST_CALL constructWithStringConstructor(ExecState* exec)
    9398{
  • trunk/Source/JavaScriptCore/runtime/StringConstructor.h

    r116828 r147985  
    5858        static bool getOwnPropertyDescriptor(JSObject*, ExecState*, PropertyName, PropertyDescriptor&);
    5959    };
     60   
     61    JSCell* JSC_HOST_CALL stringFromCharCode(ExecState*, int32_t);
    6062
    6163} // namespace JSC
Note: See TracChangeset for help on using the changeset viewer.