Re: [PATCH 3/3] PowerPC future: Add IEEE 128-bit min, max, compare.

2020-06-09 Thread Segher Boessenkool
Hi!

Everything Will said included by reference :-)

On Mon, Jun 01, 2020 at 04:01:53PM -0400, Michael Meissner wrote:
> Add support for the new IEEE 128-bit minimum, maximum, and set compare mask
> instructions when -mcpu=future was used.

You can say "ISA 3.1 instructions" now :-)  That may read better in the
commit message?  OTOH, we'll keep using the "future" name for this in
the actual code a little longer, until everything is in, to keep things
easier for everyone (and then change everything at once).

> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -14847,7 +14847,9 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, 
> rtx op_false,
>  /* ISA 3.0 (power9) minmax subcase to emit a XSMAXCDP or XSMINCDP instruction
> for SF/DF scalars.  Move TRUE_COND to DEST if OP of the operands of the 
> last
> comparison is nonzero/true, FALSE_COND if it is zero/false.  Return 0 if 
> the
> -   hardware has no such operation.  */
> +   hardware has no such operation.
> +
> +   Under FUTURE, also handle IEEE 128-bit floating point.  */

Don't say this please: if you do, eventually we'll end up with a huge
list of how every function does its work for every ISA version.  Instead,
describe it at a higher level, if you want to say anything at all?
Replace the "SF/DF" with "supported scalar floating point modes" or such.

> @@ -14981,6 +14985,21 @@ rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, 
> rtx false_cond)
>   return 1;
>  }
>  
> +  /* See if we can use the FUTURE min/max/compare instructions for IEEE 
> 128-bit
> + floating point.  At present, don't worry about doing conditional moves
> + with different types for the comparison and movement (unlike SF/DF, 
> where
> + you can do a conditional test between double and use float as the 
> if/then
> + parts. */
> +  if (TARGET_FUTURE && FLOAT128_IEEE_P (compare_mode)
> +  && compare_mode == result_mode)
> +{
> +  if (rs6000_emit_hw_fp_minmax (dest, op, true_cond, false_cond))
> + return 1;
> +
> +  if (rs6000_emit_hw_fp_cmove (dest, op, true_cond, false_cond))
> + return 1;
> +}

"emit_hw_minmax" sounds completely wrong to implement a conditional move.
Presumably the name of that function isn't really what it does?  It would
make a lot more sense already if there was "try" in the name.  A function
called "emit" should not return a bool saying if it did the job -- if it
didn't it should ICE!

> +(define_insn "*xxsel"
> +  [(set (match_operand:IEEE128 0 "vsx_register_operand" "=wa")
> + (if_then_else:IEEE128
> +  (ne (match_operand:V2DI 1 "vsx_register_operand" "wa")
> +  (match_operand:V2DI 2 "zero_constant" ""))

Leave out the constraint string completely?

> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/float128-minmax-2.c
> @@ -0,0 +1,70 @@
> +/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */

Everything in this dir is always only used for powerpc targets; don't
test for that again per testcase please.

> +/* { dg-require-effective-target powerpc_future_ok } */
> +/* { dg-options "-mdejagnu-cpu=future -O2 -ffast-math" } */
> +/* { dg-final { scan-assembler-not "xscmpuqp"  } } */
> +/* { dg-final { scan-assembler "xscmpeqqp" } } */
> +/* { dg-final { scan-assembler "xscmpgtqp" } } */
> +/* { dg-final { scan-assembler "xscmpgeqp" } } */
> +/* { dg-final { scan-assembler "xsmaxcqp"  } } */
> +/* { dg-final { scan-assembler "xsmincqp"  } } */
> +/* { dg-final { scan-assembler "xxsel" } } */

\m and \M please.  And could you use scan-assembler-times here?  If so,
please do (all of this is very general advice).


Segher


Re: [PATCH 3/3] PowerPC future: Add IEEE 128-bit min, max, compare.

2020-06-01 Thread will schmidt via Gcc-patches
On Mon, 2020-06-01 at 16:01 -0400, Michael Meissner via Gcc-patches wrote:
> Add support for the new IEEE 128-bit minimum, maximum, and set compare mask
> instructions when -mcpu=future was used.
> 
> gcc/
> 2020-06-01  Michael Meissner  
> 
>   * config/rs6000/rs6000.c (rs6000_emit_hw_fp_minmax): Update
>   comment.
>   (rs6000_emit_hw_fp_cmove): Update comment.
>   (rs6000_emit_cmove): Add support for IEEE 128-bit min, max, and
>   comparisons with -mcpu=future.
>   (rs6000_emit_minmax): Add support for IEEE 128-bit min/max with
>   -mcpu=future.
>   * config/rs6000/rs6000.md (s3, IEEE128 iterator):
>   New insns for IEEE 128-bit min/max.
>   (movcc, IEEE128 iterator): New insns for IEEE 128-bit
>   conditional move.
>   (movcc_future, IEEE128 iterator): New insns for IEEE 128-bit
>   conditional move.
>   (movcc_invert_future, IEEE128 iterator): New insns for IEEE
>   128-bit conditional move.
>   (fpmask, IEEE128 iterator): New insns for IEEE 128-bit
>   conditional move.

Include the leading wildcard here?  
(*fpmask ...
and missing an entry for this one:
(*xxsel ...


> 
> testsuite/
> 2020-06-01  Michael Meissner  
> 
>   * gcc.target/powerpc/float128-minmax-2.c: New test.
> ---
>  gcc/config/rs6000/rs6000.c |  26 -
>  gcc/config/rs6000/rs6000.md| 121 
> +
>  .../gcc.target/powerpc/float128-minmax-2.c |  70 
>  3 files changed, 214 insertions(+), 3 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/float128-minmax-2.c
> 
> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
> index 0921328..bbba8f1 100644
> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -14847,7 +14847,9 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx op_true, 
> rtx op_false,
>  /* ISA 3.0 (power9) minmax subcase to emit a XSMAXCDP or XSMINCDP instruction
> for SF/DF scalars.  Move TRUE_COND to DEST if OP of the operands of the 
> last
> comparison is nonzero/true, FALSE_COND if it is zero/false.  Return 0 if 
> the
> -   hardware has no such operation.  */
> +   hardware has no such operation.
> +
> +   Under FUTURE, also handle IEEE 128-bit floating point.  */

> 
>  static int
>  rs6000_emit_hw_fp_minmax (rtx dest, rtx op, rtx true_cond, rtx false_cond)
> @@ -14889,7 +14891,9 @@ rs6000_emit_hw_fp_minmax (rtx dest, rtx op, rtx 
> true_cond, rtx false_cond)
>  /* ISA 3.0 (power9) conditional move subcase to emit XSCMP{EQ,GE,GT,NE}DP and
> XXSEL instructions for SF/DF scalars.  Move TRUE_COND to DEST if OP of the
> operands of the last comparison is nonzero/true, FALSE_COND if it is
> -   zero/false.  Return 0 if the hardware has no such operation.  */
> +   zero/false.  Return 0 if the hardware has no such operation.
> +
> +   Under FUTURE, also handle IEEE 128-bit conditional moves.  */
> 
>  static int
>  rs6000_emit_hw_fp_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
> @@ -14981,6 +14985,21 @@ rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, 
> rtx false_cond)
>   return 1;
>  }
> 
> +  /* See if we can use the FUTURE min/max/compare instructions for IEEE 
> 128-bit
> + floating point.  At present, don't worry about doing conditional moves
> + with different types for the comparison and movement (unlike SF/DF, 
> where
> + you can do a conditional test between double and use float as the 
> if/then
> + parts. */

Why don't we worry about that now?  Should this be a 'future todo'
comment here?


Beyond those nits and questions, lgtm, 
Thanks,
-Will