Fixed con_float for non-IEEE machines
authorceriel <none@none>
Mon, 3 Dec 1990 16:00:53 +0000 (16:00 +0000)
committerceriel <none@none>
Mon, 3 Dec 1990 16:00:53 +0000 (16:00 +0000)
mach/con_float

index 19d1c40..f8f1228 100644 (file)
@@ -131,6 +131,37 @@ float_cst(str, sz, buf)
                                e.flt_exp = 0;
                        }
                }
+#endif
+#ifndef IEEEFLOAT
+               if (sz == 4 && (e.flt_mantissa.flt_h_32 & 0x80)) {
+                       /* rounding */
+                       if ((e.flt_mantissa.flt_h_32 & 0xffffff00) == 0xffffff00) {
+                               e.flt_exp++;
+                               e.flt_mantissa.flt_h_32 = 0x80000000;
+                       }
+                       else {
+                               e.flt_mantissa.flt_h_32 += 0x80;
+                       }
+               }
+               if (sz == 8 && (e.flt_mantissa.flt_l_32 & 0x80)) {
+                       /* rounding */
+                       if ((e.flt_mantissa.flt_l_32 & 0xffffff00) == 0xffffff00) {
+                               e.flt_mantissa.flt_l_32 = 0;
+                               if (e.flt_mantissa.flt_h_32 == 0xffffffff) {
+                                       e.flt_exp++;
+                                       e.flt_mantissa.flt_h_32 = 0x80000000;
+                               }
+                               else e.flt_mantissa.flt_h_32++;
+                       }
+                       else {
+                               e.flt_mantissa.flt_l_32 += 0x80;
+                       }
+               }
+               if (e.flt_exp > 255) {
+                       overflow = 1;
+                       e.flt_exp = 255;
+                       e.flt_mantissa.flt_h_32 = e.flt_mantissa.flt_l_32 = 0xffffffff;
+               }
 #endif
                buf[I0] = (e.flt_sign << 7) | (e.flt_exp >> 1);
                buf[I1] = ((e.flt_exp&1) << 7) |
@@ -157,10 +188,11 @@ float_cst(str, sz, buf)
                        /* rounding */
                        if ((e.flt_mantissa.flt_l_32 & 0xfffff800) == 0xfffff800) {
                                e.flt_mantissa.flt_l_32 = 0;
-                               if ((e.flt_mantissa.flt_h_32 += 1) == 0) {
+                               if (e.flt_mantissa.flt_h_32 == 0xffffffff) {
                                        e.flt_exp++;
                                        e.flt_mantissa.flt_h_32 = 0x80000000;
                                }
+                               else e.flt_mantissa.flt_h_32++;
                        }
                        else {
                                e.flt_mantissa.flt_l_32 += 0x400;