On Tue, Mar 02, 2021 at 10:01:11AM +0100, Ard Biesheuvel wrote: > The AArch64 asm syntax has this slightly tedious property that the names > used in mnemonics to refer to registers depend on whether the opcode in > question targets the entire 64-bits (xN), or only the least significant > 8, 16 or 32 bits (wN). When writing parameterized code such as macros, > this can be annoying, as macro arguments don't lend themselves to > indexed lookups, and so generating a reference to wN in a macro that > receives xN as an argument is problematic. > > For instance, an upcoming patch that modifies the implementation of the > cond_yield macro to be able to refer to 32-bit registers would need to > modify invocations such as > > cond_yield 3f, x8 > > to > > cond_yield 3f, 8 > > so that the second argument can be token pasted after x or w to emit the > correct register reference. Unfortunately, this interferes with the self > documenting nature of the first example, where the second argument is > obviously a register, whereas in the second example, one would need to > go and look at the code to find out what '8' means. > > So let's fix this by defining wxN aliases for all xN registers, which > resolve to the 32-bit alias of each respective 64-bit register. This > allows the macro implementation to paste the xN reference after a w to > obtain the correct register name. > > Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx> > --- > arch/arm64/include/asm/assembler.h | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h > index e0fc1d424f9b..7b076ccd1a54 100644 > --- a/arch/arm64/include/asm/assembler.h > +++ b/arch/arm64/include/asm/assembler.h > @@ -23,6 +23,14 @@ > #include <asm/ptrace.h> > #include <asm/thread_info.h> > > + /* > + * Provide a wxN alias for each wN register so what we can paste a xN > + * reference after a 'w' to obtain the 32-bit version. > + */ > + .irp n,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 > + wx\n .req w\n > + .endr That's a pretty neat hack! I remember seeing code elsewhere which would benefit from this, so might be worth a look at our other macros as I'm sure I got annoyed by one the other day... ah yes, the SVE macros in fpsimdmacros.h Acked-by: Will Deacon <will@xxxxxxxxxx> Will