2008-09-20 Maciej Stachowiak <mjs@apple.com>
authormjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 21 Sep 2008 05:54:23 +0000 (05:54 +0000)
committermjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 21 Sep 2008 05:54:23 +0000 (05:54 +0000)
        Reviewed by Darin.

        - assorted optimizations to === and !== operators
        (work towards <https://bugs.webkit.org/show_bug.cgi?id=20820>)

        2.5% speedup on earley-boyer test

        * VM/Machine.cpp:
        (JSC::Machine::cti_op_stricteq): Use inline version of
        strictEqualSlowCase; remove unneeded exception check.
        (JSC::Machine::cti_op_nstricteq): ditto
        * kjs/operations.cpp:
        (JSC::strictEqual): Use strictEqualSlowCaseInline
        (JSC::strictEqualSlowCase): ditto
        * kjs/operations.h:
        (JSC::strictEqualSlowCaseInline): Version of strictEqualSlowCase that can be inlined,
        since the extra function call indirection is a lose for CTI.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@36727 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/VM/Machine.cpp
JavaScriptCore/kjs/operations.cpp
JavaScriptCore/kjs/operations.h

index e8f1f5ba287f8a722fcfd1243e531575969b11a7..9ce72dd3269e4b6f5a0f372722a426ad53e6bf6f 100644 (file)
@@ -1,3 +1,23 @@
+2008-09-20  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin.
+        
+        - assorted optimizations to === and !== operators
+        (work towards <https://bugs.webkit.org/show_bug.cgi?id=20820>)
+        
+        2.5% speedup on earley-boyer test
+
+        * VM/Machine.cpp:
+        (JSC::Machine::cti_op_stricteq): Use inline version of
+        strictEqualSlowCase; remove unneeded exception check.
+        (JSC::Machine::cti_op_nstricteq): ditto
+        * kjs/operations.cpp:
+        (JSC::strictEqual): Use strictEqualSlowCaseInline
+        (JSC::strictEqualSlowCase): ditto
+        * kjs/operations.h:
+        (JSC::strictEqualSlowCaseInline): Version of strictEqualSlowCase that can be inlined,
+        since the extra function call indirection is a lose for CTI.
+
 2008-09-20  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej Stachowiak.
 2008-09-20  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej Stachowiak.
index 4cf74e539203d48feeab78e54e4d589a3463cc2b..52dab14ee75056e907cef901719c4e45f2ca7b91 100644 (file)
@@ -5301,13 +5301,10 @@ JSValue* Machine::cti_op_stricteq(CTI_ARGS)
 
     if (JSImmediate::areBothImmediate(src1, src2))
         return jsBoolean(reinterpret_cast<intptr_t>(src1) == reinterpret_cast<intptr_t>(src2));
 
     if (JSImmediate::areBothImmediate(src1, src2))
         return jsBoolean(reinterpret_cast<intptr_t>(src1) == reinterpret_cast<intptr_t>(src2));
-    if (JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::from(0)) & (src2 != JSImmediate::from(0)))
+    if (JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate()))
         return jsBoolean(false);
 
         return jsBoolean(false);
 
-    ExecState* exec = ARG_exec;
-    JSValue* result = jsBoolean(strictEqualSlowCase(src1, src2));
-    VM_CHECK_EXCEPTION_AT_END();
-    return result;
+    return jsBoolean(strictEqualSlowCaseInline(src1, src2));
 }
 
 JSValue* Machine::cti_op_nstricteq(CTI_ARGS)
 }
 
 JSValue* Machine::cti_op_nstricteq(CTI_ARGS)
@@ -5317,13 +5314,10 @@ JSValue* Machine::cti_op_nstricteq(CTI_ARGS)
 
     if (JSImmediate::areBothImmediate(src1, src2))
         return jsBoolean(reinterpret_cast<intptr_t>(src1) != reinterpret_cast<intptr_t>(src2));
 
     if (JSImmediate::areBothImmediate(src1, src2))
         return jsBoolean(reinterpret_cast<intptr_t>(src1) != reinterpret_cast<intptr_t>(src2));
-    if (JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::from(0)) & (src2 != JSImmediate::from(0)))
+    if (JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate()))
         return jsBoolean(true);
     
         return jsBoolean(true);
     
-    ExecState* exec = ARG_exec;
-    JSValue* result = jsBoolean(!strictEqualSlowCase(src1, src2));
-    VM_CHECK_EXCEPTION_AT_END();
-    return result;
+    return jsBoolean(!strictEqualSlowCaseInline(src1, src2));
 }
 
 JSValue* Machine::cti_op_to_jsnumber(CTI_ARGS)
 }
 
 JSValue* Machine::cti_op_to_jsnumber(CTI_ARGS)
index e04a3fb303d93077407058f94faf0ef1aa62222f..4d51e757bff5d4b2bff46535f4b045d6620a28b1 100644 (file)
@@ -107,36 +107,12 @@ bool strictEqual(JSValue* v1, JSValue* v2)
     if (JSImmediate::isEitherImmediate(v1, v2) & (v1 != JSImmediate::from(0)) & (v2 != JSImmediate::from(0)))
         return false;
 
     if (JSImmediate::isEitherImmediate(v1, v2) & (v1 != JSImmediate::from(0)) & (v2 != JSImmediate::from(0)))
         return false;
 
-    return strictEqualSlowCase(v1, v2);
+    return strictEqualSlowCaseInline(v1, v2);
 }
 
 bool strictEqualSlowCase(JSValue* v1, JSValue* v2)
 {
 }
 
 bool strictEqualSlowCase(JSValue* v1, JSValue* v2)
 {
-    ASSERT(!JSImmediate::areBothImmediate(v1, v2));
-
-    if (JSImmediate::isEitherImmediate(v1, v2)) {
-        // pointers can't be equal since one is immediate and one isn't
-        ASSERT(v1 != v2);
-        ASSERT(v1 == JSImmediate::zeroImmediate() || v2 == JSImmediate::zeroImmediate());
-
-        // The reason we can't just return false here is that 0 === -0,
-        // and while the former is an immediate number, the latter is not.
-        if (v1 == JSImmediate::zeroImmediate())
-            return static_cast<JSCell*>(v2)->isNumber() && static_cast<JSNumberCell*>(v2)->value() == 0;
-        return static_cast<JSCell*>(v1)->isNumber() && static_cast<JSNumberCell*>(v1)->value() == 0;
-    }
-
-    if (static_cast<JSCell*>(v1)->isNumber()) {
-        return static_cast<JSCell*>(v2)->isNumber()
-            && static_cast<JSNumberCell*>(v1)->value() == static_cast<JSNumberCell*>(v2)->value();
-    }
-
-    if (static_cast<JSCell*>(v1)->isString()) {
-        return static_cast<JSCell*>(v2)->isString()
-            && static_cast<JSString*>(v1)->value() == static_cast<JSString*>(v2)->value();
-    }
-
-    return v1 == v2;
+    return strictEqualSlowCaseInline(v1, v2);
 }
 
 JSValue* throwOutOfMemoryError(ExecState* exec)
 }
 
 JSValue* throwOutOfMemoryError(ExecState* exec)
index f74075306dfd8e774a6fd3498b84949928b4bbec..9614ef947b0ef0b0f7176ad83ed29b181b220808 100644 (file)
@@ -30,6 +30,35 @@ namespace JSC {
   bool equal(ExecState*, JSValue*, JSValue*);
   bool strictEqual(JSValue*, JSValue*);
   bool strictEqualSlowCase(JSValue*, JSValue*);
   bool equal(ExecState*, JSValue*, JSValue*);
   bool strictEqual(JSValue*, JSValue*);
   bool strictEqualSlowCase(JSValue*, JSValue*);
+
+  inline bool strictEqualSlowCaseInline(JSValue* v1, JSValue* v2)
+  {
+      ASSERT(!JSImmediate::areBothImmediate(v1, v2));
+      
+      if (JSImmediate::isEitherImmediate(v1, v2)) {
+          ASSERT(v1 == JSImmediate::zeroImmediate() || v2 == JSImmediate::zeroImmediate());
+          ASSERT(v1 != v2);
+
+          // The reason we can't just return false here is that 0 === -0,
+          // and while the former is an immediate number, the latter is not.
+          if (v1 == JSImmediate::zeroImmediate())
+              return static_cast<JSCell*>(v2)->isNumber() && static_cast<JSNumberCell*>(v2)->value() == 0;
+          return static_cast<JSCell*>(v1)->isNumber() && static_cast<JSNumberCell*>(v1)->value() == 0;
+      }
+      
+      if (static_cast<JSCell*>(v1)->isNumber()) {
+          return static_cast<JSCell*>(v2)->isNumber()
+              && static_cast<JSNumberCell*>(v1)->value() == static_cast<JSNumberCell*>(v2)->value();
+      }
+
+      if (static_cast<JSCell*>(v1)->isString()) {
+          return static_cast<JSCell*>(v2)->isString()
+              && static_cast<JSString*>(v1)->value() == static_cast<JSString*>(v2)->value();
+      }
+
+      return v1 == v2;
+  }
+
   JSValue* throwOutOfMemoryError(ExecState*);
 }
 
   JSValue* throwOutOfMemoryError(ExecState*);
 }