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


#include "stdafx.h" 
 
#include "../../Globals.h" 
 
#include "ARM.h" 
#include "ARMCompiler.h" 
#include "ARMTables.h" 
#include "ARMAnalyst.h" 
#include "../IR/IR.h" 
#include "../MemMap.h" 
 
#include "THUMBLoadStore.h" 
#include "ARMCompiler.h" 
 
////////////////////////////////////////////////////////////////////////// 
// THUMB 
////////////////////////////////////////////////////////////////////////// 
 
namespace THUMBInstructions 
{ 
	void Comp_T_PUSH(u16 op) 
	{ 
		int count=0; 
		if (op&(1<<8)) 
		{ 
			//LR 
			IR_Add(IR_SUB,0,ARM_REG_SP,ARM_REG_SP,IRImm((u32)4)); 
			IR_Add(IR_STOREWORD,0,0,ARM_REG_SP,ARM_REG_LR,IRLS_ALIGNED); 
			count++; 
		} 
		for (int i=7; i>=0; i--) 
		{ 
			if (op&(1<>8) & 7; 
		IR_Add(IR_MOV,0,IRTEMP0,rn); 
		u32 count=0; 
		for (int i=0; i<8; i++) 
		{ 
			if (op&(1<>3)&7; 
		u32 imm = (op>>6)&31; 
		if (imm==0) 
			IR_Add(opid,0,rd,rn,rd); //set as both out and in2, l/s will use/ignore 
		else 
		{ 
			IR_Add(IR_ADD,0,IRTEMP0,rn,IRImm(imm*mul)); 
			IR_Add(opid,0,rd,IRTEMP0,rd,IRLS_UNKNOWN); //set as both out and in2, l/s will use/ignore 
		} 
		Compiler_AddCycles(1); 
	} 
 
	void Comp_T_LSrof(u16 op, IROpID opid) 
	{ 
		int rd=op&7; 
		int rn=(op>>3)&7; 
		int rm=(op>>6)&7; 
		IR_Add(IR_ADD,0,IRTEMP0,rn,rm); 
		IR_Add(opid,0,rd,IRTEMP0,rd,IRLS_UNKNOWN); 
		Compiler_AddCycles(1); 
	} 
 
	void Comp_T_ldstisp(u16 op,IROpID opid)  
	{ 
		int rd = (op>>8)&7; 
		u32 imm = op&0xff; 
		int tempReg; 
		if (imm==0) 
			tempReg = ARM_REG_SP; 
		else 
		{ 
			tempReg = IRTEMP0; 
			IR_Add(IR_ADD,0,tempReg,ARM_REG_SP,IRImm(imm*4)); 
		} 
		IR_Add(opid,0,rd,tempReg,rd,IRLS_UNKNOWN); //todo : we may know something about alignment 
		Compiler_AddCycles(1); 
	} 
	void Comp_T_LDRsex(u16 op, IROpID opid)   
	{ 
		int rd=op&7; 
		int rn=(op>>3)&7; 
		int rm=(op>>6)&7; 
		IR_Add(IR_ADD,0,IRTEMP0,rn,rm); 
		IR_Add(IR_LOADBYTE,0,rd,IRTEMP0,rd,IRLS_ALIGNED); 
		IR_Add(opid,0,rd,rd); 
		Compiler_AddCycles(1); 
	} 
 
 
	//loadstore 
	void Comp_T_LDRB(u16 op)   {Comp_T_LSImm5(op,IR_LOADBYTE, 1);Compiler_AddCycles(1);}   
	void Comp_T_STRB(u16 op)   {Comp_T_LSImm5(op,IR_STOREBYTE,1);} // ????? 
	void Comp_T_LDRH(u16 op)   {Comp_T_LSImm5(op,IR_LOADHALF, 2);Compiler_AddCycles(1);}   
	void Comp_T_STRH(u16 op)   {Comp_T_LSImm5(op,IR_STOREHALF,2);}   
	void Comp_T_STR(u16 op)    {Comp_T_LSImm5(op,IR_STOREWORD,4);} 
	void Comp_T_LDR(u16 op)    {Comp_T_LSImm5(op,IR_LOADWORD, 4);Compiler_AddCycles(1);} 
 
	void Comp_T_LDRBro(u16 op) {Comp_T_LSrof(op,IR_LOADBYTE );Compiler_AddCycles(1);} 
	void Comp_T_STRBro(u16 op) {Comp_T_LSrof(op,IR_STOREBYTE);}   
	void Comp_T_LDRHro(u16 op) {Comp_T_LSrof(op,IR_LOADHALF );Compiler_AddCycles(1);} 
	void Comp_T_STRHro(u16 op) {Comp_T_LSrof(op,IR_STOREHALF);} 
	void Comp_T_LDRrof(u16 op) {Comp_T_LSrof(op,IR_LOADWORD );Compiler_AddCycles(1);} 
	void Comp_T_STRrof(u16 op) {Comp_T_LSrof(op,IR_STOREWORD);} 
 
	void Comp_T_LDRisp(u16 op) {Comp_T_ldstisp(op,IR_LOADWORD);Compiler_AddCycles(1);} 
	void Comp_T_STRisp(u16 op) {Comp_T_ldstisp(op,IR_STOREWORD);} 
 
	void Comp_T_LDRSB(u16 op) {Comp_T_LDRsex(op,IR_SEX8);Compiler_AddCycles(1);}  
	void Comp_T_LDRSH(u16 op) {Comp_T_LDRsex(op,IR_SEX16);Compiler_AddCycles(1);} 
 
	void Comp_T_LDRimm(u16 op)  
	{ 
		u32 addr=(compiler_pc&~3)+(op&0xff)*4+4; 
		if (0) 
			IR_Add(IR_LOADWORD,0,(op>>8)&7,IRImm(addr),0,(addr&3) ? IRLS_UNALIGNED : IRLS_ALIGNED); 
		else 
			IR_Add(IR_MOV,0,(op>>8)&7,IRImm(ReadMem32Unchecked(addr))); 
		Compiler_AddCycles(1); 
	} 
}