Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (204479 => 204480)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2016-08-15 21:04:49 UTC (rev 204480)
@@ -1856,6 +1856,11 @@
m_assembler.fneg<64>(dest, src);
}
+ void negateFloat(FPRegisterID src, FPRegisterID dest)
+ {
+ m_assembler.fneg<32>(dest, src);
+ }
+
void sqrtDouble(FPRegisterID src, FPRegisterID dest)
{
m_assembler.fsqrt<64>(dest, src);
Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (204479 => 204480)
--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2016-08-15 21:04:49 UTC (rev 204480)
@@ -1835,7 +1835,7 @@
}
}
- appendUnOp<Neg32, Neg64, NegateDouble, Air::Oops>(m_value->child(0));
+ appendUnOp<Neg32, Neg64, NegateDouble, NegateFloat>(m_value->child(0));
return;
}
Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (204479 => 204480)
--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2016-08-15 21:04:49 UTC (rev 204480)
@@ -205,6 +205,9 @@
arm64: NegateDouble U:F:64, D:F:64
Tmp, Tmp
+arm64: NegateFloat U:F:32, D:F:32
+ Tmp, Tmp
+
Mul32 U:G:32, UZD:G:32
Tmp, Tmp
x86: Addr, Tmp
Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (204479 => 204480)
--- trunk/Source/_javascript_Core/b3/testb3.cpp 2016-08-15 20:55:16 UTC (rev 204479)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp 2016-08-15 21:04:49 UTC (rev 204480)
@@ -2170,6 +2170,48 @@
CHECK(isIdentical(effect, static_cast<double>(a) - static_cast<double>(b)));
}
+void testNegDouble(double a)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNewControlValue(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, Neg, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0)));
+
+ CHECK(isIdentical(compileAndRun<double>(proc, a), -a));
+}
+
+void testNegFloat(float a)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* argument32 = root->appendNew<Value>(proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));
+ Value* floatValue = root->appendNew<Value>(proc, BitwiseCast, Origin(), argument32);
+ root->appendNewControlValue(
+ proc, Return, Origin(),
+ root->appendNew<Value>(proc, Neg, Origin(), floatValue));
+
+ CHECK(isIdentical(compileAndRun<float>(proc, bitwise_cast<int32_t>(a)), -a));
+}
+
+void testNegFloatWithUselessDoubleConversion(float a)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* argumentInt32 = root->appendNew<Value>(proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));
+ Value* floatValue = root->appendNew<Value>(proc, BitwiseCast, Origin(), argumentInt32);
+ Value* asDouble = root->appendNew<Value>(proc, FloatToDouble, Origin(), floatValue);
+ Value* result = root->appendNew<Value>(proc, Neg, Origin(), asDouble);
+ Value* floatResult = root->appendNew<Value>(proc, DoubleToFloat, Origin(), result);
+ root->appendNewControlValue(proc, Return, Origin(), floatResult);
+
+ CHECK(isIdentical(compileAndRun<float>(proc, bitwise_cast<int32_t>(a)), -a));
+}
+
void testBitAndArgs(int64_t a, int64_t b)
{
Procedure proc;
@@ -13166,6 +13208,10 @@
RUN_BINARY(testSubArgsFloatWithUselessDoubleConversion, floatingPointOperands<float>(), floatingPointOperands<float>());
RUN_BINARY(testSubArgsFloatWithEffectfulDoubleConversion, floatingPointOperands<float>(), floatingPointOperands<float>());
+ RUN_UNARY(testNegDouble, floatingPointOperands<double>());
+ RUN_UNARY(testNegFloat, floatingPointOperands<float>());
+ RUN_UNARY(testNegFloatWithUselessDoubleConversion, floatingPointOperands<float>());
+
RUN(testBitAndArgs(43, 43));
RUN(testBitAndArgs(43, 0));
RUN(testBitAndArgs(10, 3));