📄 profile-fr500.c
字号:
the first taken branch in a vliw insn. */ ps = CPU_PROFILE_STATE (cpu); if (! ps->vliw_branch_taken) { /* (1 << 4): The pc is the 5th element in inputs, outputs. ??? can be cleaned up */ PROFILE_DATA *p = CPU_PROFILE_DATA (cpu); int taken = (referenced & (1 << 4)) != 0; if (taken) { ++PROFILE_MODEL_TAKEN_COUNT (p); ps->vliw_branch_taken = 1; } else ++PROFILE_MODEL_UNTAKEN_COUNT (p); } cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr500_u_trap (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj, INT in_ICCi_2, INT in_FCCi_2){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1) { /* icc0-icc4 are the upper 4 fields of the CCR. */ if (in_ICCi_2 >= 0) in_ICCi_2 += 4; /* The entire VLIW insn must wait if there is a dependency on a register which is not ready yet. The latency of the registers may be less than previously recorded, depending on how they were used previously. See Table 13-8 in the LSI. */ if (in_GRi >= 0) { if (use_is_gr_complex (cpu, in_GRi)) decrease_GR_busy (cpu, in_GRi, 1); } if (in_GRj != in_GRi && in_GRj >= 0) { if (use_is_gr_complex (cpu, in_GRj)) decrease_GR_busy (cpu, in_GRj, 1); } vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); vliw_wait_for_CCR (cpu, in_ICCi_2); vliw_wait_for_CCR (cpu, in_FCCi_2); handle_resource_wait (cpu); load_wait_for_GR (cpu, in_GRi); load_wait_for_GR (cpu, in_GRj); trace_vliw_wait_cycles (cpu); return 0; } cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr500_u_check (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_ICCi_3, INT in_FCCi_3){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1) { /* icc0-icc4 are the upper 4 fields of the CCR. */ if (in_ICCi_3 >= 0) in_ICCi_3 += 4; /* The entire VLIW insn must wait if there is a dependency on a register which is not ready yet. */ vliw_wait_for_CCR (cpu, in_ICCi_3); vliw_wait_for_CCR (cpu, in_FCCi_3); handle_resource_wait (cpu); trace_vliw_wait_cycles (cpu); return 0; } cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr500_u_clrgr (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRk){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1) { /* Wait for both GNER registers or just the one specified. */ if (in_GRk == -1) { vliw_wait_for_SPR (cpu, H_SPR_GNER0); vliw_wait_for_SPR (cpu, H_SPR_GNER1); } else vliw_wait_for_SPR (cpu, GNER_FOR_GR (in_GRk)); handle_resource_wait (cpu); trace_vliw_wait_cycles (cpu); return 0; } cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr500_u_clrfr (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_FRk){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1) { /* Wait for both GNER registers or just the one specified. */ if (in_FRk == -1) { vliw_wait_for_SPR (cpu, H_SPR_FNER0); vliw_wait_for_SPR (cpu, H_SPR_FNER1); } else vliw_wait_for_SPR (cpu, FNER_FOR_FR (in_FRk)); handle_resource_wait (cpu); trace_vliw_wait_cycles (cpu); return 0; } cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr500_u_commit (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRk, INT in_FRk){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1) { /* If GR is specified, then FR is not and vice-versa. If neither is then it's a commitga or commitfa. Check the insn attribute to figure out which. */ if (in_GRk != -1) vliw_wait_for_SPR (cpu, GNER_FOR_GR (in_GRk)); else if (in_FRk != -1) vliw_wait_for_SPR (cpu, FNER_FOR_FR (in_FRk)); else if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_FR_ACCESS)) { vliw_wait_for_SPR (cpu, H_SPR_FNER0); vliw_wait_for_SPR (cpu, H_SPR_FNER1); } else { vliw_wait_for_SPR (cpu, H_SPR_GNER0); vliw_wait_for_SPR (cpu, H_SPR_GNER1); } handle_resource_wait (cpu); trace_vliw_wait_cycles (cpu); return 0; } cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr500_u_set_hilo (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT out_GRkhi, INT out_GRklo){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1) { /* The entire VLIW insn must wait if there is a dependency on a GR which is not ready yet. */ vliw_wait_for_GR (cpu, out_GRkhi); vliw_wait_for_GR (cpu, out_GRklo); handle_resource_wait (cpu); load_wait_for_GR (cpu, out_GRkhi); load_wait_for_GR (cpu, out_GRklo); trace_vliw_wait_cycles (cpu); return 0; } /* GRk is available immediately to the next VLIW insn. */ cycles = idesc->timing->units[unit_num].done; set_use_not_gr_complex (cpu, out_GRkhi); set_use_not_gr_complex (cpu, out_GRklo); return cycles;}intfrvbf_model_fr500_u_gr_load (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj, INT out_GRk, INT out_GRdoublek){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1) { /* The entire VLIW insn must wait if there is a dependency on a register which is not ready yet. The latency of the registers may be less than previously recorded, depending on how they were used previously. See Table 13-8 in the LSI. */ if (in_GRi != out_GRk && in_GRi != out_GRdoublek && in_GRi != out_GRdoublek + 1 && in_GRi >= 0) { if (use_is_gr_complex (cpu, in_GRi)) decrease_GR_busy (cpu, in_GRi, 1); } if (in_GRj != in_GRi && in_GRj != out_GRk && in_GRj != out_GRdoublek && in_GRj != out_GRdoublek + 1 && in_GRj >= 0) { if (use_is_gr_complex (cpu, in_GRj)) decrease_GR_busy (cpu, in_GRj, 1); } vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); vliw_wait_for_GR (cpu, out_GRk); vliw_wait_for_GRdouble (cpu, out_GRdoublek); handle_resource_wait (cpu); load_wait_for_GR (cpu, in_GRi); load_wait_for_GR (cpu, in_GRj); load_wait_for_GR (cpu, out_GRk); load_wait_for_GRdouble (cpu, out_GRdoublek); trace_vliw_wait_cycles (cpu); return 0; } cycles = idesc->timing->units[unit_num].done; /* The latency of GRk for a load will depend on how long it takes to retrieve the the data from the cache or memory. */ update_GR_latency_for_load (cpu, out_GRk, cycles); update_GRdouble_latency_for_load (cpu, out_GRdoublek, cycles); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { /* GNER has a latency of 2 cycles. */ update_SPR_latency (cpu, GNER_FOR_GR (out_GRk), cycles + 2); update_SPR_latency (cpu, GNER_FOR_GR (out_GRdoublek), cycles + 2); } if (out_GRk >= 0) set_use_is_gr_complex (cpu, out_GRk); if (out_GRdoublek != -1) { set_use_is_gr_complex (cpu, out_GRdoublek); set_use_is_gr_complex (cpu, out_GRdoublek + 1); } return cycles;}intfrvbf_model_fr500_u_gr_store (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj, INT in_GRk, INT in_GRdoublek){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1) { /* The entire VLIW insn must wait if there is a dependency on a register which is not ready yet. The latency of the registers may be less than previously recorded, depending on how they were used previously. See Table 13-8 in the LSI. */ if (in_GRi >= 0) { if (use_is_gr_complex (cpu, in_GRi)) decrease_GR_busy (cpu, in_GRi, 1); } if (in_GRj != in_GRi && in_GRj >= 0) { if (use_is_gr_complex (cpu, in_GRj)) decrease_GR_busy (cpu, in_GRj, 1); } if (in_GRk != in_GRi && in_GRk != in_GRj && in_GRk >= 0) { if (use_is_gr_complex (cpu, in_GRk)) decrease_GR_busy (cpu, in_GRk, 1); } if (in_GRdoublek != in_GRi && in_GRdoublek != in_GRj && in_GRdoublek + 1 != in_GRi && in_GRdoublek + 1 != in_GRj && in_GRdoublek >= 0) { if (use_is_gr_complex (cpu, in_GRdoublek)) decrease_GR_busy (cpu, in_GRdoublek, 1); if (use_is_gr_complex (cpu, in_GRdoublek + 1)) decrease_GR_busy (cpu, in_GRdoublek + 1, 1); } vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); vliw_wait_for_GR (cpu, in_GRk); vliw_wait_for_GRdouble (cpu, in_GRdoublek); handle_resource_wait (cpu); load_wait_for_GR (cpu, in_GRi); load_wait_for_GR (cpu, in_GRj); load_wait_for_GR (cpu, in_GRk); load_wait_for_GRdouble (cpu, in_GRdoublek); trace_vliw_wait_cycles (cpu); return 0; } cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr500_u_gr_r_store (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj, INT in_GRk, INT in_GRdoublek){ int cycles = frvbf_model_fr500_u_gr_store (cpu, idesc, unit_num, referenced, in_GRi, in_GRj, in_GRk, in_GRdoublek); if (model_insn == FRV_INSN_MODEL_PASS_2) { if (CPU_RSTR_INVALIDATE(cpu)) request_cache_invalidate (cpu, CPU_DATA_CACHE (cpu), cycles); } return cycles;}intfrvbf_model_fr500_u_fr_load (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj, INT out_FRk, INT out_FRdoublek){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1) { /* The entire VLIW insn must wait if there is a dependency on a register which is not ready yet. The latency of the registers may be less than previously recorded, depending on how they were used previously. See Table 13-8 in the LSI. */ if (in_GRi >= 0) { if (use_is_gr_complex (cpu, in_GRi)) decrease_GR_busy (cpu, in_GRi, 1); } if (in_GRj != in_GRi && in_GRj >= 0) { if (use_is_gr_complex (cpu, in_GRj)) decrease_GR_busy (cpu, in_GRj, 1); } if (out_FRk >= 0) { if (use_is_media (cpu, out_FRk)) decrease_FR_busy (cpu, out_FRk, 1); else adjust_float_register_busy (cpu, -1, -1, out_FRk, 1); } if (out_FRdoublek >= 0) { if (use_is_media (cpu, out_FRdoublek)) decrease_FR_busy (cpu, out_FRdoublek, 1); else adjust_float_register_busy (cpu, -1, -1, out_FRdoublek, 1); if (use_is_media (cpu, out_FRdoublek + 1)) decrease_FR_busy (cpu, out_FRdoublek + 1, 1); else adjust_float_register_busy (cpu, -1, -1, out_FRdoublek + 1, 1); } vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); vliw_wait_for_FR (cpu, out_FRk); vliw_wait_for_FRdouble (cpu, out_FRdoublek); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { vliw_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk)); vliw_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek)); } handle_resource_wait (cpu); load_wait_for_GR (cpu, in_GRi); load_wait_for_GR (cpu, in_GRj); load_wait_for_FR (cpu, out_FRk); load_wait_for_FRdouble (cpu, out_FRdoublek); trace_vliw_wait_cycles (cpu); return 0; } cycles = idesc->timing->units[unit_num].done; /* The latency of FRk for a load will depend on how long it takes to retrieve the the data from the cache or memory. */ update_FR_latency_for_load (cpu, out_FRk, cycles); update_FRdouble_latency_for_load (cpu, out_FRdoublek, cycles); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { /* FNER has a latency of 3 cycles. */ update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), cycles + 3); update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), cycles + 3); } fr500_reset_fr_flags (cpu, out_FRk); return cycles;}intfrvbf_model_fr500_u_fr_store (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj, INT in_FRk, INT in_FRdoublek){ int cycles; if (model_insn == FRV_INSN_MODEL_PASS_1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -