📄 profile-fr550.c
字号:
{ /* The entire VLIW insn must wait if there is a dependency on a register which is not ready yet. */ vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); vliw_wait_for_GR (cpu, out_GRk); vliw_wait_for_CCR (cpu, out_ICCi_1); 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); trace_vliw_wait_cycles (cpu); return 0; } fr550_reset_ccr_flags (cpu, out_ICCi_1); /* GRk is available immediately to the next VLIW insn as is ICCi_1. */ cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr550_u_imul (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1){ int cycles; /* icc0-icc4 are the upper 4 fields of the CCR. */ if (out_ICCi_1 >= 0) out_ICCi_1 += 4; 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. */ vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); vliw_wait_for_GRdouble (cpu, out_GRk); vliw_wait_for_CCR (cpu, out_ICCi_1); handle_resource_wait (cpu); load_wait_for_GR (cpu, in_GRi); load_wait_for_GR (cpu, in_GRj); load_wait_for_GRdouble (cpu, out_GRk); trace_vliw_wait_cycles (cpu); return 0; } /* GRk has a latency of 1 cycles. */ cycles = idesc->timing->units[unit_num].done; update_GRdouble_latency (cpu, out_GRk, cycles + 1); /* ICCi_1 has a latency of 1 cycle. */ update_CCR_latency (cpu, out_ICCi_1, cycles + 1); fr550_reset_ccr_flags (cpu, out_ICCi_1); return cycles;}intfrvbf_model_fr550_u_idiv (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1){ int cycles; FRV_VLIW *vliw; int slot; /* icc0-icc4 are the upper 4 fields of the CCR. */ if (out_ICCi_1 >= 0) out_ICCi_1 += 4; vliw = CPU_VLIW (cpu); slot = vliw->next_slot - 1; slot = (*vliw->current_vliw)[slot] - UNIT_I0; 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. */ vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); vliw_wait_for_GR (cpu, out_GRk); vliw_wait_for_CCR (cpu, out_ICCi_1); vliw_wait_for_idiv_resource (cpu, slot); 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); trace_vliw_wait_cycles (cpu); return 0; } /* GRk has a latency of 18 cycles! */ cycles = idesc->timing->units[unit_num].done; update_GR_latency (cpu, out_GRk, cycles + 18); /* ICCi_1 has a latency of 18 cycles. */ update_CCR_latency (cpu, out_ICCi_1, cycles + 18); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { /* GNER has a latency of 18 cycles. */ update_SPR_latency (cpu, GNER_FOR_GR (out_GRk), cycles + 18); } /* the idiv resource has a latency of 18 cycles! */ update_idiv_resource_latency (cpu, slot, cycles + 18); fr550_reset_ccr_flags (cpu, out_ICCi_1); return cycles;}intfrvbf_model_fr550_u_branch (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; FRV_PROFILE_STATE *ps; 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. */ 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; } /* When counting branches taken or not taken, don't consider branches after 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_fr550_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. */ 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_fr550_u_check (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_ICCi_3, INT in_FCCi_3){ /* Modelling for this unit is the same as for fr500. */ return frvbf_model_fr500_u_check (cpu, idesc, unit_num, referenced, in_ICCi_3, in_FCCi_3);}intfrvbf_model_fr550_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; return cycles;}intfrvbf_model_fr550_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. */ 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); } return cycles;}intfrvbf_model_fr550_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. */ 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; } /* The target register is available immediately. */ cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr550_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. */ adjust_float_register_busy (cpu, -1, 1, -1, 1, out_FRk, 1); adjust_float_register_busy (cpu, -1, 1, -1, 1, out_FRdoublek, 2); 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); } if (out_FRk >= 0) set_use_is_fr_load (cpu, out_FRk); if (out_FRdoublek >= 0) { set_use_is_fr_load (cpu, out_FRdoublek); set_use_is_fr_load (cpu, out_FRdoublek + 1); } return cycles;}intfrvbf_model_fr550_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) { /* The entire VLIW insn must wait if there is a dependency on a register which is not ready yet. */ adjust_float_register_busy (cpu, in_FRk, 1, -1, 1, -1, 1); adjust_float_register_busy (cpu, in_FRdoublek, 2, -1, 1, -1, 1); vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); vliw_wait_for_FR (cpu, in_FRk); vliw_wait_for_FRdouble (cpu, in_FRdoublek); handle_resource_wait (cpu); load_wait_for_GR (cpu, in_GRi); load_wait_for_GR (cpu, in_GRj); load_wait_for_FR (cpu, in_FRk); load_wait_for_FRdouble (cpu, in_FRdoublek); trace_vliw_wait_cycles (cpu); return 0; } /* The target register is available immediately. */ cycles = idesc->timing->units[unit_num].done; return cycles;}intfrvbf_model_fr550_u_ici (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj){ 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. */ vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); 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; request_cache_invalidate (cpu, CPU_INSN_CACHE (cpu), cycles); return cycles;}intfrvbf_model_fr550_u_dci (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_GRi, INT in_GRj){ 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. */ vliw_wait_for_GR (cpu, in_GRi); vliw_wait_for_GR (cpu, in_GRj); handle_resource_wait (cpu); load_wait_for_GR (cpu, in_GRi); load_wait_for_GR (cpu, in_GRj);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -