Reduce branching in implementations of some operator implementations, yielding 1...
authoroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 24 Oct 2007 02:01:53 +0000 (02:01 +0000)
committeroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 24 Oct 2007 02:01:53 +0000 (02:01 +0000)
Reviewed by Maciej

        * kjs/nodes.cpp:
        (KJS::MultNode::evaluate):
        (KJS::DivNode::evaluate):
        (KJS::ModNode::evaluate):
        (KJS::add):
        (KJS::sub):
        (KJS::AddNode::evaluate):
        (KJS::SubNode::evaluate):
        (KJS::valueForReadModifyAssignment):
        * kjs/operations.cpp:
        * kjs/operations.h:

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/nodes.cpp
JavaScriptCore/kjs/operations.cpp
JavaScriptCore/kjs/operations.h

index 3c0ce9b394cb195a886fcc73ddf69d5174dd14ee..5b43fd062c8641e8f70b46b0f27dff482d5d65b1 100644 (file)
@@ -1,3 +1,21 @@
+2007-10-23  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Maciej.
+
+        Reduce branching in implementations of some operator implementations, yielding 1.3% boost to SunSpider.
+
+        * kjs/nodes.cpp:
+        (KJS::MultNode::evaluate):
+        (KJS::DivNode::evaluate):
+        (KJS::ModNode::evaluate):
+        (KJS::add):
+        (KJS::sub):
+        (KJS::AddNode::evaluate):
+        (KJS::SubNode::evaluate):
+        (KJS::valueForReadModifyAssignment):
+        * kjs/operations.cpp:
+        * kjs/operations.h:
+
 2007-10-23  Oliver Hunt  <oliver@apple.com>
 
         Reviewed by Maciej.
index 5847900ddfb71918718de633f816e51de37923da..ef0ce74ef177cb3a29c72f1d7b72a7571276fc2a 100644 (file)
@@ -1193,8 +1193,8 @@ JSValue *MultNode::evaluate(ExecState *exec)
         
     JSValue *v2 = term2->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
-        
-    return mult(exec, v1, v2, '*');
+
+    return jsNumber(v1->toNumber(exec) * v2->toNumber(exec));
 }
 
 // ECMA 11.5.2
@@ -1205,8 +1205,8 @@ JSValue *DivNode::evaluate(ExecState *exec)
         
     JSValue *v2 = term2->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
-        
-    return mult(exec, v1, v2, '/');
+
+    return jsNumber(v1->toNumber(exec) / v2->toNumber(exec));
 }
 
 // ECMA 11.5.3
@@ -1217,12 +1217,41 @@ JSValue *ModNode::evaluate(ExecState *exec)
         
     JSValue *v2 = term2->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
-        
-    return mult(exec, v1, v2, '%');
+
+    return jsNumber(fmod(v1->toNumber(exec), v2->toNumber(exec)));
 }
 
 // ------------------------------ Additive Nodes --------------------------------------
 
+
+// ECMA 11.6
+static inline JSValue *add(ExecState *exec, JSValue *v1, JSValue *v2)
+{
+    // exception for the Date exception in defaultValue()
+    JSValue *p1 = v1->toPrimitive(exec, UnspecifiedType);
+    JSValue *p2 = v2->toPrimitive(exec, UnspecifiedType);
+    
+    if (p1->isString() || p2->isString()) {
+        UString value = p1->toString(exec) + p2->toString(exec);
+        if (value.isNull()) {
+            JSObject *error = Error::create(exec, GeneralError, "Out of memory");
+            exec->setException(error);
+            return error;
+        } else
+            return jsString(value);
+    }
+    
+    return jsNumber(p1->toNumber(exec) + p2->toNumber(exec));
+}
+
+static inline JSValue *sub(ExecState *exec, JSValue *v1, JSValue *v2)
+{
+    JSValue *p1 = v1->toPrimitive(exec, NumberType);
+    JSValue *p2 = v2->toPrimitive(exec, NumberType);
+
+    return jsNumber(p1->toNumber(exec) - p2->toNumber(exec));
+}
+
 // ECMA 11.6.1
 JSValue *AddNode::evaluate(ExecState *exec)
 {
@@ -1232,7 +1261,7 @@ JSValue *AddNode::evaluate(ExecState *exec)
   JSValue *v2 = term2->evaluate(exec);
   KJS_CHECKEXCEPTIONVALUE
 
-  return add(exec, v1, v2, '+');
+  return add(exec, v1, v2);
 }
 
 
@@ -1245,7 +1274,7 @@ JSValue *SubNode::evaluate(ExecState *exec)
     JSValue *v2 = term2->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
         
-    return add(exec, v1, v2, '-');
+    return sub(exec, v1, v2);
 }
 
 // ------------------------------ Shift Nodes ------------------------------------
@@ -1520,16 +1549,16 @@ static ALWAYS_INLINE JSValue *valueForReadModifyAssignment(ExecState * exec, JSV
   unsigned int ui;
   switch (oper) {
   case OpMultEq:
-    v = mult(exec, v1, v2, '*');
+    v = jsNumber(v1->toNumber(exec) * v2->toNumber(exec));
     break;
   case OpDivEq:
-    v = mult(exec, v1, v2, '/');
+    v = jsNumber(v1->toNumber(exec) / v2->toNumber(exec));
     break;
   case OpPlusEq:
-    v = add(exec, v1, v2, '+');
+    v = add(exec, v1, v2);
     break;
   case OpMinusEq:
-    v = add(exec, v1, v2, '-');
+    v = sub(exec, v1, v2);
     break;
   case OpLShift:
     i1 = v1->toInt32(exec);
index dd8a58d7a0f323c12afb2c1d499acc37812041af..b13ee78154bfa2ee9b1452250ae2f6d36a18cbcb 100644 (file)
@@ -216,46 +216,4 @@ int minInt(int d1, int d2)
     return (d1 < d2) ? d1 : d2;
 }
 
-// ECMA 11.6
-JSValue *add(ExecState *exec, JSValue *v1, JSValue *v2, char oper)
-{
-    // exception for the Date exception in defaultValue()
-    JSType preferred = oper == '+' ? UnspecifiedType : NumberType;
-    JSValue *p1 = v1->toPrimitive(exec, preferred);
-    JSValue *p2 = v2->toPrimitive(exec, preferred);
-    
-    if ((p1->isString() || p2->isString()) && oper == '+') {
-        UString value = p1->toString(exec) + p2->toString(exec);
-        if (value.isNull()) {
-            JSObject *error = Error::create(exec, GeneralError, "Out of memory");
-            exec->setException(error);
-            return error;
-        } else
-            return jsString(value);
-    }
-    
-    if (oper == '+')
-        return jsNumber(p1->toNumber(exec) + p2->toNumber(exec));
-    else
-        return jsNumber(p1->toNumber(exec) - p2->toNumber(exec));
-}
-
-// ECMA 11.5
-JSValue *mult(ExecState *exec, JSValue *v1, JSValue *v2, char oper)
-{
-    double n1 = v1->toNumber(exec);
-    double n2 = v2->toNumber(exec);
-    
-    double result;
-    
-    if (oper == '*')
-        result = n1 * n2;
-    else if (oper == '/')
-        result = n1 / n2;
-    else
-        result = fmod(n1, n2);
-    
-    return jsNumber(result);
-}
-
 }
index 818b0a39a3c075d53ce1835dfe76c29817084273..a055ae845b322d118e5094a02a26b3ecceb51621 100644 (file)
@@ -55,21 +55,6 @@ namespace KJS {
   int relation(ExecState *exec, JSValue *v1, JSValue *v2);
   int maxInt(int d1, int d2);
   int minInt(int d1, int d2);
-  /**
-   * Additive operator. Either performs an addition or substraction of v1
-   * and v2.
-   * @param oper '+' or '-' for an addition or substraction, respectively.
-   * @return The result of the operation.
-   */
-  JSValue *add(ExecState *exec, JSValue *v1, JSValue *v2, char oper);
-  /**
-   * Multiplicative operator. Either multiplies/divides v1 and v2 or
-   * calculates the remainder from an division.
-   * @param oper '*', '/' or '%' for a multiplication, division or
-   * modulo operation.
-   * @return The result of the operation.
-   */
-  JSValue *mult(ExecState *exec, JSValue *v1, JSValue *v2, char oper);
 
 }