[clang] [CLANG] Full support of complex multiplication and division. (PR #81514)
Joshua Cranmer via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 29 13:21:29 PST 2024
================
@@ -1847,19 +1847,50 @@ floating point semantic models: precise (the default), strict, and fast.
* ``16`` - Forces ``_Float16`` operations to be emitted without using excess
precision arithmetic.
+.. option:: -fcomplex-arithmetic=<value>:
+
+ This option specifies the implementation for complex multiplication and division.
+
+ Valid values are: ``basic``, ``improved``, ``full`` and ``promoted``.
+
+ * ``basic`` Implementation of complex division and multiplication using
+ algebraic formulas at source precision. No special handling to avoid
+ overflow. NaN and infinite values are not handled.
+ * ``improved`` Implementation of complex division using the Smith algorithm
+ at source precision. Smith's algorithm for complex division.
+ See SMITH, R. L. Algorithm 116: Complex division. Commun. ACM 5, 8 (1962).
+ This value offers improved handling for overflow in intermediate
+ calculations, but overflow may occur. NaN and infinite values are not
+ handled in some cases.
+ * ``full`` Implementation of complex division and multiplication using a
+ call to runtime library functions (generally the case, but the BE might
+ sometimes replace the library call if it knows enough about the potential
+ range of the inputs). Overflow and non-finite values are handled by the
+ library implementation. For the case of multiplication overflow will occur in
+ accordance with normal floating-point rules. This is the default value.
+ * ``promoted`` Implementation of complex division using algebraic formulas at
+ higher precision. Overflow is handled. Non-finite values are handled in some
+ cases. If the target does not have native support for a higher precision
+ data type, an implementation for the complex operation will be used to provide
+ improved guards against intermediate overflow, but overflow and underflow may
+ still occur in some cases. NaN and infinite values are not handled.
----------------
jcranmer-intel wrote:
This documentation doesn't make it clear what happens if there is no higher-precision datatype available and you use `promoted` format. And I'm somewhat uncomfortable with the idea that using `promoted` keeps you from being able to choose what happens in that case.
(In general, `promoted` is scary to me for anything larger than a `float` because `long double` is just such a cursed type and I'm not sure it's a good idea to convert `double` computations to `long double`).
https://github.com/llvm/llvm-project/pull/81514
More information about the cfe-commits
mailing list