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

📄 integer.c

📁 ppc750 system design simulator using system c
💻 C
📖 第 1 页 / 共 5 页
字号:
	sword_t a = GPR(RA);	sword_t b = GPR(RB);		if(b == 0)	{		/* divide by 0 */		if(OE)		{			SET_XER_OV;			SET_XER_SO;		}	}	else	{		if(a == 0x80000000 && b == 0xffffffff)		{			if(OE)			{				SET_XER_OV;				SET_XER_SO;			}		}		else		{			sword_t result = a / b;						GPR(RD) = result;						if(OE) RESET_XER_OV;						if(Rc) COMPUTE_CR0(result);					}	}}void divwux_impl(ppc_inst_t inst){	word_t a = GPR(RA);	word_t b = GPR(RB);		if(b == 0)	{		/* divide by 0 */		if(OE)		{			SET_XER_OV;			SET_XER_SO;		}	}	else	{		word_t result = a / b;					GPR(RD) = result;					if(OE) RESET_XER_OV;					if(Rc) COMPUTE_CR0(result);	}}void mulhwx_impl(ppc_inst_t inst){	sdword_t a = (sword_t) GPR(RA);	sdword_t b = (sword_t) GPR(RB);	sdword_t result = a * b;	result = (result >> 32);	GPR(RD) = (sword_t) result;	if(Rc) COMPUTE_CR0(result);}void mulhwux_impl(ppc_inst_t inst){	dword_t a = GPR(RA);	dword_t b = GPR(RB);	dword_t result = a * b;	result = (result >> 32);	GPR(RD) = (word_t) result;	if(Rc) COMPUTE_CR0(result);}void mullwx_impl(ppc_inst_t inst){	sword_t a = GPR(RA);	sword_t b = GPR(RB);	sdword_t result = a * b;	GPR(RD) = (sword_t)(result & 0x00000000ffffffff);	if(OE)	{		if(result & 0xffffffff00000000)		{			SET_XER_OV;			SET_XER_SO;		}		else		{			RESET_XER_SO;		}	}	if(Rc) COMPUTE_CR0(result);}void negx_impl(ppc_inst_t inst){    word_t result = -GPR(RA);    GPR(RD) = result;    if(OE)    {    	if(GPR(RA) == 0x80000000)    	{    		SET_XER_OV;    		SET_XER_SO;    	}    	else    	{    		RESET_XER_OV;    	}    }	if(Rc) COMPUTE_CR0(result);}void subfx_impl(ppc_inst_t inst){	word_t a = GPR(RA);	word_t b = GPR(RB);	word_t result = b - a;		GPR(RD) = result;			if(OE)	{		if(Underflow(b, a))		{			SET_XER_OV;			SET_XER_SO;		}		else		{			RESET_XER_OV;		}	}			if(Rc) COMPUTE_CR0(result);}void subfcx_impl(ppc_inst_t inst){	word_t a = GPR(RA);	word_t b = GPR(RB);	word_t result = b - a;		GPR(RD) = result;		if(a == 0 || Carry(b, -a)) SET_XER_CA; else RESET_XER_CA;			if(OE)	{		if(Underflow(b, a))		{			SET_XER_OV;			SET_XER_SO;		}		else		{			RESET_XER_OV;		}	}			if(Rc) COMPUTE_CR0(result);}void subfex_impl(ppc_inst_t inst){	word_t a = ~GPR(RA);	word_t b = GPR(RB);	word_t c = XER_CA;	word_t result = a + b + c;		GPR(RD) = result;		if(Carry(a, b) || Carry(a + b, c)) SET_XER_CA; else RESET_XER_CA;			if(OE)	{		if(Overflow(b, a) || Overflow(b + a, c))		{			SET_XER_OV;			SET_XER_SO;		}		else		{			RESET_XER_OV;		}	}			if(Rc) COMPUTE_CR0(result);}void subfmex_impl(ppc_inst_t inst){	word_t a = ~GPR(RA);	word_t c = XER_CA;	word_t result = a + c - 1;		GPR(RD) = result;		if(Carry(a, c - 1)) SET_XER_CA; else RESET_XER_CA;			if(OE)	{		if(Overflow(a, c - 1))		{			SET_XER_OV;			SET_XER_SO;		}		else		{			RESET_XER_OV;		}	}			if(Rc) COMPUTE_CR0(result);}void subfzex_impl(ppc_inst_t inst){	word_t a = ~GPR(RA);	word_t c = XER_CA;	word_t result = a + c;		GPR(RD) = result;		if(Carry(a, c)) SET_XER_CA; else RESET_XER_CA;			if(OE)	{		if(Overflow(a, c))		{			SET_XER_OV;			SET_XER_SO;		}		else		{			RESET_XER_OV;		}	}			if(Rc) COMPUTE_CR0(result);}char *addi_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	if(RA)		buf += sprintf(buf, "\tGPR(%u) = GPR(%u) + (%d);\n", RD, RA, SEXT16(IMM));	else		buf += sprintf(buf, "\tGPR(%u) = %d;\n", RD, SEXT16(IMM));	return buf;}char *addic_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA);	buf += sprintf(buf, "\tword_t b = %d;\n", SEXT16(IMM));	buf += sprintf(buf, "\tGPR(%u) = a + b;\n", RD);	buf += sprintf(buf, "\tif(Carry(a, b))\n");	buf += sprintf(buf, "\t\tSET_XER_CA;\n");	buf += sprintf(buf, "\telse\n");	buf += sprintf(buf, "\t\tRESET_XER_CA;\n");	return buf;}char *addicd_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA);	buf += sprintf(buf, "\tword_t b = %d;\n", SEXT16(IMM));	buf += sprintf(buf, "\tword_t result = a + b;\n");	buf += sprintf(buf, "\tGPR(%u) = result;\n", RD);	buf += sprintf(buf, "\tif(Carry(a, b))\n");	buf += sprintf(buf, "\t\tSET_XER_CA;\n");	buf += sprintf(buf, "\telse\n");	buf += sprintf(buf, "\t\tRESET_XER_CA;\n");	buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n");	return buf;}	char *addis_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	if(RA)		buf += sprintf(buf, "\tGPR(%u) = GPR(%u) + (%d);\n", RD, RA, (SEXT16(IMM) << 16));	else		buf += sprintf(buf, "\tGPR(%u) = %d;\n", RD, (SEXT16(IMM) << 16));	return buf;}char *andid_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t result = GPR(%u) & %u;\n", RS, IMM);	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	buf += sprintf(buf, "\tif((sword_t) result < 0) SET_CR0_LT; else RESET_CR0_LT;\n");	buf += sprintf(buf, "\tif((sword_t) result > 0) SET_CR0_GT; else RESET_CR0_GT;\n");	buf += sprintf(buf, "\tif(result == 0) SET_CR0_EQ; else RESET_CR0_EQ;\n");	buf += sprintf(buf, "\tif(XER_SO) SET_CR0_SO; else RESET_CR0_SO;\n");	return buf;}char *andisd_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t result = GPR(%u) & %u;\n", RS, (IMM << 16));	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	buf += sprintf(buf, "\tif((sword_t) result < 0) SET_CR0_LT; else RESET_CR0_LT;\n");	buf += sprintf(buf, "\tif((sword_t) result > 0) SET_CR0_GT; else RESET_CR0_GT;\n");	buf += sprintf(buf, "\tif(result == 0) SET_CR0_EQ; else RESET_CR0_EQ;\n");	buf += sprintf(buf, "\tif(XER_SO) SET_CR0_SO; else RESET_CR0_SO;\n");	return buf;}char *cmpi_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t result = GPR(%u) - (%d);\n", RA, SEXT16(IMM));	buf += sprintf(buf, "\tif((sword_t) result < 0) SET_CR_LT(%u); else RESET_CR_LT(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif((sword_t) result > 0) SET_CR_GT(%u); else RESET_CR_GT(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(result == 0) SET_CR_EQ(%u); else RESET_CR_EQ(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(XER_SO) SET_CR_SO(%u); else RESET_CR_SO(%u);\n", CRFD, CRFD);	return buf;}char *cmpli_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA);	buf += sprintf(buf, "\tword_t b = %u;\n", IMM);	buf += sprintf(buf, "\tif(a < b) SET_CR_LT(%u); else RESET_CR_LT(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(a > b) SET_CR_GT(%u); else RESET_CR_GT(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(a == b) SET_CR_EQ(%u); else RESET_CR_EQ(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(XER_SO) SET_CR_SO(%u); else RESET_CR_SO(%u);\n", CRFD, CRFD);	return buf;}char *mulli_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tGPR(%u) = GPR(%u) * (%d);\n", RD, RA, SEXT16(IMM));	return buf;}	char *ori_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tGPR(%u) = GPR(%u) | %u;\n", RA, RS, IMM);	return buf;}char *oris_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tGPR(%u) = GPR(%u) | %u;\n", RA, RS, (IMM << 16));	return buf;}char *subfic_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA);	buf += sprintf(buf, "\tword_t b = %d;\n", SEXT16(IMM));	buf += sprintf(buf, "\tGPR(%u) = b - a;\n", RD);	buf += sprintf(buf, "\tif(a == 0 || Carry(-a, b)) SET_XER_CA; else RESET_XER_CA;\n");	return buf;}char *twi_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tabort();\n");	return buf;}char *xori_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tGPR(%u) = GPR(%u) ^ %u;\n", RA, RS, IMM);	return buf;}char *xoris_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tGPR(%u) = GPR(%u) ^ %u;\n", RA, RS, (IMM << 16));	return buf;}char *rlwimix_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t r = ROTL(GPR(%u), %u);\n", RS, SH);	buf += sprintf(buf, "\tword_t m = MASK(%u, %u);\n", MB, ME);	buf += sprintf(buf, "\tword_t result = (r & m) | (GPR(%u) & (~m));\n", RA);	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n");	return buf;}char *rlwinmx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t r = ROTL(GPR(%u), %u);\n", RS, SH);	buf += sprintf(buf, "\tword_t m = MASK(%u, %u);\n", MB, ME);	buf += sprintf(buf, "\tword_t result = r & m;\n");	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n");	return buf;}char *rlwnmx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t r = ROTL(GPR(%u), GPR(%u) & 0x1f);\n", RS, RB);	buf += sprintf(buf, "\tword_t m = MASK(%u, %u);\n", MB, ME);	buf += sprintf(buf, "\tword_t result = r & m;\n");	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n");	return buf;}char *andx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tUInt32 result = GPR(%u) & GPR(%u);\n", RS, RB);	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n");	return buf;}char *andcx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t result = GPR(%u) & (~GPR(%u));\n", RS, RB);	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n");	return buf;}char *cmp_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t result = GPR(%u) - GPR(%u);\n", RA, RB);	buf += sprintf(buf, "\tif((sword_t) result < 0) SET_CR_LT(%u); else RESET_CR_LT(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif((sword_t) result > 0) SET_CR_GT(%u); else RESET_CR_GT(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(result == 0) SET_CR_EQ(%u); else RESET_CR_EQ(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(XER_SO) SET_CR_SO(%u); else RESET_CR_SO(%u);\n", CRFD, CRFD);	return buf;}char *cmpl_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t a = GPR(%u);\n", RA);	buf += sprintf(buf, "\tword_t b = GPR(%u);\n", RB);	buf += sprintf(buf, "\tif(a < b) SET_CR_LT(%u); else RESET_CR_LT(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(a > b) SET_CR_GT(%u); else RESET_CR_GT(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(a == b) SET_CR_EQ(%u); else RESET_CR_EQ(%u);\n", CRFD, CRFD);	buf += sprintf(buf, "\tif(XER_SO) SET_CR_SO(%u); else RESET_CR_SO(%u);\n", CRFD, CRFD);	return buf;}char *cntlzwx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t n = 0;\n");	buf += sprintf(buf, "\tword_t m = 1 << 31;\n");	buf += sprintf(buf, "\twhile(n < 32)\n");	buf += sprintf(buf, "\t{\n");	buf += sprintf(buf, "\t\tif(GPR(%u) & m) break;\n", RS);	buf += sprintf(buf, "\t\tm >>= 1;\n");	buf += sprintf(buf, "\t\tn++;\n");	buf += sprintf(buf, "\t}\n");	buf += sprintf(buf, "\tGPR(%u) = n;\n", RA);	if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(n);\n");	return buf;}char *eqvx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t result = ~(GPR(%u) ^ GPR(%u));\n", RS, RB);	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n");	return buf;}char *extsbx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t result = (word_t)(sword_t)(sbyte_t)(byte_t) GPR(%u);\n", RS);	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n");	return buf;}char *extshx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t result = (word_t)(sword_t)(shalfword_t)(halfword_t) GPR(%u);\n", RS);	buf += sprintf(buf, "\tGPR(%u) = result;\n", RA);	if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR0(result);\n");	return buf;}

⌨️ 快捷键说明

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