On Fri, Jul 13, 2018 at 04:15:41AM -0500, Richard Sandiford wrote:
> Given a pattern like:
>
> (define_insn "aarch64_frecpe<mode>" ...)
>
> the SVE ACLE implementation wants to generate the pattern for a
> particular (non-constant) mode. This patch automatically generates
> helpers to do that, specifically:
>
> // Return CODE_FOR_nothing on failure.
> insn_code maybe_code_for_aarch64_frecpe (machine_mode);
>
> // Assert that the code exists.
> insn_code code_for_aarch64_frecpe (machine_mode);
>
> // Return NULL_RTX on failure.
> rtx maybe_gen_aarch64_frecpe (machine_mode, rtx, rtx);
>
> // Assert that generation succeeds.
> rtx gen_aarch64_frecpe (machine_mode, rtx, rtx);
>
> Many patterns don't have sensible names when all <...>s are removed.
> E.g. "<optab><mode>2" would give a base name "2". The new functions
> therefore require explicit opt-in, which should also help to reduce
> code bloat.
>
> The (arbitrary) opt-in syntax I went for was to prefix the pattern
> name with '@', similarly to the existing '*' marker.
>
> The patch also makes config/aarch64 use the new routines in cases where
> they obviously apply. This was mostly straight-forward, but it seemed
> odd that we defined:
>
> aarch64_reload_movcp<...><P:mode>
>
> but then only used it with DImode, never SImode. If we should be
> using Pmode instead of DImode, then that's a simple change,
> but should probably be a separate patch.
>
> Tested on aarch64-linux-gnu (with and without SVE), aarch64_be-elf
> and x86_64-linux-gnu. I think I can self-approve the gen* bits,
> but OK for the AArch64 parts?
For what it is worth, I like the change to AArch64, and would support it
when you get consensus around the new syntax from other targets.
You only have to look at something like:
> - rtx (*gen) (rtx, rtx, rtx);
> -
> - switch (src_mode)
> - {
> - case E_V8QImode:
> - gen = gen_aarch64_simd_combinev8qi;
> - break;
> - case E_V4HImode:
> - gen = gen_aarch64_simd_combinev4hi;
> - break;
> - case E_V2SImode:
> - gen = gen_aarch64_simd_combinev2si;
> - break;
> - case E_V4HFmode:
> - gen = gen_aarch64_simd_combinev4hf;
> - break;
> - case E_V2SFmode:
> - gen = gen_aarch64_simd_combinev2sf;
> - break;
> - case E_DImode:
> - gen = gen_aarch64_simd_combinedi;
> - break;
> - case E_DFmode:
> - gen = gen_aarch64_simd_combinedf;
> - break;
> - default:
> - gcc_unreachable ();
> - }
> -
> - emit_insn (gen (dst, src1, src2));
> + emit_insn (gen_aarch64_simd_combine (src_mode, dst, src1, src2));
To understand this is a Good Thing for code maintainability.
Thanks,
James
>
> Any objections to this approach or syntax?
>
> Richard