aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog10
-rw-r--r--gas/atof-generic.c39
-rw-r--r--gas/testsuite/gas/all/float.s2
-rw-r--r--gas/testsuite/gas/i386/fp.d1
-rw-r--r--gas/testsuite/gas/i386/fp.s4
5 files changed, 49 insertions, 7 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 655c8ad..bd9887e 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2019-08-22 Bosco GarcĂ­a <jbgg.gnu@gmail.com>
+ Nick Clifton <nickc@redhat.com>
+
+ * atof-generic.c (atof_generic): Do not ignore leading zeros if
+ they appear after a decimal point.
+ * testsuite/gas/all/float.s: Extend test to include a number with
+ a leading decimal point followed by several zeroes.
+ * testsuite/gas/i386/fp.s: Likewise.
+ * testsuite/gas/i386/fp.d: Update expected output.
+
2019-08-22 Barnaby Wilks <barnaby.wilks@arm.com>
* config/tc-aarch64.c: Add float16 directive and add "Hh" to
diff --git a/gas/atof-generic.c b/gas/atof-generic.c
index 40ee910..345ccef 100644
--- a/gas/atof-generic.c
+++ b/gas/atof-generic.c
@@ -184,23 +184,42 @@ atof_generic (/* return pointer to just AFTER number we read. */
#ifndef OLD_FLOAT_READS
/* Ignore trailing 0's after the decimal point. The original code here
- * (ifdef'd out) does not do this, and numbers like
- * 4.29496729600000000000e+09 (2**31)
- * come out inexact for some reason related to length of the digit
- * string.
- */
+ (ifdef'd out) does not do this, and numbers like
+ 4.29496729600000000000e+09 (2**31)
+ come out inexact for some reason related to length of the digit
+ string. */
+
+ /* The case number_of_digits_before_decimal = 0 is handled for
+ deleting zeros after decimal. In this case the decimal mark and
+ the first zero digits after decimal mark are skipped. */
+ seen_significant_digit = 0;
+ signed long subtract_decimal_exponent = 0;
+
if (c && IS_DECIMAL_MARK (c))
{
- unsigned int zeros = 0; /* Length of current string of zeros */
+ unsigned int zeros = 0; /* Length of current string of zeros. */
+
+ if (number_of_digits_before_decimal == 0)
+ /* Skip decimal mark. */
+ first_digit++;
for (p++; (c = *p) && ISDIGIT (c); p++)
{
if (c == '0')
{
- zeros++;
+ if (number_of_digits_before_decimal == 0
+ && !seen_significant_digit)
+ {
+ /* Skip '0' and the decimal mark. */
+ first_digit++;
+ subtract_decimal_exponent--;
+ }
+ else
+ zeros++;
}
else
{
+ seen_significant_digit = 1;
number_of_digits_after_decimal += 1 + zeros;
zeros = 0;
}
@@ -287,6 +306,12 @@ atof_generic (/* return pointer to just AFTER number we read. */
}
}
+#ifndef OLD_FLOAT_READS
+ /* Subtract_decimal_exponent != 0 when number_of_digits_before_decimal = 0
+ and first digit after decimal is '0'. */
+ decimal_exponent += subtract_decimal_exponent;
+#endif
+
*address_of_string_pointer = p;
number_of_digits_available =
diff --git a/gas/testsuite/gas/all/float.s b/gas/testsuite/gas/all/float.s
index b098cad..902914f 100644
--- a/gas/testsuite/gas/all/float.s
+++ b/gas/testsuite/gas/all/float.s
@@ -2,3 +2,5 @@
foo: .single 0r1.2345e+06
.single 0f3.14159
.double 0r2.718282
+ .double .0000000000000000000001
+ .double 1e-22
diff --git a/gas/testsuite/gas/i386/fp.d b/gas/testsuite/gas/i386/fp.d
index 21838e2..a9a9538 100644
--- a/gas/testsuite/gas/i386/fp.d
+++ b/gas/testsuite/gas/i386/fp.d
@@ -6,3 +6,4 @@
Contents of section .data:
0000 00881bcd 4b789ad4 004071a3 79094f93 ....Kx...@q.y.O.
0010 0a40789a 5440789a 54400000 00000000 .@x.T@x.T@......
+ 0020 e65e1710 20395e3b e65e1710 20395e3b .\^.. 9\^;.\^.. 9\^;
diff --git a/gas/testsuite/gas/i386/fp.s b/gas/testsuite/gas/i386/fp.s
index 4187d4e..a1f2b0f 100644
--- a/gas/testsuite/gas/i386/fp.s
+++ b/gas/testsuite/gas/i386/fp.s
@@ -11,3 +11,7 @@
.single 3.32192809488736218171e0
# .byte 0x78, 0x9a, 0x54, 0x40, 0, 0, 0, 0
.byte 0, 0, 0, 0, 0, 0
+
+# The assembler used to treat the next value as zero instead of 1e-22.
+ .double .0000000000000000000001
+ .double 1e-22