decode.c

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

C
800
字号
char *ppc_disassemble2(ppc_inst_t inst, addr_t pc){	static char buffer[256];	ppc_disassemble(inst, pc, buffer);	return buffer;}void ppc_disassemble_to_stream(ppc_inst_t inst, addr_t pc, FILE *stream){	char buf[256];	ppc_disassemble(inst, pc, buf);	fprintf(stream, "0x%08x : 0x%08x    %s", pc, inst, buf);}void translate_31(ppc_inst_t inst, struct DecodedInstruction *di){	translate_table31[XO_10](inst, di);}void translate_63(ppc_inst_t inst, struct DecodedInstruction *di){	translate_table63[XO_10](inst, di);}void translate_19(ppc_inst_t inst, struct DecodedInstruction *di){	translate_table19[XO_10](inst, di);}void translate_59(ppc_inst_t inst, struct DecodedInstruction *di){	translate_table59[XO_5](inst, di);}void translate_default(ppc_inst_t inst, struct DecodedInstruction *di){	di->iclass = 0;}void ppc_translate(ppc_inst_t inst, struct DecodedInstruction *di){	translate_table[OPCD](inst, di);}void init_table(int opcd, void (*impl)(ppc_inst_t), char *(*bin2c)(ppc_inst_t, addr_t, char *), char *(*disasm)(ppc_inst_t, addr_t, char *), void (*translate)(ppc_inst_t, struct DecodedInstruction *), void (*xmlize)(ppc_inst_t, addr_t, char *), char *mnemonic){	impl_table[opcd] = impl;	bin2c_table[opcd] = bin2c;	disasm_table[opcd] = disasm;	translate_table[opcd] = translate;	xml_table[opcd] = xmlize;	mnemonic_table[ninstructions] = mnemonic;	index_table[opcd] = ninstructions++;}void init_table59(int xo, void (*impl)(ppc_inst_t), char *(*bin2c)(ppc_inst_t, addr_t, char *), char *(*disasm)(ppc_inst_t, addr_t, char *), void (*translate)(ppc_inst_t, struct DecodedInstruction *), void (*xmlize)(ppc_inst_t, addr_t, char *), char *mnemonic){	impl_table59[xo] = impl;	bin2c_table59[xo] = bin2c;	disasm_table59[xo] = disasm;	translate_table59[xo] = translate;	xml_table[xo] = xmlize;	mnemonic_table[ninstructions] = mnemonic;	index_table59[xo] = ninstructions++;}void init_table19(int xo, void (*impl)(ppc_inst_t), char *(*bin2c)(ppc_inst_t, addr_t, char *), char *(*disasm)(ppc_inst_t, addr_t, char *), void (*translate)(ppc_inst_t, struct DecodedInstruction *), void (*xmlize)(ppc_inst_t, addr_t, char *), char *mnemonic){	impl_table19[xo] = impl;	bin2c_table19[xo] = bin2c;	disasm_table19[xo] = disasm;	translate_table19[xo] = translate;	xml_table[xo] = xmlize;	mnemonic_table[ninstructions] = mnemonic;	index_table19[xo] = ninstructions++;}void init_table31(int xo, int bitcount, void (*impl)(ppc_inst_t), char *(*bin2c)(ppc_inst_t, addr_t, char *), char *(*disasm)(ppc_inst_t, addr_t, char *), void (*translate)(ppc_inst_t, struct DecodedInstruction *), void (*xmlize)(ppc_inst_t, addr_t, char *), char *mnemonic){	int d = 10 - bitcount;	int n = 1 << d;	int i;		for(i = 0; i < n; i++)	{		impl_table31[xo | (i << bitcount)] = impl;		bin2c_table31[xo | (i << bitcount)] = bin2c;		disasm_table31[xo | (i << bitcount)] = disasm;		translate_table31[xo | (i << bitcount)] = translate;		xml_table31[xo | (i << bitcount)] = xmlize;		index_table31[xo | (i << bitcount)] = ninstructions;	}	mnemonic_table[ninstructions] = mnemonic;	ninstructions++;}void init_table63(int xo, int bitcount, void (*impl)(ppc_inst_t), char *(*bin2c)(ppc_inst_t, addr_t, char *), char *(*disasm)(ppc_inst_t, addr_t, char *), void (*translate)(ppc_inst_t, struct DecodedInstruction *), void (*xmlize)(ppc_inst_t, addr_t, char *), char *mnemonic){	int d = 10 - bitcount;	int n = 1 << d;	int i;		for(i = 0; i < n; i++)	{		impl_table63[xo | (i << bitcount)] = impl;		bin2c_table31[xo | (i << bitcount)] = bin2c;		disasm_table63[xo | (i << bitcount)] = disasm;		translate_table63[xo | (i << bitcount)] = translate;		xml_table63[xo | (i << bitcount)] = xmlize;		index_table63[xo | (i << bitcount)] = ninstructions;	}	mnemonic_table[ninstructions] = mnemonic;	ninstructions++;}void ppc_clear_instruction_counters(){	int i;	for(i = 0; i < ninstructions; i++)	{		counters[i] = 0;	}	instruction_counter = 0;}void ppc_init_decode(){	int i;		ninstructions = 0;	instruction_counter = 0;		for(i = 0; i < 64; i++) impl_table[i] = impl_default;	for(i = 0; i < 1024; i++) impl_table31[i] = impl_default;	for(i = 0; i < 1024; i++) impl_table63[i] = impl_default;	for(i = 0; i < 1024; i++) impl_table19[i] = impl_default;	for(i = 0; i < 32; i++) impl_table59[i] = impl_default;			for(i = 0; i < 64; i++) bin2c_table[i] = bin2c_default;	for(i = 0; i < 1024; i++) bin2c_table31[i] = bin2c_default;	for(i = 0; i < 1024; i++) bin2c_table63[i] = bin2c_default;	for(i = 0; i < 1024; i++) bin2c_table19[i] = bin2c_default;	for(i = 0; i < 32; i++) bin2c_table59[i] = bin2c_default;		for(i = 0; i < 64; i++) disasm_table[i] = disasm_default;	for(i = 0; i < 1024; i++) disasm_table31[i] = disasm_default;	for(i = 0; i < 1024; i++) disasm_table63[i] = disasm_default;	for(i = 0; i < 1024; i++) disasm_table19[i] = disasm_default;	for(i = 0; i < 32; i++) disasm_table59[i] = disasm_default;	for(i = 0; i < 64; i++) translate_table[i] = translate_default;	for(i = 0; i < 1024; i++) translate_table31[i] = translate_default;	for(i = 0; i < 1024; i++) translate_table63[i] = translate_default;	for(i = 0; i < 1024; i++) translate_table19[i] = translate_default;	for(i = 0; i < 32; i++) translate_table59[i] = translate_default;	for(i = 0; i < 64; i++) xml_table[i] = xml_default;	for(i = 0; i < 1024; i++) xml_table31[i] = xml_default;	for(i = 0; i < 1024; i++) xml_table63[i] = xml_default;	for(i = 0; i < 1024; i++) xml_table19[i] = xml_default;	for(i = 0; i < 32; i++) xml_table59[i] = xml_default;				for(i = 0; i < 1024; i++) mnemonic_table[i] = "?";		for(i = 0; i < 64; i++) index_table[i] = 0;	for(i = 0; i < 1024; i++) index_table31[i] = 0;	for(i = 0; i < 1024; i++) index_table63[i] = 0;	for(i = 0; i < 1024; i++) index_table19[i] = 0;	for(i = 0; i < 32; i++) index_table59[i] = 0;		init_table(14, addi_impl, addi_bin2c, addi_disasm, addi_translate, addi_xml, "addi");	init_table(12, addic_impl, addic_bin2c, addic_disasm, addic_translate, addic_xml, "addic");	init_table(13, addicd_impl, addicd_bin2c, addicd_disasm, addicd_translate, addicd_xml, "addic.");	init_table(15, addis_impl, addis_bin2c, addis_disasm, addis_translate, addis_xml, "addis");	init_table(28, andid_impl, andid_bin2c, andid_disasm, andid_translate, andid_xml, "andi.");	init_table(29, andisd_impl, andisd_bin2c, andisd_disasm, andisd_translate, andisd_xml, "andis.");	init_table(11, cmpi_impl, cmpi_bin2c, cmpi_disasm, cmpi_translate, cmpi_xml, "cmpi");	init_table(10, cmpli_impl, cmpli_bin2c, cmpli_disasm, cmpli_translate, cmpli_xml, "cmpli");	init_table(34, lbz_impl, lbz_bin2c, lbz_disasm, lbz_translate, lbz_xml, "lbz");	init_table(35, lbzu_impl, lbzu_bin2c, lbzu_disasm, lbzu_translate, lbzu_xml, "lbzu");	init_table(50, lfd_impl, lfd_bin2c, lfd_disasm, lfd_translate, lfd_xml, "lfd");	init_table(51, lfdu_impl, lfdu_bin2c, lfdu_disasm, lfdu_translate, lfdu_xml, "lfdu");	init_table(48, lfs_impl, lfs_bin2c, lfs_disasm, lfs_translate, lfs_xml, "lfs");	init_table(49, lfsu_impl, lfsu_bin2c, lfsu_disasm, lfsu_translate, lfsu_xml, "lfsu");	init_table(42, lha_impl, lha_bin2c, lha_disasm, lha_translate, lha_xml, "lha");	init_table(43, lhau_impl, lhau_bin2c, lhau_disasm, lhau_translate, lhau_xml, "lhau");	init_table(40, lhz_impl, lhz_bin2c, lhz_disasm, lhz_translate, lhz_xml, "lhz");	init_table(41, lhzu_impl, lhzu_bin2c, lhzu_disasm, lhzu_translate, lhzu_xml, "lhzu");	init_table(46, lmw_impl, lmw_bin2c, lmw_disasm, lmw_translate, lmw_xml, "lmw");	init_table(32, lwz_impl, lwz_bin2c, lwz_disasm, lwz_translate, lwz_xml, "lwz");	init_table(33, lwzu_impl, lwzu_bin2c, lwzu_disasm, lwzu_translate, lwzu_xml, "lwzu");	init_table(7, mulli_impl, mulli_bin2c, mulli_disasm, mulli_translate, mulli_xml, "mulli");	init_table(24, ori_impl, ori_bin2c, ori_disasm, ori_translate, ori_xml, "ori");	init_table(25, oris_impl, oris_bin2c, oris_disasm, oris_translate, oris_xml, "oris");	init_table(38, stb_impl, stb_bin2c, stb_disasm, stb_translate, stb_xml, "stb");	init_table(39, stbu_impl, stbu_bin2c, stbu_disasm, stbu_translate, stbu_xml, "stbu");	init_table(54, stfd_impl, stfd_bin2c, stfd_disasm, stfd_translate, stfd_xml, "stfd");	init_table(55, stfdu_impl, stfdu_bin2c, stfdu_disasm, stfdu_translate, stfdu_xml, "stfdu");	init_table(52, stfs_impl, stfs_bin2c, stfs_disasm, stfs_translate, stfs_xml, "stfs");	init_table(53, stfsu_impl, stfsu_bin2c, stfsu_disasm, stfsu_translate, stfsu_xml, "stfsu");	init_table(44, sth_impl, sth_bin2c, sth_disasm, sth_translate, sth_xml, "sth");	init_table(45, sthu_impl, sthu_bin2c, sthu_disasm, sthu_translate, sthu_xml, "sthu");	init_table(47, stmw_impl, stmw_bin2c, stmw_disasm, stmw_translate, stmw_xml, "stmw");	init_table(36, stw_impl, stw_bin2c, stw_disasm, stw_translate, stw_xml, "stw");	init_table(37, stwu_impl, stwu_bin2c, stwu_disasm, stwu_translate, stwu_xml, "stwu");	init_table(8, subfic_impl, subfic_bin2c, subfic_disasm, subfic_translate, subfic_xml, "subfic");	init_table(3, twi_impl, twi_bin2c, twi_disasm, twi_translate, twi_xml, "twi");	init_table(26, xori_impl, xori_bin2c, xori_disasm, xori_translate, xori_xml, "xori");	init_table(27, xoris_impl, xoris_bin2c, xoris_disasm, xoris_translate, xoris_xml, "xoris");	init_table(31, impl_31, bin2c_31, disasm_31, translate_31, xml_31, NULL);	init_table(63, impl_63, bin2c_63, disasm_63, translate_63, xml_63, NULL);	init_table(19, impl_19, bin2c_19, disasm_19, translate_19, xml_19, NULL);	init_table(59, impl_59, bin2c_59, disasm_59, translate_59, xml_59, NULL);	init_table(18, bx_impl, bx_bin2c, bx_disasm, bx_translate, bx_xml, "bx");	init_table(16, bcx_impl, bcx_bin2c, bcx_disasm, bcx_translate, bcx_xml, "bcx");	init_table(17, sc_impl, sc_bin2c, sc_disasm, sc_translate, sc_xml, "sc");	init_table(20, rlwimix_impl, rlwimix_bin2c, rlwimix_disasm, rlwimix_translate, rlwimix_xml, "rlwimix");	init_table(21, rlwinmx_impl, rlwinmx_bin2c, rlwinmx_disasm, rlwinmx_translate, rlwinmx_xml, "rlwinmx");	init_table(23, rlwnmx_impl, rlwnmx_bin2c, rlwnmx_disasm, rlwnmx_translate, rlwnmx_xml, "rlwnmx");		init_table59(21, faddsx_impl, faddsx_bin2c, faddsx_disasm, faddsx_translate, faddsx_xml, "faddsx");	init_table59(18, fdivsx_impl, fdivsx_bin2c, fdivsx_disasm, fdivsx_translate, fdivsx_xml, "fdivsx");	init_table59(29, fmaddsx_impl, fmaddsx_bin2c, fmaddsx_disasm, fmaddsx_translate, fmaddsx_xml, "fmaddsx");	init_table59(28, fmsubsx_impl, fmsubsx_bin2c, fmsubsx_disasm, fmsubsx_translate, fmsubsx_xml, "fmsubsx");	init_table59(25, fmulsx_impl, fmulsx_bin2c, fmulsx_disasm, fmulsx_translate, fmulsx_xml, "fmulsx");	init_table59(31, fnmaddsx_impl, fnmaddsx_bin2c, fnmaddsx_disasm, fnmaddsx_translate, fnmaddsx_xml, "fnmaddsx");	init_table59(30, fnmsubsx_impl, fnmsubsx_bin2c, fnmsubsx_disasm, fnmsubsx_translate, fnmsubsx_xml, "fnmsubsx");/*	init_table59(24, fresx_impl, fresx_bin2c, fresx_disasm, fresx_translate, fresx_xml, "fresx");	init_table59(22, fsqrtsx_impl, fsqrtsx_bin2c, fsqrtsx_disasm, fsqrtsx_translate, fsqrtsx_xml, "fsqrtsx");*/	init_table59(20, fsubsx_impl, fsubsx_bin2c, fsubsx_disasm, fsubsx_translate, fsubsx_xml, "fsubsx");	init_table63(264, 10, fabsx_impl, fabsx_bin2c, fabsx_disasm, fabsx_translate, fabsx_xml, "fabsx");/*	init_table63(32, 10, fcmpo_impl, fcmpo_bin2c, fcmpo_disasm, fcmpo_translate, fcmpo_xml, "fcmpo");*/	init_table63(0, 10, fcmpu_impl, fcmpu_bin2c, fcmpu_disasm, fcmpu_translate, fcmpu_xml, "fcmpu");/*	init_table63(14, 10, fctiwx_impl, fctiwx_bin2c, fctiwx_disasm, fctiwx_translate, fctiwx_xml, "fctiwx");*/	init_table63(15, 10, fctiwzx_impl, fctiwzx_bin2c, fctiwzx_disasm, fctiwzx_translate, fctiwzx_xml, "fctiwzx");	init_table63(72, 10, fmrx_impl, fmrx_bin2c, fmrx_disasm, fmrx_translate, fmrx_xml, "fmrx");	init_table63(136, 10, fnabsx_impl, fnabsx_bin2c, fnabsx_disasm, fnabsx_translate, fnabsx_xml, "fnabsx");	init_table63(40, 10, fnegx_impl, fnegx_bin2c, fnegx_disasm, fnegx_translate, fnegx_xml, "fnegx");	init_table63(12, 10, frspx_impl, frspx_bin2c, frspx_disasm, frspx_translate, frspx_xml, "frspx");/*	init_table63(64, 10, mcrfs_impl, mcrfs_bin2c, mcrfs_disasm, mcrfs_translate, mcrfs_xml, "mcrfs");*/	init_table63(583, 10, mffsx_impl, mffsx_bin2c, mffsx_disasm, mffsx_translate, mffsx_xml, "mffsx");	init_table63(70, 10, mtfsb0x_impl, mtfsb0x_bin2c, mtfsb0x_disasm, mtfsb0x_translate, mtfsb0x_xml, "mtfsb0x");/*	init_table63(38, 10, mtfsb1x_impl, mtfsb1x_bin2c, mtfsb1x_disasm, mtfsb1x_translate, mtfsb1x_xml, "mtfsb1x");*/	init_table63(134, 10, mtfsfix_impl, mtfsfix_bin2c, mtfsfix_disasm, mtfsfix_translate, mtfsfix_xml, "mtfsfix");	init_table63(711, 10, mtfsfx_impl, mtfsfx_bin2c, mtfsfx_disasm, mtfsfx_translate, mtfsfx_xml, "mtfsfx");	init_table63(21, 5, faddx_impl, faddx_bin2c, faddx_disasm, faddx_translate, faddx_xml, "faddx");	init_table63(18, 5, fdivx_impl, fdivx_bin2c, fdivx_disasm, fdivx_translate, fdivx_xml, "fdivx");	init_table63(29, 5, fmaddx_impl, fmaddx_bin2c, fmaddx_disasm, fmaddx_translate, fmaddx_xml, "fmaddx");	init_table63(28, 5, fmsubx_impl, fmsubx_bin2c, fmsubx_disasm, fmsubx_translate, fmsubx_xml, "fmsubx");	init_table63(25, 5, fmulx_impl, fmulx_bin2c, fmulx_disasm, fmulx_translate, fmulx_xml, "fmulx");	init_table63(31, 5, fnmaddx_impl, fnmaddx_bin2c, fnmaddx_disasm, fnmaddx_translate, fnmaddx_xml, "fnmaddx");	init_table63(30, 5, fnmsubx_impl, fnmsubx_bin2c, fnmsubx_disasm, fnmsubx_translate, fnmsubx_xml, "fnmsubx");/*	init_table63(26, 5, frsqrtex_impl, frsqrtex_bin2c, frsqrtex_disasm, frsqrtex_translate, frsqrtex_xml, "frsqrtex");	init_table63(23, 5, fselx_impl, fselx_bin2c, fselx_disasm, fselx_translate, fselx_xml, "fselx");

⌨️ 快捷键说明

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