From 5773855c3f57da5864a848c12844883bd1c48b24 Mon Sep 17 00:00:00 2001 From: Olivier Hainque Date: Fri, 13 Dec 2019 09:09:18 +0000 Subject: [PATCH] Move and adjust PROBE_STACK reg definitions for aarch64 The change moves the definitions of PROBE_STACK_FIRST_REG and PROBE_STACK_SECOND_REG to a more appropriate place for such items (here, in aarch64.md as suggested by Richard), and adjusts their value from r9/r10 to r10/r11 to free r9 for a possibly more general purpose (e.g. as a static chain at least on targets which have a private use of r18, such as Windows or Vxworks). 2020-11-07 Olivier Hainque gcc/ * config/aarch64/aarch64.md: Define PROBE_STACK_FIRST_REGNUM and PROBE_STACK_SECOND_REGNUM constants, designating r10/r11. Replacements for the PROBE_STACK_FIRST/SECOND_REG constants in aarch64.c. * config/aarch64/aarch64.c (PROBE_STACK_FIRST_REG): Remove. (PROBE_STACK_SECOND_REG): Remove. (aarch64_emit_probe_stack_range): Adjust to the _REG -> _REGNUM suffix update for PROBE_STACK register numbers. --- gcc/config/aarch64/aarch64.c | 8 ++------ gcc/config/aarch64/aarch64.md | 7 +++++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 27f587be7e7..0ae6c8b53f6 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -6272,10 +6272,6 @@ aarch64_libgcc_cmp_return_mode (void) #error Cannot use simple address calculation for stack probing #endif -/* The pair of scratch registers used for stack probing. */ -#define PROBE_STACK_FIRST_REG R9_REGNUM -#define PROBE_STACK_SECOND_REG R10_REGNUM - /* Emit code to probe a range of stack addresses from FIRST to FIRST+POLY_SIZE, inclusive. These are offsets from the current stack pointer. */ @@ -6289,7 +6285,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, poly_int64 poly_size) return; } - rtx reg1 = gen_rtx_REG (Pmode, PROBE_STACK_FIRST_REG); + rtx reg1 = gen_rtx_REG (Pmode, PROBE_STACK_FIRST_REGNUM); /* See the same assertion on PROBE_INTERVAL above. */ gcc_assert ((first % ARITH_FACTOR) == 0); @@ -6347,7 +6343,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, poly_int64 poly_size) equality test for the loop condition. */ else { - rtx reg2 = gen_rtx_REG (Pmode, PROBE_STACK_SECOND_REG); + rtx reg2 = gen_rtx_REG (Pmode, PROBE_STACK_SECOND_REGNUM); /* Step 1: round SIZE to the previous multiple of the interval. */ diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 78fe7c43a00..11e0f4612be 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -111,6 +111,13 @@ ;; "FFR token": a fake register used for representing the scheduling ;; restrictions on FFR-related operations. (FFRT_REGNUM 85) + ;; The pair of scratch registers used for stack probing with -fstack-check. + ;; Leave R9 alone as a possible choice for the static chain. + ;; Note that the use of these registers is mutually exclusive with the use + ;; of STACK_CLASH_SVE_CFA_REGNUM, which is for -fstack-clash-protection + ;; rather than -fstack-check. + (PROBE_STACK_FIRST_REGNUM 10) + (PROBE_STACK_SECOND_REGNUM 11) ;; Scratch register used by stack clash protection to calculate ;; SVE CFA offsets during probing. (STACK_CLASH_SVE_CFA_REGNUM 11) -- 2.30.2