Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (192492 => 192493)
--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-11-16 23:47:10 UTC (rev 192492)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-11-16 23:49:22 UTC (rev 192493)
@@ -78,6 +78,10 @@
Add64 U:G, U:G, D:G
Imm, Tmp, Tmp
+AddDouble U:F, UD:F
+ Tmp, Tmp
+ Addr, Tmp
+
Sub32 U:G, UD:G
Tmp, Tmp
Imm, Addr
@@ -106,6 +110,10 @@
Mul64 U:G, UD:G
Tmp, Tmp
+DivDouble U:F, UD:F
+ Tmp, Tmp
+ Addr, Tmp
+
X86ConvertToDoubleWord32 U:G, D:G
Tmp*, Tmp*
@@ -132,10 +140,6 @@
Tmp, Tmp
Imm, Tmp
-AddDouble U:F, UD:F
- Tmp, Tmp
- Addr, Tmp
-
Lshift32 U:G, UD:G
Tmp*, Tmp
Imm, Tmp
Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (192492 => 192493)
--- trunk/Source/_javascript_Core/b3/testb3.cpp 2015-11-16 23:47:10 UTC (rev 192492)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp 2015-11-16 23:49:22 UTC (rev 192493)
@@ -384,6 +384,70 @@
test(1);
}
+void testDivArgDouble(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, Div, Origin(), value, value));
+
+ CHECK(isIdentical(compileAndRun<double>(proc, a), a / a));
+}
+
+void testDivArgsDouble(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, Div, Origin(), valueA, valueB));
+
+ CHECK(isIdentical(compileAndRun<double>(proc, a, b), a / b));
+}
+
+void testDivArgImmDouble(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, Div, Origin(), valueA, valueB));
+
+ CHECK(isIdentical(compileAndRun<double>(proc, a), a / b));
+}
+
+void testDivImmArgDouble(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, Div, Origin(), valueA, valueB));
+
+ CHECK(isIdentical(compileAndRun<double>(proc, b), a / b));
+}
+
+void testDivImmsDouble(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, Div, Origin(), valueA, valueB));
+
+ CHECK(isIdentical(compileAndRun<double>(proc), a / b));
+}
+
void testSubArg(int a)
{
Procedure proc;
@@ -4057,6 +4121,30 @@
RUN(testMulArgs32(1, 2));
RUN(testMulLoadTwice());
+ RUN(testDivArgDouble(M_PI));
+ RUN(testDivArgsDouble(M_PI, 1));
+ RUN(testDivArgsDouble(M_PI, -M_PI));
+ RUN(testDivArgImmDouble(M_PI, 1));
+ RUN(testDivArgImmDouble(M_PI, 0));
+ RUN(testDivArgImmDouble(M_PI, negativeZero()));
+ RUN(testDivArgImmDouble(0, 0));
+ RUN(testDivArgImmDouble(0, negativeZero()));
+ RUN(testDivArgImmDouble(negativeZero(), 0));
+ RUN(testDivArgImmDouble(negativeZero(), negativeZero()));
+ RUN(testDivImmArgDouble(M_PI, 1));
+ RUN(testDivImmArgDouble(M_PI, 0));
+ RUN(testDivImmArgDouble(M_PI, negativeZero()));
+ RUN(testDivImmArgDouble(0, 0));
+ RUN(testDivImmArgDouble(0, negativeZero()));
+ RUN(testDivImmArgDouble(negativeZero(), 0));
+ RUN(testDivImmArgDouble(negativeZero(), negativeZero()));
+ RUN(testDivImmsDouble(M_PI, 1));
+ RUN(testDivImmsDouble(M_PI, 0));
+ RUN(testDivImmsDouble(M_PI, negativeZero()));
+ RUN(testDivImmsDouble(0, 0));
+ RUN(testDivImmsDouble(0, negativeZero()));
+ RUN(testDivImmsDouble(negativeZero(), negativeZero()));
+
RUN(testSubArg(24));
RUN(testSubArgs(1, 1));
RUN(testSubArgs(1, 2));