From a3197745b1edfd711e345b7c94c68be85eb11e48 Mon Sep 17 00:00:00 2001 From: Bosco Garc?a Date: Thu, 22 Aug 2019 12:54:06 +0100 Subject: [PATCH] Fix the assembler's floating point number parser so that it can correctly handle numbers encoded as a leading decimal point, followed by zeroes, followed by a non-zero sequence. * 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. --- gas/ChangeLog | 10 +++++++++ gas/atof-generic.c | 39 ++++++++++++++++++++++++++++------- gas/testsuite/gas/all/float.s | 2 ++ gas/testsuite/gas/i386/fp.d | 1 + gas/testsuite/gas/i386/fp.s | 4 ++++ 5 files changed, 49 insertions(+), 7 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 655c8adadf6..bd9887e4243 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2019-08-22 Bosco García + Nick Clifton + + * 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 * config/tc-aarch64.c: Add float16 directive and add "Hh" to diff --git a/gas/atof-generic.c b/gas/atof-generic.c index 40ee910c720..345ccef2c1c 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 b098cad1cc2..902914f4dc8 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 21838e262bc..a9a9538cd09 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 4187d4e55c3..a1f2b0f0a48 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 -- 2.30.2