Index: runtime/vm/assembler_mips_test.cc |
diff --git a/runtime/vm/assembler_mips_test.cc b/runtime/vm/assembler_mips_test.cc |
index e3cad3d6a91c1266688f625e4c81cce0588d144c..1a541a62daa6283fef7b15623a87259f3959a275 100644 |
--- a/runtime/vm/assembler_mips_test.cc |
+++ b/runtime/vm/assembler_mips_test.cc |
@@ -1976,107 +1976,130 @@ ASSEMBLER_TEST_RUN(Cop1COLE_not_taken, test) { |
} |
-ASSEMBLER_TEST_GENERATE(Cop1CvtDW, assembler) { |
- __ LoadImmediate(T0, 42); |
- __ mtc1(T0, F2); |
- __ cvtdw(D0, F2); |
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD, assembler) { |
+ __ LoadImmediate(D1, 42.9); |
+ __ truncwd(F0, D1); |
+ __ mfc1(V0, F0); |
__ Ret(); |
} |
-ASSEMBLER_TEST_RUN(Cop1CvtDW, test) { |
- typedef double (*SimpleCode)() DART_UNUSED; |
+ASSEMBLER_TEST_RUN(Cop1TruncWD, test) { |
+ typedef int (*SimpleCode)() DART_UNUSED; |
EXPECT(test != NULL); |
- double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
- EXPECT_FLOAT_EQ(42.0, res, 0.001); |
+ EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
} |
-ASSEMBLER_TEST_GENERATE(Cop1CvtDW_neg, assembler) { |
- __ LoadImmediate(T0, -42); |
- __ mtc1(T0, F2); |
- __ cvtdw(D0, F2); |
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_neg, assembler) { |
+ __ LoadImmediate(D1, -42.9); |
+ __ truncwd(F0, D1); |
+ __ mfc1(V0, F0); |
__ Ret(); |
} |
-ASSEMBLER_TEST_RUN(Cop1CvtDW_neg, test) { |
- typedef double (*SimpleCode)() DART_UNUSED; |
+ASSEMBLER_TEST_RUN(Cop1TruncWD_neg, test) { |
+ typedef int (*SimpleCode)() DART_UNUSED; |
EXPECT(test != NULL); |
- double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
- EXPECT_FLOAT_EQ(-42.0, res, 0.001); |
+ EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
} |
-ASSEMBLER_TEST_GENERATE(Cop1CvtDL, assembler) { |
- if (TargetCPUFeatures::mips_version() == MIPS32r2) { |
- __ LoadImmediate(T0, 0x1); |
- __ mtc1(ZR, F2); |
- __ mtc1(T0, F3); // D0 <- 0x100000000 = 4294967296 |
- __ cvtdl(D0, D1); |
- } else { |
- __ LoadImmediate(D0, 4294967296.0); |
- } |
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_NaN, assembler) { |
+ // Double non-signaling NaN is 0x7FF8000000000000. |
+ __ LoadImmediate(T0, 0x7FF80000); |
+ __ mtc1(ZR, F2); // Load upper bits of NaN. |
+ __ mtc1(T0, F3); // Load lower bits of NaN. |
+ __ truncwd(F0, D1); |
+ __ mfc1(V0, F0); |
__ Ret(); |
} |
-ASSEMBLER_TEST_RUN(Cop1CvtDL, test) { |
+ASSEMBLER_TEST_RUN(Cop1TruncWD_NaN, test) { |
typedef double (*SimpleCode)() DART_UNUSED; |
EXPECT(test != NULL); |
- double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
- EXPECT_FLOAT_EQ(4294967296.0, res, 0.001); |
+ EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
} |
-ASSEMBLER_TEST_GENERATE(Cop1CvtDL_neg, assembler) { |
- if (TargetCPUFeatures::mips_version() == MIPS32r2) { |
- __ LoadImmediate(T0, 0xffffffff); |
- __ mtc1(T0, F2); |
- __ mtc1(T0, F3); // D0 <- 0xffffffffffffffff = -1 |
- __ cvtdl(D0, D1); |
- } else { |
- __ LoadImmediate(D0, -1.0); |
- } |
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Inf, assembler) { |
+ __ LoadImmediate(T0, 0x7FF00000); // +inf |
+ __ mtc1(ZR, F2); |
+ __ mtc1(T0, F3); |
+ __ truncwd(F0, D1); |
+ __ mfc1(V0, F0); |
__ Ret(); |
} |
-ASSEMBLER_TEST_RUN(Cop1CvtDL_neg, test) { |
+ASSEMBLER_TEST_RUN(Cop1TruncWD_Inf, test) { |
typedef double (*SimpleCode)() DART_UNUSED; |
EXPECT(test != NULL); |
- double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
- EXPECT_FLOAT_EQ(-1.0, res, 0.001); |
+ EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
} |
-ASSEMBLER_TEST_GENERATE(Cop1CvtWD, assembler) { |
- __ LoadImmediate(D1, 42.0); |
- __ cvtwd(F0, D1); |
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Overflow, assembler) { |
+ __ LoadImmediate(D1, 2.0*kMaxInt32); |
+ __ truncwd(F0, D1); |
__ mfc1(V0, F0); |
__ Ret(); |
} |
-ASSEMBLER_TEST_RUN(Cop1CvtWD, test) { |
- typedef int (*SimpleCode)() DART_UNUSED; |
+ASSEMBLER_TEST_RUN(Cop1TruncWD_Overflow, test) { |
+ typedef double (*SimpleCode)() DART_UNUSED; |
EXPECT(test != NULL); |
- EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
+ EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
} |
-ASSEMBLER_TEST_GENERATE(Cop1CvtWD_neg, assembler) { |
- __ LoadImmediate(D1, -42.0); |
- __ cvtwd(F0, D1); |
+ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Underflow, assembler) { |
+ __ LoadImmediate(D1, 2.0*kMinInt32); |
+ __ truncwd(F0, D1); |
__ mfc1(V0, F0); |
__ Ret(); |
} |
-ASSEMBLER_TEST_RUN(Cop1CvtWD_neg, test) { |
- typedef int (*SimpleCode)() DART_UNUSED; |
+ASSEMBLER_TEST_RUN(Cop1TruncWD_Underflow, test) { |
+ typedef double (*SimpleCode)() DART_UNUSED; |
EXPECT(test != NULL); |
- EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
+ EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
+} |
+ |
+ |
+ASSEMBLER_TEST_GENERATE(Cop1CvtDW, assembler) { |
+ __ LoadImmediate(T0, 42); |
+ __ mtc1(T0, F2); |
+ __ cvtdw(D0, F2); |
+ __ Ret(); |
+} |
+ |
+ |
+ASSEMBLER_TEST_RUN(Cop1CvtDW, test) { |
+ typedef double (*SimpleCode)() DART_UNUSED; |
+ EXPECT(test != NULL); |
+ double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
+ EXPECT_FLOAT_EQ(42.0, res, 0.001); |
+} |
+ |
+ |
+ASSEMBLER_TEST_GENERATE(Cop1CvtDW_neg, assembler) { |
+ __ LoadImmediate(T0, -42); |
+ __ mtc1(T0, F2); |
+ __ cvtdw(D0, F2); |
+ __ Ret(); |
+} |
+ |
+ |
+ASSEMBLER_TEST_RUN(Cop1CvtDW_neg, test) { |
+ typedef double (*SimpleCode)() DART_UNUSED; |
+ EXPECT(test != NULL); |
+ double res = EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()); |
+ EXPECT_FLOAT_EQ(-42.0, res, 0.001); |
} |