Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(127)

Unified Diff: runtime/vm/assembler_dbc_test.cc

Issue 2162173002: DBC: Misc double instructions (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Make test deopt Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/tests/vm/dart/double_to_smi_test.dart ('k') | runtime/vm/constants_dbc.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/assembler_dbc_test.cc
diff --git a/runtime/vm/assembler_dbc_test.cc b/runtime/vm/assembler_dbc_test.cc
index 4f68a7b5476e258cb43d8e337f18110960ed4526..254f6387ad4ebdd10ca5361ae8555684f4d28604 100644
--- a/runtime/vm/assembler_dbc_test.cc
+++ b/runtime/vm/assembler_dbc_test.cc
@@ -2492,6 +2492,38 @@ ASSEMBLER_TEST_RUN(IfUGtFalse, test) {
}
+// - Min, Max rA, rB, rC
+//
+// FP[rA] <- {min, max}(FP[rB], FP[rC]). Assumes that FP[rB], and FP[rC] are
+// Smis.
+ASSEMBLER_TEST_GENERATE(Min, assembler) {
+ __ Frame(3);
+ __ LoadConstant(0, Smi::Handle(Smi::New(42)));
+ __ LoadConstant(1, Smi::Handle(Smi::New(500)));
+ __ Min(2, 0, 1);
+ __ Return(2);
+}
+
+
+ASSEMBLER_TEST_RUN(Min, test) {
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Max, assembler) {
+ __ Frame(3);
+ __ LoadConstant(0, Smi::Handle(Smi::New(42)));
+ __ LoadConstant(1, Smi::Handle(Smi::New(5)));
+ __ Max(2, 0, 1);
+ __ Return(2);
+}
+
+
+ASSEMBLER_TEST_RUN(Max, test) {
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+
#if defined(ARCH_IS_64_BIT)
// - UnboxDouble rA, rD
//
@@ -2638,6 +2670,158 @@ ASSEMBLER_TEST_RUN(DNeg, test) {
EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
}
+
+ASSEMBLER_TEST_GENERATE(DSqrt, assembler) {
+ __ Frame(2);
+ __ LoadConstant(0, Double::Handle(Double::New(36.0, Heap::kOld)));
+ __ UnboxDouble(0, 0);
+ __ DSqrt(1, 0);
+ __ Return(1);
+}
+
+
+ASSEMBLER_TEST_RUN(DSqrt, test) {
+ EXPECT_EQ(6.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
+}
+
+
+// - SmiToDouble rA, rD
+//
+// Convert the Smi in FP[rD] to an unboxed double in FP[rA].
+//
+// - DoubleToSmi rA, rD
+//
+// If the unboxed double in FP[rD] can be converted to a Smi in FP[rA], then
+// this instruction does so, and skips the following instruction. Otherwise,
+// the following instruction is not skipped.
+ASSEMBLER_TEST_GENERATE(SmiToDouble, assembler) {
+ __ Frame(2);
+ __ LoadConstant(0, Smi::Handle(Smi::New(42)));
+ __ SmiToDouble(1, 0);
+ __ Return(1);
+}
+
+
+ASSEMBLER_TEST_RUN(SmiToDouble, test) {
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(DoubleToSmi, assembler) {
+ __ Frame(2);
+ __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
+ __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
+ __ UnboxDouble(0, 0);
+ __ DoubleToSmi(1, 0);
+ __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
+ __ Return(1);
+}
+
+
+ASSEMBLER_TEST_RUN(DoubleToSmi, test) {
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMax, assembler) {
+ const double m = static_cast<double>(Smi::kMaxValue - 1000);
+ __ Frame(2);
+ __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld)));
+ __ LoadConstant(1, Smi::Handle(Smi::New(42)));
+ __ UnboxDouble(0, 0);
+ __ DoubleToSmi(0, 0);
+ __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
+ __ Return(1);
+}
+
+
+ASSEMBLER_TEST_RUN(DoubleToSmiNearMax, test) {
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMin, assembler) {
+ const double m = static_cast<double>(Smi::kMinValue);
+ __ Frame(2);
+ __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld)));
+ __ LoadConstant(1, Smi::Handle(Smi::New(42)));
+ __ UnboxDouble(0, 0);
+ __ DoubleToSmi(0, 0);
+ __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
+ __ Return(1);
+}
+
+
+ASSEMBLER_TEST_RUN(DoubleToSmiNearMin, test) {
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(DoubleToSmiFailPos, assembler) {
+ const double pos_overflow = static_cast<double>(Smi::kMaxValue + 1);
+ __ Frame(2);
+ __ LoadConstant(0, Double::Handle(Double::New(pos_overflow, Heap::kOld)));
+ __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
+ __ UnboxDouble(0, 0);
+ __ DoubleToSmi(1, 0);
+ __ LoadConstant(1, Smi::Handle(Smi::New(42)));
+ __ Return(1);
+}
+
+
+ASSEMBLER_TEST_RUN(DoubleToSmiFailPos, test) {
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(DoubleToSmiFailNeg, assembler) {
+ const double neg_overflow = static_cast<double>(Smi::kMinValue - 1000);
+ __ Frame(2);
+ __ LoadConstant(0, Double::Handle(Double::New(neg_overflow, Heap::kOld)));
+ __ LoadConstant(1, Smi::Handle(Smi::New(-1)));
+ __ UnboxDouble(0, 0);
+ __ DoubleToSmi(1, 0);
+ __ LoadConstant(1, Smi::Handle(Smi::New(42)));
+ __ Return(1);
+}
+
+
+ASSEMBLER_TEST_RUN(DoubleToSmiFailNeg, test) {
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(DMin, assembler) {
+ __ Frame(3);
+ __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
+ __ LoadConstant(1, Double::Handle(Double::New(500.0, Heap::kOld)));
+ __ UnboxDouble(0, 0);
+ __ UnboxDouble(1, 1);
+ __ DMin(2, 0, 1);
+ __ Return(2);
+}
+
+
+ASSEMBLER_TEST_RUN(DMin, test) {
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(DMax, assembler) {
+ __ Frame(3);
+ __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld)));
+ __ LoadConstant(1, Double::Handle(Double::New(5.0, Heap::kOld)));
+ __ UnboxDouble(0, 0);
+ __ UnboxDouble(1, 1);
+ __ DMax(2, 0, 1);
+ __ Return(2);
+}
+
+
+ASSEMBLER_TEST_RUN(DMax, test) {
+ EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code()));
+}
+
#endif // defined(ARCH_IS_64_BIT)
} // namespace dart
« no previous file with comments | « runtime/tests/vm/dart/double_to_smi_test.dart ('k') | runtime/vm/constants_dbc.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698