mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-11-03 23:28:48 +00:00 
			
		
		
		
	arm_tick_counts: Thumb implementation
This commit is contained in:
		
							parent
							
								
									9c0fad21db
								
							
						
					
					
						commit
						6da59d581e
					
				
					 1 changed files with 98 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -369,6 +369,104 @@ const std::array arm_matchers{
 | 
			
		|||
    // clang-format on
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const std::array thumb_matchers{
 | 
			
		||||
    // clang-format off
 | 
			
		||||
 | 
			
		||||
    // Shift (immediate) add, subtract, move and compare instructions
 | 
			
		||||
    INST("LSL (imm)",                "00000vvvvvmmmddd",    1)
 | 
			
		||||
    INST("LSR (imm)",                "00001vvvvvmmmddd",    1)
 | 
			
		||||
    INST("ASR (imm)",                "00010vvvvvmmmddd",    1)
 | 
			
		||||
    INST("ADD (reg, T1)",            "0001100mmmnnnddd",    1)
 | 
			
		||||
    INST("SUB (reg)",                "0001101mmmnnnddd",    1)
 | 
			
		||||
    INST("ADD (imm, T1)",            "0001110vvvnnnddd",    1)
 | 
			
		||||
    INST("SUB (imm, T1)",            "0001111vvvnnnddd",    1)
 | 
			
		||||
    INST("MOV (imm)",                "00100dddvvvvvvvv",    1)
 | 
			
		||||
    INST("CMP (imm)",                "00101nnnvvvvvvvv",    1)
 | 
			
		||||
    INST("ADD (imm, T2)",            "00110dddvvvvvvvv",    1)
 | 
			
		||||
    INST("SUB (imm, T2)",            "00111dddvvvvvvvv",    1)
 | 
			
		||||
 | 
			
		||||
     // Data-processing instructions
 | 
			
		||||
    INST("AND (reg)",                "0100000000mmmddd",    1)
 | 
			
		||||
    INST("EOR (reg)",                "0100000001mmmddd",    1)
 | 
			
		||||
    INST("LSL (reg)",                "0100000010mmmddd",    1)
 | 
			
		||||
    INST("LSR (reg)",                "0100000011mmmddd",    1)
 | 
			
		||||
    INST("ASR (reg)",                "0100000100mmmddd",    1)
 | 
			
		||||
    INST("ADC (reg)",                "0100000101mmmddd",    1)
 | 
			
		||||
    INST("SBC (reg)",                "0100000110mmmddd",    1)
 | 
			
		||||
    INST("ROR (reg)",                "0100000111sssddd",    1)
 | 
			
		||||
    INST("TST (reg)",                "0100001000mmmnnn",    1)
 | 
			
		||||
    INST("RSB (imm)",                "0100001001nnnddd",    1)
 | 
			
		||||
    INST("CMP (reg, T1)",            "0100001010mmmnnn",    1)
 | 
			
		||||
    INST("CMN (reg)",                "0100001011mmmnnn",    1)
 | 
			
		||||
    INST("ORR (reg)",                "0100001100mmmddd",    1)
 | 
			
		||||
    INST("MUL (reg)",                "0100001101nnnddd",    1)
 | 
			
		||||
    INST("BIC (reg)",                "0100001110mmmddd",    1)
 | 
			
		||||
    INST("MVN (reg)",                "0100001111mmmddd",    1)
 | 
			
		||||
 | 
			
		||||
    // Special data instructions
 | 
			
		||||
    INST("ADD (reg, T2)",            "01000100Dmmmmddd",    1) // v4T, Low regs: v6T2
 | 
			
		||||
    INST("CMP (reg, T2)",            "01000101Nmmmmnnn",    1) // v4T
 | 
			
		||||
    INST("MOV (reg)",                "01000110Dmmmmddd",    1) // v4T, Low regs: v6
 | 
			
		||||
 | 
			
		||||
    // Store/Load single data item instructions
 | 
			
		||||
    INST("LDR (literal)",            "01001tttvvvvvvvv",    2)
 | 
			
		||||
    INST("STR (reg)",                "0101000mmmnnnttt",    2)
 | 
			
		||||
    INST("STRH (reg)",               "0101001mmmnnnttt",    2)
 | 
			
		||||
    INST("STRB (reg)",               "0101010mmmnnnttt",    2)
 | 
			
		||||
    INST("LDRSB (reg)",              "0101011mmmnnnttt",    2)
 | 
			
		||||
    INST("LDR (reg)",                "0101100mmmnnnttt",    2)
 | 
			
		||||
    INST("LDRH (reg)",               "0101101mmmnnnttt",    2)
 | 
			
		||||
    INST("LDRB (reg)",               "0101110mmmnnnttt",    2)
 | 
			
		||||
    INST("LDRSH (reg)",              "0101111mmmnnnttt",    2)
 | 
			
		||||
    INST("STR (imm, T1)",            "01100vvvvvnnnttt",    2)
 | 
			
		||||
    INST("LDR (imm, T1)",            "01101vvvvvnnnttt",    2)
 | 
			
		||||
    INST("STRB (imm)",               "01110vvvvvnnnttt",    2)
 | 
			
		||||
    INST("LDRB (imm)",               "01111vvvvvnnnttt",    2)
 | 
			
		||||
    INST("STRH (imm)",               "10000vvvvvnnnttt",    2)
 | 
			
		||||
    INST("LDRH (imm)",               "10001vvvvvnnnttt",    2)
 | 
			
		||||
    INST("STR (imm, T2)",            "10010tttvvvvvvvv",    2)
 | 
			
		||||
    INST("LDR (imm, T2)",            "10011tttvvvvvvvv",    2)
 | 
			
		||||
 | 
			
		||||
    // Generate relative address instructions
 | 
			
		||||
    INST("ADR",                      "10100dddvvvvvvvv",    1)
 | 
			
		||||
    INST("ADD (SP plus imm, T1)",    "10101dddvvvvvvvv",    1)
 | 
			
		||||
    INST("ADD (SP plus imm, T2)",    "101100000vvvvvvv",    1) // v4T
 | 
			
		||||
    INST("SUB (SP minus imm)",       "101100001vvvvvvv",    1) // v4T
 | 
			
		||||
 | 
			
		||||
    // Hint instructions
 | 
			
		||||
    INST("NOP",                      "10111111--------",    (1)) // IT on v7
 | 
			
		||||
 | 
			
		||||
    // Miscellaneous 16-bit instructions
 | 
			
		||||
    INST("SXTH",                     "1011001000mmmddd",    1) // v6
 | 
			
		||||
    INST("SXTB",                     "1011001001mmmddd",    1) // v6
 | 
			
		||||
    INST("UXTH",                     "1011001010mmmddd",    1) // v6
 | 
			
		||||
    INST("UXTB",                     "1011001011mmmddd",    1) // v6
 | 
			
		||||
    INST("PUSH",                     "1011010xxxxxxxxx",    LoadStoreMultiple(i)) // v4T
 | 
			
		||||
    INST("POP",                      "1011110xxxxxxxxx",    LoadStoreMultiple(i)) // v4T
 | 
			
		||||
    INST("SETEND",                   "101101100101x000",    1) // v6
 | 
			
		||||
    INST("CPS",                      "10110110011m0aif",    1) // v6
 | 
			
		||||
    INST("REV",                      "1011101000mmmddd",    1) // v6
 | 
			
		||||
    INST("REV16",                    "1011101001mmmddd",    1) // v6
 | 
			
		||||
    INST("REVSH",                    "1011101011mmmddd",    1) // v6
 | 
			
		||||
    INST("BKPT",                     "10111110xxxxxxxx",    8) // v5
 | 
			
		||||
 | 
			
		||||
    // Store/Load multiple registers
 | 
			
		||||
    INST("STMIA",                    "11000nnnxxxxxxxx",    LoadStoreMultiple(i))
 | 
			
		||||
    INST("LDMIA",                    "11001nnnxxxxxxxx",    LoadStoreMultiple(i))
 | 
			
		||||
 | 
			
		||||
    // Branch instructions
 | 
			
		||||
    INST("BX",                       "010001110mmmm000",    5) // v4T
 | 
			
		||||
    INST("BLX (reg)",                "010001111mmmm000",    6) // v5T
 | 
			
		||||
    INST("UDF",                      "11011110--------",    8)
 | 
			
		||||
    INST("SVC",                      "11011111xxxxxxxx",    8)
 | 
			
		||||
    INST("B (T1)",                   "1101ccccvvvvvvvv",    4)
 | 
			
		||||
    INST("B (T2)",                   "11100vvvvvvvvvvv",    4)
 | 
			
		||||
    INST("BL (imm)",                 "11110Svvvvvvvvvv11j1jvvvvvvvvvvv",    4) // v4T
 | 
			
		||||
    INST("BLX (imm)",                "11110Svvvvvvvvvv11j0jvvvvvvvvvvv",    5) // v5T
 | 
			
		||||
 | 
			
		||||
    // clang-format on
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
namespace Core {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue