Richard Henderson <richard.hender...@linaro.org> writes:
> Reject QI/HImode conditions, which would require extension in
> order to compare.  Fixes
>
> z.c:10:1: error: unrecognizable insn:
>    10 | }
>       | ^
> (insn 23 22 24 2 (set (reg:CC 66 cc)
>         (compare:CC (reg:HI 128)
>             (reg:HI 127))) "z.c":6:6 -1
>      (nil))
> during RTL pass: vregs
>
> gcc:
>       * config/aarch64/aarch64.md (mov<ALLI>cc): Accept MODE_CC
>       conditions directly; reject QI/HImode conditions.
>
> gcc/testsuite:
>       * gcc.target/aarch64/cmpbr-3.c: New.
> ---
>  gcc/config/aarch64/aarch64.md              | 16 +++++++++++-----
>  gcc/testsuite/gcc.target/aarch64/cmpbr-3.c | 15 +++++++++++++++
>  2 files changed, 26 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/cmpbr-3.c
>
> diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
> index 8545c750282..4358cc59b0b 100644
> --- a/gcc/config/aarch64/aarch64.md
> +++ b/gcc/config/aarch64/aarch64.md
> @@ -4752,15 +4752,21 @@
>                          (match_operand:ALLI 3 "register_operand")))]
>    ""
>    {
> -    rtx ccreg;
>      enum rtx_code code = GET_CODE (operands[1]);
> -
>      if (code == UNEQ || code == LTGT)
>        FAIL;
>  
> -    ccreg = aarch64_gen_compare_reg (code, XEXP (operands[1], 0),
> -                                  XEXP (operands[1], 1));
> -    operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx);
> +    rtx ccreg = XEXP (operands[1], 0);
> +    enum machine_mode ccmode = GET_MODE (ccreg);
> +    if (GET_MODE_CLASS (ccmode) == MODE_CC)
> +     gcc_assert (XEXP (operands[1], 1) == const0_rtx);

Sorry for the formatting nit, but: too much indentation.

LGTM otherwise.

Richard

> +    else if (ccmode == QImode || ccmode == HImode)
> +      FAIL;
> +    else
> +      {
> +     ccreg = aarch64_gen_compare_reg (code, ccreg, XEXP (operands[1], 1));
> +     operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx);
> +      }
>    }
>  )
>  
> diff --git a/gcc/testsuite/gcc.target/aarch64/cmpbr-3.c 
> b/gcc/testsuite/gcc.target/aarch64/cmpbr-3.c
> new file mode 100644
> index 00000000000..a4f12deef27
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/cmpbr-3.c
> @@ -0,0 +1,15 @@
> +/* { dg-do assemble } */
> +/* { dg-options "-O2" } */
> +
> +#pragma GCC target "+cmpbr"
> +
> +long aarch64_fallback_frame_state_tpidr2_0;
> +unsigned short aarch64_fallback_frame_state_tpidr2_1, 
> aarch64_fallback_frame_state_za_ctx_0;
> +void aarch64_fallback_frame_state_za_buffer()
> +{
> +  long num_slices = aarch64_fallback_frame_state_tpidr2_1;
> +  if (aarch64_fallback_frame_state_tpidr2_1 > 
> aarch64_fallback_frame_state_za_ctx_0)
> +    num_slices = aarch64_fallback_frame_state_za_ctx_0;
> +  __builtin_memcpy((void *)aarch64_fallback_frame_state_tpidr2_0,
> +         aarch64_fallback_frame_state_za_buffer, num_slices);
> +}

Reply via email to