diff options
| author | bunnei <bunneidev@gmail.com> | 2014-12-15 22:29:12 -0500 | 
|---|---|---|
| committer | bunnei <bunneidev@gmail.com> | 2014-12-15 22:29:12 -0500 | 
| commit | a8098187aa4aab222e9cf511768c28649f798b8f (patch) | |
| tree | 73ccba515c8b74b586f75a16062bb43c8189e08b | |
| parent | cd2a31eaf4a35568a18840eba7d3cdac59881d2f (diff) | |
| parent | 1c7f77334c32fe304b1db22f6bae210c837ba40f (diff) | |
Merge pull request #285 from lioncash/uxtab16
armemu: Implement UXTAB16
| -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:  			return 1;  		} -		case 0x6c: -			if ((instr & 0xf03f0) == 0xf0070) { //uxtb16 -				u8 rm_idx = BITS(0, 3); -				u8 rd_idx = BITS(12, 15); -				u32 rm_val = state->Reg[rm_idx]; -				u32 rotation = BITS(10, 11) * 8; -				u32 in = ((rm_val << (32 - rotation)) | (rm_val >> rotation)); -				state->Reg[rd_idx] = in & 0x00FF00FF; +		case 0x6c: // UXTB16 and UXTAB16 +			{ +				const u8 rm_idx = BITS(0, 3); +				const u8 rn_idx = BITS(16, 19); +				const u8 rd_idx = BITS(12, 15); +				const u32 rm_val = state->Reg[rm_idx]; +				const u32 rn_val = state->Reg[rn_idx]; +				const u32 rotation = BITS(10, 11) * 8; +				const u32 rotated_rm = ((rm_val << (32 - rotation)) | (rm_val >> rotation)); + +				// UXTB16 +				if ((instr & 0xf03f0) == 0xf0070) { +					state->Reg[rd_idx] = rotated_rm & 0x00FF00FF; +				} +				else { // UXTAB16 +					const u8 lo_rotated = (rotated_rm & 0xFF); +					const u16 lo_result = (rn_val & 0xFFFF) + (u16)lo_rotated; + +					const u8 hi_rotated = (rotated_rm >> 16) & 0xFF; +					const u16 hi_result = (rn_val >> 16) + (u16)hi_rotated; + +					state->Reg[rd_idx] = ((hi_result << 16) | (lo_result & 0xFFFF)); +				} +  				return 1; -			} else -				printf ("Unhandled v6 insn: uxtab16\n"); +			}  			break;  		case 0x6e: {  			ARMword Rm; | 
