bool started, seendot, warned;
p = digits;
tenpwr = 0;
- started = seendot = warned = false;
+ started = seendot = false;
+ warned = (pass0 != 1);
while (*string && *string != 'E' && *string != 'e') {
if (*string == '.') {
if (!seendot) {
}
/* Test a single bit */
-static int test_bit(uint16_t *mant, int bit)
+static int test_bit(const uint16_t *mant, int bit)
{
return (mant[bit >> 4] >> (~bit & 15)) & 1;
}
+/* Report if the mantissa value is all zero */
+static bool is_zero(const uint16_t *mant)
+{
+ int i;
+
+ for (i = 0; i < MANT_WORDS; i++)
+ if (mant[i])
+ return false;
+
+ return true;
+}
+
/* Produce standard IEEE formats, with implicit or explicit integer
bit; this makes the following assumptions:
exponent >= 2 - expmax - fmt->mantissa) {
type = FL_DENORMAL;
} else if (exponent > 0) {
- error(ERR_WARNING|ERR_WARN_FL_OVERFLOW,
- "overflow in floating-point constant");
+ if (pass0 == 1)
+ error(ERR_WARNING|ERR_WARN_FL_OVERFLOW,
+ "overflow in floating-point constant");
type = FL_INFINITY;
} else {
/* underflow */
+ if (pass0 == 1)
+ error(ERR_WARNING|ERR_WARN_FL_UNDERFLOW,
+ "underflow in floating-point constant");
type = FL_ZERO;
}
} else {
if (!fmt->explicit)
mant[one_pos] &= ~one_mask; /* remove explicit one */
mant[0] |= exponent << (15 - fmt->exponent);
- } else if (daz) {
- /* Flush denormals to zero */
- goto zero;
+ } else {
+ if (daz || is_zero(mant)) {
+ /* Flush denormals to zero */
+ if (pass0 == 1)
+ error(ERR_WARNING|ERR_WARN_FL_UNDERFLOW,
+ "underflow in floating-point constant");
+ goto zero;
+ } else {
+ if (pass0 == 1)
+ error(ERR_WARNING|ERR_WARN_FL_DENORM,
+ "denormal floating-point constant");
+ }
}
break;
}
if (test_bit(mant, fmt->exponent+fmt->explicit-1)) {
ieee_shr(mant, 1);
exponent++;
- if (exponent >= expmax) {
- error(ERR_WARNING|ERR_WARN_FL_OVERFLOW,
- "overflow in floating-point constant");
+ if (exponent >= (expmax << 1)-1) {
+ if (pass0 == 1)
+ error(ERR_WARNING|ERR_WARN_FL_OVERFLOW,
+ "overflow in floating-point constant");
type = FL_INFINITY;
goto overflow;
}
"cyclic macro self-references",
"labels alone on lines without trailing `:'",
"numeric constants do not fit in 32 bits",
- "using 8- or 16-bit relocation in ELF32, a GNU extension"
+ "using 8- or 16-bit relocation in ELF32, a GNU extension",
"floating point overflow",
"floating point denormal",
"floating point underflow",
- "too many digits in floating-point number",
+ "too many digits in floating-point number"
};
/*