mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	arm_disasm: ARMv6 reversal media instructions
REV, REV16, REVSH Only their ARM encoding, Thumb encoding is still missing.
This commit is contained in:
		
							parent
							
								
									e4ff244288
								
							
						
					
					
						commit
						0be8e1bfb6
					
				
					 2 changed files with 26 additions and 0 deletions
				
			
		|  | @ -69,6 +69,9 @@ static const char *opcode_names[] = { | ||||||
|     "orr", |     "orr", | ||||||
|     "pkh", |     "pkh", | ||||||
|     "pld", |     "pld", | ||||||
|  |     "rev", | ||||||
|  |     "rev16", | ||||||
|  |     "revsh", | ||||||
|     "rsb", |     "rsb", | ||||||
|     "rsc", |     "rsc", | ||||||
|     "sbc", |     "sbc", | ||||||
|  | @ -259,6 +262,10 @@ std::string ARM_Disasm::Disassemble(uint32_t addr, uint32_t insn) | ||||||
|             return DisassemblePKH(insn); |             return DisassemblePKH(insn); | ||||||
|         case OP_PLD: |         case OP_PLD: | ||||||
|             return DisassemblePLD(insn); |             return DisassemblePLD(insn); | ||||||
|  |         case OP_REV: | ||||||
|  |         case OP_REV16: | ||||||
|  |         case OP_REVSH: | ||||||
|  |             return DisassembleREV(opcode, insn); | ||||||
|         case OP_SEL: |         case OP_SEL: | ||||||
|             return DisassembleSEL(insn); |             return DisassembleSEL(insn); | ||||||
|         case OP_SSAT: |         case OP_SSAT: | ||||||
|  | @ -772,6 +779,15 @@ std::string ARM_Disasm::DisassemblePLD(uint32_t insn) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | std::string ARM_Disasm::DisassembleREV(Opcode opcode, uint32_t insn) { | ||||||
|  |     uint32_t cond = BITS(insn, 28, 31); | ||||||
|  |     uint32_t rd = BITS(insn, 12, 15); | ||||||
|  |     uint32_t rm = BITS(insn, 0, 3); | ||||||
|  | 
 | ||||||
|  |     return Common::StringFromFormat("%s%s\tr%u, r%u", opcode_names[opcode], cond_to_str(cond), | ||||||
|  |                                     rd, rm); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| std::string ARM_Disasm::DisassembleREX(Opcode opcode, uint32_t insn) { | std::string ARM_Disasm::DisassembleREX(Opcode opcode, uint32_t insn) { | ||||||
|     uint32_t rn = BITS(insn, 16, 19); |     uint32_t rn = BITS(insn, 16, 19); | ||||||
|     uint32_t rd = BITS(insn, 12, 15); |     uint32_t rd = BITS(insn, 12, 15); | ||||||
|  | @ -1094,12 +1110,16 @@ Opcode ARM_Disasm::DecodePackingSaturationReversal(uint32_t insn) { | ||||||
|                 return OP_SXTB; |                 return OP_SXTB; | ||||||
|             break; |             break; | ||||||
|         case 0x3: |         case 0x3: | ||||||
|  |             if (op2 == 0x1) | ||||||
|  |                 return OP_REV; | ||||||
|             if (BIT(op2, 0) == 0) |             if (BIT(op2, 0) == 0) | ||||||
|                 return OP_SSAT; |                 return OP_SSAT; | ||||||
|             if (op2 == 0x3 && a != 0xf) |             if (op2 == 0x3 && a != 0xf) | ||||||
|                 return OP_SXTAH; |                 return OP_SXTAH; | ||||||
|             if (op2 == 0x3 && a == 0xf) |             if (op2 == 0x3 && a == 0xf) | ||||||
|                 return OP_SXTH; |                 return OP_SXTH; | ||||||
|  |             if (op2 == 0x5) | ||||||
|  |                 return OP_REV16; | ||||||
|             break; |             break; | ||||||
|         case 0x4: |         case 0x4: | ||||||
|             if (op2 == 0x3 && a != 0xf) |             if (op2 == 0x3 && a != 0xf) | ||||||
|  | @ -1124,6 +1144,8 @@ Opcode ARM_Disasm::DecodePackingSaturationReversal(uint32_t insn) { | ||||||
|                 return OP_UXTAH; |                 return OP_UXTAH; | ||||||
|             if (op2 == 0x3 && a == 0xf) |             if (op2 == 0x3 && a == 0xf) | ||||||
|                 return OP_UXTH; |                 return OP_UXTH; | ||||||
|  |             if (op2 == 0x5) | ||||||
|  |                 return OP_REVSH; | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|  | @ -50,6 +50,9 @@ enum Opcode { | ||||||
|     OP_ORR, |     OP_ORR, | ||||||
|     OP_PKH, |     OP_PKH, | ||||||
|     OP_PLD, |     OP_PLD, | ||||||
|  |     OP_REV, | ||||||
|  |     OP_REV16, | ||||||
|  |     OP_REVSH, | ||||||
|     OP_RSB, |     OP_RSB, | ||||||
|     OP_RSC, |     OP_RSC, | ||||||
|     OP_SBC, |     OP_SBC, | ||||||
|  | @ -174,6 +177,7 @@ class ARM_Disasm { | ||||||
|   static std::string DisassembleNoOperands(Opcode opcode, uint32_t insn); |   static std::string DisassembleNoOperands(Opcode opcode, uint32_t insn); | ||||||
|   static std::string DisassemblePKH(uint32_t insn); |   static std::string DisassemblePKH(uint32_t insn); | ||||||
|   static std::string DisassemblePLD(uint32_t insn); |   static std::string DisassemblePLD(uint32_t insn); | ||||||
|  |   static std::string DisassembleREV(Opcode opcode, uint32_t insn); | ||||||
|   static std::string DisassembleREX(Opcode opcode, uint32_t insn); |   static std::string DisassembleREX(Opcode opcode, uint32_t insn); | ||||||
|   static std::string DisassembleSAT(Opcode opcode, uint32_t insn); |   static std::string DisassembleSAT(Opcode opcode, uint32_t insn); | ||||||
|   static std::string DisassembleSEL(uint32_t insn); |   static std::string DisassembleSEL(uint32_t insn); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue