⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 profile-fr550.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    {      /* 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 + -