[PATCH,rs6000] Add built-in function support Power9 binary floating point operations

Segher Boessenkool segher@kernel.crashing.org
Mon Aug 1 21:02:00 GMT 2016


Hi Kelvin,

On Fri, Jul 29, 2016 at 09:47:55AM -0600, Kelvin Nilsen wrote:
> This patch adds built-in support for the following fourteen new binary
> floating point instructions introduced with the Power9 architecture: 

Some comments, mostly about whitespace:

> --- gcc/doc/extend.texi	(revision 238014)
> +++ gcc/doc/extend.texi	(working copy)

> +int scalar_test_data_class (float source, unsigned int condition);
> +int scalar_test_data_class (double source, unsigned int condition);
> +
> +int scalar_test_neg (float source)
> +int scalar_test_neg (double source)

These last two probably want a semicolon as well?

> +The @code{scalar_extract_sig} and @code{scalar_insert_exp}
> +functions require a 64-bit environment supporting ISA 3.0 or later.
> +The @code{scalar_extract_exp} and @code{vec_extract_sig} built-in
> +functions return the significand and exponent respectively of their
> +@code{source} arguments.  The 

Trailing space.

> +The @code{scalar_cmp_exp_gt}, @code{scalar_cmp_exp_lt},
> +@code{scalar_cmp_exp_eq}, and @code{scalar_cmp_exp_unordered} built-in
> +functions return a non-zero value if @code{arg1} is greater than, less
> +than, equal to, or not comparable to @code{arg2} respectively.  The
> +arguments are not comparable if one or the other equals NaN (not a
> +number). 

Trailing space.

> +__vector float
> +vec_insert_exp (__vector unsigned int significands,  __vector unsigned int exponents);
> +__vector double
> +vec_insert_exp (__vector unsigned long long int significands,
> +                __vector unsigned long long int exponents);

Break up the first of these to two lines as well?

> +/* { dg-skip-if "" { powerpc*-*-aix* } } */

I think you can do this in bfp.exp, for all tests at the same time?
Or will bfp/ include tests that can run on AIX, eventually?

> +/* This test should succeed only 64-bit configuration.  */

Maybe "only on 64-bit configurations"?

> +;; Iterator for scalar floating point types
> +(define_mode_iterator VSX_SF [DF SF])

There is an iterator SFDF already; is there a reason to use a new one?

> +(define_mode_attr vsx_sf_suffix [(DF "dp") (SF "sp")])

That is Fvsx already.

> +(define_mode_attr vsx_f_suffix [(V4SF "dp") (V2DF "sp")])

Those seem swapped?

You can make vsx_sf_suffix (or Fvsx) do these types as well.

> +(define_mode_attr VSX_F_INTEGER [(V4SF "V4SI") (V2DF "V2DI")])

VSi does this, too.

> +;; ISA 3.0 Binary Floating-Point Support
> +
> +;; VSX Scalar Extract Exponent Double-Precision
> +(define_insn "xsxexpdp"
> +  [(set (match_operand:DI 0 "register_operand" "=r")
> +  	(unspec:DI [(match_operand:DF 1 "vsx_register_operand" "wa")] 
> +        UNSPEC_VSX_SXEXPDP))]

These last two lines aren't indented correctly (no spaces before tabs,
and no spaces where you could use a tab).  Many variations below.
"contrib/check_GNU_style.sh" might help a bit.

> +  "xsxexpdp %0,%x1"
> +  [(set_attr "type" "fp")])

I think this should be "fpsimple"?

> +(define_insn "*xscmpexpdp"
> +  [(set (match_operand:CCFP 0 "" "=y")

No predicate?  cc_reg_operand?

> +;; VSX Scalar Test Data Class Double- and Single-Precision
> +;;  (The lt bit is set if operand 1 is negative.  The eq bit is set 
> +;;   if any of the conditions tested by operand 2 are satisfied.  
> +;;   The gt and unordered bits are cleared to zero.)

Trailing spaces.  There are more.

> +(define_expand "xststdc<vsx_sf_suffix>"
> +  [(set (match_dup 3)
> +        (compare:CCFP
> +         (unspec:VSX_SF
> +          [(match_operand:VSX_SF 1 "vsx_register_operand" "wa")
> +           (match_operand:SI 2 "u7bit_cint_operand" "n")]
> +          UNSPEC_VSX_STSTDC)
> +        (match_dup 4)))
> +   (set (match_operand:SI 0 "register_operand" "=r")
> +        (eq:SI (match_dup 3)
> +               (const_int 0)))
> +  ]

Don't put this ] on a separate line please.

> +(define_insn "*xststdc<vsx_sf_suffix>"
> +  [(set (match_operand:CCFP 0 "" "=y")
> +        (compare:CCFP
> +         (unspec:VSX_SF [(match_operand:VSX_SF 1 "vsx_register_operand" "wa")
> +                        (match_operand:SI 2 "u7bit_cint_operand" "n")]

The ( should line up here.  And, tabs.

> +;; VSX Vector Test Data Class Double and Single Precision
> +;;  The corresponding elements of the result vector are all ones
> +;;   if any of the conditions tested by operand 3 are satisfied.  

Something went wrong with the leading spaces here :-)

> @@ -4721,6 +4799,7 @@ altivec_resolve_overloaded_builtin (location_t loc
>    tree types[3], args[3];
>    const struct altivec_builtin_types *desc;
>    unsigned int n;
> +  bool unsupported_builtin;
>  
>    if (!rs6000_overloaded_builtin_p (fcode))
>      return NULL_TREE;
> @@ -5480,6 +5559,7 @@ assignment for unaligned loads and stores");
>        return build_int_cst (NULL_TREE, TYPE_VECTOR_SUBPARTS (types[0]));
>      }
>  
> +  unsupported_builtin = false;

Declare it here, instead of 750 lines above?

> +BU_P9V_VSX_2 (VSCEDPGT,	"scalar_cmp_exp_dp_gt", CONST, xscmpexpdp_gt)
> +BU_P9V_VSX_2 (VSCEDPLT,	"scalar_cmp_exp_dp_lt", CONST, xscmpexpdp_lt)
> +BU_P9V_VSX_2 (VSCEDPEQ,	"scalar_cmp_exp_dp_eq", CONST, xscmpexpdp_eq)
> +BU_P9V_VSX_2 (VSCEDPUO,	"scalar_cmp_exp_dp_unordered", CONST, xscmpexpdp_unordered)

You're using spaces instead of tabs for the last few parameters here.
Everything else uses tabs, it's best to follow style I think.

> --- gcc/config/rs6000/predicates.md	(revision 238014)
> +++ gcc/config/rs6000/predicates.md	(working copy)
> @@ -147,6 +147,11 @@
>    (and (match_code "const_int")
>         (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 63")))
>  
> +;; Return 1 if op is an unsigned 7-bit constant integer.
> +(define_predicate "u7bit_cint_operand"
> +  (and (match_code "const_int")
> +       (match_test "INTVAL (op) >= 0 && UINTVAL (op) <= 127")))

Why UINTVAL for the latter?  IN_RANGE is a bit nicer as well I think.


Segher



More information about the Gcc-patches mailing list