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

📄 arm_gen.cpp

📁 這是一個arm模擬器 以C++實做 主要模擬ARM9架構
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*************************************************************************    Copyright (C) 2002 - 2007 Wei Qin    See file COPYING for more information.    This program is free software; you can redistribute it and/or modify        it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.*************************************************************************/#include "arch_gen.hpp"char *emitc_movi_imm_mode1_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, %u);\n"	"", (inst>>12)&15, (inst>>0)&255);	return buf;}char *emitc_movi_rot_mode1_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, ((%u>>(%u<<1))|(%u<<(32-(%u<<1)))));\n"	"", (inst>>12)&15, (inst>>0)&255, (inst>>8)&15, (inst>>0)&255, (inst>>8)&15);	return buf;}char *emitc_movis_imm_mode1_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (carry=C_FLAG,%u);\n"	"	if (%u==15)\n"	"		WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&255, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movis_rot_mode1_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (rslt32=(%u>>(%u<<1))|(%u<<(32-(%u<<1))), carry=BIT31(rslt32), rslt32);\n"	"	if (%u==15)\n"	"		WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&255, (inst>>8)&15, (inst>>0)&255, (inst>>8)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_mov_lsl_mode2_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, (READ_REG(%u)<<%u));\n"	"", (inst>>12)&15, (inst>>0)&15, (inst>>7)&31);	return buf;}char *emitc_mov_zero_mode2_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, 0);\n"	"", (inst>>12)&15);	return buf;}char *emitc_mov_lsr_mode2_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, (READ_REG(%u)>>%u));\n"	"", (inst>>12)&15, (inst>>0)&15, (inst>>7)&31);	return buf;}char *emitc_mov_sign_mode2_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, (BIT31(READ_REG(%u))?~0:0));\n"	"", (inst>>12)&15, (inst>>0)&15);	return buf;}char *emitc_mov_asr_mode2_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, ((int32_t)(READ_REG(%u))>>%u));\n"	"", (inst>>12)&15, (inst>>0)&15, (inst>>7)&31);	return buf;}char *emitc_mov_rrx_mode2_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, ((READ_REG(%u)>>1)|(C_FLAG<<31)));\n"	"", (inst>>12)&15, (inst>>0)&15);	return buf;}char *emitc_mov_ror_mode2_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, (val32=READ_REG(%u), (val32>>%u)|(val32<<(32-%u))));\n"	"", (inst>>12)&15, (inst>>0)&15, (inst>>7)&31, (inst>>7)&31);	return buf;}char *emitc_mov_lsl_mode3_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t tmp32;\n");	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (tmp32<32)?(val32<<tmp32):0));\n"	"", (inst>>12)&15, (inst>>8)&15, (inst>>0)&15);	return buf;}char *emitc_mov_lsr_mode3_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t tmp32;\n");	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (tmp32<32)?(val32>>tmp32):0));\n"	"", (inst>>12)&15, (inst>>8)&15, (inst>>0)&15);	return buf;}char *emitc_mov_asr_mode3_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t tmp32;\n");	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (int32_t)val32>>(tmp32<32?tmp32:31)));\n"	"", (inst>>12)&15, (inst>>8)&15, (inst>>0)&15);	return buf;}char *emitc_mov_ror_mode3_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t tmp32;\n");	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (val32>>(tmp32&0x1f))|(val32<<(32-(tmp32&0x1f)))));\n"	"", (inst>>12)&15, (inst>>8)&15, (inst>>0)&15);	return buf;}char *emitc_movs_lsz_mode2_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (carry=C_FLAG, READ_REG(%u));\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_lsl_mode2_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (val32=READ_REG(%u), carry=BITn(val32, 32-%u), val32<<%u);\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>7)&31, (inst>>7)&31, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_zero_mode2_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (carry=BIT31(READ_REG(%u)), 0);\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_lsr_mode2_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (val32=READ_REG(%u), carry=BITn(val32, %u-1), val32>>%u);\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>7)&31, (inst>>7)&31, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_sign_mode2_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (val32=READ_REG(%u), carry=BIT31(val32), BIT31(val32)?~0:0);\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_asr_mode2_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (val32=READ_REG(%u), carry=BITn(val32, %u-1), (int32_t)val32>>%u);\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>7)&31, (inst>>7)&31, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_rrx_mode2_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (val32=READ_REG(%u), carry=BIT0(val32), (val32>>1)|(C_FLAG<<31));\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_ror_mode2_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (val32=READ_REG(%u), carry=BITn(val32, %u-1), (val32>>%u)|(val32<<(32-%u)));\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>7)&31, (inst>>7)&31, (inst>>7)&31, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_lsl_mode3_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t tmp32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), carry=(tmp32==0)?C_FLAG:((tmp32>32)?0:BITn(val32,32-val32)), (tmp32<32)?(val32<<tmp32):0);\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>8)&15, (inst>>0)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_lsr_mode3_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t tmp32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), carry=(tmp32==0)?C_FLAG:((tmp32>32)?0:BITn(val32,tmp32-1)), (tmp32<32)?(val32>>tmp32):0);\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>8)&15, (inst>>0)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_asr_mode3_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t tmp32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), carry=(tmp32==0)?C_FLAG:((tmp32>31)?BIT31(val32):BITn(val32,tmp32-1)), (int32_t)val32>>(tmp32<32?tmp32:31));\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>8)&15, (inst>>0)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_movs_ror_mode3_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t val32;\n");	buf += sprintf(buf, "\tuint32_t tmp32;\n");	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), carry=(tmp32==0)?C_FLAG:((tmp32&0x1f==0)?BIT31(val32):BITn(val32,(tmp32&0x1f)-1)), (val32>>(tmp32&0x1f))|(val32<<(32-(tmp32&0x1f))));\n"	"	if (%u==15)\n"	"    	WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>8)&15, (inst>>0)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_mvni_imm_mode1_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, ~%u);\n"	"", (inst>>12)&15, (inst>>0)&255);	return buf;}char *emitc_mvni_rot_mode1_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, ~((%u>>(%u<<1))|(%u<<(32-(%u<<1)))));\n"	"", (inst>>12)&15, (inst>>0)&255, (inst>>8)&15, (inst>>0)&255, (inst>>8)&15);	return buf;}char *emitc_mvnis_imm_mode1_s_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	rslt32 = ~(carry=C_FLAG,%u);\n"	"	if (%u==15)\n"	"		WRITE_CPSR(SPSR);\n"	"	else\n"	"		ASGN_NZC(rslt32, carry);\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&255, (inst>>12)&15, (inst>>12)&15);	return buf;

⌨️ 快捷键说明

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