Matthew Malcomson <matthew.malcom...@arm.com> 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