]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - sim/common/sim-fpu.c
import gdb-1999-09-21
[thirdparty/binutils-gdb.git] / sim / common / sim-fpu.c
index 8931ad3f3eb1d5b088d247098c10dbc6ecda39d6..99381e06b179ad013b019859b61c442fbca2f5df 100644 (file)
@@ -541,7 +541,7 @@ i2fpu (sim_fpu *f, signed64 i, int is_64bit)
        {
          do 
            {
-             f->fraction >>= 1;
+             f->fraction = (f->fraction >> 1) | (f->fraction & 1);
              f->normal_exp += 1;
            }
          while (f->fraction >= IMPLICIT_2);
@@ -2090,7 +2090,17 @@ INLINE_SIM_FPU (double)
 sim_fpu_2d (const sim_fpu *s)
 {
   sim_fpu_map val;
-  val.i = pack_fpu (s, 1);
+  if (sim_fpu_is_snan (s))
+    {
+      /* gag SNaN's */
+      sim_fpu n = *s;
+      n.class = sim_fpu_class_qnan;
+      val.i = pack_fpu (&n, 1);
+    }
+  else
+    {
+      val.i = pack_fpu (s, 1);
+    }
   return val.d;
 }
 
@@ -2438,24 +2448,26 @@ sim_fpu_gt (int *is,
 
 /* A number of useful constants */
 
-EXTERN_SIM_FPU (const sim_fpu) sim_fpu_zero = {
+#if EXTERN_SIM_FPU_P
+const sim_fpu sim_fpu_zero = {
   sim_fpu_class_zero,
 };
-EXTERN_SIM_FPU (const sim_fpu) sim_fpu_qnan = {
+const sim_fpu sim_fpu_qnan = {
   sim_fpu_class_qnan,
 };
-EXTERN_SIM_FPU (const sim_fpu) sim_fpu_one = {
+const sim_fpu sim_fpu_one = {
   sim_fpu_class_number, 0, IMPLICIT_1, 1
 };
-EXTERN_SIM_FPU (const sim_fpu) sim_fpu_two = {
+const sim_fpu sim_fpu_two = {
   sim_fpu_class_number, 0, IMPLICIT_1, 2
 };
-EXTERN_SIM_FPU (const sim_fpu) sim_fpu_max32 = {
+const sim_fpu sim_fpu_max32 = {
   sim_fpu_class_number, 0, LSMASK64 (NR_FRAC_GUARD, NR_GUARDS32), NORMAL_EXPMAX32
 };
-EXTERN_SIM_FPU (const sim_fpu) sim_fpu_max64 = {
+const sim_fpu sim_fpu_max64 = {
   sim_fpu_class_number, 0, LSMASK64 (NR_FRAC_GUARD, NR_GUARDS64), NORMAL_EXPMAX64
 };
+#endif
 
 
 /* For debugging */