From 17af2902ebcd54f7ea13cc9eaefe114f48c7b66f Mon Sep 17 00:00:00 2001 From: ceriel Date: Mon, 3 Dec 1990 16:00:53 +0000 Subject: [PATCH] Fixed con_float for non-IEEE machines --- mach/con_float | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/mach/con_float b/mach/con_float index 19d1c4004..f8f1228e9 100644 --- a/mach/con_float +++ b/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; -- 2.34.1