This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCHv2, rs6000] Add minimum __float128 built-in support required for glibc
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: Bill Schmidt <wschmidt at linux dot vnet dot ibm dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, David Edelsohn <dje dot gcc at gmail dot com>
- Date: Thu, 23 Jun 2016 18:49:28 -0500
- Subject: Re: [PATCHv2, rs6000] Add minimum __float128 built-in support required for glibc
- Authentication-results: sourceware.org; auth=none
- References: <DEA68D1C-CC68-4458-986E-6DF38ABA37F5 at linux dot vnet dot ibm dot com>
Hi Bill,
Some little things about the patch...
On Thu, Jun 23, 2016 at 04:44:27PM -0500, Bill Schmidt wrote:
> We no longer have a half-clever implementation to construct an infinity
> inside vector registers, or the full-clever one that Segher proposed in
> response. :) We can try to add that support later if desired.
For posterity:
Use vspltisw A,N ; vsrw B,A,A ; vslo D,B,A to create in D:
N=-16 ffff_0000_0000_0000_0000_0000_0000_0000 (ieee128 -Inf)
N=-17 7fff_0000_0000_0000_0000_0000_0000_0000 (ieee128 +Inf)
> @@ -35569,6 +35639,7 @@ static struct rs6000_opt_mask const rs6000_builtin
> { "hard-dfp", RS6000_BTM_DFP, false, false },
> { "hard-float", RS6000_BTM_HARD_FLOAT, false, false },
> { "long-double-128", RS6000_BTM_LDBL128, false, false },
> + { "float128", RS6000_BTM_FLOAT128, false, false },
The previous entries use tabs for indentation.
> --- gcc/config/rs6000/rs6000.h (revision 237619)
> +++ gcc/config/rs6000/rs6000.h (working copy)
> @@ -2689,6 +2689,7 @@ extern int frame_pointer_needed;
> #define RS6000_BTM_HARD_FLOAT MASK_SOFT_FLOAT /* Hardware floating point. */
> #define RS6000_BTM_LDBL128 MASK_MULTIPLE /* 128-bit long double. */
> #define RS6000_BTM_64BIT MASK_64BIT /* 64-bit addressing. */
> +#define RS6000_BTM_FLOAT128 MASK_P9_VECTOR /* IEEE 128-bit float. */
Here, too.
> @@ -2705,7 +2706,8 @@ extern int frame_pointer_needed;
> | RS6000_BTM_CELL \
> | RS6000_BTM_DFP \
> | RS6000_BTM_HARD_FLOAT \
> - | RS6000_BTM_LDBL128)
> + | RS6000_BTM_LDBL128 \
> + | RS6000_BTM_FLOAT128)
And here. And more later. Let's try to stick to one style, at least
locally.
> --- gcc/config/rs6000/rs6000.md (revision 237619)
> +++ gcc/config/rs6000/rs6000.md (working copy)
> @@ -13326,7 +13326,25 @@
> "xssqrtqp %0,%1"
> [(set_attr "type" "vecdiv")])
>
> -(define_insn "copysign<mode>3"
> +(define_expand "copysign<mode>3"
> + [(use (match_operand:IEEE128 0 "altivec_register_operand" ""))
> + (use (match_operand:IEEE128 1 "altivec_register_operand" ""))
> + (use (match_operand:IEEE128 2 "altivec_register_operand" ""))]
The "" is not needed.
> + "FLOAT128_IEEE_P (<MODE>mode)"
> +{
> + if (TARGET_FLOAT128_HW)
> + emit_insn (gen_copysign<mode>3_hard (operands[0], operands[1],
> + operands[2]));
Tabbing here...
> + else
> + {
> + rtx tmp = gen_reg_rtx (<MODE>mode);
> + emit_insn (gen_copysign<mode>3_soft (operands[0], operands[1],
> + operands[2], tmp));
... and here is completely broken.
> @@ -13336,6 +13354,18 @@
> "xscpsgnqp %0,%2,%1"
> [(set_attr "type" "vecsimple")])
>
> +(define_insn "copysign<mode>3_soft"
> + [(set (match_operand:IEEE128 0 "altivec_register_operand" "=v")
> + (unspec:IEEE128
> + [(match_operand:IEEE128 1 "altivec_register_operand" "v")
> + (match_operand:IEEE128 2 "altivec_register_operand" "v")
> + (match_operand:IEEE128 3 "altivec_register_operand" "+v")]
> + UNSPEC_COPYSIGN))]
> + "!TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)"
> + "xscpsgndp %x3,%x2,%x1\n\txxpermdi %x0,%x3,%x1,1"
Two machine insns in a template should be separated by \; not \n\t .
> +Additional built-in functions are available for the 64-bit PowerPC
> +family of processors, for efficient use of 128-bit floating point
> +(@code{__float128}) values.
> +
> +The following floating-point built-in functions are always available. All
> +of them implement the function that is part of the name.
"Always"? Not just with -mfloat128? And it needs VMX?
Segher