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

📄 arm_gen.cpp

📁 arm的模拟器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}char *emitc_adc_rrx_mode2_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, READ_REG(%u) + ((READ_REG(%u)>>1)|(C_FLAG<<31)) + C_FLAG);\n"	"", (inst>>12)&15, (inst>>16)&15, (inst>>0)&15);	return buf;}char *emitc_adc_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, READ_REG(%u) + (val32=READ_REG(%u), (val32>>%u)|(val32<<(32-%u))) + C_FLAG);\n"	"", (inst>>12)&15, (inst>>16)&15, (inst>>0)&15, (inst>>7)&31, (inst>>7)&31);	return buf;}char *emitc_adc_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, READ_REG(%u) + (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (tmp32<32)?(val32<<tmp32):0) + C_FLAG);\n"	"", (inst>>12)&15, (inst>>16)&15, (inst>>8)&15, (inst>>0)&15);	return buf;}char *emitc_adc_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, READ_REG(%u) + (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (tmp32<32)?(val32>>tmp32):0) + C_FLAG);\n"	"", (inst>>12)&15, (inst>>16)&15, (inst>>8)&15, (inst>>0)&15);	return buf;}char *emitc_adc_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, READ_REG(%u) + (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (int32_t)val32>>(tmp32<32?tmp32:31)) + C_FLAG);\n"	"", (inst>>12)&15, (inst>>16)&15, (inst>>8)&15, (inst>>0)&15);	return buf;}char *emitc_adc_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, READ_REG(%u) + (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (val32>>(tmp32&0x1f))|(val32<<(32-(tmp32&0x1f)))) + C_FLAG);\n"	"", (inst>>12)&15, (inst>>16)&15, (inst>>8)&15, (inst>>0)&15);	return buf;}char *emitc_adcs_lsl_mode2_(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"	"	tmp32  = (READ_REG(%u)<<%u);\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>7)&31, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_zero_mode2_(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"	"	tmp32  = 0;\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_lsr_mode2_(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"	"	tmp32  = (READ_REG(%u)>>%u);\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>7)&31, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_sign_mode2_(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"	"	tmp32  = (BIT31(READ_REG(%u))?~0:0);\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_asr_mode2_(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"	"	tmp32  = ((int32_t)(READ_REG(%u))>>%u);\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>7)&31, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_rrx_mode2_(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"	"	tmp32  = ((READ_REG(%u)>>1)|(C_FLAG<<31));\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_ror_mode2_(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"	"	tmp32  = (val32=READ_REG(%u), (val32>>%u)|(val32<<(32-%u)));\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&15, (inst>>7)&31, (inst>>7)&31, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_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, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	tmp32  = (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (tmp32<32)?(val32<<tmp32):0);\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>8)&15, (inst>>0)&15, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_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, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	tmp32  = (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (tmp32<32)?(val32>>tmp32):0);\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>8)&15, (inst>>0)&15, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_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, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	tmp32  = (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (int32_t)val32>>(tmp32<32?tmp32:31));\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>8)&15, (inst>>0)&15, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_adcs_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, "\tuint32_t rslt32;\n");	buf += sprintf(buf, "\tuint32_t carry;\n");	buf += sprintf(buf, "\n"	"	tmp32  = (tmp32=READ_REG(%u)&0xFF, val32=READ_REG(%u), (val32>>(tmp32&0x1f))|(val32<<(32-(tmp32&0x1f))));\n"	"	val32  = READ_REG(%u);\n"	"	if (C_FLAG) {\n"	"		rslt32 = tmp32+val32+1;\n"	"		carry = rslt32 <= val32;\n"	"	}\n"	"	else {\n"	"		rslt32 = tmp32+val32;\n"	"		carry = rslt32 < val32;\n"	"	}\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, carry, (val32 ^ tmp32 ^ -1) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>8)&15, (inst>>0)&15, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_subi_imm_mode1_(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>>16)&15, (inst>>0)&255);	return buf;}char *emitc_subi_rot_mode1_(char *buf, unsigned curpc, target_inst_t inst, unsigned size){	buf += sprintf(buf, "\n"	"	WRITE_REG(%u, READ_REG(%u) - ((%u>>(%u<<1))|(%u<<(32-(%u<<1)))));\n"	"", (inst>>12)&15, (inst>>16)&15, (inst>>0)&255, (inst>>8)&15, (inst>>0)&255, (inst>>8)&15);	return buf;}char *emitc_subis_imm_mode1_(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, "\n"	"	tmp32  = %u;\n"	"	val32  = READ_REG(%u);\n"	"	rslt32 = val32 - tmp32;\n"	"\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, val32>=tmp32, (val32 ^ tmp32) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&255, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}char *emitc_subis_rot_mode1_(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, "\n"	"	tmp32  = ((%u>>(%u<<1))|(%u<<(32-(%u<<1))));\n"	"	val32  = READ_REG(%u);\n"	"	rslt32 = val32 - tmp32;\n"	"\n"	"    if (%u==15)\n"	"        WRITE_CPSR(SPSR);\n"	"    else\n"	"		ASGN_NZCV(rslt32, val32>=tmp32, (val32 ^ tmp32) & (val32 ^ rslt32));\n"	"	WRITE_REG(%u, rslt32);\n"	"", (inst>>0)&255, (inst>>8)&15, (inst>>0)&255, (inst>>8)&15, (inst>>16)&15, (inst>>12)&15, (inst>>12)&15);	return buf;}

⌨️ 快捷键说明

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