⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dyncode_arm.c

📁 大名鼎鼎的CE下播放软件,TCPPMP的源代码!!!2410下可以流畅的解QVGA的H264,MPEG4等格式.
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	int Shift;
	context* c = Context();
	dyninst* p = NULL;

	if (MODE(Code) == 2 && Const>=0 && Const<8)
	{
		p = InstCreate32((c->NextCond << 28) | (Code & MODEMASK) | ((Dest & 15) << 16) | ((Op1 & 15) << 12) | (Const << 0),
				Dest, Op1, NONE, (c->NextCond != AL)?1:0, 0);
	}

	if (MODE(Code) == 9 && Const>=0 && Const<256)
	{
		p = InstCreate32((c->NextCond << 28) | (Code & MODEMASK) | ((Dest & 15) << 12) | ((Op1 & 15) << 16) | ((Const & 15) << 0) | ((Const & 0xF0) << 16),
				Dest, Op1, NONE, (c->NextCond != AL)?1:0, 0);
	}

	if (MODE(Code) == 15)
	{
		if (Const<0)
		{
			Code ^= (1<<23);
			Const = -Const;
		}
		if (Code & 256) // dword or qword
		{
			if (Const & 3)
				Const = -1;
			else
				Const >>= 2;
		}
		if (Const>=0 && Const<256)
		{
			p = InstCreate32((c->NextCond << 28) | (Code & MODEMASK) | ((Dest & 15) << 12) | ((Op1 & 15) << 16) | (Const << 0),
					NONE, Op1, NONE, (c->NextCond != AL)?1:0, 0);

			if (Code & (1<<20))
				p->WrRegs |= 1 << Dest;
			else
				p->RdRegs |= 1 << Dest;

			if (!(Code & (1<<24)) || (Code & (1<<21)))
				p->WrRegs |= 1 << Op1;
		}
	}

	if (Code >= 0 && Code < 16)
	{
		if (Code == MOV && Const < 0)
		{
			Code = MVN;
			Const = -Const-1;
		}
		else
		if (Code == ADD && Const < 0)
		{
			Code = SUB;
			Const = -Const;
		}
		else
		if (Code == SUB && Const < 0)
		{
			Code = ADD;
			Const = -Const;
		}

		if (Code == CMP || Code == TST || Code == CMN || Code == TEQ) 
			c->NextSet = 1;

		for (Shift = 0;Shift<32;Shift+=2)
		{
			if (Const >= 0 && Const <= 255)
				break;
			Const = (Const << 2) | ((Const >> 30) & 3);
		}
		if (Const >= 0 && Const <= 255)
			p = InstCreate32((c->NextCond << 28) | (1<<25) | (Code << 21) | ((c->NextSet?1:0)<<20) |
				((Op1==NONE?R0:Op1) << 16) | ((Dest==NONE?R0:Dest) << 12) | (Shift << 7) | Const,
				Dest, Op1, NONE, (c->NextCond != AL)?1:0, c->NextSet?1:0);
	}
	
	IPLD(&Code,&Dest);

	if (Code == LDR || Code == STR || 
		Code == LDR_PRE || Code == STR_PRE || 
		Code == LDR_POST|| Code == STR_POST ||
		Code == LDR_PRESUB || Code == STR_PRESUB || 
		Code == LDR_POSTSUB || Code == STR_POSTSUB)
	{
		bool_t Pre = (Code != LDR_POST) && (Code != STR_POST) && (Code != LDR_POSTSUB) && (Code != STR_POSTSUB);
		bool_t PreWrite = (Code == LDR_PRE) || (Code == STR_PRE) || (Code == LDR_PRESUB) || (Code == STR_PRESUB);
		bool_t Load = (Code == LDR) || (Code == LDR_PRE) || (Code == LDR_POST) || (Code == LDR_PRESUB) || (Code == LDR_POSTSUB);
		bool_t Unsigned = (Code != LDR_PRESUB) && (Code != STR_PRESUB) && (Code != LDR_POSTSUB) && (Code != STR_POSTSUB);

		if (Const == 0)
		{
			Pre = 1;
			PreWrite = 0;
		}
		if (Const < 0)
		{
			Const = -Const;
			Unsigned = !Unsigned;
		}

		if (c->NextHalf || c->NextSign)
		{
			if (Const >= 0 && Const < 256 && (c->NextHalf || c->NextByte))
				p = InstCreate32((c->NextCond << 28) | 
					((Pre?1:0)<<24) | (Unsigned<<23) | (1 << 22) |
					((PreWrite?1:0)<<21) | (Load<<20) | (c->NextSign << 6) | (c->NextHalf << 5) |
					(Op1 << 16) | (Dest << 12) | ((Const >> 4) << 8) | (9 << 4) | (Const & 15),
					NONE, Op1, NONE, (c->NextCond != AL)?1:0, 0);
		}
		else
			if (Const >= 0 && Const < 4096)
				p = InstCreate32((c->NextCond << 28) | (1 << 26) |
					((Pre?1:0)<<24) | (Unsigned<<23) | (c->NextByte<<22) |
					((PreWrite?1:0)<<21) | (Load<<20) |
					(Op1 << 16) | (Dest << 12) | Const,
					NONE, Op1, NONE, (c->NextCond != AL)?1:0, 0);

		if (p)
		{
			if (Load)
				p->WrRegs |= 1 << Dest;
			else
				p->RdRegs |= 1 << Dest;

			if (!Pre || PreWrite)
				p->WrRegs |= 1 << Op1;
		}
	}

	InstPost(p);
}


void I1P(int Code, reg Dest, dyninst* Block, int Ofs)
{
	context* c = Context();
	dyninst* p = NULL;

	if (MODE(Code)==15)
	{
		p = InstCreate32((c->NextCond << 28) | (Code & MODEMASK) | (PC << 16) | ((Dest & 15) << 12),
			Dest, PC, NONE, (c->NextCond != AL)?1:0, 0);

		if (p)
		{
			p->Tag = Ofs;
			p->ReAlloc = Block;
		}
	}

	if (Code == LDR || Code == STR)
	{
		int Load = (Code == LDR);

		p = InstCreate32((c->NextCond << 28) | (1 << 26) |
			(1<<24) | (c->NextByte<<22) | (Load<<20) |
			(PC << 16) | (Dest << 12),
			Dest, PC, NONE, (c->NextCond != AL)?1:0, 0);

		if (p)
		{
			p->Tag = Ofs;
			p->ReAlloc = Block;
		}
	}
	else
	if (Code == MOV) // ADD|SUB,Dst,R15,Ofs
	{
		p = InstCreate32((c->NextCond << 28) |
			(1<<25) | (PC << 16) | (Dest << 12),
			Dest, PC, NONE, (c->NextCond != AL)?1:0, 0);

		if (p)
		{
			p->Tag = Ofs;
			p->ReAlloc = Block;
		}
	}
	InstPost(p);
}

void I0P(int Code, int Cond, dyninst* Target)
{
	dyninst* p = NULL;
	if (Code == B || Code == BL)
	{
		p = InstCreate32((Cond << 28) | (5 << 25) | ((Code == BL?1:0)<<24),
			PC, NONE, NONE, (Cond != AL)?1:0, 0);
		if (p)
		{	
			if (Code == BL)
				p->WrRegs |= 1 << LR;
			p->ReAlloc = Target;
			p->Branch = 1;
		}
	}
	InstPost(p);
}

void Break()
{
	context* c = Context();
	dyninst* p = InstCreate32((c->NextCond << 28) | (15 << 24),NONE,NONE,NONE,0,0);
	if (p)
		p->Branch = 1;
	InstPost(p);
}

void CodeBegin()
{
	int i;
	dyninst* p = InstCreate32(0xE92D5FF0,SP,NONE,NONE,0,0);
	if (p)
		for (i=4;i<16;++i)
			p->RdRegs |= 1 << i;
	InstPost(p);
}

void CodeEnd()
{
	int i;
	dyninst* p = InstCreate32(0xE8BD9FF0,SP,NONE,NONE,0,0);
	if (p)
		for (i=4;i<16;++i)
			p->WrRegs |= 1 << i;
	InstPost(p);
}

bool_t InstReAlloc(dyninst* p,dyninst* ReAlloc)
{
	int Diff = ReAlloc->Address - (p->Address+8);
	int* Code = (int*) InstCode(p);

	if (((*Code >> 25) & 7) == 6) //wldr,wstr
	{
		int Ofs = Diff + p->Tag;
		int OfsUnsigned = 1;
		if (Ofs < 0)
		{
			Ofs = -Ofs;
			OfsUnsigned = 0;
		}
		if (*Code & 256)
		{
			if (Ofs & 3)
				Ofs = 256;
			else
				Ofs >>= 2;
		}
		if (Ofs < 256)
		{
			*Code &= ~(1<<23);
			*Code |= OfsUnsigned<<23;
			*Code &= ~255;
			*Code |= Ofs;
			return 1;
		}

		DEBUG_MSG1(-1,T("Realloc failed for wldr,wstr %d"),Ofs);
	}
	else
	if (((*Code >> 25) & 7) == 5) //branch
	{
		*Code &= 0xFF000000;
		*Code |= (Diff >> 2) & ~0xFF000000;
		return 1;
	}
	else
	if (((*Code >> 25) & 7) == 1) //add dest,pc,#const
	{
		int Shift;
		int Ofs = Diff + p->Tag;

		*Code &= ~((15 << 21)|4095);

		if (Ofs < 0)
		{
			Ofs = -Ofs;
			*Code |= (SUB << 21);
		}
		else
			*Code |= (ADD << 21);

		for (Shift = 0;Shift<32;Shift+=2)
		{
			if (Ofs >= 0 && Ofs <= 255)
				break;
			Ofs = (Ofs << 2) | ((Ofs >> 30) & 3);
		}

		if (Ofs >= 0 && Ofs <= 255)
		{
			*Code |= (Shift << 7) | Ofs;
			return 1;
		}

		DEBUG_MSG1(-1,T("Realloc failed for add dest,pc,#const %d"),Ofs);
	}
	else
	if (((*Code >> 25) & 7) == 2) //ldr,str
	{
		int Ofs = Diff + p->Tag;
		int OfsUnsigned = 1;
		if (Ofs < 0)
		{
			Ofs = -Ofs;
			OfsUnsigned = 0;
		}
		if (Ofs < 4096)
		{
			*Code &= ~(1<<23);
			*Code |= OfsUnsigned<<23;
			*Code &= ~4095;
			*Code |= Ofs;
			return 1;
		}

		DEBUG_MSG1(-1,T("Realloc failed for ldr,str %d"),Ofs);
	}
	return 0;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -