Allow insns using 128-bit float to either either mode that supports it.
This patch adds new predicates for IEEE 128-bit and IBM 128-bit registers. The
predicate specifically allows either mode that supports the floating point
format (i.e. KFmode and TFmode when -mabi=ieeelongdouble is used).
The reason is to avoid adding a bunch of extra insns that have NOP conversions
to be able to recognize these patterns. Or alternatively in the function
rs6000_expand_builtin we would have to have code that switches each of the
KFmode built-in functions to TFmode.
For example, if the user writes:
__float128 a, b, c, d;
// ...
a = __builtin_fmaf128_round_to_odd (b, c, -d);
If the mode that d uses is TFmode instead of KFmode, GCC would either abort or
possibly add a convert insn in the subject. By adding the convert insn, the
multiply-subtract operation would not combine the negate and multiply-add
operation.
Currently when -mabi=ieeelongdouble is used, __float128 uses TFmode instead of
KFmode to be compatible with long double.
2022-08-10 Michael Meissner <meissner@linux.ibm.com>