systemregisters.c

来自「ppc750 system design simulator using sys」· C语言 代码 · 共 979 行 · 第 1/3 页

C
979
字号
	buf += sprintf(buf, "\t\t}\n");	buf += sprintf(buf, "\t\t_c=_c<<1;\n");	buf += sprintf(buf, "\t}\n");	buf += sprintf(buf, "\t_f = _rb & _m;\n");//	FPSCR = _f;	return buf;}char *mcrxr_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mfcr_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "GPR(%u) = CR;\n", RD);	return buf;}char *mfmsr_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mfsr_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mfsrin_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mtmsr_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mtsr_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mtsrin_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mfspr_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	word_t _s, _d;;	_s = SPR;	_d = ((_s & 0x1F)<< 5) + (( _s >> 5)&0x1F);	if (_d ==1)		buf += sprintf(buf, "\tGPR(%u) = XER;\n", RD);	else if (_d ==8)		buf += sprintf(buf, "\tGPR(%u) = LR;\n", RD);	else if (_d == 9)		buf += sprintf(buf, "\tGPR(%u) = CTR;\n", RD);	return buf;}char *mftb_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	word_t _d, _s;	_s = TBR;	_d = ((_s & 0x1F) << 5) + (( _s >> 5)&0x1F);	switch(_d)	{		case 268:			buf += sprintf(buf, "\tGPR(%u) = TBL;\n", RD);			break;		case 269:			buf += sprintf(buf, "\tGPR(%u) = TBU;\n", RD);			break;	}	return buf;}char *mtcrf_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _m,_crm, _c, _a;\n");	buf += sprintf(buf, "\tint _i, _b, _d;\n");	buf += sprintf(buf, "\t_crm = %u;\n", CRM);	buf += sprintf(buf, "\t_d = GPR(%u);\n", RS);	buf += sprintf(buf, "\tfor(_i = 0; _i < 8; _i++)\n");	buf += sprintf(buf, "\t{\n");	buf += sprintf(buf, "\t\t_b = (_crm >> _i) & 0x1;\n");	buf += sprintf(buf, "\t\tif(_b == 1)\n");	buf += sprintf(buf, "\t\t{\n");	buf += sprintf(buf, "\t\t\t_c = CR;\n");	buf += sprintf(buf, "\t\t\t_a = (_d >> (_i*4) ) & 0xf;\n");	buf += sprintf(buf, "\t\t\t_m = (0xf << ( (_i)*4) );\n");	buf += sprintf(buf, "\t\t\tCR = (_c & ~_m) | (_a << ((_i)*4));\n");	buf += sprintf(buf, "\t\t}\n");	buf += sprintf(buf, "\t}\n");	return buf;}char *mtspr_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	word_t _s, _d;	_s = SPR;	_d = ((_s & 0x1f) << 5) + (( _s >> 5)&0x1F);	if (_d ==1)		buf += sprintf(buf, "\tXER = GPR(%u);\n", RD);	else if (_d ==8)		buf += sprintf(buf, "\tLR = GPR(%u);\n", RD);	else if (_d == 9)		buf += sprintf(buf, "\tCTR = GPR(%u);\n", RD);	return buf;}char *crand_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _a, _b, _c, _d, _m;\n");	buf += sprintf(buf, "\t_c = CR;\n");	buf += sprintf(buf, "\t_a = (0x1)  & (_c >> (31- %u));\n", CRBA);	buf += sprintf(buf, "\t_b = (0x1)  & (_c >> (31- %u));\n", CRBB);	buf += sprintf(buf, "\t_d = (_a & _b)<<(31-%u);\n", CRBD);	buf += sprintf(buf, "\t_m = ~(1<<(31-%u));\n", CRBD);	buf += sprintf(buf, "\tCR = ((_c & _m) | _d );\n");	return buf;}char *crandc_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _a, _b, _c, _d, _m;\n");	buf += sprintf(buf, "\t_c = CR;\n");	buf += sprintf(buf, "\t_a = (0x1)  & (_c >> (31- %u));\n", CRBA);	buf += sprintf(buf, "\t_b = (0x1)  & (_c >> (31- %u));\n", CRBB);	buf += sprintf(buf, "\t_d = (_a & (!_b))<<(31-%u);\n", CRBD);	buf += sprintf(buf, "\t_m = ~(1<<(31-%u));\n", CRBD);	buf += sprintf(buf, "\tCR = ((_c & _m) | _d );\n");	return buf;}char *creqv_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _a, _b, _c, _d, _m;\n");	buf += sprintf(buf, "\t_c = CR;\n");	buf += sprintf(buf, "\t_a = (0x1)  & (_c >> (31- %u));\n", CRBA);	buf += sprintf(buf, "\t_b = (0x1)  & (_c >> (31- %u));\n", CRBB);	buf += sprintf(buf, "\t_d = (!(_a ^ _b))<<(31-%u);\n", CRBD);	buf += sprintf(buf, "\t_m = ~(1<<(31-%u));\n", CRBD);	buf += sprintf(buf, "\tCR = ((_c & _m) | _d );\n");	return buf;}char *crnand_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _a, _b, _c, _d, _m;\n");	buf += sprintf(buf, "\t_c = CR;\n");	buf += sprintf(buf, "\t_a = (0x1)  & (_c >> (31- %u));\n", CRBA);	buf += sprintf(buf, "\t_b = (0x1)  & (_c >> (31- %u));\n", CRBB);	buf += sprintf(buf, "\t_d = (!(_a & _b))<<(31-%u);\n", CRBD);	buf += sprintf(buf, "\t_m = ~(1<<(31-%u));\n", CRBD);	buf += sprintf(buf, "\tCR = ((_c & _m) | _d );\n");	return buf;}char *crnor_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _a, _b, _c, _d, _m;\n");	buf += sprintf(buf, "\t_c = CR;\n");	buf += sprintf(buf, "\t_a = (0x1)  & (_c >> (31- %u));\n", CRBA);	buf += sprintf(buf, "\t_b = (0x1)  & (_c >> (31- %u));\n", CRBB);	buf += sprintf(buf, "\t_d = (!(_a | _b))<<(31-%u);\n", CRBD);	buf += sprintf(buf, "\t_m = ~(1<<(31-%u));\n", CRBD);	buf += sprintf(buf, "\tCR = ((_c & _m) | _d );\n");	return buf;}char *cror_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _a, _b, _c, _d, _m;\n");	buf += sprintf(buf, "\t_c = CR;\n");	buf += sprintf(buf, "\t_a = (0x1)  & (_c >> (31- %u));\n", CRBA);	buf += sprintf(buf, "\t_b = (0x1)  & (_c >> (31- %u));\n", CRBB);	buf += sprintf(buf, "\t_d = (_a | _b)<<(31-%u);\n", CRBD);	buf += sprintf(buf, "\t_m = ~(1<<(31-%u));\n", CRBD);	buf += sprintf(buf, "\tCR = ((_c & _m) | _d );\n");	return buf;}char *crorc_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _a, _b, _c, _d, _m;\n");	buf += sprintf(buf, "\t_c = CR;\n");	buf += sprintf(buf, "\t_a = (0x1)  & (_c >> (31- %u));\n", CRBA);	buf += sprintf(buf, "\t_b = (0x1)  & (_c >> (31- %u));\n", CRBB);	buf += sprintf(buf, "\t_d = (_a | (!_b))<<(31-%u);\n", CRBD);	buf += sprintf(buf, "\t_m = ~(1<<(31-%u));\n", CRBD);	buf += sprintf(buf, "\tCR = ((_c & _m) | _d );\n");	return buf;}char *crxor_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _a, _b, _c, _d, _m;\n");	buf += sprintf(buf, "\t_c = CR;\n");	buf += sprintf(buf, "\t_a = (0x1)  & (_c >> (31- %u));\n", CRBA);	buf += sprintf(buf, "\t_b = (0x1)  & (_c >> (31- %u));\n", CRBB);	buf += sprintf(buf, "\t_d = (_a ^ _b)<<(31-%u);\n", CRBD);	buf += sprintf(buf, "\t_m = ~(1<<(31-%u));\n", CRBD);	buf += sprintf(buf, "\tCR = ((_c & _m) | _d );\n");	return buf;}char *mcrf_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tCR = (CR & (~(0xf << (4 * (7 - %u))))) | (((CR >> (4 * (7 - %u))) & 0xf) << (4 * (7 - %u)));\n", CRFD, CRFS, CRFD);	return buf;}char *rfi_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *rfid_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }	char *sync_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *isync_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mcrfs_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mcrfs cr%u, cr%u", CRFD, CRFS); return buf; }char *mffsx_disasm(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "mffs");	if(Rc) buf += sprintf(buf, ".");	buf += sprintf(buf, " f%u", FD);	return buf;}char *mtfsb0x_disasm(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "mtfsb0");	if(Rc) buf += sprintf(buf, ".");	buf += sprintf(buf, " crb%u", CRBD);	return buf;}char *mtfsb1x_disasm(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "mtfsb1");	if(Rc) buf += sprintf(buf, ".");	buf += sprintf(buf, " crb%u", CRBD);	return buf;}char *mtfsfix_disasm(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "mtfsfi");	if(Rc) buf += sprintf(buf, ".");	buf += sprintf(buf, " crf%u, %u", CRFD, MTFSFI_IMM);	return buf;}char *mtfsfx_disasm(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "mtfsf");	if(Rc) buf += sprintf(buf, ".");	buf += sprintf(buf, " %u, f%u", FM, FB);	return buf;}char *mcrxr_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mcrxr cr%u", CRFD); return buf; }char *mfcr_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mfcr r%u", RD); return buf; }char *mfmsr_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mfmsr r%u", RD); return buf; }char *mfsr_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mfsr r%u, %u", RD, SR); return buf; }char *mfsrin_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mfsrin r%u, r%u", RD, RB); return buf; }char *mtmsr_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mtmsr r%u", RS); return buf; }char *mtsr_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mtsr %u, r%u", SR, RS); return buf; }char *mtsrin_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mtsrin r%u, r%u", RS, RB); return buf; }char *mfspr_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mfspr r%u, %u", RD, SPR); return buf; }char *mftb_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mftb r%u, %u", RD, TBR); return buf; }char *mtcrf_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mtcrf %u, r%u", CRM, RS); return buf; }char *mtspr_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mtspr %u, r%u", SPR, RS); return buf; }char *crand_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "crand cr%u, cr%u, cr%u", CRBD, CRBA, CRBB); return buf; }char *crandc_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "crandc cr%u, cr%u, cr%u", CRBD, CRBA, CRBB); return buf; }char *creqv_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "creqv cr%u, cr%u, cr%u", CRBD, CRBA, CRBB); return buf; }char *crnand_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "crnand cr%u, cr%u, cr%u", CRBD, CRBA, CRBB); return buf; }char *crnor_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "crnor cr%u, cr%u, cr%u", CRBD, CRBA, CRBB); return buf; }char *cror_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "cror cr%u, cr%u, cr%u", CRBD, CRBA, CRBB); return buf; }char *crorc_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "crorc cr%u, cr%u, cr%u", CRBD, CRBA, CRBB); return buf; }char *crxor_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "crxor cr%u, cr%u, cr%u", CRBD, CRBA, CRBB); return buf; }char *mcrf_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "mcrf cr%u, cr%u", CRFD, CRFS); return buf; }char *rfi_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "rfi"); return buf; }char *rfid_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "rfid"); return buf; }	char *sync_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "sync"); return buf; }char *isync_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "isync"); return buf; }void mcrfs_translate(ppc_inst_t inst, struct DecodedInstruction *di) { di->iclass = 0; }void mffsx_translate(ppc_inst_t inst, struct DecodedInstruction *di){	di->hasImmed = FALSE;	di->iclass = ICMoveFromFPSCR;	di->operation.floatingPoint.ident = Rc ? ID_MFFSD : ID_MFFS;	di->io.floatingPoint.inFPSCR = TRUE;	di->io.floatingPoint.srcReg[0] = -1;	di->io.floatingPoint.srcReg[1] = -1;	di->io.floatingPoint.srcReg[2] = -1;	di->io.floatingPoint.dstReg = FD;	if(Rc)	{		di->io.floatingPoint.outCR = TRUE;    	di->io.floatingPoint.crf = 1;    }    else    {		di->io.floatingPoint.outCR = FALSE;    }}void mtfsb0x_translate(ppc_inst_t inst, struct DecodedInstruction *di){	di->hasImmed = FALSE;	di->iclass = ICMoveToFPSCR;	di->operation.floatingPoint.ident = Rc ? ID_MTFSB0D : ID_MTFSB0;	di->io.floatingPoint.inFPSCR = FALSE;	di->io.floatingPoint.srcReg[0] = -1;	di->io.floatingPoint.srcReg[1] = -1;	di->io.floatingPoint.srcReg[2] = -1;	di->io.floatingPoint.dstReg = -1;	di->io.floatingPoint.outCR = FALSE;}void mtfsb1x_translate(ppc_inst_t inst, struct DecodedInstruction *di){	di->hasImmed = FALSE;	di->iclass = ICMoveToFPSCR;	di->operation.floatingPoint.ident = Rc ? ID_MTFSB1D : ID_MTFSB1;	di->io.floatingPoint.inFPSCR = FALSE;	di->io.floatingPoint.srcReg[0] = -1;	di->io.floatingPoint.srcReg[1] = -1;

⌨️ 快捷键说明

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