www.pudn.com > potemkin_sourceforPSP.rar > ARMInfo.cpp


#include "stdafx.h" 
#include "ARM.h" 
#include "ARMTables.h" 
#include "ARMInfo.h" 
 
namespace ARMInstructions 
{ 
	InstructionInfo Info_NN(u32 op) 
	{ 
		InstructionInfo info = {0}; 
		return info; 
	} 
 
	InstructionInfo Info_T_NN(u16 op) 
	{ 
		InstructionInfo info = {0}; 
		return info; 
	} 
 
	InstructionInfo Info_Unimpl(u32 op) 
	{ 
		InstructionInfo info = {0}; 
		info.flags|=BAD_INSTRUCTION; 
		return info; 
	} 
 
	InstructionInfo Info_T_Unimpl(u16 op) 
	{ 
		InstructionInfo info = {0}; 
		info.flags|=BAD_INSTRUCTION; 
		return info; 
	} 
 
	InstructionInfo Info_DP(u32 op) 
	{ 
		InstructionInfo info = {0}; 
		int cond = op>>28; 
		int rd = (op>>12)&0xF; 
		if (rd == ARM_REG_PC) 
		{ 
			if (cond == COND_AL) 
				info.flags |= END_BASIC_BLOCK; 
		} 
		// TODO : if shiftop == RRX, require a flag 
		return info; 
	} 
 
	InstructionInfo Info_LDM(u32 op) 
	{ 
		InstructionInfo info = {0}; 
		bool loadingPC = (op&(1<<15)) ? true : false; 
		if (loadingPC) 
			info.flags |= END_BASIC_BLOCK; 
		return info; 
	} 
 
	InstructionInfo Info_LDR(u32 op) 
	{ 
		InstructionInfo info = {0}; 
		int rd = ((op>>12)&0xF); 
		if (rd == ARM_REG_PC) 
			info.flags |= END_BASIC_BLOCK; 
		return info; 
	} 
 
	InstructionInfo Info_T_POP(u16 op) 
	{ 
		InstructionInfo info = {0}; 
		if (op&(1<<8)) //load pc 
			info.flags |= END_BASIC_BLOCK; 
		return info; 
	} 
 
	InstructionInfo Info_T_ADDhi(u16 op) 
	{ 
		InstructionInfo info = {0}; 
		int rd = ((op>>4)&8)|(op&7); 
		if (rd == ARM_REG_PC) 
			info.flags |= END_BASIC_BLOCK; 
		return info; 
	} 
 
	InstructionInfo Info_T_MOVhi(u16 op) 
	{ 
		InstructionInfo info = {0}; 
		int rd = ((op>>4)&8)|(op&7); 
		if (rd == ARM_REG_PC) 
			info.flags |= END_BASIC_BLOCK; 
		return info; 
	} 
 
}