Spencer Abson <[email protected]> writes:
> Enable a target with FEAT_FP16 to emit the half-precision variants
> of FCMP/FCMPE.
>
> gcc/ChangeLog:
>
> * config/aarch64/aarch64.md: Update cbranch, cstore, fcmp
> and fcmpe to use the GPF_F16 iterator for floating-point
> modes.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/aarch64/_Float16_cmp_1.c: New test.
> * gcc.target/aarch64/_Float16_cmp_2.c: New (negative) test.
> ---
> gcc/config/aarch64/aarch64.md | 29 +++++-----
> .../gcc.target/aarch64/_Float16_cmp_1.c | 54 +++++++++++++++++++
> .../gcc.target/aarch64/_Float16_cmp_2.c | 7 +++
> 3 files changed, 77 insertions(+), 13 deletions(-)
> create mode 100644 gcc/testsuite/gcc.target/aarch64/_Float16_cmp_1.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/_Float16_cmp_2.c
>
> diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
> index 071058dbeb3..8721bf5d4f3 100644
> --- a/gcc/config/aarch64/aarch64.md
> +++ b/gcc/config/aarch64/aarch64.md
> @@ -707,11 +707,12 @@
> )
>
> (define_expand "cbranch<mode>4"
> - [(set (pc) (if_then_else (match_operator 0 "aarch64_comparison_operator"
> - [(match_operand:GPF 1 "register_operand")
> - (match_operand:GPF 2
> "aarch64_fp_compare_operand")])
> - (label_ref (match_operand 3 "" ""))
> - (pc)))]
> + [(set (pc) (if_then_else
> + (match_operator 0 "aarch64_comparison_operator"
> + [(match_operand:GPF_F16 1 "register_operand")
> + (match_operand:GPF_F16 2 "aarch64_fp_compare_operand")])
> + (label_ref (match_operand 3 "" ""))
> + (pc)))]
> ""
> "
> operands[1] = aarch64_gen_compare_reg (GET_CODE (operands[0]), operands[1],
> @@ -4338,26 +4339,28 @@
>
> (define_insn "fcmp<mode>"
> [(set (reg:CCFP CC_REGNUM)
> - (compare:CCFP (match_operand:GPF 0 "register_operand")
> - (match_operand:GPF 1 "aarch64_fp_compare_operand")))]
> + (compare:CCFP
> + (match_operand:GPF_F16 0 "register_operand")
> + (match_operand:GPF_F16 1 "aarch64_fp_compare_operand")))]
Minor formatting nit, but it'd be more usual to indent by two extra
columns relative to the (compare ...), i.e.:
(compare:CCFP
(match_operand:GPF_F16 0 "register_operand")
(match_operand:GPF_F16 1 "aarch64_fp_compare_operand")))]
Similarly for the others.
OK with that change for GCC 16, thanks.
BTW:
> diff --git a/gcc/testsuite/gcc.target/aarch64/_Float16_cmp_2.c
> b/gcc/testsuite/gcc.target/aarch64/_Float16_cmp_2.c
> new file mode 100644
> index 00000000000..e714304970b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/_Float16_cmp_2.c
> @@ -0,0 +1,7 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -march=armv8.2-a+nofp16" } */
> +
> +#include "_Float16_cmp_1.c"
> +
> +/* { dg-final { scan-assembler-not "\tfcmp\th\[0-9\]\+" } } */
> +/* { dg-final { scan-assembler-not "\tfcmpe\th\[0-9\]\+" } } */
> \ No newline at end of file
It can be easier to write these tests using {...} quoting for the regexp
as well, so that backslashes are regexp backslashes rather than Tcl string
backslashes:
/* { dg-final { scan-assembler-not {\tfcmp\th[0-9]+} } } */
/* { dg-final { scan-assembler-not {\tfcmpe\th[0-9]+} } } */
The "..." version is ok (and often used) too though.
Richard