Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (192523 => 192524)
--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2015-11-17 20:23:02 UTC (rev 192523)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2015-11-17 20:24:12 UTC (rev 192524)
@@ -1260,7 +1260,7 @@
}
case Mul: {
- appendBinOp<Mul32, Mul64, Air::Oops, Commutative>(
+ appendBinOp<Mul32, Mul64, MulDouble, Commutative>(
m_value->child(0), m_value->child(1));
return;
}
Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (192523 => 192524)
--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-11-17 20:23:02 UTC (rev 192523)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-11-17 20:24:12 UTC (rev 192524)
@@ -114,6 +114,10 @@
Mul64 U:G, UD:G
Tmp, Tmp
+MulDouble U:F, UD:F
+ Tmp, Tmp
+ Addr, Tmp
+
DivDouble U:F, UD:F
Tmp, Tmp
Addr, Tmp
Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (192523 => 192524)
--- trunk/Source/_javascript_Core/b3/testb3.cpp 2015-11-17 20:23:02 UTC (rev 192523)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp 2015-11-17 20:24:12 UTC (rev 192524)
@@ -386,6 +386,70 @@
test(1);
}
+void testMulArgDouble(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, Mul, Origin(), value, value));
+
+ CHECK(isIdentical(compileAndRun<double>(proc, a), a * a));
+}
+
+void testMulArgsDouble(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, Mul, Origin(), valueA, valueB));
+
+ CHECK(isIdentical(compileAndRun<double>(proc, a, b), a * b));
+}
+
+void testMulArgImmDouble(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, Mul, Origin(), valueA, valueB));
+
+ CHECK(isIdentical(compileAndRun<double>(proc, a), a * b));
+}
+
+void testMulImmArgDouble(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, Mul, Origin(), valueA, valueB));
+
+ CHECK(isIdentical(compileAndRun<double>(proc, b), a * b));
+}
+
+void testMulImmsDouble(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, Mul, Origin(), valueA, valueB));
+
+ CHECK(isIdentical(compileAndRun<double>(proc), a * b));
+}
+
void testDivArgDouble(double a)
{
Procedure proc;
@@ -4396,6 +4460,12 @@
RUN(testMulArgs32(1, 2));
RUN(testMulLoadTwice());
+ RUN_UNARY(testMulArgDouble, doubleOperands());
+ RUN_BINARY(testMulArgsDouble, doubleOperands(), doubleOperands());
+ RUN_BINARY(testMulArgImmDouble, doubleOperands(), doubleOperands());
+ RUN_BINARY(testMulImmArgDouble, doubleOperands(), doubleOperands());
+ RUN_BINARY(testMulImmsDouble, doubleOperands(), doubleOperands());
+
RUN(testDivArgDouble(M_PI));
RUN(testDivArgsDouble(M_PI, 1));
RUN(testDivArgsDouble(M_PI, -M_PI));