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;