📄 profile-fr500.c
字号:
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); 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_fr500_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. 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); 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_fr500_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. 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); 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_fr500_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. 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); 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_fr500_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; 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, in_FRj, out_FRk, 1); adjust_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek, 1); ps = CPU_PROFILE_STATE (cpu); ps->post_wait = cycles; 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, in_FRj, out_FRk, 1); restore_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek, 1); /* 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 3 cycles. */ update_FR_ptime (cpu, out_FRk, 3); update_FRdouble_ptime (cpu, out_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 (out_FRdoublek), 3); } /* Mark this use of the register as a floating point op. */ if (out_FRk >= 0) set_use_is_fpop (cpu, out_FRk); if (out_FRdoublek >= 0) { set_use_is_fpop (cpu, out_FRdoublek); if (out_FRdoublek < 63) set_use_is_fpop (cpu, out_FRdoublek + 1); } return cycles;}intfrvbf_model_fr500_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; 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, in_FRj, out_FRk, 1); adjust_float_register_busy (cpu, dual_FRi, dual_FRj, dual_FRk, 1); adjust_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek, 1); adjust_double_register_busy (cpu, dual_FRdoublei, dual_FRdoublej, dual_FRdoublek, 1); ps = CPU_PROFILE_STATE (cpu); ps->post_wait = cycles; 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, in_FRj, out_FRk, 1); restore_float_register_busy (cpu, dual_FRi, dual_FRj, dual_FRk, 1); restore_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek, 1); restore_double_register_busy (cpu, dual_FRdoublei, dual_FRdoublej, dual_FRdoublek, 1); /* 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) set_use_is_fpop (cpu, out_FRk); if (dual_FRk >= 0) set_use_is_fpop (cpu, dual_FRk); if (out_FRdoublek >= 0) { set_use_is_fpop (cpu, out_FRdoublek); if (out_FRdoublek < 63) set_use_is_fpop (cpu, out_FRdoublek + 1); } if (dual_FRdoublek >= 0) { set_use_is_fpop (cpu, dual_FRdoublek); if (dual_FRdoublek < 63) set_use_is_fpop (cpu, dual_FRdoublek + 1); } return cycles;}intfrvbf_model_fr500_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, in_FRj, out_FRk, 1); ps = CPU_PROFILE_STATE (cpu); ps->post_wait = cycles; 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)); vliw = CPU_VLIW (cpu); slot = vliw->next_slot - 1; slot = (*vliw->current_vliw)[slot] - UNIT_FM0; post_wait_for_fdiv (cpu, slot); restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1); /* The latency of FRk will be at least the latency of the other inputs. */ /* Once initiated, post-processing will take 10 cycles. */ update_FR_latency (cpu, out_FRk, ps->post_wait); update_FR_ptime (cpu, out_FRk, 10); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) { /* FNER has a latency of 10 cycles. */ update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait); update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 10); } /* 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); /* Mark this use of the register as a floating point op. */ set_use_is_fpop (cpu, out_FRk); return cycles;}intfrvbf_model_fr500_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, in_FRj, out_FRk, 1); adjust_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1); ps = CPU_PROFILE_STATE (cpu); ps->post_wait = cycles; 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)); vliw = CPU_VLIW (cpu); slot = vliw->next_slot - 1; slot = (*vliw->current_vliw)[slot] - UNIT_FM0; post_wait_for_fsqrt (cpu, slot); restore_float_register_busy (cpu, -1, in_FRj, out_FRk, 1); restore_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1); /* 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); /* Once initiated, post-processing will take 15 cycles. */ update_FR_ptime (cpu, out_FRk, 15); update_FRdouble_ptime (cpu, out_FRdoublek, 15); if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING)) update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 15); /* The latency of the sqrt unit will be the latency of the other inputs plus 14 cycles. */ update_fsqrt_resource_latency (cpu, slot, ps->post_wait + 14); /* Mark this use of the register as a floating point op. */ if (out_FRk >= 0) set_use_is_fpop (cpu, out_FRk); if (out_FRdoublek >= 0) { set_use_is_fpop (cpu, out_FRdoublek); if (out_FRdoublek < 63) set_use_is_fpop (cpu, out_FRdoublek + 1); } return cycles;}intfrvbf_model_fr500_u_float_dual_sqrt (SIM_CPU *cpu, const IDESC *idesc, int unit_num, int referenced, INT in_FRj, INT out_FRk)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -