On Thu, Feb 22, 2024 at 3:56 AM Richard Earnshaw (lists) <richard.earns...@arm.com> wrote: > > On 21/02/2024 18:30, Evgeny Karpov wrote: > > > +/* X18 reserved for the TEB on Windows. */ > +#ifdef TARGET_ARM64_MS_ABI > +# define FIXED_X18 1 > +# define CALL_USED_X18 0 > +#else > +# define FIXED_X18 0 > +# define CALL_USED_X18 1 > +#endif > > I'm not overly keen on ifdefs like this (and the one below), it can get quite > confusing if we have to support more than a couple of ABIs. Perhaps we could > create a couple of new headers, one for the EABI (which all existing targets > would then need to include) and one for the MS ABI. Then the mingw port > would use that instead of the EABI header. > > An alternative is to make all this dynamic, based on the setting of the > aarch64_calling_abi enum and to make the adjustments in > aarch64_conditional_register_usage.
Dynamically might be needed also if we want to support ms_abi attribute and/or -mabi=ms to support the wine folks. Thanks, Andrew Pinski > > +# define CALL_USED_X18 0 > > Is that really correct? If the register is really reserved, but some code > modifies it anyway, this will cause the compiler to restore the old value at > the end of a function; generally, for a reserved register, code that knows > what it's doing would want to make permanent changes to this value. > > +#ifdef TARGET_ARM64_MS_ABI > +# define STATIC_CHAIN_REGNUM R17_REGNUM > +#else > +# define STATIC_CHAIN_REGNUM R18_REGNUM > +#endif > > If we went the enum way, we'd want something like > > #define STATIC_CHAIN_REGNUM (calling_abi == AARCH64_CALLING_ABI_MS ? > R17_REGNUM : R18_REGNUM) > > R.