diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h index fa9af26..2e69a4d 100644 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h @@ -284,11 +284,13 @@ extern unsigned aarch64_architecture_version; /* Standard register usage. */ +#define FIXED_R18 0 + /* 31 64-bit general purpose registers R0-R30: R30 LR (link register) R29 FP (frame pointer) R19-R28 Callee-saved registers - R18 The platform register; use as temporary register. + R18 The platform register; use as temporary register if !FIXED_R18. R17 IP1 The second intra-procedure-call temporary register (can be used by call veneers and PLT code); otherwise use as a temporary register @@ -324,7 +326,7 @@ extern unsigned aarch64_architecture_version; { \ 0, 0, 0, 0, 0, 0, 0, 0, /* R0 - R7 */ \ 0, 0, 0, 0, 0, 0, 0, 0, /* R8 - R15 */ \ - 0, 0, 0, 0, 0, 0, 0, 0, /* R16 - R23 */ \ + 0, 0, FIXED_R18, 0, 0, 0, 0, 0, /* R16 - R23 */ \ 0, 0, 0, 0, 0, 1, 0, 1, /* R24 - R30, SP */ \ 0, 0, 0, 0, 0, 0, 0, 0, /* V0 - V7 */ \ 0, 0, 0, 0, 0, 0, 0, 0, /* V8 - V15 */ \ @@ -419,7 +421,7 @@ extern unsigned aarch64_architecture_version; uses alloca. */ #define EXIT_IGNORE_STACK (cfun->calls_alloca) -#define STATIC_CHAIN_REGNUM R18_REGNUM +#define STATIC_CHAIN_REGNUM (!(FIXED_R18) ? R18_REGNUM : R11_REGNUM) #define HARD_FRAME_POINTER_REGNUM R29_REGNUM #define FRAME_POINTER_REGNUM SFP_REGNUM #define STACK_POINTER_REGNUM SP_REGNUM