Add a fast path for bitwise-and of two immediate numbers for a 0.7% improvement in...
authoroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Nov 2007 22:23:39 +0000 (22:23 +0000)
committeroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Nov 2007 22:23:39 +0000 (22:23 +0000)
Reviewed by Sam.

This only improves bitwise-and performance, as the additional logic required
for similar code paths on or, xor, and shifting requires additional operations
and branches that negate (and in certain cases, regress) any advantage we might
otherwise receive.

This improves performance on all bitop tests, the cryptography tests, as well as
the string-base64 and string-unpack-code tests.  No significant degradation on
any other tests.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/JSImmediate.h
JavaScriptCore/kjs/nodes.cpp
JavaScriptCore/kjs/value.h

index 97eace01d1336d12717d37cdd3d7b6a579b5406d..8a06e0a10bbf3944e71fa7d084cf4bd7568237b2 100644 (file)
@@ -1,3 +1,26 @@
+2007-11-08  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Sam.
+
+        Add a fast path for bitwise-and of two immediate numbers for a 0.7% improvement in SunSpider (4% bitop improvement).
+
+        This only improves bitwise-and performance, as the additional logic required 
+        for similar code paths on or, xor, and shifting requires additional operations
+        and branches that negate (and in certain cases, regress) any advantage we might
+        otherwise receive.
+
+        This improves performance on all bitop tests, the cryptography tests, as well as 
+        the string-base64 and string-unpack-code tests.  No significant degradation on 
+        any other tests.
+
+        * kjs/JSImmediate.h:
+        (KJS::JSImmediate::areBothImmediateNumbers):
+        (KJS::JSImmediate::andImmediateNumbers):
+        * kjs/nodes.cpp:
+        (KJS::BitAndNode::evaluate):
+        * kjs/value.h:
+        (KJS::jsNumberFromAnd):
+
 2007-11-08  Adam Roben  <aroben@apple.com>
 
         Stop using KJS inside of MathExtras.h
index fd263df5c84f7b24064c86db2b05b0585238d824..59998d9d4313a275aa3e2a31d56fa0c1b45f08d4 100644 (file)
@@ -82,6 +82,17 @@ public:
         return (getTag(v) == UndefinedType);
     }
 
+    static ALWAYS_INLINE bool areBothImmediateNumbers(const JSValue* v1, const JSValue* v2)
+    {
+        return (reinterpret_cast<uintptr_t>(v1) & reinterpret_cast<uintptr_t>(v2) & TagMask) == NumberType;
+    }
+
+    static ALWAYS_INLINE JSValue* andImmediateNumbers(const JSValue* v1, const JSValue* v2)
+    {
+        ASSERT(areBothImmediateNumbers(v1, v2));
+        return reinterpret_cast<JSValue*>(reinterpret_cast<uintptr_t>(v1) & reinterpret_cast<uintptr_t>(v2));
+    }
+
     static JSValue* fromDouble(double d);
     static double toDouble(const JSValue*);
     static bool toBoolean(const JSValue*);
index fa88e8db77cc4ee364652c02279178e147039f63..f87a29d995ea12bcc539d935d496a891301aa474 100644 (file)
@@ -2185,13 +2185,13 @@ void BitAndNode::optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::No
 
 // ECMA 11.10
 JSValue *BitAndNode::evaluate(ExecState *exec)
-{
+{    
   JSValue *v1 = expr1->evaluate(exec);
   KJS_CHECKEXCEPTIONVALUE
   JSValue *v2 = expr2->evaluate(exec);
   KJS_CHECKEXCEPTIONVALUE
   
-  return jsNumber(v1->toInt32(exec) & v2->toInt32(exec));
+  return jsNumberFromAnd(exec, v1, v2);
 }
 
 void BitXOrNode::optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack& nodeStack)
index 7411af5c4fb1abae3112cc78aae6e47b03e17813..1ebd3848fad0dba43cec06871682b604009d162a 100644 (file)
@@ -204,6 +204,13 @@ ALWAYS_INLINE JSValue* jsNumber(double d)
     return v ? v : jsNumberCell(d);
 }
 
+ALWAYS_INLINE JSValue* jsNumberFromAnd(ExecState *exec, JSValue* v1, JSValue* v2)
+{
+    if (JSImmediate::areBothImmediateNumbers(v1, v2))
+        return JSImmediate::andImmediateNumbers(v1, v2);
+    return jsNumber(v1->toInt32(exec) & v2->toInt32(exec));
+}
+
 inline JSValue::JSValue()
 {
 }