summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/arm/interpreter/armemu.cpp33
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 {