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

📄 profile-fr500.c

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