📄 profile-fr550.c
字号:
trace_vliw_wait_cycles (cpu); return 0; } cycles = idesc->timing->units[unit_num].done; request_cache_invalidate (cpu, CPU_DATA_CACHE (cpu), cycles); return cycles;}intfrvbf_model_fr550_u_dcf (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_flush (cpu, CPU_DATA_CACHE (cpu), cycles); return cycles;}intfrvbf_model_fr550_u_icpl (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_preload (cpu, CPU_INSN_CACHE (cpu), cycles); return cycles;}intfrvbf_model_fr550_u_dcpl (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_preload (cpu, CPU_DATA_CACHE (cpu), cycles); return cycles;}intfrvbf_model_fr550_u_icul (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_unlock (cpu, CPU_INSN_CACHE (cpu), cycles); return cycles;}intfrvbf_model_fr550_u_dcul (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_unlock (cpu, CPU_DATA_CACHE (cpu), cycles); return cycles;}intfrvbf_model_fr550_u_float_arith (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_FRi, INT in_FRj, INT in_FRdoublei, INT in_FRdoublej, INT out_FRk, INT out_FRdoublek){ int cycles; FRV_PROFILE_STATE *ps; FRV_VLIW *vliw; int slot; if (model_insn == FRV_INSN_MODEL_PASS_1) return 0; /* The preprocessing can execute right away. */ cycles = idesc->timing->units[unit_num].done; /* The post processing must wait if there is a dependency on a FR which is not ready yet. */ adjust_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1); adjust_float_register_busy (cpu, in_FRdoublei, 2, in_FRdoublej, 2, out_FRdoublek, 2); ps = CPU_PROFILE_STATE (cpu); ps->post_wait = cycles; vliw = CPU_VLIW (cpu); slot = vliw->next_slot - 1; slot = (*vliw->current_vliw)[slot] - UNIT_FM0; post_wait_for_float (cpu, slot); post_wait_for_FR (cpu, in_FRi); post_wait_for_FR (cpu, in_FRj); post_wait_for_FR (cpu, out_FRk); post_wait_for_FRdouble (cpu, in_FRdoublei); post_wait_for_FRdouble (cpu, in_FRdoublej); post_wait_for_FRdouble (cpu, out_FRdoublek); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk)); post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek)); } restore_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1); restore_float_register_busy (cpu, in_FRdoublei, 2, in_FRdoublej, 2, out_FRdoublek, 2); /* The latency of FRk will be at least the latency of the other inputs. */ update_FR_latency (cpu, out_FRk, ps->post_wait); update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait); update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait); } /* Once initiated, post-processing will take 2 cycles. */ update_FR_ptime (cpu, out_FRk, 2); update_FRdouble_ptime (cpu, out_FRdoublek, 2); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 2); update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 2); } /* Mark this use of the register as a floating point op. */ if (out_FRk >= 0) set_use_is_fr_complex_2 (cpu, out_FRk); if (out_FRdoublek >= 0) { set_use_is_fr_complex_2 (cpu, out_FRdoublek); if (out_FRdoublek < 63) set_use_is_fr_complex_2 (cpu, out_FRdoublek + 1); } /* the media point unit resource has a latency of 4 cycles */ update_media_resource_latency (cpu, slot, cycles + 4); return cycles;}intfrvbf_model_fr550_u_float_dual_arith (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_FRi, INT in_FRj, INT in_FRdoublei, INT in_FRdoublej, INT out_FRk, INT out_FRdoublek){ int cycles; INT dual_FRi; INT dual_FRj; INT dual_FRk; INT dual_FRdoublei; INT dual_FRdoublej; INT dual_FRdoublek; FRV_PROFILE_STATE *ps; FRV_VLIW *vliw; int slot; if (model_insn == FRV_INSN_MODEL_PASS_1) return 0; /* The preprocessing can execute right away. */ cycles = idesc->timing->units[unit_num].done; /* The post processing must wait if there is a dependency on a FR which is not ready yet. */ dual_FRi = DUAL_REG (in_FRi); dual_FRj = DUAL_REG (in_FRj); dual_FRk = DUAL_REG (out_FRk); dual_FRdoublei = DUAL_DOUBLE (in_FRdoublei); dual_FRdoublej = DUAL_DOUBLE (in_FRdoublej); dual_FRdoublek = DUAL_DOUBLE (out_FRdoublek); adjust_float_register_busy (cpu, in_FRi, 2, in_FRj, 2, out_FRk, 2); adjust_float_register_busy (cpu, in_FRdoublei, 4, in_FRdoublej, 4, out_FRdoublek, 4); ps = CPU_PROFILE_STATE (cpu); ps->post_wait = cycles; vliw = CPU_VLIW (cpu); slot = vliw->next_slot - 1; slot = (*vliw->current_vliw)[slot] - UNIT_FM0; post_wait_for_float (cpu, slot); post_wait_for_FR (cpu, in_FRi); post_wait_for_FR (cpu, in_FRj); post_wait_for_FR (cpu, out_FRk); post_wait_for_FR (cpu, dual_FRi); post_wait_for_FR (cpu, dual_FRj); post_wait_for_FR (cpu, dual_FRk); post_wait_for_FRdouble (cpu, in_FRdoublei); post_wait_for_FRdouble (cpu, in_FRdoublej); post_wait_for_FRdouble (cpu, out_FRdoublek); post_wait_for_FRdouble (cpu, dual_FRdoublei); post_wait_for_FRdouble (cpu, dual_FRdoublej); post_wait_for_FRdouble (cpu, dual_FRdoublek); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk)); post_wait_for_SPR (cpu, FNER_FOR_FR (dual_FRk)); post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek)); post_wait_for_SPR (cpu, FNER_FOR_FR (dual_FRdoublek)); } restore_float_register_busy (cpu, in_FRi, 2, in_FRj, 2, out_FRk, 2); restore_float_register_busy (cpu, in_FRdoublei, 4, in_FRdoublej, 4, out_FRdoublek, 4); /* The latency of FRk will be at least the latency of the other inputs. */ update_FR_latency (cpu, out_FRk, ps->post_wait); update_FR_latency (cpu, dual_FRk, ps->post_wait); update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait); update_FRdouble_latency (cpu, dual_FRdoublek, ps->post_wait); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait); update_SPR_latency (cpu, FNER_FOR_FR (dual_FRk), ps->post_wait); update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait); update_SPR_latency (cpu, FNER_FOR_FR (dual_FRdoublek), ps->post_wait); } /* Once initiated, post-processing will take 3 cycles. */ update_FR_ptime (cpu, out_FRk, 3); update_FR_ptime (cpu, dual_FRk, 3); update_FRdouble_ptime (cpu, out_FRdoublek, 3); update_FRdouble_ptime (cpu, dual_FRdoublek, 3); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 3); update_SPR_ptime (cpu, FNER_FOR_FR (dual_FRk), 3); update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 3); update_SPR_ptime (cpu, FNER_FOR_FR (dual_FRdoublek), 3); } /* Mark this use of the register as a floating point op. */ if (out_FRk >= 0) fr550_reset_fr_flags (cpu, out_FRk); if (dual_FRk >= 0) fr550_reset_fr_flags (cpu, dual_FRk); if (out_FRdoublek >= 0) { fr550_reset_fr_flags (cpu, out_FRdoublek); if (out_FRdoublek < 63) fr550_reset_fr_flags (cpu, out_FRdoublek + 1); } if (dual_FRdoublek >= 0) { fr550_reset_fr_flags (cpu, dual_FRdoublek); if (dual_FRdoublek < 63) fr550_reset_fr_flags (cpu, dual_FRdoublek + 1); } /* the media point unit resource has a latency of 5 cycles */ update_media_resource_latency (cpu, slot, cycles + 5); return cycles;}intfrvbf_model_fr550_u_float_div (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_FRi, INT in_FRj, INT out_FRk){ int cycles; FRV_VLIW *vliw; int slot; FRV_PROFILE_STATE *ps; if (model_insn == FRV_INSN_MODEL_PASS_1) return 0; cycles = idesc->timing->units[unit_num].done; /* The post processing must wait if there is a dependency on a FR which is not ready yet. */ adjust_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1); ps = CPU_PROFILE_STATE (cpu); ps->post_wait = cycles; vliw = CPU_VLIW (cpu); slot = vliw->next_slot - 1; slot = (*vliw->current_vliw)[slot] - UNIT_FM0; post_wait_for_float (cpu, slot); post_wait_for_fdiv (cpu, slot); post_wait_for_FR (cpu, in_FRi); post_wait_for_FR (cpu, in_FRj); post_wait_for_FR (cpu, out_FRk); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk)); restore_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1); /* The latency of FRk will be at least the latency of the other inputs. */ /* Once initiated, post-processing will take 9 cycles. */ update_FR_latency (cpu, out_FRk, ps->post_wait); update_FR_ptime (cpu, out_FRk, 9); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { /* FNER has a latency of 9 cycles. */ update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait); update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 9); } /* The latency of the fdiv unit will be at least the latency of the other inputs. Once initiated, post-processing will take 9 cycles. */ update_fdiv_resource_latency (cpu, slot, ps->post_wait + 9); /* the media point unit resource has a latency of 11 cycles */ update_media_resource_latency (cpu, slot, cycles + 11); fr550_reset_fr_flags (cpu, out_FRk); return cycles;}intfrvbf_model_fr550_u_float_sqrt (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_FRj, INT in_FRdoublej, INT out_FRk, INT out_FRdoublek){ int cycles; FRV_VLIW *vliw; int slot; FRV_PROFILE_STATE *ps; if (model_insn == FRV_INSN_MODEL_PASS_1) return 0; cycles = idesc->timing->units[unit_num].done; /* The post processing must wait if there is a dependency on a FR which is not ready yet. */ adjust_float_register_busy (cpu, -1, 1, in_FRj, 1, out_FRk, 1); adjust_float_register_busy (cpu, -1, 1, in_FRdoublej, 2, out_FRdoublek, 2); ps = CPU_PROFILE_STATE (cpu); ps->post_wait = cycles; vliw = CPU_VLIW (cpu); slot = vliw->next_slot - 1; slot = (*vliw->current_vliw)[slot] - UNIT_FM0; post_wait_for_float (cpu, slot); post_wait_for_fsqrt (cpu, slot); post_wait_for_FR (cpu, in_FRj); post_wait_for_FR (cpu, out_FRk); post_wait_for_FRdouble (cpu, in_FRdoublej); post_wait_for_FRdouble (cpu, out_FRdoublek); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk)); post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek)); } restore_float_register_busy (cpu, -1, 1, in_FRj, 1, out_FRk, 1); restore_float_register_busy (cpu, -1, 1, in_FRdoublej, 2, out_FRdoublek, 2); /* The latency of FRk will be at least the latency of the other inputs. */ update_FR_latency (cpu, out_FRk, ps->post_wait); update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { /* FNER has a latency of 14 cycles. */ update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait); update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait); } /* Once initiated, post-processing will take 14 cycles. */ update_FR_ptime (cpu, out_FRk, 14); update_FRdouble_ptime (cpu, out_FRdoublek, 14); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -