2010-05-06 Oliver Hunt <oliver@apple.com>
Reviewed by Geoffrey Garen.
Improve performance of single character string compares
https://bugs.webkit.org/show_bug.cgi?id=38659
Add logic to the jit to identify comparisons to single character string literals
and then just perform the comparison inline, rather than ignoring the evidence
and attempting to perform an integer comparison.
Multiple changes required -- add jnlesseq opcode, add helper function to identify
single character string constants, add a helper to load single character strings.
Then add the 32_64 and normal codepaths to the JIT.
* assembler/MacroAssemblerX86Common.h:
(JSC::MacroAssemblerX86Common::load16):
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::dump):
* bytecode/Opcode.h:
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::emitJumpIfTrue):
* interpreter/Interpreter.cpp:
(JSC::Interpreter::privateExecute):
* jit/JIT.cpp:
(JSC::JIT::privateCompileMainPass):
(JSC::JIT::privateCompileSlowCases):
* jit/JIT.h:
* jit/JITArithmetic.cpp:
(JSC::JIT::emit_op_jnless):
(JSC::JIT::emitSlow_op_jnless):
(JSC::JIT::emit_op_jless):
(JSC::JIT::emitSlow_op_jless):
(JSC::JIT::emit_op_jlesseq):
(JSC::JIT::emit_op_jnlesseq):
(JSC::JIT::emitSlow_op_jlesseq):
(JSC::JIT::emitSlow_op_jnlesseq):
* jit/JITArithmetic32_64.cpp:
(JSC::JIT::emit_op_jnless):
(JSC::JIT::emitSlow_op_jnless):
(JSC::JIT::emit_op_jless):
(JSC::JIT::emitSlow_op_jless):
(JSC::JIT::emit_op_jlesseq):
(JSC::JIT::emit_op_jnlesseq):
(JSC::JIT::emitSlow_op_jlesseq):
(JSC::JIT::emitSlow_op_jnlesseq):
(JSC::JIT::emitBinaryDoubleOp):
* jit/JITInlineMethods.h:
(JSC::JIT::emitLoadCharacterString):
(JSC::JIT::isOperandConstantImmediateChar):
* jit/JSInterfaceJIT.h:
(JSC::ThunkHelpers::stringImplDataOffset):
(JSC::ThunkHelpers::jsStringLengthOffset):
(JSC::ThunkHelpers::jsStringValueOffset):
Moved from ThunkGenerators to make it possible to share.
* jit/ThunkGenerators.cpp:
2010-05-06 Oliver Hunt <oliver@apple.com>
Reviewed by Geoffrey Garen.
Improve performance of single character string compares
https://bugs.webkit.org/show_bug.cgi?id=38659
Add many tests of <, >, <=, >=, ==, ===, !=, !== as the existing
tests were woefully inadequate.
* fast/js/comparison-operators-expected.txt: Added.
* fast/js/comparison-operators-greater-expected.txt: Added.
* fast/js/comparison-operators-greater.html: Added.
* fast/js/comparison-operators-less-expected.txt: Added.
* fast/js/comparison-operators-less.html: Added.
* fast/js/comparison-operators.html: Added.
* fast/js/script-tests/comparison-operators-greater.js: Added.
(description.makeTest.func.f.toString):
(description.makeTest):
(doTest):
* fast/js/script-tests/comparison-operators-less.js: Added.
(description.makeTest.func.f.toString):
(description.makeTest):
(doTest):
* fast/js/script-tests/comparison-operators.js: Added.
(description.makeTest.func.f.toString):
(description.makeTest):
(doTest):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@58902 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/bytecode/CodeBlock.cpp b/JavaScriptCore/bytecode/CodeBlock.cpp
index c2d6dd0..d56d328 100644
--- a/JavaScriptCore/bytecode/CodeBlock.cpp
+++ b/JavaScriptCore/bytecode/CodeBlock.cpp
@@ -931,6 +931,13 @@
printf("[%4d] jless\t\t %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
break;
}
+ case op_jlesseq: {
+ int r0 = (++it)->u.operand;
+ int r1 = (++it)->u.operand;
+ int offset = (++it)->u.operand;
+ printf("[%4d] jlesseq\t\t %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
+ break;
+ }
case op_loop_if_lesseq: {
int r0 = (++it)->u.operand;
int r1 = (++it)->u.operand;