diff options
Diffstat (limited to 'src/core/arm/interpreter/armsupp.cpp')
| -rw-r--r-- | src/core/arm/interpreter/armsupp.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/core/arm/interpreter/armsupp.cpp b/src/core/arm/interpreter/armsupp.cpp index 68ac2a0ce..e2626eefb 100644 --- a/src/core/arm/interpreter/armsupp.cpp +++ b/src/core/arm/interpreter/armsupp.cpp | |||
| @@ -418,6 +418,22 @@ ARMul_NegZero (ARMul_State * state, ARMword result) | |||
| 418 | } | 418 | } |
| 419 | } | 419 | } |
| 420 | 420 | ||
| 421 | // Add with carry, indicates if a carry-out or signed overflow occurred. | ||
| 422 | u32 AddWithCarry(u32 left, u32 right, u32 carry_in, bool* carry_out_occurred, bool* overflow_occurred) | ||
| 423 | { | ||
| 424 | u64 unsigned_sum = (u64)left + (u64)right + (u64)carry_in; | ||
| 425 | s64 signed_sum = (s64)(s32)left + (s64)(s32)right + (s64)carry_in; | ||
| 426 | u64 result = (unsigned_sum & 0xFFFFFFFF); | ||
| 427 | |||
| 428 | if (carry_out_occurred) | ||
| 429 | *carry_out_occurred = (result != unsigned_sum); | ||
| 430 | |||
| 431 | if (overflow_occurred) | ||
| 432 | *overflow_occurred = ((s64)(s32)result != signed_sum); | ||
| 433 | |||
| 434 | return (u32)result; | ||
| 435 | } | ||
| 436 | |||
| 421 | // Compute whether an addition of A and B, giving RESULT, overflowed. | 437 | // Compute whether an addition of A and B, giving RESULT, overflowed. |
| 422 | bool AddOverflow(ARMword a, ARMword b, ARMword result) | 438 | bool AddOverflow(ARMword a, ARMword b, ARMword result) |
| 423 | { | 439 | { |