diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/arm/interpreter/armemu.cpp | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp index 99fc6c45d..07d205755 100644 --- a/src/core/arm/interpreter/armemu.cpp +++ b/src/core/arm/interpreter/armemu.cpp | |||
| @@ -5839,21 +5839,46 @@ L_stm_s_takeabort: | |||
| 5839 | const s16 rm_lo = (state->Reg[rm_idx] & 0xFFFF); | 5839 | const s16 rm_lo = (state->Reg[rm_idx] & 0xFFFF); |
| 5840 | const s16 rm_hi = ((state->Reg[rm_idx] >> 16) & 0xFFFF); | 5840 | const s16 rm_hi = ((state->Reg[rm_idx] >> 16) & 0xFFFF); |
| 5841 | 5841 | ||
| 5842 | s32 lo_result; | ||
| 5843 | s32 hi_result; | ||
| 5844 | |||
| 5842 | // SSUB16 | 5845 | // SSUB16 |
| 5843 | if ((instr & 0xFF0) == 0xf70) { | 5846 | if ((instr & 0xFF0) == 0xf70) { |
| 5844 | state->Reg[rd_idx] = ((rn_lo - rm_lo) & 0xFFFF) | (((rn_hi - rm_hi) & 0xFFFF) << 16); | 5847 | lo_result = (rn_lo - rm_lo); |
| 5848 | hi_result = (rn_hi - rm_hi); | ||
| 5845 | } | 5849 | } |
| 5846 | // SADD16 | 5850 | // SADD16 |
| 5847 | else if ((instr & 0xFF0) == 0xf10) { | 5851 | else if ((instr & 0xFF0) == 0xf10) { |
| 5848 | state->Reg[rd_idx] = ((rn_lo + rm_lo) & 0xFFFF) | (((rn_hi + rm_hi) & 0xFFFF) << 16); | 5852 | lo_result = (rn_lo + rm_lo); |
| 5853 | hi_result = (rn_hi + rm_hi); | ||
| 5849 | } | 5854 | } |
| 5850 | // SSAX | 5855 | // SSAX |
| 5851 | else if ((instr & 0xFF0) == 0xf50) { | 5856 | else if ((instr & 0xFF0) == 0xf50) { |
| 5852 | state->Reg[rd_idx] = ((rn_lo + rm_hi) & 0xFFFF) | (((rn_hi - rm_lo) & 0xFFFF) << 16); | 5857 | lo_result = (rn_lo + rm_hi); |
| 5858 | hi_result = (rn_hi - rm_lo); | ||
| 5853 | } | 5859 | } |
| 5854 | // SASX | 5860 | // SASX |
| 5855 | else { | 5861 | else { |
| 5856 | state->Reg[rd_idx] = ((rn_lo - rm_hi) & 0xFFFF) | (((rn_hi + rm_lo) & 0xFFFF) << 16); | 5862 | lo_result = (rn_lo - rm_hi); |
| 5863 | hi_result = (rn_hi + rm_lo); | ||
| 5864 | } | ||
| 5865 | |||
| 5866 | state->Reg[rd_idx] = (lo_result & 0xFFFF) | ((hi_result & 0xFFFF) << 16); | ||
| 5867 | |||
| 5868 | if (lo_result >= 0) { | ||
| 5869 | state->Cpsr |= (1 << 16); | ||
| 5870 | state->Cpsr |= (1 << 17); | ||
| 5871 | } else { | ||
| 5872 | state->Cpsr &= ~(1 << 16); | ||
| 5873 | state->Cpsr &= ~(1 << 17); | ||
| 5874 | } | ||
| 5875 | |||
| 5876 | if (hi_result >= 0) { | ||
| 5877 | state->Cpsr |= (1 << 18); | ||
| 5878 | state->Cpsr |= (1 << 19); | ||
| 5879 | } else { | ||
| 5880 | state->Cpsr &= ~(1 << 18); | ||
| 5881 | state->Cpsr &= ~(1 << 19); | ||
| 5857 | } | 5882 | } |
| 5858 | return 1; | 5883 | return 1; |
| 5859 | } else { | 5884 | } else { |