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

📄 fpu-tst.c

📁 gdb-6.8 Linux下的调试程序 最新版本
💻 C
字号:
#define ASSERT(EXPRESSION) \do { \  if (!(EXPRESSION)) { \    fprintf (stderr, "%s:%d: assertion failed - %s\n", \             __FILE__, __LINE__, #EXPRESSION); \    abort (); \  } \} while (0)#define SIM_BITS_INLINE (INCLUDE_MODULE | INCLUDED_BY_MODULE)#include "milieu.h"#include "softfloat.h"#include "systfloat.h"#include "systmodes.h"/* #define SIM_FPU_INLINE (INCLUDE_MODULE | INCLUDED_BY_MODULE) */#include "sim-bits.h"#include "sim-fpu.h"#include "sim-fpu.c"static int flags;int8syst_float_flags_clear (){  int old_flags = 0;  int i = 1;  while (flags >= i)    {      switch ((sim_fpu_status) (flags & i))	{	case sim_fpu_status_denorm:	  break;	case sim_fpu_status_invalid_snan:	case sim_fpu_status_invalid_qnan:	case sim_fpu_status_invalid_isi:	case sim_fpu_status_invalid_idi:	case sim_fpu_status_invalid_zdz:	case sim_fpu_status_invalid_imz:	case sim_fpu_status_invalid_cvi:	case sim_fpu_status_invalid_cmp:	case sim_fpu_status_invalid_sqrt:	  old_flags |= float_flag_invalid; /* v */	  break;	case sim_fpu_status_inexact:	  old_flags |= float_flag_inexact; /* x */	  break;	case sim_fpu_status_overflow:	  old_flags |= float_flag_overflow; /* o */	  break;	case sim_fpu_status_underflow:	  old_flags |= float_flag_underflow; /* u */	  break;	case sim_fpu_status_invalid_div0:	  old_flags |= float_flag_divbyzero; /* z */	  break;	case sim_fpu_status_rounded:	  break;	}      i <<= 1;    }  flags = 0;  return old_flags;}sim_fpu_round rounding_mode;voidsyst_float_set_rounding_mode(int8 mode){  switch (mode)    {    case float_round_nearest_even:      rounding_mode = sim_fpu_round_near;      break;    case float_round_down:      rounding_mode = sim_fpu_round_down;      break;    case float_round_up:      rounding_mode = sim_fpu_round_up;      break;    case float_round_to_zero:      rounding_mode = sim_fpu_round_zero;      break;    }}float32syst_int32_to_float32(int32 a){  float32 z;  sim_fpu s;  flags |= sim_fpu_i32to (&s, a, rounding_mode);  flags |= sim_fpu_round_32 (&s, rounding_mode, 0);  sim_fpu_to32 (&z, &s);  return z;}float64syst_int32_to_float64( int32 a ){  float64 z;  sim_fpu s;  flags |= sim_fpu_i32to (&s, a, rounding_mode);  sim_fpu_to64 (&z, &s);  return z;}int32syst_float32_to_int32_round_to_zero( float32 a ){  int32 z;  sim_fpu s;  sim_fpu_32to (&s, a);  flags |= sim_fpu_to32i (&z, &s, sim_fpu_round_zero);  return z;}float64syst_float32_to_float64 (float32 a){  float64 z;  sim_fpu s;  sim_fpu_32to (&s, a);  flags |= sim_fpu_round_64 (&s, rounding_mode, 0);  sim_fpu_to64 (&z, &s);  return z;}float32 syst_float32_add( float32 a, float32 b ){  float32 z;  sim_fpu A;  sim_fpu B;  sim_fpu ans;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);#if 0  fprintf (stdout, "\n  ");  sim_fpu_print_fpu (&A, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, "\n+ ");  sim_fpu_print_fpu (&B, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, "\n= ");#endif  flags |= sim_fpu_add (&ans, &A, &B);  flags |= sim_fpu_round_32 (&ans, rounding_mode, 0);#if 0  sim_fpu_print_fpu (&ans, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, "\n");#endif  sim_fpu_to32 (&z, &ans);  return z;}float32 syst_float32_sub( float32 a, float32 b ){  float32 z;  sim_fpu A;  sim_fpu B;  sim_fpu ans;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);#if 0  sim_fpu_print_fpu (&A, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " + ");  sim_fpu_print_fpu (&B, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " = ");#endif  flags |= sim_fpu_sub (&ans, &A, &B);  flags |= sim_fpu_round_32 (&ans, rounding_mode, 0);#if 0  sim_fpu_print_fpu (&ans, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, "\n");#endif  sim_fpu_to32 (&z, &ans);  return z;}float32 syst_float32_mul( float32 a, float32 b ){  float32 z;  sim_fpu A;  sim_fpu B;  sim_fpu ans;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);#if 0  sim_fpu_print_fpu (&A, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " + ");  sim_fpu_print_fpu (&B, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " = ");#endif  flags |= sim_fpu_mul (&ans, &A, &B);#if 0  sim_fpu_print_fpu (&ans, (sim_fpu_print_func*) fprintf, stdout);#endif  flags |= sim_fpu_round_32 (&ans, rounding_mode, 0);#if 0  sim_fpu_print_status (flags, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, "\n");#endif  sim_fpu_to32 (&z, &ans);  return z;}float32 syst_float32_div( float32 a, float32 b ){  float32 z;  sim_fpu A;  sim_fpu B;  sim_fpu ans;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);  flags |= sim_fpu_div (&ans, &A, &B);  flags |= sim_fpu_round_32 (&ans, rounding_mode, 0);  sim_fpu_to32 (&z, &ans);  return z;}float32 syst_float32_sqrt( float32 a ){  float32 z;  sim_fpu A;  sim_fpu ans;  sim_fpu_32to (&A, a);#if 0  sim_fpu_print_fpu (&A, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " sqrt> ");#endif  flags |= sim_fpu_sqrt (&ans, &A);#if 0  sim_fpu_print_fpu (&ans, (sim_fpu_print_func*) fprintf, stdout);#endif  flags |= sim_fpu_round_32 (&ans, rounding_mode, 0);#if 0  fprintf (stdout, " (%x)\n", flags);#endif  sim_fpu_to32 (&z, &ans);  return z;}flag syst_float32_eq( float32 a, float32 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);  flags |= (sim_fpu_eq (&is, &A, &B) & ~sim_fpu_status_invalid_qnan);  return is;}flag syst_float32_eq_signaling( float32 a, float32 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);  flags |= sim_fpu_eq (&is, &A, &B);  return is;}flag syst_float32_le( float32 a, float32 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);  flags |= sim_fpu_le (&is, &A, &B);  return is;}flag syst_float32_le_quiet( float32 a, float32 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);  flags |= (sim_fpu_le (&is, &A, &B) & ~sim_fpu_status_invalid_qnan);  return is;}flag syst_float32_lt( float32 a, float32 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);  flags |= sim_fpu_lt (&is, &A, &B);  return is;}flag syst_float32_lt_quiet( float32 a, float32 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_32to (&A, a);  sim_fpu_32to (&B, b);  flags |= (sim_fpu_lt (&is, &A, &B) & ~sim_fpu_status_invalid_qnan);  return is;}int32 syst_float64_to_int32_round_to_zero( float64 a ){  int32 z;  sim_fpu s;  sim_fpu_64to (&s, a);  flags |= sim_fpu_to32i (&z, &s, sim_fpu_round_zero);  return z;}float32 syst_float64_to_float32( float64 a ){  float32 z;  sim_fpu s;  sim_fpu_64to (&s, a);#if 0  sim_fpu_print_fpu (&s, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " -> ");#endif  flags |= sim_fpu_round_32 (&s, rounding_mode, 0);#if 0  sim_fpu_print_fpu (&s, (sim_fpu_print_func*) fprintf, stdout);  sim_fpu_print_status (flags, (sim_fpu_print_func*) fprintf, stdout);  printf ("\n");#endif  sim_fpu_to32 (&z, &s);  return z;}float64 syst_float64_add( float64 a, float64 b ){  float64 z;  sim_fpu A;  sim_fpu B;  sim_fpu ans;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);#if 0  sim_fpu_print_fpu (&A, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " + ");  sim_fpu_print_fpu (&B, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " = ");#endif  flags |= sim_fpu_add (&ans, &A, &B);#if 0  sim_fpu_print_fpu (&ans, (sim_fpu_print_func*) fprintf, stdout);#endif  flags |= sim_fpu_round_64 (&ans, rounding_mode, 0);#if 0  fprintf (stdout, " (%x)\n", flags);#endif  sim_fpu_to64 (&z, &ans);  return z;}float64 syst_float64_sub( float64 a, float64 b ){  float64 z;  sim_fpu A;  sim_fpu B;  sim_fpu ans;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);#if 0  sim_fpu_print_fpu (&A, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " + ");  sim_fpu_print_fpu (&B, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " = ");#endif  flags |= sim_fpu_sub (&ans, &A, &B);#if 0  sim_fpu_print_fpu (&ans, (sim_fpu_print_func*) fprintf, stdout);#endif  flags |= sim_fpu_round_64 (&ans, rounding_mode, 0);#if 0  fprintf (stdout, " (%x)\n", flags);#endif  sim_fpu_to64 (&z, &ans);  return z;}float64 syst_float64_mul( float64 a, float64 b ){  float64 z;  sim_fpu A;  sim_fpu B;  sim_fpu ans;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);#if 0  sim_fpu_print_fpu (&A, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " * ");  sim_fpu_print_fpu (&B, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " = ");#endif  flags |= sim_fpu_mul (&ans, &A, &B);#if 0  sim_fpu_print_fpu (&ans, (sim_fpu_print_func*) fprintf, stdout);#endif  flags |= sim_fpu_round_64 (&ans, rounding_mode, 0);#if 0  sim_fpu_print_status (flags, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, "\n");#endif  sim_fpu_to64 (&z, &ans);  return z;}float64 syst_float64_div( float64 a, float64 b ){  float64 z;  sim_fpu A;  sim_fpu B;  sim_fpu ans;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);#if 0  sim_fpu_print_fpu (&A, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " + ");  sim_fpu_print_fpu (&B, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, " = ");#endif  flags |= sim_fpu_div (&ans, &A, &B);#if 0  sim_fpu_print_fpu (&ans, (sim_fpu_print_func*) fprintf, stdout);#endif  flags |= sim_fpu_round_64 (&ans, rounding_mode, 0);#if 0  sim_fpu_print_status (flags, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, "\n");#endif  sim_fpu_to64 (&z, &ans);  return z;}float64 syst_float64_sqrt( float64 a ){  float64 z;  sim_fpu A;  sim_fpu ans;  sim_fpu_64to (&A, a);#if 0  sim_fpu_print_fpu (&A, (sim_fpu_print_func*) fprintf, stdout);  printf (" sqrt> ");  printf ("\n");#endif  flags |= sim_fpu_sqrt (&ans, &A);#if 0  sim_fpu_print_fpu (&ans, (sim_fpu_print_func*) fprintf, stdout);#endif  flags |= sim_fpu_round_64 (&ans, rounding_mode, 0);#if 0  sim_fpu_print_status (flags, (sim_fpu_print_func*) fprintf, stdout);  fprintf (stdout, "\n");#endif  sim_fpu_to64 (&z, &ans);  return z;}flag syst_float64_eq( float64 a, float64 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);  flags |= (sim_fpu_eq (&is, &A, &B) & ~sim_fpu_status_invalid_qnan);  return is;}flag syst_float64_eq_signaling( float64 a, float64 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);  flags |= sim_fpu_eq (&is, &A, &B);  return is;}flag syst_float64_le( float64 a, float64 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);  flags |= sim_fpu_le (&is, &A, &B);  return is;}flag syst_float64_le_quiet( float64 a, float64 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);  flags |= (sim_fpu_le (&is, &A, &B) & ~sim_fpu_status_invalid_qnan);  return is;}flag syst_float64_lt( float64 a, float64 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);  flags |= sim_fpu_lt (&is, &A, &B);  return is;}flag syst_float64_lt_quiet( float64 a, float64 b ){  sim_fpu A;  sim_fpu B;  int is;  sim_fpu_64to (&A, a);  sim_fpu_64to (&B, b);  flags |= (sim_fpu_lt (&is, &A, &B) & ~sim_fpu_status_invalid_qnan);  return is;}

⌨️ 快捷键说明

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