Chromium Code Reviews| 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 |