mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #1959 from MerryMage/revsh-upstream
dyncom: Fix translation of thumb REVSH
This commit is contained in:
		
						commit
						5c743ddfa8
					
				
					 1 changed files with 13 additions and 4 deletions
				
			
		|  | @ -2,6 +2,8 @@ | ||||||
| // Licensed under GPLv2 or any later version
 | // Licensed under GPLv2 or any later version
 | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
|  | #include <cstddef> | ||||||
|  | 
 | ||||||
| // We can provide simple Thumb simulation by decoding the Thumb instruction into its corresponding
 | // We can provide simple Thumb simulation by decoding the Thumb instruction into its corresponding
 | ||||||
| // ARM instruction, and using the existing ARM simulator.
 | // ARM instruction, and using the existing ARM simulator.
 | ||||||
| 
 | 
 | ||||||
|  | @ -293,15 +295,22 @@ ThumbDecodeStatus TranslateThumbInstruction(u32 addr, u32 instr, u32* ainstr, u3 | ||||||
|                     | (BIT(tinstr, 4) << 18); // enable bit
 |                     | (BIT(tinstr, 4) << 18); // enable bit
 | ||||||
|             } |             } | ||||||
|         } else if ((tinstr & 0x0F00) == 0x0a00) { |         } else if ((tinstr & 0x0F00) == 0x0a00) { | ||||||
|             static const u32 subset[3] = { |             static const u32 subset[4] = { | ||||||
|                 0xE6BF0F30, // REV
 |                 0xE6BF0F30, // REV
 | ||||||
|                 0xE6BF0FB0, // REV16
 |                 0xE6BF0FB0, // REV16
 | ||||||
|  |                 0,          // undefined
 | ||||||
|                 0xE6FF0FB0, // REVSH
 |                 0xE6FF0FB0, // REVSH
 | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             *ainstr = subset[BITS(tinstr, 6, 7)] // base
 |             size_t subset_index = BITS(tinstr, 6, 7); | ||||||
|  | 
 | ||||||
|  |             if (subset_index == 2) { | ||||||
|  |                 valid = ThumbDecodeStatus::UNDEFINED; | ||||||
|  |             } else { | ||||||
|  |                 *ainstr = subset[subset_index]       // base
 | ||||||
|                     | (BITS(tinstr, 0, 2) << 12)     // Rd
 |                     | (BITS(tinstr, 0, 2) << 12)     // Rd
 | ||||||
|                     | BITS(tinstr, 3, 5);            // Rm
 |                     | BITS(tinstr, 3, 5);            // Rm
 | ||||||
|  |             } | ||||||
|         } else { |         } else { | ||||||
|             static const u32 subset[4] = { |             static const u32 subset[4] = { | ||||||
|                 0xE92D0000, // STMDB sp!,{rlist}
 |                 0xE92D0000, // STMDB sp!,{rlist}
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue