Переглянути джерело

Fixed con_float for non-IEEE machines

ceriel 34 роки тому
батько
коміт
17af2902eb
1 змінених файлів з 33 додано та 1 видалено
  1. 33 1
      mach/con_float

+ 33 - 1
mach/con_float

@@ -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;