Title: [192493] trunk/Source/_javascript_Core
Revision
192493
Author
benja...@webkit.org
Date
2015-11-16 15:49:22 -0800 (Mon, 16 Nov 2015)

Log Message

[JSC] Add trivial lowering for B3's Div with doubles
https://bugs.webkit.org/show_bug.cgi?id=151292

Patch by Benjamin Poulain <bpoul...@apple.com> on 2015-11-16
Reviewed by Geoffrey Garen.

Filip had already made the constant propagation for it.
The Air Opcode was all we had left.

* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::lower):
* b3/air/AirOpcode.opcodes:
* b3/testb3.cpp:
(JSC::B3::testDivArgDouble):
(JSC::B3::testDivArgsDouble):
(JSC::B3::testDivArgImmDouble):
(JSC::B3::testDivImmArgDouble):
(JSC::B3::testDivImmsDouble):
(JSC::B3::run):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (192492 => 192493)


--- trunk/Source/_javascript_Core/ChangeLog	2015-11-16 23:47:10 UTC (rev 192492)
+++ trunk/Source/_javascript_Core/ChangeLog	2015-11-16 23:49:22 UTC (rev 192493)
@@ -1,5 +1,26 @@
 2015-11-16  Benjamin Poulain  <bpoul...@apple.com>
 
+        [JSC] Add trivial lowering for B3's Div with doubles
+        https://bugs.webkit.org/show_bug.cgi?id=151292
+
+        Reviewed by Geoffrey Garen.
+
+        Filip had already made the constant propagation for it.
+        The Air Opcode was all we had left.
+
+        * b3/B3LowerToAir.cpp:
+        (JSC::B3::Air::LowerToAir::lower):
+        * b3/air/AirOpcode.opcodes:
+        * b3/testb3.cpp:
+        (JSC::B3::testDivArgDouble):
+        (JSC::B3::testDivArgsDouble):
+        (JSC::B3::testDivArgImmDouble):
+        (JSC::B3::testDivImmArgDouble):
+        (JSC::B3::testDivImmsDouble):
+        (JSC::B3::run):
+
+2015-11-16  Benjamin Poulain  <bpoul...@apple.com>
+
         [JSC] Speed up the coalescing-related operation of the iterated register allocator
         https://bugs.webkit.org/show_bug.cgi?id=151290
 

Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (192492 => 192493)


--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-11-16 23:47:10 UTC (rev 192492)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-11-16 23:49:22 UTC (rev 192493)
@@ -1292,10 +1292,9 @@
                 append(Move, eax, tmp(m_value));
                 return;
             }
+            ASSERT(isFloat(m_value->type()));
 
-            // FIXME: Support doubles.
-            // https://bugs.webkit.org/show_bug.cgi?id=150991
-            RELEASE_ASSERT_NOT_REACHED();
+            appendBinOp<Air::Oops, Air::Oops, DivDouble>(m_value->child(0), m_value->child(1));
             return;
         }
 

Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (192492 => 192493)


--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2015-11-16 23:47:10 UTC (rev 192492)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2015-11-16 23:49:22 UTC (rev 192493)
@@ -78,6 +78,10 @@
 Add64 U:G, U:G, D:G
     Imm, Tmp, Tmp
 
+AddDouble U:F, UD:F
+    Tmp, Tmp
+    Addr, Tmp
+
 Sub32 U:G, UD:G
     Tmp, Tmp
     Imm, Addr
@@ -106,6 +110,10 @@
 Mul64 U:G, UD:G
     Tmp, Tmp
 
+DivDouble U:F, UD:F
+    Tmp, Tmp
+    Addr, Tmp
+
 X86ConvertToDoubleWord32 U:G, D:G
     Tmp*, Tmp*
 
@@ -132,10 +140,6 @@
     Tmp, Tmp
     Imm, Tmp
 
-AddDouble U:F, UD:F
-    Tmp, Tmp
-    Addr, Tmp
-
 Lshift32 U:G, UD:G
     Tmp*, Tmp
     Imm, Tmp

Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (192492 => 192493)


--- trunk/Source/_javascript_Core/b3/testb3.cpp	2015-11-16 23:47:10 UTC (rev 192492)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp	2015-11-16 23:49:22 UTC (rev 192493)
@@ -384,6 +384,70 @@
     test(1);
 }
 
+void testDivArgDouble(double a)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* value = root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0);
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<Value>(proc, Div, Origin(), value, value));
+
+    CHECK(isIdentical(compileAndRun<double>(proc, a), a / a));
+}
+
+void testDivArgsDouble(double a, double b)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* valueA = root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0);
+    Value* valueB = root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR1);
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<Value>(proc, Div, Origin(), valueA, valueB));
+
+    CHECK(isIdentical(compileAndRun<double>(proc, a, b), a / b));
+}
+
+void testDivArgImmDouble(double a, double b)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* valueA = root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0);
+    Value* valueB = root->appendNew<ConstDoubleValue>(proc, Origin(), b);
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<Value>(proc, Div, Origin(), valueA, valueB));
+
+    CHECK(isIdentical(compileAndRun<double>(proc, a), a / b));
+}
+
+void testDivImmArgDouble(double a, double b)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* valueA = root->appendNew<ConstDoubleValue>(proc, Origin(), a);
+    Value* valueB = root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0);
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<Value>(proc, Div, Origin(), valueA, valueB));
+
+    CHECK(isIdentical(compileAndRun<double>(proc, b), a / b));
+}
+
+void testDivImmsDouble(double a, double b)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* valueA = root->appendNew<ConstDoubleValue>(proc, Origin(), a);
+    Value* valueB = root->appendNew<ConstDoubleValue>(proc, Origin(), b);
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<Value>(proc, Div, Origin(), valueA, valueB));
+
+    CHECK(isIdentical(compileAndRun<double>(proc), a / b));
+}
+
 void testSubArg(int a)
 {
     Procedure proc;
@@ -4057,6 +4121,30 @@
     RUN(testMulArgs32(1, 2));
     RUN(testMulLoadTwice());
 
+    RUN(testDivArgDouble(M_PI));
+    RUN(testDivArgsDouble(M_PI, 1));
+    RUN(testDivArgsDouble(M_PI, -M_PI));
+    RUN(testDivArgImmDouble(M_PI, 1));
+    RUN(testDivArgImmDouble(M_PI, 0));
+    RUN(testDivArgImmDouble(M_PI, negativeZero()));
+    RUN(testDivArgImmDouble(0, 0));
+    RUN(testDivArgImmDouble(0, negativeZero()));
+    RUN(testDivArgImmDouble(negativeZero(), 0));
+    RUN(testDivArgImmDouble(negativeZero(), negativeZero()));
+    RUN(testDivImmArgDouble(M_PI, 1));
+    RUN(testDivImmArgDouble(M_PI, 0));
+    RUN(testDivImmArgDouble(M_PI, negativeZero()));
+    RUN(testDivImmArgDouble(0, 0));
+    RUN(testDivImmArgDouble(0, negativeZero()));
+    RUN(testDivImmArgDouble(negativeZero(), 0));
+    RUN(testDivImmArgDouble(negativeZero(), negativeZero()));
+    RUN(testDivImmsDouble(M_PI, 1));
+    RUN(testDivImmsDouble(M_PI, 0));
+    RUN(testDivImmsDouble(M_PI, negativeZero()));
+    RUN(testDivImmsDouble(0, 0));
+    RUN(testDivImmsDouble(0, negativeZero()));
+    RUN(testDivImmsDouble(negativeZero(), negativeZero()));
+
     RUN(testSubArg(24));
     RUN(testSubArgs(1, 1));
     RUN(testSubArgs(1, 2));
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to