diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/arm/interpreter/armemu.cpp | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp index 33ebc7986..b846fbe9c 100644 --- a/src/core/arm/interpreter/armemu.cpp +++ b/src/core/arm/interpreter/armemu.cpp | |||
| @@ -6101,17 +6101,32 @@ L_stm_s_takeabort: | |||
| 6101 | 6101 | ||
| 6102 | return 1; | 6102 | return 1; |
| 6103 | } | 6103 | } |
| 6104 | case 0x6c: | 6104 | case 0x6c: // UXTB16 and UXTAB16 |
| 6105 | if ((instr & 0xf03f0) == 0xf0070) { //uxtb16 | 6105 | { |
| 6106 | u8 rm_idx = BITS(0, 3); | 6106 | const u8 rm_idx = BITS(0, 3); |
| 6107 | u8 rd_idx = BITS(12, 15); | 6107 | const u8 rn_idx = BITS(16, 19); |
| 6108 | u32 rm_val = state->Reg[rm_idx]; | 6108 | const u8 rd_idx = BITS(12, 15); |
| 6109 | u32 rotation = BITS(10, 11) * 8; | 6109 | const u32 rm_val = state->Reg[rm_idx]; |
| 6110 | u32 in = ((rm_val << (32 - rotation)) | (rm_val >> rotation)); | 6110 | const u32 rn_val = state->Reg[rn_idx]; |
| 6111 | state->Reg[rd_idx] = in & 0x00FF00FF; | 6111 | const u32 rotation = BITS(10, 11) * 8; |
| 6112 | const u32 rotated_rm = ((rm_val << (32 - rotation)) | (rm_val >> rotation)); | ||
| 6113 | |||
| 6114 | // UXTB16 | ||
| 6115 | if ((instr & 0xf03f0) == 0xf0070) { | ||
| 6116 | state->Reg[rd_idx] = rotated_rm & 0x00FF00FF; | ||
| 6117 | } | ||
| 6118 | else { // UXTAB16 | ||
| 6119 | const u8 lo_rotated = (rotated_rm & 0xFF); | ||
| 6120 | const u16 lo_result = (rn_val & 0xFFFF) + (u16)lo_rotated; | ||
| 6121 | |||
| 6122 | const u8 hi_rotated = (rotated_rm >> 16) & 0xFF; | ||
| 6123 | const u16 hi_result = (rn_val >> 16) + (u16)hi_rotated; | ||
| 6124 | |||
| 6125 | state->Reg[rd_idx] = ((hi_result << 16) | (lo_result & 0xFFFF)); | ||
| 6126 | } | ||
| 6127 | |||
| 6112 | return 1; | 6128 | return 1; |
| 6113 | } else | 6129 | } |
| 6114 | printf ("Unhandled v6 insn: uxtab16\n"); | ||
| 6115 | break; | 6130 | break; |
| 6116 | case 0x6e: { | 6131 | case 0x6e: { |
| 6117 | ARMword Rm; | 6132 | ARMword Rm; |