diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/interpreter/armemu.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp index 81a4fdb92..e69789142 100644 --- a/src/core/arm/interpreter/armemu.cpp +++ b/src/core/arm/interpreter/armemu.cpp | |||
| @@ -6209,16 +6209,23 @@ L_stm_s_takeabort: | |||
| 6209 | s16 rn_lo = (state->Reg[rn_idx]); | 6209 | s16 rn_lo = (state->Reg[rn_idx]); |
| 6210 | s16 rn_hi = (state->Reg[rn_idx] >> 16); | 6210 | s16 rn_hi = (state->Reg[rn_idx] >> 16); |
| 6211 | 6211 | ||
| 6212 | if (rn_lo > max) | 6212 | if (rn_lo > max) { |
| 6213 | rn_lo = max; | 6213 | rn_lo = max; |
| 6214 | else if (rn_lo < min) | 6214 | state->Cpsr |= (1 << 27); |
| 6215 | } else if (rn_lo < min) { | ||
| 6215 | rn_lo = min; | 6216 | rn_lo = min; |
| 6217 | state->Cpsr |= (1 << 27); | ||
| 6218 | } | ||
| 6216 | 6219 | ||
| 6217 | if (rn_hi > max) | 6220 | if (rn_hi > max) { |
| 6218 | rn_hi = max; | 6221 | rn_hi = max; |
| 6219 | else if (rn_hi < min) | 6222 | state->Cpsr |= (1 << 27); |
| 6223 | } else if (rn_hi < min) { | ||
| 6220 | rn_hi = min; | 6224 | rn_hi = min; |
| 6225 | state->Cpsr |= (1 << 27); | ||
| 6226 | } | ||
| 6221 | 6227 | ||
| 6228 | ARMul_CPSRAltered(state); | ||
| 6222 | state->Reg[rd_idx] = (rn_lo & 0xFFFF) | ((rn_hi & 0xFFFF) << 16); | 6229 | state->Reg[rd_idx] = (rn_lo & 0xFFFF) | ((rn_hi & 0xFFFF) << 16); |
| 6223 | return 1; | 6230 | return 1; |
| 6224 | } | 6231 | } |
| @@ -6350,16 +6357,23 @@ L_stm_s_takeabort: | |||
| 6350 | s16 rn_lo = (state->Reg[rn_idx]); | 6357 | s16 rn_lo = (state->Reg[rn_idx]); |
| 6351 | s16 rn_hi = (state->Reg[rn_idx] >> 16); | 6358 | s16 rn_hi = (state->Reg[rn_idx] >> 16); |
| 6352 | 6359 | ||
| 6353 | if (max < rn_lo) | 6360 | if (max < rn_lo) { |
| 6354 | rn_lo = max; | 6361 | rn_lo = max; |
| 6355 | else if (rn_lo < 0) | 6362 | state->Cpsr |= (1 << 27); |
| 6363 | } else if (rn_lo < 0) { | ||
| 6356 | rn_lo = 0; | 6364 | rn_lo = 0; |
| 6365 | state->Cpsr |= (1 << 27); | ||
| 6366 | } | ||
| 6357 | 6367 | ||
| 6358 | if (max < rn_hi) | 6368 | if (max < rn_hi) { |
| 6359 | rn_hi = max; | 6369 | rn_hi = max; |
| 6360 | else if (rn_hi < 0) | 6370 | state->Cpsr |= (1 << 27); |
| 6371 | } else if (rn_hi < 0) { | ||
| 6361 | rn_hi = 0; | 6372 | rn_hi = 0; |
| 6362 | 6373 | state->Cpsr |= (1 << 27); | |
| 6374 | } | ||
| 6375 | |||
| 6376 | ARMul_CPSRAltered(state); | ||
| 6363 | state->Reg[rd_idx] = (rn_lo & 0xFFFF) | ((rn_hi << 16) & 0xFFFF); | 6377 | state->Reg[rd_idx] = (rn_lo & 0xFFFF) | ((rn_hi << 16) & 0xFFFF); |
| 6364 | return 1; | 6378 | return 1; |
| 6365 | } | 6379 | } |