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.
This commit is contained in:
Bosco Garc?a 2019-08-22 12:54:06 +01:00 committed by Nick Clifton
parent 43771869e5
commit a3197745b1
5 changed files with 49 additions and 7 deletions

View File

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

View File

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

View File

@ -2,3 +2,5 @@
foo: .single 0r1.2345e+06
.single 0f3.14159
.double 0r2.718282
.double .0000000000000000000001
.double 1e-22

View File

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

View File

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