systemregisters.c

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

C
979
字号
/***************************************************************************                systemregisters.c  -  description                      -------------------     begin                : Wed Sep 26 2001     copyright            : (C) 2001 Universite Paris Sud and CEA     author               : Gilles Mouchard     email                : gilles.mouchard@lri.fr, gilles.mouchard@cea.fr ***************************************************************************//*************************************************************************** * * *   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.   * * * ***************************************************************************/#include <systemregisters.h>#include <ppcemul.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <xmlize.h>void mcrfs_impl(ppc_inst_t inst) { abort(); }void mffsx_impl(ppc_inst_t inst){	dword_t _f;	_f= (dword_t)FPSCR;	FPR_DW(FD) = _f;}void mtfsb0x_impl(ppc_inst_t inst){	if(CRBD != 1 && CRBD != 2)	{//		FPSCR = FPSCR & (~(1 << (31 - CRBD)));	}}void mtfsb1x_impl(ppc_inst_t inst) { abort(); }void mtfsfix_impl(ppc_inst_t inst){//	FPSCR = MTFSFI_IMM;}void mtfsfx_impl(ppc_inst_t inst){	word_t _m,_f, _fm, _rb,_c;	int _i;	_rb = FPR_DW(FB);	_f=FPSCR;	_fm = FM;		if(_fm & 0x80)	{		_m = 0x60000000;	}	else	{		_m=0x0;	}	_c=0x1;	for(_i=0;_i<7;_i++)	{		if(_c & _fm)		{			_m= _m | (0xf<<(_i*4));		}		_c=_c<<1;	}	_f = _rb & _m;//	FPSCR = _f;}void mcrxr_impl(ppc_inst_t inst) { abort(); }void mfcr_impl(ppc_inst_t inst){	GPR(RD) = CR;}void mfmsr_impl(ppc_inst_t inst) { abort(); }void mfsr_impl(ppc_inst_t inst) { abort(); }void mfsrin_impl(ppc_inst_t inst) { abort(); }void mtmsr_impl(ppc_inst_t inst) { abort(); }void mtsr_impl(ppc_inst_t inst) { abort(); }void mtsrin_impl(ppc_inst_t inst) { abort(); }void mfspr_impl(ppc_inst_t inst){	word_t _s, _d;	_s = SPR;	_d = ((_s & 0x1F)<< 5) + (( _s >> 5)&0x1F);	if (_d ==1)	{		GPR(RD) = XER;	}		else if (_d ==8)	{		GPR(RD) = LR;	}	else if (_d == 9)	{		GPR(RD) = CTR;	}}void mftb_impl(ppc_inst_t inst){	word_t _d, _s;	_s = TBR;	_d = ((_s & 0x1F) << 5) + (( _s >> 5)&0x1F);	switch(_d)	{		case 268:			GPR(RD) = TBL;			break;					case 269:			GPR(RD) = TBU;			break;	}}void mtcrf_impl(ppc_inst_t inst){	word_t _m,_crm, _c, _a;	int _i, _b, _d;	_crm = CRM;	_d = GPR(RS);	for(_i = 0; _i < 8; _i++)	{		_b = (_crm >> _i) & 0x1;		if(_b == 1)		{			_c = CR;			_a = (_d >> (_i*4) ) & 0xf;			_m = (0xf << ( (_i)*4) );			CR = (_c & ~_m) | (_a << ((_i)*4));		}	}}void mtspr_impl(ppc_inst_t inst){	word_t _s, _d;	_s = SPR;	_d = ((_s & 0x1f) << 5) + (( _s >> 5)&0x1F);	if (_d ==1)	{		XER = GPR(RD);	}	else if (_d ==8)	{		LR = GPR(RD);	}	else if (_d == 9)	{		CTR = GPR(RD);	}}void crand_impl(ppc_inst_t inst){	word_t _a, _b, _c, _d, _m;	_c = CR;	_a = (0x1)  & (_c >> (31- CRBA));	_b = (0x1)  & (_c >> (31- CRBB));	_d = (_a & _b)<<(31-CRBD);	_m = ~(1<<(31-CRBD));	CR = ((_c & _m) | _d );}void crandc_impl(ppc_inst_t inst){	word_t _a, _b, _c, _d, _m;	_c = CR;	_a = (0x1)  & (_c >> (31- CRBA));	_b = (0x1)  & (_c >> (31- CRBB));	_d = (_a & (!_b))<<(31-CRBD);	_m = ~(1<<(31-CRBD));	CR = ((_c & _m) | _d );}void creqv_impl(ppc_inst_t inst){	word_t _a, _b, _c, _d, _m;	_c = CR;	_a = (0x1)  & (_c >> (31- CRBA));	_b = (0x1)  & (_c >> (31- CRBB));	_d = (!(_a ^ _b))<<(31-CRBD);	_m = ~(1<<(31-CRBD));	CR = ((_c & _m) | _d );}void crnand_impl(ppc_inst_t inst){	word_t _a, _b, _c, _d, _m;	_c = CR;	_a = (0x1)  & (_c >> (31- CRBA));	_b = (0x1)  & (_c >> (31- CRBB));	_d = (!(_a & _b))<<(31-CRBD);	_m = ~(1<<(31-CRBD));	CR = ((_c & _m) | _d );}void crnor_impl(ppc_inst_t inst){	word_t _a, _b, _c, _d, _m;	_c = CR;	_a = (0x1)  & (_c >> (31- CRBA));	_b = (0x1)  & (_c >> (31- CRBB));	_d = (!(_a | _b))<<(31-CRBD);	_m = ~(1<<(31-CRBD));	CR = ((_c & _m) | _d );}void cror_impl(ppc_inst_t inst){	word_t _a, _b, _c, _d, _m;	_c = CR;	_a = (0x1)  & (_c >> (31- CRBA));	_b = (0x1)  & (_c >> (31- CRBB));	_d = (_a | _b)<<(31-CRBD);	_m = ~(1<<(31-CRBD));	CR = ((_c & _m) | _d );}void crorc_impl(ppc_inst_t inst){	word_t _a, _b, _c, _d, _m;	_c = CR;	_a = (0x1)  & (_c >> (31- CRBA));	_b = (0x1)  & (_c >> (31- CRBB));	_d = (_a | (!_b))<<(31-CRBD);	_m = ~(1<<(31-CRBD));	CR = ((_c & _m) | _d );}void crxor_impl(ppc_inst_t inst){	word_t _a, _b, _c, _d, _m;	_c = CR;	_a = (0x1)  & (_c >> (31- CRBA));	_b = (0x1)  & (_c >> (31- CRBB));	_d = (_a ^ _b)<<(31-CRBD);	_m = ~(1<<(31-CRBD));	CR = ((_c & _m) | _d );}void mcrf_impl(ppc_inst_t inst){	CR = (CR & (~(0xf << (4 * (7 - CRFD))))) | (((CR >> (4 * (7 - CRFS))) & 0xf) << (4 * (7 - CRFD)));}void rfi_impl(ppc_inst_t inst) { abort(); }void rfid_impl(ppc_inst_t inst) { abort(); }	void sync_impl(ppc_inst_t inst) { abort(); }void isync_impl(ppc_inst_t inst) { abort(); }char *mcrfs_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mffsx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tdword_t _f;\n");	buf += sprintf(buf, "\t_f= (dword_t)FPSCR;\n");	buf += sprintf(buf, "\tFPR_DW(%u) = _f;\n", FD);	return buf;}char *mtfsb0x_bin2c(ppc_inst_t inst, addr_t pc, char *buf){//	if(CRBD != 1 && CRBD != 2)//	{//		FPSCR = FPSCR & (~(1 << (31 - CRBD)));//	}	strcpy(buf, "");	return buf;}char *mtfsb1x_bin2c(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *mtfsfix_bin2c(ppc_inst_t inst, addr_t pc, char *buf){//	FPSCR = MTFSFI_IMM;	strcpy(buf, "");	return buf;}char *mtfsfx_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tword_t _m,_f, _fm, _rb,_c;\n");	buf += sprintf(buf, "\tint _i;\n");	buf += sprintf(buf, "\t_rb = FPR_DW(%u);\n", FB);	buf += sprintf(buf, "\t_f=FPSCR;\n");	buf += sprintf(buf, "\t_fm = %u;\n", FM);		buf += sprintf(buf, "\tif(_fm & 0x80)\n");	buf += sprintf(buf, "\t{\n");	buf += sprintf(buf, "\t\t_m = 0x60000000;\n");	buf += sprintf(buf, "\t}\n");	buf += sprintf(buf, "\telse\n");	buf += sprintf(buf, "\t{\n");	buf += sprintf(buf, "\t\t_m=0x0;\n");	buf += sprintf(buf, "\t}\n");	buf += sprintf(buf, "\t_c=0x1;\n");	buf += sprintf(buf, "\tfor(_i=0;_i<7;_i++)\n");	buf += sprintf(buf, "\t{\n");	buf += sprintf(buf, "\t\tif(_c & _fm)\n");	buf += sprintf(buf, "\t\t{\n");	buf += sprintf(buf, "\t\t\t_m= _m | (0xf<<(_i*4));\n");

⌨️ 快捷键说明

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