Modified: trunk/Source/_javascript_Core/ChangeLog (192542 => 192543)
--- trunk/Source/_javascript_Core/ChangeLog 2015-11-17 22:46:53 UTC (rev 192542)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-11-17 22:48:19 UTC (rev 192543)
@@ -1,3 +1,21 @@
+2015-11-17 Benjamin Poulain <bpoul...@apple.com>
+
+ [JSC] Remove FTLOutput operations that act directly on floats
+ https://bugs.webkit.org/show_bug.cgi?id=151342
+
+ Reviewed by Geoffrey Garen.
+
+ * ftl/FTLLowerDFGToLLVM.cpp:
+ (JSC::FTL::DFG::LowerDFGToLLVM::compileArithFRound):
+ (JSC::FTL::DFG::LowerDFGToLLVM::compileGetByVal):
+ (JSC::FTL::DFG::LowerDFGToLLVM::compilePutByVal):
+ * ftl/FTLOutput.cpp:
+ (JSC::FTL::Output::store):
+ * ftl/FTLOutput.h:
+ (JSC::FTL::Output::loadFloatToDouble):
+ (JSC::FTL::Output::fround):
+ (JSC::FTL::Output::loadFloat): Deleted.
+
2015-11-17 Filip Pizlo <fpi...@apple.com>
Add a FTL_USES_B3 compile-time setting and set it to 0.
Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp (192542 => 192543)
--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp 2015-11-17 22:46:53 UTC (rev 192542)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp 2015-11-17 22:48:19 UTC (rev 192543)
@@ -2035,8 +2035,7 @@
void compileArithFRound()
{
- LValue floatValue = m_out.fpCast(lowDouble(m_node->child1()), m_out.floatType);
- setDouble(m_out.fpCast(floatValue, m_out.doubleType));
+ setDouble(m_out.fround(lowDouble(m_node->child1())));
}
void compileArithNegate()
@@ -2789,7 +2788,7 @@
LValue result;
switch (type) {
case TypeFloat32:
- result = m_out.fpCast(m_out.loadFloat(pointer), m_out.doubleType);
+ result = m_out.loadFloatToDouble(pointer);
break;
case TypeFloat64:
result = m_out.loadDouble(pointer);
@@ -3062,7 +3061,7 @@
LValue value = lowDouble(child3);
switch (type) {
case TypeFloat32:
- valueToStore = m_out.fpCast(value, m_out.floatType);
+ valueToStore = value;
refType = m_out.refFloat;
break;
case TypeFloat64:
Modified: trunk/Source/_javascript_Core/ftl/FTLOutput.cpp (192542 => 192543)
--- trunk/Source/_javascript_Core/ftl/FTLOutput.cpp 2015-11-17 22:46:53 UTC (rev 192542)
+++ trunk/Source/_javascript_Core/ftl/FTLOutput.cpp 2015-11-17 22:48:19 UTC (rev 192543)
@@ -91,6 +91,8 @@
void Output::store(LValue value, TypedPointer pointer, LType refType)
{
+ if (refType == refFloat)
+ value = buildFPCast(m_builder, value, floatType);
LValue result = set(value, intToPtr(pointer.value(), refType));
pointer.heap().decorateInstruction(result, *m_heaps);
}
Modified: trunk/Source/_javascript_Core/ftl/FTLOutput.h (192542 => 192543)
--- trunk/Source/_javascript_Core/ftl/FTLOutput.h 2015-11-17 22:46:53 UTC (rev 192542)
+++ trunk/Source/_javascript_Core/ftl/FTLOutput.h 2015-11-17 22:48:19 UTC (rev 192543)
@@ -224,6 +224,8 @@
LValue intToPtr(LValue value, LType type) { return buildIntToPtr(m_builder, value, type); }
LValue ptrToInt(LValue value, LType type) { return buildPtrToInt(m_builder, value, type); }
LValue bitCast(LValue value, LType type) { return buildBitCast(m_builder, value, type); }
+
+ LValue fround(LValue doubleValue);
// Hilariously, the #define machinery in the stdlib means that this method is actually called
// __builtin_alloca. So far this appears benign. :-|
@@ -249,7 +251,7 @@
LValue load32(TypedPointer pointer) { return load(pointer, ref32); }
LValue load64(TypedPointer pointer) { return load(pointer, ref64); }
LValue loadPtr(TypedPointer pointer) { return load(pointer, refPtr); }
- LValue loadFloat(TypedPointer pointer) { return load(pointer, refFloat); }
+ LValue loadFloatToDouble(TypedPointer pointer) { return buildFPCast(m_builder, load(pointer, refFloat), doubleType); }
LValue loadDouble(TypedPointer pointer) { return load(pointer, refDouble); }
void store16(LValue value, TypedPointer pointer) { store(value, pointer, ref16); }
void store32(LValue value, TypedPointer pointer) { store(value, pointer, ref32); }
@@ -463,6 +465,12 @@
return zeroExt(value16, int32);
}
+inline LValue Output::fround(LValue doubleValue)
+{
+ LValue floatValue = buildFPCast(m_builder, doubleValue, floatType);
+ return buildFPCast(m_builder, floatValue, doubleType);
+}
+
#define FTL_NEW_BLOCK(output, nameArguments) \
(LIKELY(!verboseCompilationEnabled()) \
? (output).newBlock() \