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