Matthew Malcomson <[email protected]> writes:
> diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
> index
> f996472d6990b7709602ae93f7a2cb7daa0e84b0..9795c929b8733f89722d3660456f5e7d6405d902
> 100644
> --- a/gcc/config/aarch64/aarch64.h
> +++ b/gcc/config/aarch64/aarch64.h
> @@ -643,6 +643,16 @@ extern unsigned aarch64_architecture_version;
> #define GP_REGNUM_P(REGNO) \
> (((unsigned) (REGNO - R0_REGNUM)) <= (R30_REGNUM - R0_REGNUM))
>
> +/* Registers known to be preserved over a BL instruction. This consists of
> the
> + GENERAL_REGS without x16, x17, and x30. The x30 register is changed by
> the BL
Long line.
> + instruction itself, while the x16 and x17 registers may be used by veneers
> + which can be inserted by the linker. */
> +#define STUB_REGNUM_P(REGNO) \
> + (GP_REGNUM_P (REGNO) \
> + && ((unsigned) (REGNO - R0_REGNUM)) != (R16_REGNUM - R0_REGNUM) \
> + && ((unsigned) (REGNO - R0_REGNUM)) != (R17_REGNUM - R0_REGNUM) \
> + && ((unsigned) (REGNO - R0_REGNUM)) != (R30_REGNUM - R0_REGNUM)) \
Sorry, I should have noticed this before, but we can just compare
(REGNO) directly with R16_REGNUM etc, with subtracting R0_REGNUM from
both sides. The R0_REGNUM stuff is only needed for range comparisons,
where the idea is to avoid reevaluating REGNO.
> […]
> @@ -10869,7 +10872,7 @@ aarch64_asm_trampoline_template (FILE *f)
> specific attributes to choose between hardening against straight line
> speculation or not, but such function specific attributes are likely to
> happen in the future. */
> - output_asm_insn ("dsb\tsy\n\tisb", NULL);
> + asm_fprintf (f, "\tdsb\tsy\n\tisb\n");
Looks like this should be part of 2/3.
> […]
> +rtx
> +aarch64_sls_create_blr_label (int regnum)
> +{
> + gcc_assert (regnum < 30 && regnum != 16 && regnum != 17);
Can just use STUB_REGNUM_P here.
> […]
> +/* Emit shared BLR stubs for the current compilation unit.
> + Over the course of compiling this unit we may have converted some BLR
> + instructions to a BL to a shared stub function. This is where we emit
> those
> + stub functions.
> + This function is for the stubs shared between different functions in this
> + compilation unit. We share when optimising for size instead of speed.
optimizing (alas).
> […]
> +/* { dg-final { scan-assembler "\tbr\tx\[0-9\]\[0-9\]?" } } */
Probably easier to read with {…} quoting rather than "…" quoting,
so that no backslashes are needed for [ and ].
OK with those changes, thanks.
Richard