Index: runtime/vm/assembler_mips_test.cc |
=================================================================== |
--- runtime/vm/assembler_mips_test.cc (revision 20999) |
+++ runtime/vm/assembler_mips_test.cc (working copy) |
@@ -1041,6 +1041,64 @@ |
EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
} |
+ |
+ASSEMBLER_TEST_GENERATE(AddOverflow_detect, assembler) { |
+ Label error, success; |
regis
2013/04/05 23:23:45
"success" is actually "done".
zra
2013/04/06 00:04:19
Done.
|
+ __ LoadImmediate(V0, 1); // Success value. |
+ |
+ __ LoadImmediate(T0, 0x7fffffff); |
+ __ LoadImmediate(T1, 1); |
+ __ AdduDetectOverflow(T2, T1, T0, T3); |
+ __ bgez(T3, &error); // INT_MAX + 1 overflows. |
+ |
+ __ LoadImmediate(T0, 0x7fffffff); |
+ __ LoadImmediate(T1, 0x7fffffff); |
+ __ AdduDetectOverflow(T2, T1, T0, T3); |
+ __ bgez(T3, &error); // INT_MAX + INT_MAX overflows. |
+ |
+ __ LoadImmediate(T0, 0x7fffffff); |
+ __ LoadImmediate(T1, -1); |
+ __ AdduDetectOverflow(T2, T1, T0, T3); |
+ __ bltz(T3, &error); // INT_MAX - 1 does not overflow. |
+ |
+ __ LoadImmediate(T0, -1); |
+ __ LoadImmediate(T1, 1); |
+ __ AdduDetectOverflow(T2, T1, T0, T3); |
+ __ bltz(T3, &error); // -1 + 1 does not overflow. |
+ |
+ __ LoadImmediate(T0, 123456); |
+ __ LoadImmediate(T1, 654321); |
+ __ AdduDetectOverflow(T2, T1, T0, T3); |
+ __ bltz(T3, &error); // 123456 + 654321 does not overflow. |
+ |
+ __ LoadImmediate(T0, 0x80000000); |
+ __ LoadImmediate(T1, -1); |
+ __ AdduDetectOverflow(T2, T1, T0, T3); |
+ __ bgez(T3, &error); // INT_MIN - 1 overflows. |
+ |
+ __ LoadImmediate(T0, 0x80000000); |
+ __ LoadImmediate(T1, 0x80000000); |
+ __ AdduDetectOverflow(T2, T1, T0, T3); |
+ __ bgez(T3, &error); // INT_MIN + INT_MIN overflows. |
+ |
+ __ LoadImmediate(T0, -123456); |
+ __ LoadImmediate(T1, -654321); |
+ __ AdduDetectOverflow(T2, T1, T0, T3); |
+ __ bltz(T3, &error); // -123456 + -654321 does not overflow. |
+ |
+ __ b(&success); |
+ __ Bind(&error); |
+ __ mov(V0, ZR); |
+ __ Bind(&success); |
+ __ Ret(); |
+} |
+ |
+ |
+ASSEMBLER_TEST_RUN(AddOverflow_detect, test) { |
+ typedef int (*SimpleCode)(); |
+ EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
+} |
+ |
} // namespace dart |
#endif // defined TARGET_ARCH_MIPS |