📄 decode.c
字号:
{ FRV_INSN_CMADDHSS, FRVBF_INSN_CMADDHSS, FRVBF_SFMT_CMADDHSS }, { FRV_INSN_CMADDHUS, FRVBF_INSN_CMADDHUS, FRVBF_SFMT_CMADDHSS }, { FRV_INSN_CMSUBHSS, FRVBF_INSN_CMSUBHSS, FRVBF_SFMT_CMADDHSS }, { FRV_INSN_CMSUBHUS, FRVBF_INSN_CMSUBHUS, FRVBF_SFMT_CMADDHSS }, { FRV_INSN_MQADDHSS, FRVBF_INSN_MQADDHSS, FRVBF_SFMT_MQSATHS }, { FRV_INSN_MQADDHUS, FRVBF_INSN_MQADDHUS, FRVBF_SFMT_MQSATHS }, { FRV_INSN_MQSUBHSS, FRVBF_INSN_MQSUBHSS, FRVBF_SFMT_MQSATHS }, { FRV_INSN_MQSUBHUS, FRVBF_INSN_MQSUBHUS, FRVBF_SFMT_MQSATHS }, { FRV_INSN_CMQADDHSS, FRVBF_INSN_CMQADDHSS, FRVBF_SFMT_CMQADDHSS }, { FRV_INSN_CMQADDHUS, FRVBF_INSN_CMQADDHUS, FRVBF_SFMT_CMQADDHSS }, { FRV_INSN_CMQSUBHSS, FRVBF_INSN_CMQSUBHSS, FRVBF_SFMT_CMQADDHSS }, { FRV_INSN_CMQSUBHUS, FRVBF_INSN_CMQSUBHUS, FRVBF_SFMT_CMQADDHSS }, { FRV_INSN_MQLCLRHS, FRVBF_INSN_MQLCLRHS, FRVBF_SFMT_MQSATHS }, { FRV_INSN_MQLMTHS, FRVBF_INSN_MQLMTHS, FRVBF_SFMT_MQSATHS }, { FRV_INSN_MQSLLHI, FRVBF_INSN_MQSLLHI, FRVBF_SFMT_MQSLLHI }, { FRV_INSN_MQSRAHI, FRVBF_INSN_MQSRAHI, FRVBF_SFMT_MQSLLHI }, { FRV_INSN_MADDACCS, FRVBF_INSN_MADDACCS, FRVBF_SFMT_MADDACCS }, { FRV_INSN_MSUBACCS, FRVBF_INSN_MSUBACCS, FRVBF_SFMT_MADDACCS }, { FRV_INSN_MDADDACCS, FRVBF_INSN_MDADDACCS, FRVBF_SFMT_MDADDACCS }, { FRV_INSN_MDSUBACCS, FRVBF_INSN_MDSUBACCS, FRVBF_SFMT_MDADDACCS }, { FRV_INSN_MASACCS, FRVBF_INSN_MASACCS, FRVBF_SFMT_MASACCS }, { FRV_INSN_MDASACCS, FRVBF_INSN_MDASACCS, FRVBF_SFMT_MDASACCS }, { FRV_INSN_MMULHS, FRVBF_INSN_MMULHS, FRVBF_SFMT_MMULHS }, { FRV_INSN_MMULHU, FRVBF_INSN_MMULHU, FRVBF_SFMT_MMULHS }, { FRV_INSN_MMULXHS, FRVBF_INSN_MMULXHS, FRVBF_SFMT_MMULHS }, { FRV_INSN_MMULXHU, FRVBF_INSN_MMULXHU, FRVBF_SFMT_MMULHS }, { FRV_INSN_CMMULHS, FRVBF_INSN_CMMULHS, FRVBF_SFMT_CMMULHS }, { FRV_INSN_CMMULHU, FRVBF_INSN_CMMULHU, FRVBF_SFMT_CMMULHS }, { FRV_INSN_MQMULHS, FRVBF_INSN_MQMULHS, FRVBF_SFMT_MQMULHS }, { FRV_INSN_MQMULHU, FRVBF_INSN_MQMULHU, FRVBF_SFMT_MQMULHS }, { FRV_INSN_MQMULXHS, FRVBF_INSN_MQMULXHS, FRVBF_SFMT_MQMULHS }, { FRV_INSN_MQMULXHU, FRVBF_INSN_MQMULXHU, FRVBF_SFMT_MQMULHS }, { FRV_INSN_CMQMULHS, FRVBF_INSN_CMQMULHS, FRVBF_SFMT_CMQMULHS }, { FRV_INSN_CMQMULHU, FRVBF_INSN_CMQMULHU, FRVBF_SFMT_CMQMULHS }, { FRV_INSN_MMACHS, FRVBF_INSN_MMACHS, FRVBF_SFMT_MMACHS }, { FRV_INSN_MMACHU, FRVBF_INSN_MMACHU, FRVBF_SFMT_MMACHU }, { FRV_INSN_MMRDHS, FRVBF_INSN_MMRDHS, FRVBF_SFMT_MMACHS }, { FRV_INSN_MMRDHU, FRVBF_INSN_MMRDHU, FRVBF_SFMT_MMACHU }, { FRV_INSN_CMMACHS, FRVBF_INSN_CMMACHS, FRVBF_SFMT_CMMACHS }, { FRV_INSN_CMMACHU, FRVBF_INSN_CMMACHU, FRVBF_SFMT_CMMACHU }, { FRV_INSN_MQMACHS, FRVBF_INSN_MQMACHS, FRVBF_SFMT_MQMACHS }, { FRV_INSN_MQMACHU, FRVBF_INSN_MQMACHU, FRVBF_SFMT_MQMACHU }, { FRV_INSN_CMQMACHS, FRVBF_INSN_CMQMACHS, FRVBF_SFMT_CMQMACHS }, { FRV_INSN_CMQMACHU, FRVBF_INSN_CMQMACHU, FRVBF_SFMT_CMQMACHU }, { FRV_INSN_MQXMACHS, FRVBF_INSN_MQXMACHS, FRVBF_SFMT_MQMACHS }, { FRV_INSN_MQXMACXHS, FRVBF_INSN_MQXMACXHS, FRVBF_SFMT_MQMACHS }, { FRV_INSN_MQMACXHS, FRVBF_INSN_MQMACXHS, FRVBF_SFMT_MQMACHS }, { FRV_INSN_MCPXRS, FRVBF_INSN_MCPXRS, FRVBF_SFMT_MCPXRS }, { FRV_INSN_MCPXRU, FRVBF_INSN_MCPXRU, FRVBF_SFMT_MCPXRS }, { FRV_INSN_MCPXIS, FRVBF_INSN_MCPXIS, FRVBF_SFMT_MCPXRS }, { FRV_INSN_MCPXIU, FRVBF_INSN_MCPXIU, FRVBF_SFMT_MCPXRS }, { FRV_INSN_CMCPXRS, FRVBF_INSN_CMCPXRS, FRVBF_SFMT_CMCPXRS }, { FRV_INSN_CMCPXRU, FRVBF_INSN_CMCPXRU, FRVBF_SFMT_CMCPXRS }, { FRV_INSN_CMCPXIS, FRVBF_INSN_CMCPXIS, FRVBF_SFMT_CMCPXRS }, { FRV_INSN_CMCPXIU, FRVBF_INSN_CMCPXIU, FRVBF_SFMT_CMCPXRS }, { FRV_INSN_MQCPXRS, FRVBF_INSN_MQCPXRS, FRVBF_SFMT_MQCPXRS }, { FRV_INSN_MQCPXRU, FRVBF_INSN_MQCPXRU, FRVBF_SFMT_MQCPXRS }, { FRV_INSN_MQCPXIS, FRVBF_INSN_MQCPXIS, FRVBF_SFMT_MQCPXRS }, { FRV_INSN_MQCPXIU, FRVBF_INSN_MQCPXIU, FRVBF_SFMT_MQCPXRS }, { FRV_INSN_MEXPDHW, FRVBF_INSN_MEXPDHW, FRVBF_SFMT_MEXPDHW }, { FRV_INSN_CMEXPDHW, FRVBF_INSN_CMEXPDHW, FRVBF_SFMT_CMEXPDHW }, { FRV_INSN_MEXPDHD, FRVBF_INSN_MEXPDHD, FRVBF_SFMT_MEXPDHD }, { FRV_INSN_CMEXPDHD, FRVBF_INSN_CMEXPDHD, FRVBF_SFMT_CMEXPDHD }, { FRV_INSN_MPACKH, FRVBF_INSN_MPACKH, FRVBF_SFMT_MPACKH }, { FRV_INSN_MDPACKH, FRVBF_INSN_MDPACKH, FRVBF_SFMT_MDPACKH }, { FRV_INSN_MUNPACKH, FRVBF_INSN_MUNPACKH, FRVBF_SFMT_MUNPACKH }, { FRV_INSN_MDUNPACKH, FRVBF_INSN_MDUNPACKH, FRVBF_SFMT_MDUNPACKH }, { FRV_INSN_MBTOH, FRVBF_INSN_MBTOH, FRVBF_SFMT_MBTOH }, { FRV_INSN_CMBTOH, FRVBF_INSN_CMBTOH, FRVBF_SFMT_CMBTOH }, { FRV_INSN_MHTOB, FRVBF_INSN_MHTOB, FRVBF_SFMT_MHTOB }, { FRV_INSN_CMHTOB, FRVBF_INSN_CMHTOB, FRVBF_SFMT_CMHTOB }, { FRV_INSN_MBTOHE, FRVBF_INSN_MBTOHE, FRVBF_SFMT_MBTOHE }, { FRV_INSN_CMBTOHE, FRVBF_INSN_CMBTOHE, FRVBF_SFMT_CMBTOHE }, { FRV_INSN_MNOP, FRVBF_INSN_MNOP, FRVBF_SFMT_REI }, { FRV_INSN_MCLRACC_0, FRVBF_INSN_MCLRACC_0, FRVBF_SFMT_MCLRACC_0 }, { FRV_INSN_MCLRACC_1, FRVBF_INSN_MCLRACC_1, FRVBF_SFMT_MCLRACC_0 }, { FRV_INSN_MRDACC, FRVBF_INSN_MRDACC, FRVBF_SFMT_MRDACC }, { FRV_INSN_MRDACCG, FRVBF_INSN_MRDACCG, FRVBF_SFMT_MRDACCG }, { FRV_INSN_MWTACC, FRVBF_INSN_MWTACC, FRVBF_SFMT_MWTACC }, { FRV_INSN_MWTACCG, FRVBF_INSN_MWTACCG, FRVBF_SFMT_MWTACCG }, { FRV_INSN_MCOP1, FRVBF_INSN_MCOP1, FRVBF_SFMT_REI }, { FRV_INSN_MCOP2, FRVBF_INSN_MCOP2, FRVBF_SFMT_REI }, { FRV_INSN_FNOP, FRVBF_INSN_FNOP, FRVBF_SFMT_REI },};static const struct insn_sem frvbf_insn_sem_invalid = { VIRTUAL_INSN_X_INVALID, FRVBF_INSN_X_INVALID, FRVBF_SFMT_EMPTY};/* Initialize an IDESC from the compile-time computable parts. */static INLINE voidinit_idesc (SIM_CPU *cpu, IDESC *id, const struct insn_sem *t){ const CGEN_INSN *insn_table = CGEN_CPU_INSN_TABLE (CPU_CPU_DESC (cpu))->init_entries; id->num = t->index; id->sfmt = t->sfmt; if ((int) t->type <= 0) id->idata = & cgen_virtual_insn_table[- (int) t->type]; else id->idata = & insn_table[t->type]; id->attrs = CGEN_INSN_ATTRS (id->idata); /* Oh my god, a magic number. */ id->length = CGEN_INSN_BITSIZE (id->idata) / 8;#if WITH_PROFILE_MODEL_P id->timing = & MODEL_TIMING (CPU_MODEL (cpu)) [t->index]; { SIM_DESC sd = CPU_STATE (cpu); SIM_ASSERT (t->index == id->timing->num); }#endif /* Semantic pointers are initialized elsewhere. */}/* Initialize the instruction descriptor table. */voidfrvbf_init_idesc_table (SIM_CPU *cpu){ IDESC *id,*tabend; const struct insn_sem *t,*tend; int tabsize = FRVBF_INSN__MAX; IDESC *table = frvbf_insn_data; memset (table, 0, tabsize * sizeof (IDESC)); /* First set all entries to the `invalid insn'. */ t = & frvbf_insn_sem_invalid; for (id = table, tabend = table + tabsize; id < tabend; ++id) init_idesc (cpu, id, t); /* Now fill in the values for the chosen cpu. */ for (t = frvbf_insn_sem, tend = t + sizeof (frvbf_insn_sem) / sizeof (*t); t != tend; ++t) { init_idesc (cpu, & table[t->index], t); } /* Link the IDESC table into the cpu. */ CPU_IDESC (cpu) = table;}/* Given an instruction, return a pointer to its IDESC entry. */const IDESC *frvbf_decode (SIM_CPU *current_cpu, IADDR pc, CGEN_INSN_INT base_insn, CGEN_INSN_INT entire_insn, ARGBUF *abuf){ /* Result of decoder. */ FRVBF_INSN_TYPE itype; { CGEN_INSN_INT insn = base_insn; { unsigned int val = (((insn >> 18) & (127 << 0))); switch (val) { case 0 : { unsigned int val = (((insn >> 6) & (15 << 0))); switch (val) { case 0 : itype = FRVBF_INSN_ADD; goto extract_sfmt_add; case 1 : itype = FRVBF_INSN_ADDCC; goto extract_sfmt_addcc; case 2 : itype = FRVBF_INSN_ADDX; goto extract_sfmt_addx; case 3 : itype = FRVBF_INSN_ADDXCC; goto extract_sfmt_addcc; case 4 : itype = FRVBF_INSN_SUB; goto extract_sfmt_add; case 5 : itype = FRVBF_INSN_SUBCC; goto extract_sfmt_addcc; case 6 : itype = FRVBF_INSN_SUBX; goto extract_sfmt_addx; case 7 : itype = FRVBF_INSN_SUBXCC; goto extract_sfmt_addcc; case 8 : itype = FRVBF_INSN_SMUL; goto extract_sfmt_smul; case 9 : itype = FRVBF_INSN_SMULCC; goto extract_sfmt_smulcc; case 10 : itype = FRVBF_INSN_UMUL; goto extract_sfmt_smul; case 11 : itype = FRVBF_INSN_UMULCC; goto extract_sfmt_smulcc; case 12 : itype = FRVBF_INSN_CMPB; goto extract_sfmt_cmpb; case 13 : itype = FRVBF_INSN_CMPBA; goto extract_sfmt_cmpb; case 14 : itype = FRVBF_INSN_SDIV; goto extract_sfmt_sdiv; case 15 : itype = FRVBF_INSN_UDIV; goto extract_sfmt_sdiv; default : itype = FRVBF_INSN_X_INVALID; goto extract_sfmt_empty; } } case 1 : { unsigned int val = (((insn >> 6) & (15 << 0))); switch (val) { case 0 : itype = FRVBF_INSN_AND; goto extract_sfmt_add; case 1 : itype = FRVBF_INSN_ANDCC; goto extract_sfmt_andcc; case 2 : itype = FRVBF_INSN_OR; goto extract_sfmt_add; case 3 : itype = FRVBF_INSN_ORCC; goto extract_sfmt_andcc; case 4 : itype = FRVBF_INSN_XOR; goto extract_sfmt_add; case 5 : itype = FRVBF_INSN_XORCC; goto extract_sfmt_andcc; case 6 : itype = FRVBF_INSN_NOT; goto extract_sfmt_not; case 8 : itype = FRVBF_INSN_SLL; goto extract_sfmt_add; case 9 : itype = FRVBF_INSN_SLLCC; goto extract_sfmt_addcc; case 10 : itype = FRVBF_INSN_SRL; goto extract_sfmt_add; case 11 : itype = FRVBF_INSN_SRLCC; goto extract_sfmt_addcc; case 12 : itype = FRVBF_INSN_SRA; goto extract_sfmt_add; case 13 : itype = FRVBF_INSN_SRACC; goto extract_sfmt_addcc; case 14 : itype = FRVBF_INSN_NSDIV; goto extract_sfmt_sdiv; case 15 : itype = FRVBF_INSN_NUDIV; goto extract_sfmt_sdiv; default : itype = FRVBF_INSN_X_INVALID; goto extract_sfmt_empty; } } case 2 : { unsigned int val = (((insn >> 6) & (63 << 0))); switch (val) { case 0 : itype = FRVBF_INSN_LDSB; goto extract_sfmt_ldsb; case 1 : itype = FRVBF_INSN_LDUB; goto extract_sfmt_ldsb; case 2 : itype = FRVBF_INSN_LDSH; goto extract_sfmt_ldsb; case 3 : itype = FRVBF_INSN_LDUH; goto extract_sfmt_ldsb; case 4 : itype = FRVBF_INSN_LD; goto extract_sfmt_ldsb; case 5 : itype = FRVBF_INSN_LDD; goto extract_sfmt_ldd; case 6 : itype = FRVBF_INSN_LDQ; goto extract_sfmt_ldq; case 8 : itype = FRVBF_INSN_LDBF; goto extract_sfmt_ldbf; case 9 : itype = FRVBF_INSN_LDHF; goto extract_sfmt_ldbf; case 10 : itype = FRVBF_INSN_LDF; goto extract_sfmt_ldbf; case 11 : itype = FRVBF_INSN_LDDF; goto extract_sfmt_lddf; case 12 : itype = FRVBF_INSN_LDQF; goto extract_sfmt_ldqf; case 13 : itype = FRVBF_INSN_LDC; goto extract_sfmt_ldc; case 14 : itype = FRVBF_INSN_LDDC; goto extract_sfmt_lddc; case 15 : itype = FRVBF_INSN_LDQC; goto extract_sfmt_ldqc; case 16 : itype = FRVBF_INSN_LDSBU; goto extract_sfmt_ldsbu; case 17 : itype = FRVBF_INSN_LDUBU; goto extract_sfmt_ldsbu; case 18 : itype = FRVBF_INSN_LDSHU; goto extract_sfmt_ldsbu; case 19 : itype = FRVBF_INSN_LDUHU; goto extract_sfmt_ldsbu; case 20 : itype = FRVBF_INSN_LDU; goto extract_sfmt_ldsbu; case 21 : itype = FRVBF_INSN_LDDU; goto extract_sfmt_lddu; case 22 : itype = FRVBF_INSN_LDQU; goto extract_sfmt_ldqu;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -