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 + -
显示快捷键?