rjmccall added a subscriber: scanon.
rjmccall added a comment.

This LGTM with one minor revision; feel free to commit with that.

For follow-up commit consideration: @scanon, do we want to support `_Float16` 
anywhere else?  Do we need to lock down an ABI here for i386/x86_64 in advance 
of those gears turning in the outer world?



================
Comment at: docs/LanguageExtensions.rst:497
 defined by the C standards committee, so using ``_Float16`` will not prevent
-code from being ported to architectures other than Arm.  Also, ``_Float16``
-arithmetic and operations will directly map on half-precision instructions when
-they are available (e.g. Armv8.2-A), avoiding conversions to/from
-single-precision, and thus will result in more performant code. If
-half-precision instructions are unavailable, values will be promoted to
+code from being ported to architectures other than Arm, though ``_Float16`` is
+currently disabled on most platforms until support is added to their published
----------------
rjmccall wrote:
> This entire documentation section really just needs to be reworked.  Here's a 
> starting point:
> 
>   Clang supports two half-precision (16-bit) floating point types: ``__fp16`` 
> and
>   ``_Float16``.  These types are supported in all language modes.
> 
>   ``__fp16`` is supported on every target, as it is purely a storage format; 
> see below.
>   ``_Float16`` is currently only supported on the following targets:
>   - 32-bit ARM
>   - 64-bit ARM (AArch64)
>   - SPIR
>   ``_Float16`` will be supported on more targets as they define ABIs for them.
> 
>   ``__fp16`` is a storage and interchange format only.  This means that 
> values of
>   ``__fp16`` are immediately promoted to (at least) ``float`` when used in 
> arithmetic
>   operations, so that e.g. the result of adding two ``__fp16`` values has 
> type ``float``.
>   The behavior of ``__fp16`` is specified by the ARM C Language Extensions 
> (`ACLE 
> <http://infocenter.arm.com/help/topic/com.arm.doc.ihi0053d/IHI0053D_acle_2_1.pdf>`_).
>   Clang uses the ``binary16`` format from IEEE 754-2008 for ``__fp16``, not 
> the ARM
>   alternative format.
> 
>   ``_Float16`` is an extended floating-point type.  This means that, just 
> like arithmetic on
>   ``float`` or ``double``, arithmetic on ``_Float16`` operands is formally 
> performed in the
>   ``_Float16`` type, so that e.g. the result of adding two ``_Float16`` 
> values has type
>   ``_Float16``.  The behavior of ``_Float16`` is specified by ISO/IEC TS 
> 18661-3:2015
>   ("Floating-point extensions for C").  As with ``__fp16``, Clang uses the 
> ``binary16``
>   format from IEEE 754-2008 for ``_Float16``.
> 
>   ``_Float16`` arithmetic will be performed using native half-precision 
> support
>   when available on the target (e.g. on ARMv8.2a); otherwise it will be 
> performed
>   at a higher precision (currently always ``float``) and then truncated down 
> to
>   ``_Float16``.  Note that C and C++ allow intermediate floating-point 
> operands
>   of an expression to be computed with greater precision than is expressible 
> in
>   their type, so Clang may avoid intermediate truncations in certain cases; 
> this may
>   lead to results that are inconsistent with native arithmetic.
> 
>   It is recommended that portable code use ``_Float16`` instead of ``__fp16``,
>   as it has been defined by the C standards committee and has behavior that is
>   more familiar to most programmers.
> 
>   Because ``__fp16`` operands are always immediately promoted to ``float``, 
> the
>   common real type of ``__fp16`` and ``_Float16`` for the purposes of the 
> usual
>   arithmetic conversions is ``float``.
> 
>   A literal can be given ``_Float16`` type using the suffix ``f16``; for 
> example:
>   ```
>     3.14f16
>   ```
> 
>   Because default argument promotion only applies to the standard 
> floating-point
>   types, ``_Float16`` values are not promoted to ``double`` when passed as 
> variadic
>   or untyped arguments.  As a consequence, some caution must be taken when 
> using
>   certain library facilities with ``_Float16``; for example, there is no 
> ``printf`` format
>   specifier for ``_Float16``, and (unlike ``float``) it will not be 
> implicitly promoted to
>   ``double`` when passed to ``printf``, so the programmer must explicitly 
> cast it to
>   ``double`` before using it with an ``%f`` or similar specifier.
Hmm.  Here's a better way of expressing part of that:

  ``_Float16`` is currently only supported on the following targets, with 
further
  targets pending ABI standardization:
  - 32-bit ARM
  - 64-bit ARM (AArch64)
  - SPIR


================
Comment at: docs/LanguageExtensions.rst:484
+- SPIR
+``_Float16`` will be supported on more targets as they define ABIs for them.
+
----------------
"them" should be "it" here.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D57188/new/

https://reviews.llvm.org/D57188



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to