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

📄 cp1.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
    case fmt_single:      {	sim_fpu_32to (&wop1, op1);	sim_fpu_32to (&wop2, op2);	break;      }    case fmt_double:      {	sim_fpu_64to (&wop1, op1);	sim_fpu_64to (&wop2, op2);	break;      }    default:      fprintf (stderr, "Bad switch\n");      abort ();    }  if (sim_fpu_is_nan (&wop1) || sim_fpu_is_nan (&wop2))    {      if ((cond & (1 << 3)) ||	  sim_fpu_is_snan (&wop1) || sim_fpu_is_snan (&wop2))	status = sim_fpu_status_invalid_snan;      less = 0;      equal = 0;      unordered = 1;    }  else    {      if (abs)	{	  status |= sim_fpu_abs (&wop1, &wop1);	  status |= sim_fpu_abs (&wop2, &wop2);	}      equal = sim_fpu_is_eq (&wop1, &wop2);      less = !equal && sim_fpu_is_lt (&wop1, &wop2);      unordered = 0;    }  *condition = (((cond & (1 << 2)) && less)		|| ((cond & (1 << 1)) && equal)		|| ((cond & (1 << 0)) && unordered));  return status;}voidfp_cmp(sim_cpu *cpu,       address_word cia,       unsigned64 op1,       unsigned64 op2,       FP_formats fmt,       int abs,       int cond,       int cc){  sim_fpu_status status = 0;  /* The format type should already have been checked.  The FCSR is     updated before the condition codes so that any exceptions will     be signalled before the condition codes are changed.  */  switch (fmt)    {    case fmt_single:    case fmt_double:      {	int result;	status = fp_test(op1, op2, fmt, abs, cond, &result);	update_fcsr (cpu, cia, status);	SETFCC (cc, result);	break;      }    case fmt_ps:      {	int result0, result1;	status  = fp_test(FP_PS_lower (op1), FP_PS_lower (op2), fmt_single,			  abs, cond, &result0);	status |= fp_test(FP_PS_upper (op1), FP_PS_upper (op2), fmt_single,			  abs, cond, &result1);	update_fcsr (cpu, cia, status);	SETFCC (cc, result0);	SETFCC (cc+1, result1);	break;      }    default:      sim_io_eprintf (SD, "Bad switch\n");      abort ();    }}/* Basic arithmetic operations.  */static unsigned64fp_unary(sim_cpu *cpu,	 address_word cia,	 int (*sim_fpu_op)(sim_fpu *, const sim_fpu *),	 unsigned64 op,	 FP_formats fmt){  sim_fpu wop;  sim_fpu ans;  sim_fpu_round round = rounding_mode (GETRM());  sim_fpu_denorm denorm = denorm_mode (cpu);  sim_fpu_status status = 0;  unsigned64 result = 0;  /* The format type has already been checked: */  switch (fmt)    {    case fmt_single:      {	unsigned32 res;	sim_fpu_32to (&wop, op);	status |= (*sim_fpu_op) (&ans, &wop);	status |= sim_fpu_round_32 (&ans, round, denorm);	sim_fpu_to32 (&res, &ans);	result = res;	break;      }    case fmt_double:      {	unsigned64 res;	sim_fpu_64to (&wop, op);	status |= (*sim_fpu_op) (&ans, &wop);	status |= sim_fpu_round_64 (&ans, round, denorm);	sim_fpu_to64 (&res, &ans);	result = res;	break;      }    case fmt_ps:      {	int status_u = 0, status_l = 0;	unsigned32 res_u, res_l;	sim_fpu_32to (&wop, FP_PS_upper(op));	status_u |= (*sim_fpu_op) (&ans, &wop);	sim_fpu_to32 (&res_u, &ans);	sim_fpu_32to (&wop, FP_PS_lower(op));	status_l |= (*sim_fpu_op) (&ans, &wop);	sim_fpu_to32 (&res_l, &ans);	result = FP_PS_cat(res_u, res_l);	status = status_u | status_l;	break;      }    default:      sim_io_eprintf (SD, "Bad switch\n");      abort ();    }  update_fcsr (cpu, cia, status);  return result;}static unsigned64fp_binary(sim_cpu *cpu,	  address_word cia,	  int (*sim_fpu_op)(sim_fpu *, const sim_fpu *, const sim_fpu *),	  unsigned64 op1,	  unsigned64 op2,	  FP_formats fmt){  sim_fpu wop1;  sim_fpu wop2;  sim_fpu ans;  sim_fpu_round round = rounding_mode (GETRM());  sim_fpu_denorm denorm = denorm_mode (cpu);  sim_fpu_status status = 0;  unsigned64 result = 0;  /* The format type has already been checked: */  switch (fmt)    {    case fmt_single:      {	unsigned32 res;	sim_fpu_32to (&wop1, op1);	sim_fpu_32to (&wop2, op2);	status |= (*sim_fpu_op) (&ans, &wop1, &wop2);	status |= sim_fpu_round_32 (&ans, round, denorm);	sim_fpu_to32 (&res, &ans);	result = res;	break;      }    case fmt_double:      {	unsigned64 res;	sim_fpu_64to (&wop1, op1);	sim_fpu_64to (&wop2, op2);	status |= (*sim_fpu_op) (&ans, &wop1, &wop2);	status |= sim_fpu_round_64 (&ans, round, denorm);	sim_fpu_to64 (&res, &ans);	result = res;	break;      }    case fmt_ps:      {	int status_u = 0, status_l = 0;	unsigned32 res_u, res_l;	sim_fpu_32to (&wop1, FP_PS_upper(op1));	sim_fpu_32to (&wop2, FP_PS_upper(op2));	status_u |= (*sim_fpu_op) (&ans, &wop1, &wop2);	sim_fpu_to32 (&res_u, &ans);	sim_fpu_32to (&wop1, FP_PS_lower(op1));	sim_fpu_32to (&wop2, FP_PS_lower(op2));	status_l |= (*sim_fpu_op) (&ans, &wop1, &wop2);	sim_fpu_to32 (&res_l, &ans);	result = FP_PS_cat(res_u, res_l);	status = status_u | status_l;	break;      }    default:      sim_io_eprintf (SD, "Bad switch\n");      abort ();    }  update_fcsr (cpu, cia, status);  return result;}/* Common MAC code for single operands (.s or .d), defers setting FCSR.  */static sim_fpu_statusinner_mac(int (*sim_fpu_op)(sim_fpu *, const sim_fpu *, const sim_fpu *),	  unsigned64 op1,	  unsigned64 op2,	  unsigned64 op3,	  int scale,	  int negate,	  FP_formats fmt,	  sim_fpu_round round,	  sim_fpu_denorm denorm,	  unsigned64 *result){  sim_fpu wop1;  sim_fpu wop2;  sim_fpu ans;  sim_fpu_status status = 0;  sim_fpu_status op_status;  unsigned64 temp = 0;  switch (fmt)    {    case fmt_single:      {	unsigned32 res;	sim_fpu_32to (&wop1, op1);	sim_fpu_32to (&wop2, op2);	status |= sim_fpu_mul (&ans, &wop1, &wop2);	if (scale != 0 && sim_fpu_is_number (&ans))  /* number or denorm */	  ans.normal_exp += scale;	status |= sim_fpu_round_32 (&ans, round, denorm);	wop1 = ans;        op_status = 0;	sim_fpu_32to (&wop2, op3);	op_status |= (*sim_fpu_op) (&ans, &wop1, &wop2);	op_status |= sim_fpu_round_32 (&ans, round, denorm);	status |= op_status;	if (negate)	  {	    wop1 = ans;	    op_status = sim_fpu_neg (&ans, &wop1);	    op_status |= sim_fpu_round_32 (&ans, round, denorm);	    status |= op_status;	  }	sim_fpu_to32 (&res, &ans);	temp = res;	break;      }    case fmt_double:      {	unsigned64 res;	sim_fpu_64to (&wop1, op1);	sim_fpu_64to (&wop2, op2);	status |= sim_fpu_mul (&ans, &wop1, &wop2);	if (scale != 0 && sim_fpu_is_number (&ans))  /* number or denorm */	  ans.normal_exp += scale;	status |= sim_fpu_round_64 (&ans, round, denorm);	wop1 = ans;        op_status = 0;	sim_fpu_64to (&wop2, op3);	op_status |= (*sim_fpu_op) (&ans, &wop1, &wop2);	op_status |= sim_fpu_round_64 (&ans, round, denorm);	status |= op_status;	if (negate)	  {	    wop1 = ans;	    op_status = sim_fpu_neg (&ans, &wop1);	    op_status |= sim_fpu_round_64 (&ans, round, denorm);	    status |= op_status;	  }	sim_fpu_to64 (&res, &ans);	temp = res;	break;      }    default:      fprintf (stderr, "Bad switch\n");      abort ();    }  *result = temp;  return status;}/* Common implementation of madd, nmadd, msub, nmsub that does   intermediate rounding per spec.  Also used for recip2 and rsqrt2,   which are transformed into equivalent nmsub operations.  The scale   argument is an adjustment to the exponent of the intermediate   product op1*op2.  It is currently non-zero for rsqrt2 (-1), which   requires an effective division by 2. */static unsigned64fp_mac(sim_cpu *cpu,       address_word cia,       int (*sim_fpu_op)(sim_fpu *, const sim_fpu *, const sim_fpu *),       unsigned64 op1,       unsigned64 op2,       unsigned64 op3,       int scale,       int negate,       FP_formats fmt){  sim_fpu_round round = rounding_mode (GETRM());  sim_fpu_denorm denorm = denorm_mode (cpu);  sim_fpu_status status = 0;  unsigned64 result = 0;  /* The format type has already been checked: */  switch (fmt)    {    case fmt_single:    case fmt_double:      status = inner_mac(sim_fpu_op, op1, op2, op3, scale,			 negate, fmt, round, denorm, &result);      break;    case fmt_ps:      {	int status_u, status_l;	unsigned64 result_u, result_l;	status_u = inner_mac(sim_fpu_op, FP_PS_upper(op1), FP_PS_upper(op2),			     FP_PS_upper(op3), scale, negate, fmt_single,			     round, denorm, &result_u);	status_l = inner_mac(sim_fpu_op, FP_PS_lower(op1), FP_PS_lower(op2),			     FP_PS_lower(op3), scale, negate, fmt_single,			     round, denorm, &result_l);	result = FP_PS_cat(result_u, result_l);	status = status_u | status_l;	break;      }    default:      sim_io_eprintf (SD, "Bad switch\n");      abort ();    }  update_fcsr (cpu, cia, status);  return result;}/* Common rsqrt code for single operands (.s or .d), intermediate rounding.  */static sim_fpu_statusinner_rsqrt(unsigned64 op1,	    FP_formats fmt,	    sim_fpu_round round,	    sim_fpu_denorm denorm,	    unsigned64 *result){  sim_fpu wop1;  sim_fpu ans;  sim_fpu_status status = 0;  sim_fpu_status op_status;  unsigned64 temp = 0;  switch (fmt)    {    case fmt_single:      {	unsigned32 res;	sim_fpu_32to (&wop1, op1);	status |= sim_fpu_sqrt (&ans, &wop1);	status |= sim_fpu_round_32 (&ans, status, round);	wop1 = ans;	op_status = sim_fpu_inv (&ans, &wop1);	op_status |= sim_fpu_round_32 (&ans, round, denorm);	sim_fpu_to32 (&res, &ans);	temp = res;	status |= op_status;	break;      }    case fmt_double:      {	unsigned64 res;	sim_fpu_64to (&wop1, op1);	status |= sim_fpu_sqrt (&ans, &wop1);	status |= sim_fpu_round_64 (&ans, round, denorm);	wop1 = ans;	op_status = sim_fpu_inv (&ans, &wop1);	op_status |= sim_fpu_round_64 (&ans, round, denorm);	sim_fpu_to64 (&res, &ans);	temp = res;	status |= op_status;	break;      }    default:      fprintf (stderr, "Bad switch\n");      abort ();    }  *result = temp;  return status;}static unsigned64fp_inv_sqrt(sim_cpu *cpu,	    address_word cia,	    unsigned64 op1,	    FP_formats fmt){  sim_fpu_round round = rounding_mode (GETRM());  sim_fpu_round denorm = denorm_mode (cpu);  sim_fpu_status status = 0;  unsigned64 result = 0;  /* The format type has already been checked: */  switch (fmt)    {    case fmt_single:    case fmt_double:      status = inner_rsqrt (op1, fmt, round, denorm, &result);      break;    case fmt_ps:      {	int status_u, status_l;	unsigned64 result_u, result_l;	status_u = inner_rsqrt (FP_PS_upper(op1), fmt_single, round, denorm,				&result_u);	status_l = inner_rsqrt (FP_PS_lower(op1), fmt_single, round, denorm,				&result_l);	result = FP_PS_cat(result_u, result_l);	status = status_u | status_l;	break;      }    default:      sim_io_eprintf (SD, "Bad switch\n");      abort ();    }  update_fcsr (cpu, cia, status);  return result;}unsigned64fp_abs(sim_cpu *cpu,       address_word cia,       unsigned64 op,       FP_formats fmt){  return fp_unary(cpu, cia, &sim_fpu_abs, op, fmt);}unsigned64fp_neg(sim_cpu *cpu,       address_word cia,       unsigned64 op,       FP_formats fmt){  return fp_unary(cpu, cia, &sim_fpu_neg, op, fmt);}unsigned64fp_add(sim_cpu *cpu,       address_word cia,       unsigned64 op1,       unsigned64 op2,       FP_formats fmt){  return fp_binary(cpu, cia, &sim_fpu_add, op1, op2, fmt);}unsigned64fp_sub(sim_cpu *cpu,       address_word cia,       unsigned64 op1,       unsigned64 op2,       FP_formats fmt){  return fp_binary(cpu, cia, &sim_fpu_sub, op1, op2, fmt);}unsigned64fp_mul(sim_cpu *cpu,       address_word cia,       unsigned64 op1,       unsigned64 op2,       FP_formats fmt){  return fp_binary(cpu, cia, &sim_fpu_mul, op1, op2, fmt);}unsigned64fp_div(sim_cpu *cpu,       address_word cia,       unsigned64 op1,       unsigned64 op2,       FP_formats fmt){  return fp_binary(cpu, cia, &sim_fpu_div, op1, op2, fmt);}unsigned64fp_recip(sim_cpu *cpu,         address_word cia,         unsigned64 op,         FP_formats fmt){  return fp_unary(cpu, cia, &sim_fpu_inv, op, fmt);}unsigned64fp_sqrt(sim_cpu *cpu,        address_word cia,        unsigned64 op,        FP_formats fmt){  return fp_unary(cpu, cia, &sim_fpu_sqrt, op, fmt);}unsigned64fp_rsqrt(sim_cpu *cpu,         address_word cia,         unsigned64 op,         FP_formats fmt){  return fp_inv_sqrt(cpu, cia, op, fmt);}unsigned64

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -