Add generic and ARM specific support for half-precision IEEE 754 floating point numbe...
authorBarnaby Wilks <barnaby.wilks@arm.com>
Mon, 12 Aug 2019 10:08:36 +0000 (11:08 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 12 Aug 2019 10:08:36 +0000 (11:08 +0100)
commit5312fe52e9ae6fd108f161a271315eb2821246eb
tree71c72db1906cabeaa4dc817d090e1f1957508526
parent9bb9c115cd3d0b9de97e02cf2e861972010daa6f
Add generic and ARM specific support for half-precision IEEE 754 floating point numbers to the assembler.

Half precision floating point numbers will be encoded using the IEEE 754
half precision floating point format - 16 bits in total, 1 for sign, 5
for exponent and 10 bits of  mantissa.

This patch implements the float16 directive for both the IEEE 754 format
and the Arm alternative format for the Arm backend.

The syntax of the directive is:

  .float16 <0-n decimal numbers>
e.g.
  .float16 12.0
  .float16 0.23, 433.1, 0.06

The Arm alternative format is almost identical to the IEEE 754 format,
except that it doesn't encode for NaNs or Infinity (instead an exponent
of 0x1F represents a normalized number in the range 65536 to 131008).

The alternative format is documented in the reference manual:

  https://static.docs.arm.com/ddi0487/db/DDI0487D_b_armv8_arm.pdf?_ga=2.72318806.49764181.1561632697-999473562.1560847439

Which format is used is controlled by the .float16_format <format>
directive, where if <format> = ieee, then use the IEEE 754
half-precision format else if <format> = alternative, then use the
Arm alternative format

Or the format can be set on the command line via the -mfp16-format
option that has a similar syntax.  -mfp16-format=<ieee|alternative>.
This also fixes the format and it cannot be changed by any directives.

Once the format has been set (either by the command line option or a directive) it cannot be changed,
and any attempts to change it (i.e. with the float16_format directive) will result in a warning and the
line being ignored.

For ELF targets the appropriate EABI attribute will be written out at the end of assembling
if the format has been explicitly specified. If no format has been explicitly specified then no
EABI attributes will be written.

If the format is not explicitly specified then any float16 directives are encoding using the IEEE 754-2008
format by default until the format is fixed or changed with the float16_format directive.

gas * config/tc-arm.c (enum fp_16bit_format): Add enum to represent the 2 float16 encodings.
(md_atof): Set precision for float16 type.
(arm_is_largest_exponent_ok): Check for whether to encode with the IEEE or alternative
format.
(set_fp16_format): Parse a float16_format directive.
(arm_parse_fp16_opt): Parse the fp16-format command line option.
(aeabi_set_public_attributes): For ELF encode the FP16 format EABI attribute.
* config/tc-arm.h (TC_LARGEST_EXPONENT_IS_NORMAL): Macro that expands to
arm_is_largest_exponent_ok.
(arm_is_largest_exponent_ok): Add prototype for arm_is_largest_exponent_ok function.
* doc/c-arm.texi: Add documentation for .float16, .float16_format and -mfp16-format=
* testsuite/gas/arm/float16-bad.d: New test.
* testsuite/gas/arm/float16-bad.l: New test.
* testsuite/gas/arm/float16-bad.s: New test.
* testsuite/gas/arm/float16-be.d: New test.
* testsuite/gas/arm/float16-format-bad.d: New test.
* testsuite/gas/arm/float16-format-bad.l: New test.
* testsuite/gas/arm/float16-format-bad.s: New test.
* testsuite/gas/arm/float16-format-opt-bad.d: New test.
* testsuite/gas/arm/float16-format-opt-bad.l: New test.
* testsuite/gas/arm/float16-le.d: New test.
* testsuite/gas/arm/float16.s: New test.
* testsuite/gas/arm/float16-eabi-alternative-format.d: New test.
* testsuite/gas/arm/float16-eabi-ieee-format.d: New test.
* testsuite/gas/arm/float16-eabi-no-format.d: New test.
* testsuite/gas/arm/float16-eabi.s: New test.

* config/atof-ieee.c (H_PRECISION): Macro for precision of float16
type.
(atof_ieee): Set precision and exponent bits for encoding float16
types.
(gen_to_words): NaN and Infinity encoding for float16.
(ieee_md_atof): Set precision for encoding float16 type.
20 files changed:
gas/ChangeLog
gas/config/atof-ieee.c
gas/config/tc-arm.c
gas/config/tc-arm.h
gas/doc/c-arm.texi
gas/testsuite/gas/arm/float16-bad.d [new file with mode: 0644]
gas/testsuite/gas/arm/float16-bad.l [new file with mode: 0644]
gas/testsuite/gas/arm/float16-bad.s [new file with mode: 0644]
gas/testsuite/gas/arm/float16-be.d [new file with mode: 0644]
gas/testsuite/gas/arm/float16-eabi-alternative-format.d [new file with mode: 0644]
gas/testsuite/gas/arm/float16-eabi-ieee-format.d [new file with mode: 0644]
gas/testsuite/gas/arm/float16-eabi-no-format.d [new file with mode: 0644]
gas/testsuite/gas/arm/float16-eabi.s [new file with mode: 0644]
gas/testsuite/gas/arm/float16-format-bad.d [new file with mode: 0644]
gas/testsuite/gas/arm/float16-format-bad.l [new file with mode: 0644]
gas/testsuite/gas/arm/float16-format-bad.s [new file with mode: 0644]
gas/testsuite/gas/arm/float16-format-opt-bad.d [new file with mode: 0644]
gas/testsuite/gas/arm/float16-format-opt-bad.l [new file with mode: 0644]
gas/testsuite/gas/arm/float16-le.d [new file with mode: 0644]
gas/testsuite/gas/arm/float16.s [new file with mode: 0644]