Sub should be a Math IC
https://bugs.webkit.org/show_bug.cgi?id=160270
Reviewed by Mark Lam.
This makes Sub an IC like Mul and Add. I'm seeing the following
improvements of average Sub size on Unity and JetStream:
| JetStream | Unity 3D |
------| -------------|--------------
Old | 202 bytes | 205 bytes |
------| -------------|--------------
New | 134 bytes | 134 bytes |
------------------------------------
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::addJITMulIC):
(JSC::CodeBlock::addJITSubIC):
(JSC::CodeBlock::findStubInfo):
(JSC::CodeBlock::dumpMathICStats):
* bytecode/CodeBlock.h:
(JSC::CodeBlock::stubInfoBegin):
(JSC::CodeBlock::stubInfoEnd):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileArithSub):
* ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileArithAddOrSub):
* jit/JITArithmetic.cpp:
(JSC::JIT::emit_op_sub):
(JSC::JIT::emitSlow_op_sub):
(JSC::JIT::emit_op_pow):
* jit/JITMathIC.h:
* jit/JITMathICForwards.h:
* jit/JITOperations.cpp:
* jit/JITOperations.h:
* jit/JITSubGenerator.cpp:
(JSC::JITSubGenerator::generateInline):
(JSC::JITSubGenerator::generateFastPath):
* jit/JITSubGenerator.h:
(JSC::JITSubGenerator::JITSubGenerator):
(JSC::JITSubGenerator::isLeftOperandValidConstant):
(JSC::JITSubGenerator::isRightOperandValidConstant):
(JSC::JITSubGenerator::arithProfile):
(JSC::JITSubGenerator::didEmitFastPath): Deleted.
(JSC::JITSubGenerator::endJumpList): Deleted.
(JSC::JITSubGenerator::slowPathJumpList): Deleted.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@203979 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/bytecode/CodeBlock.cpp b/Source/JavaScriptCore/bytecode/CodeBlock.cpp
index 3a08943..987f321 100644
--- a/Source/JavaScriptCore/bytecode/CodeBlock.cpp
+++ b/Source/JavaScriptCore/bytecode/CodeBlock.cpp
@@ -3018,6 +3018,11 @@
return m_mulICs.add();
}
+JITSubIC* CodeBlock::addJITSubIC()
+{
+ return m_subICs.add();
+}
+
StructureStubInfo* CodeBlock::findStubInfo(CodeOrigin codeOrigin)
{
for (StructureStubInfo* stubInfo : m_stubInfos) {
@@ -4585,6 +4590,8 @@
double totalAddSize = 0.0;
double numMuls = 0.0;
double totalMulSize = 0.0;
+ double numSubs = 0.0;
+ double totalSubSize = 0.0;
auto countICs = [&] (CodeBlock* codeBlock) {
for (JITAddIC* addIC : codeBlock->m_addICs) {
@@ -4597,6 +4604,11 @@
totalMulSize += mulIC->codeSize();
}
+ for (JITSubIC* subIC : codeBlock->m_subICs) {
+ numSubs++;
+ totalSubSize += subIC->codeSize();
+ }
+
return false;
};
heap()->forEachCodeBlock(countICs);
@@ -4608,6 +4620,10 @@
dataLog("Num Muls: ", numMuls, "\n");
dataLog("Total Mul size in bytes: ", totalMulSize, "\n");
dataLog("Average Mul size: ", totalMulSize / numMuls, "\n");
+ dataLog("\n");
+ dataLog("Num Subs: ", numSubs, "\n");
+ dataLog("Total Sub size in bytes: ", totalSubSize, "\n");
+ dataLog("Average Sub size: ", totalSubSize / numSubs, "\n");
dataLog("-----------------------\n");
#endif
diff --git a/Source/JavaScriptCore/bytecode/CodeBlock.h b/Source/JavaScriptCore/bytecode/CodeBlock.h
index 7f940c0..ab92804 100644
--- a/Source/JavaScriptCore/bytecode/CodeBlock.h
+++ b/Source/JavaScriptCore/bytecode/CodeBlock.h
@@ -253,6 +253,7 @@
StructureStubInfo* addStubInfo(AccessType);
JITAddIC* addJITAddIC();
JITMulIC* addJITMulIC();
+ JITSubIC* addJITSubIC();
Bag<StructureStubInfo>::iterator stubInfoBegin() { return m_stubInfos.begin(); }
Bag<StructureStubInfo>::iterator stubInfoEnd() { return m_stubInfos.end(); }
@@ -1018,6 +1019,7 @@
Bag<StructureStubInfo> m_stubInfos;
Bag<JITAddIC> m_addICs;
Bag<JITMulIC> m_mulICs;
+ Bag<JITSubIC> m_subICs;
Bag<ByValInfo> m_byValInfos;
Bag<CallLinkInfo> m_callLinkInfos;
SentinelLinkedList<CallLinkInfo, BasicRawSentinelNode<CallLinkInfo>> m_incomingCalls;