summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/interpreter/armemu.cpp34
1 files changed, 20 insertions, 14 deletions
diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp
index 06439b73c..7a319b635 100644
--- a/src/core/arm/interpreter/armemu.cpp
+++ b/src/core/arm/interpreter/armemu.cpp
@@ -6091,22 +6091,28 @@ L_stm_s_takeabort:
6091 //ichfly 6091 //ichfly
6092 //SSAT16 6092 //SSAT16
6093 { 6093 {
6094 u8 tar = BITS(12, 15); 6094 const u8 rd_idx = BITS(12, 15);
6095 u8 src = BITS(0, 3); 6095 const u8 rn_idx = BITS(0, 3);
6096 u8 val = BITS(16, 19) + 1; 6096 const u8 num_bits = BITS(16, 19) + 1;
6097 s16 a1 = (state->Reg[src]); 6097 const s16 min = -(0x8000 >> (16 - num_bits));
6098 s16 a2 = (state->Reg[src] >> 0x10); 6098 const s16 max = (0x7FFF >> (16 - num_bits));
6099 s16 min = (s16)(0x8000 >> (16 - val)); 6099 s16 rn_lo = (state->Reg[rn_idx]);
6100 s16 max = 0x7FFF >> (16 - val); 6100 s16 rn_hi = (state->Reg[rn_idx] >> 16);
6101 if (min > a1) a1 = min; 6101
6102 if (max < a1) a1 = max; 6102 if (rn_lo > max)
6103 if (min > a2) a2 = min; 6103 rn_lo = max;
6104 if (max < a2) a2 = max; 6104 else if (rn_lo < min)
6105 u32 temp2 = ((u32)(a2)) << 0x10; 6105 rn_lo = min;
6106 state->Reg[tar] = (a1 & 0xFFFF) | (temp2); 6106
6107 if (rn_hi > max)
6108 rn_hi = max;
6109 else if (rn_hi < min)
6110 rn_hi = min;
6111
6112 state->Reg[rd_idx] = (rn_lo & 0xFFFF) | ((rn_hi & 0xFFFF) << 16);
6113 return 1;
6107 } 6114 }
6108 6115
6109 return 1;
6110 default: 6116 default:
6111 break; 6117 break;
6112 } 6118 }