Ejemplo n.º 1
0
int RebuildCppInst(OpcodeInfo *theOp)
{
	int ip = theOp->rip;
	char str[256];

#ifdef CPP_DEBUG
	str[0] = 0;
	DisassembleFromSource(ip, str);
	RebuildEmit("\t\t\t\t\t\t//%s\n", str);
#endif


#ifdef CPP_SHOW_LINES
	{
		int line = ArrayGet(&SLD_Line_Array, ip);
		int file = ArrayGet(&SLD_File_Array, ip);

		if(line!=0) {
			RebuildEmit("\n	// %s:%d\n", GetFileNumString(file), line);
			RebuildEmit("	// %s\n", GetFileLine(file, line));
		}
	}
#endif

	switch (theOp->op)
	{
		case _PUSH:
			RebuildEmit("	//push %s,%d\n",Cpp_reg[theOp->rd], theOp->rs);

			if (REGUSED(funcprop.reg_used, REG_sp))
			{
				RebuildEmit("	sp -= %d;\n",theOp->rs*4);
			}
		return 1;

		case _POP:
			RebuildEmit("	//pop  %s,%d\n",Cpp_reg[theOp->rd], theOp->rs);

			if (REGUSED(funcprop.reg_used, REG_sp))
			{
				RebuildEmit("	sp += %d;\n",theOp->rs*4);
			}

		return 1;

		case _CASE:
			CppDecodeSwitch(theOp);
		break;


		case _CALLI:
			CppDecodeCall(theOp);
		break;

		case _SYSCALL:
			CppDecodeSysCall(theOp);
		break;

		case _CALL:
			CppDecodeCallReg(theOp);
		break;

		case _LDI:
			RebuildEmit("	%s = 0x%x;", Cpp_reg[theOp->rd], theOp->imm);
		break;

		case _LDR:
		{
			if (IsRegConst(theOp->rs))
				RebuildEmit("	%s = 0x%x;", Cpp_reg[theOp->rd], ConstRegValue(theOp->rs));
			else
				RebuildEmit("	%s = %s;", Cpp_reg[theOp->rd], Cpp_reg[theOp->rs]);
		}
		break;

		// Arithmatic

		case _ADD:
			CppEmitArith(theOp,"+", 0);
		break;

		case _ADDI:
			CppEmitArith(theOp,"+", 1);
		break;

		case _MUL:
			CppEmitArith(theOp,"*", 0);
		break;

		case _MULI:
			CppEmitArith(theOp,"*", 1);
		break;

		case _SUB:
			CppEmitArith(theOp,"-", 0);
		break;

		case _SUBI:
			CppEmitArith(theOp,"-", 1);
		break;

		case _AND:
			CppEmitArith(theOp,"&", 0);
		break;

		case _ANDI:
			CppEmitArith(theOp,"&", 1);
		break;

		case _OR:
			CppEmitArith(theOp,"|", 0);
		break;

		case _ORI:
			CppEmitArith(theOp,"|", 1);
		break;

		case _XOR:
			CppEmitArith(theOp,"^", 0);
		break;

		case _XORI:
			CppEmitArith(theOp,"^", 1);
		break;

		case _DIVU:
			CppEmitDivu(theOp, 0);
		break;

		case _DIVUI:
			CppEmitDivu(theOp, 1);
		break;

		case _DIV:
			CppEmitArith(theOp,"/", 0);
		break;

		case _DIVI:
			CppEmitArith(theOp,"/", 1);
		break;

		// Shifts

		case _SLL:
			CppEmitShift(theOp,"<<", 0, 0);
		break;

		case _SLLI:
			CppEmitShift(theOp,"<<", 1, 0);
		break;

		case _SRA:
			CppEmitShift(theOp,">>", 0, 0);
		break;

		case _SRAI:
			CppEmitShift(theOp,">>", 1, 0);
		break;

		case _SRL:
			CppEmitShift(theOp,">>", 0, 1);		// Unsigned
		break;

		case _SRLI:
			CppEmitShift(theOp,">>", 1, 1);		// Unsigned
		break;

		case _NOT:
			RebuildEmit("	%s = ~%s;", Cpp_reg[theOp->rd], Cpp_reg[theOp->rs]);
		break;

		case _NEG:
			RebuildEmit("	%s = -%s;", Cpp_reg[theOp->rd], Cpp_reg[theOp->rs]);
		break;

		case _RET:
		{
			if (ThisFunctionExit == 0)	// Don't output a return jump on last instruction
			{
				RebuildEmit("	goto label_0;	// return");
				ReturnCount++;
			}
		}
		break;

		// Conditional jumps

		case _JC_EQ:
			CppEmitJumpCond(theOp, "==", 0);
		break;

		case _JC_NE:
			CppEmitJumpCond(theOp, "!=", 0);
		break;

		case _JC_GE:
			CppEmitJumpCond(theOp, ">=", 0);
		break;

		case _JC_GEU:
			CppEmitJumpCond(theOp, ">=", 1);
		break;

		case _JC_GT:
			CppEmitJumpCond(theOp, ">", 0);
		break;

		case _JC_GTU:
			CppEmitJumpCond(theOp, ">", 1);
		break;

		case _JC_LE:
			CppEmitJumpCond(theOp, "<=", 0);
		break;

		case _JC_LEU:
			CppEmitJumpCond(theOp, "<=", 1);
		break;

		case _JC_LT:
			CppEmitJumpCond(theOp, "<", 0);
		break;

		case _JC_LTU:
			CppEmitJumpCond(theOp, "<", 1);
		break;

		case _JPI:
			CppDecodeLabel(theOp, "	goto label_%d;");
		break;

		// Memory instructions

		case _LDW:
			Cpp_LoadMem(theOp, "RINT");
		break;

		case _LDH:
			Cpp_LoadMem(theOp, "RSHORT");
		break;

		case _LDB:
			Cpp_LoadMem(theOp, "RBYTE");
		break;

		case _STW:
			Cpp_StoreMem(theOp, "WINT");
		break;

		case _STH:
			Cpp_StoreMem(theOp, "WSHORT");
		break;

		case _STB:
			Cpp_StoreMem(theOp, "WBYTE");
		break;

		case _XB:
			RebuildEmit("	%s = (int)((char) %s);", Cpp_reg[theOp->rd], Cpp_reg[theOp->rs]);
		break;

		case _XH:
			RebuildEmit("	%s = (int)((short) %s);", Cpp_reg[theOp->rd], Cpp_reg[theOp->rs]);
		break;

		default:
			str[0] = 0;
			DisassembleFromSource(ip, str);
			ErrorOnIP(Error_Fatal, ip, "Missing instruction in Cpp rebuilder '%s'\n", str);
	}

	//	ArraySet(&SLD_Line_Array, CodeIP, line);
	//	ArraySet(&SLD_File_Array, CodeIP, This_SLD_File);

//	RebuildEmit("\n");

	RebuildEmit("\n");

#ifdef LOG_REGISTER_STATE_CHANGES
	if (funcprop.reg_used)
	{
		/*
		int n;
		for (n=0;n<32;n++)
		{
			if (reg_used & (1 << n))
			{
				RebuildEmit("if(last_%s != %s) { LOG_REGISTER(%s); last_%s = %s;}\n", Cpp_reg[n], Cpp_reg[n], Cpp_reg[n], Cpp_reg[n], Cpp_reg[n]);
			}
		}
		RebuildEmit(";\n\n");
		*/
		RebuildEmit("\tLOG_REGISTER_STATE_CHANGES(0x%x)\n", funcprop.reg_used);
	}
#endif


	return 1;
}
Ejemplo n.º 2
0
int RebuildJavaInst(OpcodeInfo *theOp)
{
	int ip = theOp->rip;
	char str[256];

#ifdef JRDEBUG
	str[0] = 0;
	DisassembleFromSource(ip, str);
	RebuildEmit("\t\t\t\t\t\t//%s\n", str);
#endif

	switch (theOp->op)
	{
		case _PUSH:
			RebuildEmit("	//push %s,%d\n",java_reg[theOp->rd], theOp->rs);

			if (function_registers_used & (1 << REG_sp))
			{
				RebuildEmit("	" SP_STR " -= %d;\n",theOp->rs*4);
			}
		return 1;
			
		case _POP:
			RebuildEmit("	//pop  %s,%d\n",java_reg[theOp->rd], theOp->rs);

			if (function_registers_used & (1 << REG_sp))
			{
				RebuildEmit("	" SP_STR " += %d;\n",theOp->rs*4);
			}

		return 1;

		case _CASE:
			JavaDecodeSwitch(theOp);
		break;


		case _CALLI:
			JavaDecodeCall(theOp);
		break;

		case _SYSCALL:
			JavaDecodeSysCall(theOp);
		break;

		case _CALL:
			JavaDecodeCallReg(theOp);
		break;

		case _LDI:
			RebuildEmit("	%s = 0x%x;", java_reg[theOp->rd], theOp->imm);			
			SetRegInit(theOp->rd);
		break;

		case _LDR:
		{
			SetRegInit(theOp->rd);

			if (IsRegConst(theOp->rs))
				RebuildEmit("	%s = 0x%x;", java_reg[theOp->rd], ConstRegValue(theOp->rs));
			else
				RebuildEmit("	%s = %s;", java_reg[theOp->rd], java_reg[theOp->rs]);		
		}
		break;

		// Arithmatic
		
		case _ADD:
			JavaEmitArith(theOp,"+", 0);
		break;

		case _ADDI:
			JavaEmitArith(theOp,"+", 1);
		break;

		case _MUL:
			JavaEmitArith(theOp,"*", 0);
		break;

		case _MULI:
			JavaEmitArith(theOp,"*", 1);
		break;

		case _SUB:
			JavaEmitArith(theOp,"-", 0);
		break;

		case _SUBI:
			JavaEmitArith(theOp,"-", 1);
		break;

		case _AND:
			JavaEmitArith(theOp,"&", 0);
		break;

		case _ANDI:
			JavaEmitArith(theOp,"&", 1);
		break;

		case _OR:
			JavaEmitArith(theOp,"|", 0);
		break;

		case _ORI:
			JavaEmitArith(theOp,"|", 1);
		break;

		case _XOR:
			JavaEmitArith(theOp,"^", 0);
		break;

		case _XORI:
			JavaEmitArith(theOp,"^", 1);
		break;

		case _DIVU:
			JavaEmitDivu(theOp, 0);
		break;

		case _DIVUI:
			JavaEmitDivu(theOp, 1);
		break;

		case _DIV:
			JavaEmitArith(theOp,"/", 0);
		break;

		case _DIVI:
			JavaEmitArith(theOp,"/", 1);
		break;

		// Shifts

		case _SLL:
			JavaEmitArith(theOp,"<<", 0);
		break;

		case _SLLI:
			JavaEmitArith(theOp,"<<", 1);
		break;

		case _SRA:
			JavaEmitArith(theOp,">>", 0);
		break;

		case _SRAI:
			JavaEmitArith(theOp,">>", 1);
		break;

		case _SRL:
			JavaEmitArith(theOp,">>>", 0);
		break;

		case _SRLI:
			JavaEmitArith(theOp,">>>", 1);
		break;

		case _NOT:
			RebuildEmit("	%s = ~%s;", java_reg[theOp->rd], java_reg[theOp->rs]);		
			SetRegInit(theOp->rd);
		break;

		case _NEG:
			RebuildEmit("	%s = -%s;", java_reg[theOp->rd], java_reg[theOp->rs]);
			SetRegInit(theOp->rd);
		break;

		case _RET:
		{
			if (ThisFunctionExit == 0)	// Don't output a return jump on last instruction
			{
				RebuildEmit("	ms.goto_0();	// return");
				ReturnCount++;
			}
		}
		break;

		// Conditional jumps

		case _JC_EQ:
			JavaEmitJumpCond(theOp, "==", 0);
		break;

		case _JC_NE:
			JavaEmitJumpCond(theOp, "!=", 0);
		break;

		case _JC_GE:
			JavaEmitJumpCond(theOp, ">=", 0);
		break;

		case _JC_GEU:
			JavaEmitJumpCond(theOp, ">=", 1);
		break;

		case _JC_GT:
			JavaEmitJumpCond(theOp, ">", 0);
		break;

		case _JC_GTU:
			JavaEmitJumpCond(theOp, ">", 1);
		break;

		case _JC_LE:
			JavaEmitJumpCond(theOp, "<=", 0);
		break;

		case _JC_LEU:
			JavaEmitJumpCond(theOp, "<=", 1);
		break;

		case _JC_LT:
			JavaEmitJumpCond(theOp, "<", 0);
		break;

		case _JC_LTU:
			JavaEmitJumpCond(theOp, "<", 1);
		break;

		case _JPI:
			JavaDecodeLabel(theOp, "	ms.goto_%d();");
		break;

#ifdef NO_ELIM
		case _JPR:
//			JavaDecodeLabel(theOp, "	ms.goto_%d();");
		break;
#endif
		// Memory instructions

		case _LDW:
			Java_LoadMem(theOp, "RINT");
		break;

		case _LDH:
			Java_LoadMem(theOp, "RSHORT");
		break;

		case _LDB:
			Java_LoadMem(theOp, "RBYTE");
		break;

		case _STW:
			Java_StoreMem(theOp, "WINT");
		break;

		case _STH:
			Java_StoreMem(theOp, "WSHORT");
		break;

		case _STB:
			Java_StoreMem(theOp, "WBYTE");
		break;

		case _XB:
			RebuildEmit("	%s = (int)((byte) %s);", java_reg[theOp->rd], java_reg[theOp->rs]);		
		break;

		case _XH:
			RebuildEmit("	%s = (int)((short) %s);", java_reg[theOp->rd], java_reg[theOp->rs]);		
		break;

		default:
			str[0] = 0;
			DisassembleFromSource(ip, str);
			ErrorOnIP(Error_Fatal, ip, "Missing instruction in Java rebuilder '%s'\n", str);
	}

	RebuildEmit("\n");
	return 1;
}