Title: [192857] trunk/Source/_javascript_Core
Revision
192857
Author
benja...@webkit.org
Date
2015-11-30 20:59:02 -0800 (Mon, 30 Nov 2015)

Log Message

[JSC] Add Sqrt to B3
https://bugs.webkit.org/show_bug.cgi?id=151692

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

* assembler/MacroAssemblerX86Common.h:
(JSC::MacroAssemblerX86Common::sqrtDouble):
* assembler/X86Assembler.h:
(JSC::X86Assembler::sqrtsd_mr):
* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::lower):
* b3/B3Opcode.cpp:
(WTF::printInternal):
* b3/B3Opcode.h:
* b3/B3Validate.cpp:
* b3/B3Value.cpp:
(JSC::B3::Value::effects):
(JSC::B3::Value::key):
(JSC::B3::Value::typeFor):
* b3/air/AirOpcode.opcodes:
* b3/testb3.cpp:
(JSC::B3::testSqrtArg):
(JSC::B3::testSqrtImm):
(JSC::B3::testSqrtMem):
(JSC::B3::run):
* ftl/FTLB3Output.h:
(JSC::FTL::Output::doubleSqrt):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (192856 => 192857)


--- trunk/Source/_javascript_Core/ChangeLog	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/ChangeLog	2015-12-01 04:59:02 UTC (rev 192857)
@@ -1,3 +1,33 @@
+2015-11-30  Benjamin Poulain  <bpoul...@apple.com>
+
+        [JSC] Add Sqrt to B3
+        https://bugs.webkit.org/show_bug.cgi?id=151692
+
+        Reviewed by Geoffrey Garen.
+
+        * assembler/MacroAssemblerX86Common.h:
+        (JSC::MacroAssemblerX86Common::sqrtDouble):
+        * assembler/X86Assembler.h:
+        (JSC::X86Assembler::sqrtsd_mr):
+        * b3/B3LowerToAir.cpp:
+        (JSC::B3::Air::LowerToAir::lower):
+        * b3/B3Opcode.cpp:
+        (WTF::printInternal):
+        * b3/B3Opcode.h:
+        * b3/B3Validate.cpp:
+        * b3/B3Value.cpp:
+        (JSC::B3::Value::effects):
+        (JSC::B3::Value::key):
+        (JSC::B3::Value::typeFor):
+        * b3/air/AirOpcode.opcodes:
+        * b3/testb3.cpp:
+        (JSC::B3::testSqrtArg):
+        (JSC::B3::testSqrtImm):
+        (JSC::B3::testSqrtMem):
+        (JSC::B3::run):
+        * ftl/FTLB3Output.h:
+        (JSC::FTL::Output::doubleSqrt):
+
 2015-11-30  Filip Pizlo  <fpi...@apple.com>
 
         FTL lazy slow paths should work with B3

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (192856 => 192857)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2015-12-01 04:59:02 UTC (rev 192857)
@@ -505,6 +505,11 @@
         m_assembler.sqrtsd_rr(src, dst);
     }
 
+    void sqrtDouble(Address src, FPRegisterID dst)
+    {
+        m_assembler.sqrtsd_mr(src.offset, src.base, dst);
+    }
+
     void absDouble(FPRegisterID src, FPRegisterID dst)
     {
         ASSERT(src != dst);

Modified: trunk/Source/_javascript_Core/assembler/X86Assembler.h (192856 => 192857)


--- trunk/Source/_javascript_Core/assembler/X86Assembler.h	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/assembler/X86Assembler.h	2015-12-01 04:59:02 UTC (rev 192857)
@@ -2137,7 +2137,13 @@
         m_formatter.prefix(PRE_SSE_F2);
         m_formatter.twoByteOp(OP2_SQRTSD_VsdWsd, (RegisterID)dst, (RegisterID)src);
     }
-    
+
+    void sqrtsd_mr(int offset, RegisterID base, XMMRegisterID dst)
+    {
+        m_formatter.prefix(PRE_SSE_F2);
+        m_formatter.twoByteOp(OP2_SQRTSD_VsdWsd, (RegisterID)dst, base, offset);
+    }
+
     // Misc instructions:
 
     void int3()

Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (192856 => 192857)


--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-12-01 04:59:02 UTC (rev 192857)
@@ -1463,6 +1463,11 @@
             return;
         }
 
+        case Sqrt: {
+            appendUnOp<Air::Oops, Air::Oops, SqrtDouble>(m_value->child(0));
+            return;
+        }
+
         case BitwiseCast: {
             appendUnOp<Air::Oops, Move64ToDouble, MoveDoubleTo64>(m_value->child(0));
             return;

Modified: trunk/Source/_javascript_Core/b3/B3Opcode.cpp (192856 => 192857)


--- trunk/Source/_javascript_Core/b3/B3Opcode.cpp	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/b3/B3Opcode.cpp	2015-12-01 04:59:02 UTC (rev 192857)
@@ -137,6 +137,9 @@
     case ZShr:
         out.print("ZShr");
         return;
+    case Sqrt:
+        out.print("Sqrt");
+        return;
     case BitwiseCast:
         out.print("BitwiseCast");
         return;

Modified: trunk/Source/_javascript_Core/b3/B3Opcode.h (192856 => 192857)


--- trunk/Source/_javascript_Core/b3/B3Opcode.h	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/b3/B3Opcode.h	2015-12-01 04:59:02 UTC (rev 192857)
@@ -81,6 +81,9 @@
     SShr, // Arithmetic Shift.
     ZShr, // Logical Shift.
 
+    // Double math.
+    Sqrt,
+
     // Casts and such.
     // Bitwise Cast of Double->Int64 or Int64->Double
     BitwiseCast,

Modified: trunk/Source/_javascript_Core/b3/B3Validate.cpp (192856 => 192857)


--- trunk/Source/_javascript_Core/b3/B3Validate.cpp	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/b3/B3Validate.cpp	2015-12-01 04:59:02 UTC (rev 192857)
@@ -197,6 +197,7 @@
                 VALIDATE(value->child(0)->type() == Int64, ("At ", *value));
                 VALIDATE(value->type() == Int32, ("At ", *value));
                 break;
+            case Sqrt:
             case FRound:
                 VALIDATE(value->numChildren() == 1, ("At ", *value));
                 VALIDATE(value->child(0)->type() == Double, ("At ", *value));

Modified: trunk/Source/_javascript_Core/b3/B3Value.cpp (192856 => 192857)


--- trunk/Source/_javascript_Core/b3/B3Value.cpp	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/b3/B3Value.cpp	2015-12-01 04:59:02 UTC (rev 192857)
@@ -325,6 +325,7 @@
     case Shl:
     case SShr:
     case ZShr:
+    case Sqrt:
     case BitwiseCast:
     case SExt8:
     case SExt16:
@@ -400,6 +401,7 @@
     case FramePointer:
         return ValueKey(opcode(), type());
     case Identity:
+    case Sqrt:
     case SExt8:
     case SExt16:
     case SExt32:
@@ -496,6 +498,7 @@
     case Shl:
     case SShr:
     case ZShr:
+    case Sqrt:
     case CheckAdd:
     case CheckSub:
     case CheckMul:

Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (192856 => 192857)


--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2015-12-01 04:59:02 UTC (rev 192857)
@@ -203,6 +203,10 @@
     Tmp
     Addr
 
+SqrtDouble U:F, UD:F
+    Tmp, Tmp
+    Addr, Tmp
+
 ConvertInt32ToDouble U:G, D:F
     Tmp, Tmp
     Addr, Tmp

Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (192856 => 192857)


--- trunk/Source/_javascript_Core/b3/testb3.cpp	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp	2015-12-01 04:59:02 UTC (rev 192857)
@@ -1884,6 +1884,44 @@
     CHECK(compileAndRun<uint32_t>(proc, a) == (a >> b));
 }
 
+void testSqrtArg(double a)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<Value>(
+            proc, Sqrt, Origin(),
+                root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0)));
+
+    CHECK(isIdentical(compileAndRun<double>(proc, a), sqrt(a)));
+}
+
+void testSqrtImm(double a)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* argument = root->appendNew<ConstDoubleValue>(proc, Origin(), a);
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<Value>(proc, Sqrt, Origin(), argument));
+
+    CHECK(isIdentical(compileAndRun<double>(proc), sqrt(a)));
+}
+
+void testSqrtMem(double a)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* address = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
+    MemoryValue* loadDouble = root->appendNew<MemoryValue>(proc, Load, Double, Origin(), address);
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<Value>(proc, Sqrt, Origin(), loadDouble));
+
+    CHECK(isIdentical(compileAndRun<double>(proc, &a), sqrt(a)));
+}
+
 void testDoubleArgToInt64BitwiseCast(double value)
 {
     Procedure proc;
@@ -5682,6 +5720,10 @@
     RUN(testZShrArgImm32(0xffffffff, 1));
     RUN(testZShrArgImm32(0xffffffff, 63));
 
+    RUN_UNARY(testSqrtArg, doubleOperands());
+    RUN_UNARY(testSqrtImm, doubleOperands());
+    RUN_UNARY(testSqrtMem, doubleOperands());
+
     RUN_UNARY(testDoubleArgToInt64BitwiseCast, doubleOperands());
     RUN_UNARY(testDoubleImmToInt64BitwiseCast, doubleOperands());
     RUN_UNARY(testTwoBitwiseCastOnDouble, doubleOperands());

Modified: trunk/Source/_javascript_Core/ftl/FTLB3Output.h (192856 => 192857)


--- trunk/Source/_javascript_Core/ftl/FTLB3Output.h	2015-12-01 04:43:28 UTC (rev 192856)
+++ trunk/Source/_javascript_Core/ftl/FTLB3Output.h	2015-12-01 04:59:02 UTC (rev 192857)
@@ -166,7 +166,7 @@
 
     LValue doublePowi(LValue xOperand, LValue yOperand) { CRASH(); }
 
-    LValue doubleSqrt(LValue value) { CRASH(); }
+    LValue doubleSqrt(LValue value) { return m_block->appendNew<B3::Value>(m_proc, B3::Sqrt, origin(), value); }
 
     LValue doubleLog(LValue value) { CRASH(); }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to