Title: [206411] trunk/Source/_javascript_Core
Revision
206411
Author
commit-qu...@webkit.org
Date
2016-09-26 20:45:25 -0700 (Mon, 26 Sep 2016)

Log Message

Make DFGSlowPathGenerator a bit more variadic
https://bugs.webkit.org/show_bug.cgi?id=162378

Patch by Sam Weinig <s...@webkit.org> on 2016-09-26
Reviewed by Filip Pizlo.

Make the subclass of CallSlowPathGenerator that takes arguments variadic
so it can take any number of arguments. Also updates the slowPathCall helper
function to be variadic. I had to move the spill mode and exception check
requirement parameters to before the arguments since the variadic arguments
must be at the end. As a convenience, I added an overload of slowPathCall that
doesn't take spill mode and exception check requirement parameters.

* dfg/DFGSlowPathGenerator.h:
(JSC::DFG::CallResultAndArgumentsSlowPathGenerator::CallResultAndArgumentsSlowPathGenerator):
(JSC::DFG::CallResultAndArgumentsSlowPathGenerator::unpackAndGenerate):
(JSC::DFG::slowPathCall):
(JSC::DFG::CallResultAndNoArgumentsSlowPathGenerator::CallResultAndNoArgumentsSlowPathGenerator): Deleted.
(JSC::DFG::CallResultAndOneArgumentSlowPathGenerator::CallResultAndOneArgumentSlowPathGenerator): Deleted.
(JSC::DFG::CallResultAndTwoArgumentsSlowPathGenerator::CallResultAndTwoArgumentsSlowPathGenerator): Deleted.
(JSC::DFG::CallResultAndThreeArgumentsSlowPathGenerator::CallResultAndThreeArgumentsSlowPathGenerator): Deleted.
(JSC::DFG::CallResultAndFourArgumentsSlowPathGenerator::CallResultAndFourArgumentsSlowPathGenerator): Deleted.
(JSC::DFG::CallResultAndFourArgumentsSlowPathGenerator::generateInternal): Deleted.
(JSC::DFG::CallResultAndFiveArgumentsSlowPathGenerator::CallResultAndFiveArgumentsSlowPathGenerator): Deleted.
(JSC::DFG::CallResultAndFiveArgumentsSlowPathGenerator::generateInternal): Deleted.
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileValueToInt32):
(JSC::DFG::SpeculativeJIT::compileNotifyWrite):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::cachedGetById):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (206410 => 206411)


--- trunk/Source/_javascript_Core/ChangeLog	2016-09-27 03:35:01 UTC (rev 206410)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-09-27 03:45:25 UTC (rev 206411)
@@ -1,3 +1,35 @@
+2016-09-26  Sam Weinig  <s...@webkit.org>
+
+        Make DFGSlowPathGenerator a bit more variadic
+        https://bugs.webkit.org/show_bug.cgi?id=162378
+
+        Reviewed by Filip Pizlo.
+
+        Make the subclass of CallSlowPathGenerator that takes arguments variadic
+        so it can take any number of arguments. Also updates the slowPathCall helper
+        function to be variadic. I had to move the spill mode and exception check 
+        requirement parameters to before the arguments since the variadic arguments
+        must be at the end. As a convenience, I added an overload of slowPathCall that
+        doesn't take spill mode and exception check requirement parameters.
+
+        * dfg/DFGSlowPathGenerator.h:
+        (JSC::DFG::CallResultAndArgumentsSlowPathGenerator::CallResultAndArgumentsSlowPathGenerator):
+        (JSC::DFG::CallResultAndArgumentsSlowPathGenerator::unpackAndGenerate):
+        (JSC::DFG::slowPathCall):
+        (JSC::DFG::CallResultAndNoArgumentsSlowPathGenerator::CallResultAndNoArgumentsSlowPathGenerator): Deleted.
+        (JSC::DFG::CallResultAndOneArgumentSlowPathGenerator::CallResultAndOneArgumentSlowPathGenerator): Deleted.
+        (JSC::DFG::CallResultAndTwoArgumentsSlowPathGenerator::CallResultAndTwoArgumentsSlowPathGenerator): Deleted.
+        (JSC::DFG::CallResultAndThreeArgumentsSlowPathGenerator::CallResultAndThreeArgumentsSlowPathGenerator): Deleted.
+        (JSC::DFG::CallResultAndFourArgumentsSlowPathGenerator::CallResultAndFourArgumentsSlowPathGenerator): Deleted.
+        (JSC::DFG::CallResultAndFourArgumentsSlowPathGenerator::generateInternal): Deleted.
+        (JSC::DFG::CallResultAndFiveArgumentsSlowPathGenerator::CallResultAndFiveArgumentsSlowPathGenerator): Deleted.
+        (JSC::DFG::CallResultAndFiveArgumentsSlowPathGenerator::generateInternal): Deleted.
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::compileValueToInt32):
+        (JSC::DFG::SpeculativeJIT::compileNotifyWrite):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::cachedGetById):
+
 2016-09-26  Commit Queue  <commit-qu...@webkit.org>
 
         Unreviewed, rolling out r206405.

Modified: trunk/Source/_javascript_Core/dfg/DFGSlowPathGenerator.h (206410 => 206411)


--- trunk/Source/_javascript_Core/dfg/DFGSlowPathGenerator.h	2016-09-27 03:35:01 UTC (rev 206410)
+++ trunk/Source/_javascript_Core/dfg/DFGSlowPathGenerator.h	2016-09-27 03:45:25 UTC (rev 206411)
@@ -159,267 +159,55 @@
     Vector<SilentRegisterSavePlan, 2> m_plans;
 };
 
-template<typename JumpType, typename FunctionType, typename ResultType>
-class CallResultAndNoArgumentsSlowPathGenerator
+template<typename JumpType, typename FunctionType, typename ResultType, typename... Arguments>
+class CallResultAndArgumentsSlowPathGenerator
     : public CallSlowPathGenerator<JumpType, FunctionType, ResultType> {
 public:
-    CallResultAndNoArgumentsSlowPathGenerator(
+    CallResultAndArgumentsSlowPathGenerator(
         JumpType from, SpeculativeJIT* jit, FunctionType function,
-        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result)
+        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, Arguments... arguments)
         : CallSlowPathGenerator<JumpType, FunctionType, ResultType>(
             from, jit, function, spillMode, requirement, result)
+        , m_arguments(std::forward<Arguments>(arguments)...)
     {
     }
-    
-protected:
-    void generateInternal(SpeculativeJIT* jit) override
-    {
-        this->setUp(jit);
-        this->recordCall(jit->callOperation(this->m_function, extractResult(this->m_result)));
-        this->tearDown(jit);
-    }
-};
 
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1>
-class CallResultAndOneArgumentSlowPathGenerator
-    : public CallSlowPathGenerator<JumpType, FunctionType, ResultType> {
-public:
-    CallResultAndOneArgumentSlowPathGenerator(
-        JumpType from, SpeculativeJIT* jit, FunctionType function,
-        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1)
-        : CallSlowPathGenerator<JumpType, FunctionType, ResultType>(
-            from, jit, function, spillMode, requirement, result)
-        , m_argument1(argument1)
-    {
-    }
-    
 protected:
-    void generateInternal(SpeculativeJIT* jit) override
+    template<size_t... ArgumentsIndex>
+    void unpackAndGenerate(SpeculativeJIT* jit, std::index_sequence<ArgumentsIndex...>)
     {
         this->setUp(jit);
-        this->recordCall(jit->callOperation(this->m_function, extractResult(this->m_result), m_argument1));
+        this->recordCall(jit->callOperation(this->m_function, extractResult(this->m_result), std::get<ArgumentsIndex>(m_arguments)...));
         this->tearDown(jit);
     }
 
-    ArgumentType1 m_argument1;
-};
-
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1, typename ArgumentType2>
-class CallResultAndTwoArgumentsSlowPathGenerator
-    : public CallSlowPathGenerator<JumpType, FunctionType, ResultType> {
-public:
-    CallResultAndTwoArgumentsSlowPathGenerator(
-        JumpType from, SpeculativeJIT* jit, FunctionType function,
-        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1,
-        ArgumentType2 argument2)
-        : CallSlowPathGenerator<JumpType, FunctionType, ResultType>(
-            from, jit, function, spillMode, requirement, result)
-        , m_argument1(argument1)
-        , m_argument2(argument2)
-    {
-    }
-    
-protected:
     void generateInternal(SpeculativeJIT* jit) override
     {
-        this->setUp(jit);
-        this->recordCall(jit->callOperation(this->m_function, extractResult(this->m_result), m_argument1, m_argument2));
-        this->tearDown(jit);
+        unpackAndGenerate(jit, std::make_index_sequence<std::tuple_size<std::tuple<Arguments...>>::value>());
     }
 
-    ArgumentType1 m_argument1;
-    ArgumentType2 m_argument2;
+    std::tuple<Arguments...> m_arguments;
 };
 
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1, typename ArgumentType2, typename ArgumentType3>
-class CallResultAndThreeArgumentsSlowPathGenerator
-    : public CallSlowPathGenerator<JumpType, FunctionType, ResultType> {
-public:
-    CallResultAndThreeArgumentsSlowPathGenerator(
-        JumpType from, SpeculativeJIT* jit, FunctionType function,
-        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1,
-        ArgumentType2 argument2, ArgumentType3 argument3)
-        : CallSlowPathGenerator<JumpType, FunctionType, ResultType>(
-            from, jit, function, spillMode, requirement, result)
-        , m_argument1(argument1)
-        , m_argument2(argument2)
-        , m_argument3(argument3)
-    {
-    }
-
-protected:    
-    void generateInternal(SpeculativeJIT* jit) override
-    {
-        this->setUp(jit);
-        this->recordCall(
-            jit->callOperation(
-                this->m_function, extractResult(this->m_result), m_argument1, m_argument2,
-                m_argument3));
-        this->tearDown(jit);
-    }
-
-    ArgumentType1 m_argument1;
-    ArgumentType2 m_argument2;
-    ArgumentType3 m_argument3;
-};
-
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1, typename ArgumentType2, typename ArgumentType3,
-    typename ArgumentType4>
-class CallResultAndFourArgumentsSlowPathGenerator
-    : public CallSlowPathGenerator<JumpType, FunctionType, ResultType> {
-public:
-    CallResultAndFourArgumentsSlowPathGenerator(
-        JumpType from, SpeculativeJIT* jit, FunctionType function,
-        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1,
-        ArgumentType2 argument2, ArgumentType3 argument3, ArgumentType4 argument4)
-        : CallSlowPathGenerator<JumpType, FunctionType, ResultType>(
-            from, jit, function, spillMode, requirement, result)
-        , m_argument1(argument1)
-        , m_argument2(argument2)
-        , m_argument3(argument3)
-        , m_argument4(argument4)
-    {
-    }
-    
-protected:
-    void generateInternal(SpeculativeJIT* jit)
-    {
-        this->setUp(jit);
-        this->recordCall(
-            jit->callOperation(
-                this->m_function, extractResult(this->m_result), m_argument1, m_argument2,
-                m_argument3, m_argument4));
-        this->tearDown(jit);
-    }
-
-    ArgumentType1 m_argument1;
-    ArgumentType2 m_argument2;
-    ArgumentType3 m_argument3;
-    ArgumentType4 m_argument4;
-};
-
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1, typename ArgumentType2, typename ArgumentType3,
-    typename ArgumentType4, typename ArgumentType5>
-class CallResultAndFiveArgumentsSlowPathGenerator
-    : public CallSlowPathGenerator<JumpType, FunctionType, ResultType> {
-public:
-    CallResultAndFiveArgumentsSlowPathGenerator(
-        JumpType from, SpeculativeJIT* jit, FunctionType function,
-        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1,
-        ArgumentType2 argument2, ArgumentType3 argument3, ArgumentType4 argument4,
-        ArgumentType5 argument5)
-        : CallSlowPathGenerator<JumpType, FunctionType, ResultType>(
-            from, jit, function, spillMode, requirement, result)
-        , m_argument1(argument1)
-        , m_argument2(argument2)
-        , m_argument3(argument3)
-        , m_argument4(argument4)
-        , m_argument5(argument5)
-    {
-    }
-
-protected:    
-    void generateInternal(SpeculativeJIT* jit)
-    {
-        this->setUp(jit);
-        this->recordCall(
-            jit->callOperation(
-                this->m_function, extractResult(this->m_result), m_argument1, m_argument2,
-                m_argument3, m_argument4, m_argument5));
-        this->tearDown(jit);
-    }
-
-    ArgumentType1 m_argument1;
-    ArgumentType2 m_argument2;
-    ArgumentType3 m_argument3;
-    ArgumentType4 m_argument4;
-    ArgumentType5 m_argument5;
-};
-
-template<typename JumpType, typename FunctionType, typename ResultType>
+template<typename JumpType, typename FunctionType, typename ResultType, typename... Arguments>
 inline std::unique_ptr<SlowPathGenerator> slowPathCall(
     JumpType from, SpeculativeJIT* jit, FunctionType function,
-    ResultType result, SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
+    SpillRegistersMode spillMode, ExceptionCheckRequirement requirement,
+    ResultType result, Arguments... arguments)
 {
-    return std::make_unique<CallResultAndNoArgumentsSlowPathGenerator<JumpType, FunctionType, ResultType>>(
-        from, jit, function, spillMode, requirement, result);
+    return std::make_unique<CallResultAndArgumentsSlowPathGenerator<JumpType, FunctionType, ResultType, Arguments...>>(
+        from, jit, function, spillMode, requirement, result, arguments...);
 }
 
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1>
+template<typename JumpType, typename FunctionType, typename ResultType, typename... Arguments>
 inline std::unique_ptr<SlowPathGenerator> slowPathCall(
     JumpType from, SpeculativeJIT* jit, FunctionType function,
-    ResultType result, ArgumentType1 argument1,
-    SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
+    ResultType result, Arguments... arguments)
 {
-    return std::make_unique<CallResultAndOneArgumentSlowPathGenerator<JumpType, FunctionType, ResultType, ArgumentType1>>(
-        from, jit, function, spillMode, requirement, result, argument1);
+    return slowPathCall(
+        from, jit, function, NeedToSpill, ExceptionCheckRequirement::CheckNeeded, result, arguments...);
 }
 
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1, typename ArgumentType2>
-inline std::unique_ptr<SlowPathGenerator> slowPathCall(
-    JumpType from, SpeculativeJIT* jit, FunctionType function,
-    ResultType result, ArgumentType1 argument1, ArgumentType2 argument2,
-    SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
-{
-    return std::make_unique<CallResultAndTwoArgumentsSlowPathGenerator<JumpType, FunctionType, ResultType, ArgumentType1, ArgumentType2>>(
-        from, jit, function, spillMode, requirement, result, argument1, argument2);
-}
-
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1, typename ArgumentType2, typename ArgumentType3>
-inline std::unique_ptr<SlowPathGenerator> slowPathCall(
-    JumpType from, SpeculativeJIT* jit, FunctionType function,
-    ResultType result, ArgumentType1 argument1, ArgumentType2 argument2,
-    ArgumentType3 argument3, SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
-{
-    return std::make_unique<CallResultAndThreeArgumentsSlowPathGenerator<JumpType, FunctionType, ResultType, ArgumentType1, ArgumentType2,
-        ArgumentType3>>(from, jit, function, spillMode, requirement, result, argument1, argument2, argument3);
-}
-
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1, typename ArgumentType2, typename ArgumentType3,
-    typename ArgumentType4>
-inline std::unique_ptr<SlowPathGenerator> slowPathCall(
-    JumpType from, SpeculativeJIT* jit, FunctionType function,
-    ResultType result, ArgumentType1 argument1, ArgumentType2 argument2,
-    ArgumentType3 argument3, ArgumentType4 argument4,
-    SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
-{
-    return std::make_unique<CallResultAndFourArgumentsSlowPathGenerator<JumpType, FunctionType, ResultType, ArgumentType1, ArgumentType2,
-        ArgumentType3, ArgumentType4>>(from, jit, function, spillMode, requirement, result, argument1, argument2, argument3, argument4);
-}
-
-template<
-    typename JumpType, typename FunctionType, typename ResultType,
-    typename ArgumentType1, typename ArgumentType2, typename ArgumentType3,
-    typename ArgumentType4, typename ArgumentType5>
-inline std::unique_ptr<SlowPathGenerator> slowPathCall(
-    JumpType from, SpeculativeJIT* jit, FunctionType function,
-    ResultType result, ArgumentType1 argument1, ArgumentType2 argument2,
-    ArgumentType3 argument3, ArgumentType4 argument4, ArgumentType5 argument5,
-    SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
-{
-    return std::make_unique<CallResultAndFiveArgumentsSlowPathGenerator<JumpType, FunctionType, ResultType, ArgumentType1, ArgumentType2,
-        ArgumentType3, ArgumentType4, ArgumentType5>>(from, jit, function, spillMode, requirement, result, argument1, argument2, argument3,
-        argument4, argument5);
-}
-
 template<typename JumpType, typename DestinationType, typename SourceType, unsigned numberOfAssignments>
 class AssigningSlowPathGenerator : public JumpingSlowPathGenerator<JumpType> {
 public:

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (206410 => 206411)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2016-09-27 03:35:01 UTC (rev 206410)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2016-09-27 03:45:25 UTC (rev 206411)
@@ -2151,7 +2151,7 @@
         GPRReg gpr = result.gpr();
         JITCompiler::Jump notTruncatedToInteger = m_jit.branchTruncateDoubleToInt32(fpr, gpr, JITCompiler::BranchIfTruncateFailed);
         
-        addSlowPathGenerator(slowPathCall(notTruncatedToInteger, this, operationToInt32, gpr, fpr, NeedToSpill, ExceptionCheckRequirement::CheckNotNeeded));
+        addSlowPathGenerator(slowPathCall(notTruncatedToInteger, this, operationToInt32, NeedToSpill, ExceptionCheckRequirement::CheckNotNeeded, gpr, fpr));
         
         int32Result(gpr, node);
         return;
@@ -6751,7 +6751,7 @@
         TrustedImm32(IsInvalidated));
     
     addSlowPathGenerator(
-        slowPathCall(slowCase, this, operationNotifyWrite, NoResult, set, NeedToSpill, ExceptionCheckRequirement::CheckNotNeeded));
+        slowPathCall(slowCase, this, operationNotifyWrite, NeedToSpill, ExceptionCheckRequirement::CheckNotNeeded, NoResult, set));
     
     noResult(node);
 }

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp (206410 => 206411)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp	2016-09-27 03:35:01 UTC (rev 206410)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp	2016-09-27 03:45:25 UTC (rev 206411)
@@ -180,8 +180,9 @@
     slowCases.append(gen.slowPathJump());
     
     auto slowPath = slowPathCall(
-        slowCases, this, type == AccessType::Get ? operationGetByIdOptimize : operationTryGetByIdOptimize, resultGPR, gen.stubInfo(), baseGPR,
-        identifierUID(identifierNumber), spillMode);
+        slowCases, this, type == AccessType::Get ? operationGetByIdOptimize : operationTryGetByIdOptimize,
+        spillMode, ExceptionCheckRequirement::CheckNeeded,
+        resultGPR, gen.stubInfo(), baseGPR, identifierUID(identifierNumber));
     
     m_jit.addGetById(gen, slowPath.get());
     addSlowPathGenerator(WTFMove(slowPath));
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to