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(); }