Message ID | 13835555f8ef44b21d1b7ddfe1c4203d0981f77e.1551824161.git.stefan@agner.ch (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] ARM: drop unnecessary WASM | expand |
Hi Stefan, On 2019-03-05 10:18 pm, Stefan Agner wrote: > The W macro for generating wide instructions when targeting Thumb-2 > is not required for the preload data instructions (pld, pldw) since > they are only available as wide instructions. The GNU assembler seems > to work with or without the .w appended when compiling an Thumb-2 > kernel. However, Clang's integrated assembler does not consider the > .w variants as valid instructions: > > ./arch/arm/include/asm/processor.h:133:5: error: invalid instruction > "pldw.w\t%a0 \n" > ^ > <inline asm>:2:1: note: instantiated into assembly here > pldw.w [r0] > ^ > 1 error generated. Have you filed a bug against Clang for that? Something like "pldwal.w" may be super-redundant, but it's still perfectly valid syntax. The "Standard assembler syntax fields" section of the Arm ARM even calls out that "...the .W qualifier has no effect" on ARM/A32 instructions since they are inherently 32-bit; that should equally apply for 32-bit only Thumb/T32 instructions. There are certainly a few instructions which don't allow a condition code (even "AL"), but off-hand I don't remember any not having the optional {<q>} field in their syntax. That said, obviously the patch itself is no problem since the syntax *is* redundant here, but it really is just a workaround for an assembler bug. Robin. > Drop the macro to make sure non-wide variants of pld and pldw are > emitted in all cases. > > Signed-off-by: Stefan Agner <stefan@agner.ch> > --- > arch/arm/include/asm/processor.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h > index 120f4c9bbfde..042d77cf686d 100644 > --- a/arch/arm/include/asm/processor.h > +++ b/arch/arm/include/asm/processor.h > @@ -131,8 +131,8 @@ static inline void prefetchw(const void *ptr) > __asm__ __volatile__( > ".arch_extension mp\n" > __ALT_SMP_ASM( > - WASM(pldw) "\t%a0", > - WASM(pld) "\t%a0" > + "pldw\t%a0", > + "pld\t%a0" > ) > :: "p" (ptr)); > } >
On Tue, Mar 5, 2019 at 3:39 PM Robin Murphy <robin.murphy@arm.com> wrote: > > Hi Stefan, > > On 2019-03-05 10:18 pm, Stefan Agner wrote: > > The W macro for generating wide instructions when targeting Thumb-2 > > is not required for the preload data instructions (pld, pldw) since > > they are only available as wide instructions. The GNU assembler seems > > to work with or without the .w appended when compiling an Thumb-2 > > kernel. However, Clang's integrated assembler does not consider the > > .w variants as valid instructions: > > > > ./arch/arm/include/asm/processor.h:133:5: error: invalid instruction > > "pldw.w\t%a0 \n" > > ^ > > <inline asm>:2:1: note: instantiated into assembly here > > pldw.w [r0] > > ^ > > 1 error generated. > > Have you filed a bug against Clang for that? Something like "pldwal.w" Yes; please. For each deficiency you find, please file a bug. We're working on identifying what's missing from Clang's integrated assembler support. Given the list of issues, it's easier to estimate how much effort is needed, which helps us allocate resources towards fixing those issues better. It would be good to know if pldw.w is valid under UAL or not. Hopefully, the ARM kernel team can stress the importance of assembler support for their ISA to their LLVM team.
On 06.03.2019 00:39, Robin Murphy wrote: > Hi Stefan, > > On 2019-03-05 10:18 pm, Stefan Agner wrote: >> The W macro for generating wide instructions when targeting Thumb-2 >> is not required for the preload data instructions (pld, pldw) since >> they are only available as wide instructions. The GNU assembler seems >> to work with or without the .w appended when compiling an Thumb-2 >> kernel. However, Clang's integrated assembler does not consider the >> .w variants as valid instructions: >> >> ./arch/arm/include/asm/processor.h:133:5: error: invalid instruction >> "pldw.w\t%a0 \n" >> ^ >> <inline asm>:2:1: note: instantiated into assembly here >> pldw.w [r0] >> ^ >> 1 error generated. > > Have you filed a bug against Clang for that? Something like "pldwal.w" > may be super-redundant, but it's still perfectly valid syntax. The > "Standard assembler syntax fields" section of the Arm ARM even calls > out that "...the .W qualifier has no effect" on ARM/A32 instructions > since they are inherently 32-bit; that should equally apply for 32-bit > only Thumb/T32 instructions. There are certainly a few instructions > which don't allow a condition code (even "AL"), but off-hand I don't > remember any not having the optional {<q>} field in their syntax. Good point, bug filed: https://bugs.llvm.org/show_bug.cgi?id=40972 Will send a v2 and note that this is a work around for Clang and reference the bug. -- Stefan > > That said, obviously the patch itself is no problem since the syntax > *is* redundant here, but it really is just a workaround for an > assembler bug. > > Robin. > >> Drop the macro to make sure non-wide variants of pld and pldw are >> emitted in all cases. >> >> Signed-off-by: Stefan Agner <stefan@agner.ch> >> --- >> arch/arm/include/asm/processor.h | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h >> index 120f4c9bbfde..042d77cf686d 100644 >> --- a/arch/arm/include/asm/processor.h >> +++ b/arch/arm/include/asm/processor.h >> @@ -131,8 +131,8 @@ static inline void prefetchw(const void *ptr) >> __asm__ __volatile__( >> ".arch_extension mp\n" >> __ALT_SMP_ASM( >> - WASM(pldw) "\t%a0", >> - WASM(pld) "\t%a0" >> + "pldw\t%a0", >> + "pld\t%a0" >> ) >> :: "p" (ptr)); >> } >>
On 06.03.2019 01:47, Nick Desaulniers wrote: > On Tue, Mar 5, 2019 at 3:39 PM Robin Murphy <robin.murphy@arm.com> wrote: >> >> Hi Stefan, >> >> On 2019-03-05 10:18 pm, Stefan Agner wrote: >> > The W macro for generating wide instructions when targeting Thumb-2 >> > is not required for the preload data instructions (pld, pldw) since >> > they are only available as wide instructions. The GNU assembler seems >> > to work with or without the .w appended when compiling an Thumb-2 >> > kernel. However, Clang's integrated assembler does not consider the >> > .w variants as valid instructions: >> > >> > ./arch/arm/include/asm/processor.h:133:5: error: invalid instruction >> > "pldw.w\t%a0 \n" >> > ^ >> > <inline asm>:2:1: note: instantiated into assembly here >> > pldw.w [r0] >> > ^ >> > 1 error generated. >> >> Have you filed a bug against Clang for that? Something like "pldwal.w" > > Yes; please. For each deficiency you find, please file a bug. We're > working on identifying what's missing from Clang's integrated > assembler support. Given the list of issues, it's easier to estimate > how much effort is needed, which helps us allocate resources towards > fixing those issues better. > > It would be good to know if pldw.w is valid under UAL or not. As far as I understand the Arm ARM it is valid under UAL. Reported a bug in LLVM's bug tracker: https://bugs.llvm.org/show_bug.cgi?id=40972 Will send a v2 patch mentioning this is really a work around for LLVM and link to the bug report. > > Hopefully, the ARM kernel team can stress the importance of assembler > support for their ISA to their LLVM team. -- Stefan
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index 120f4c9bbfde..042d77cf686d 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h @@ -131,8 +131,8 @@ static inline void prefetchw(const void *ptr) __asm__ __volatile__( ".arch_extension mp\n" __ALT_SMP_ASM( - WASM(pldw) "\t%a0", - WASM(pld) "\t%a0" + "pldw\t%a0", + "pld\t%a0" ) :: "p" (ptr)); }
The W macro for generating wide instructions when targeting Thumb-2 is not required for the preload data instructions (pld, pldw) since they are only available as wide instructions. The GNU assembler seems to work with or without the .w appended when compiling an Thumb-2 kernel. However, Clang's integrated assembler does not consider the .w variants as valid instructions: ./arch/arm/include/asm/processor.h:133:5: error: invalid instruction "pldw.w\t%a0 \n" ^ <inline asm>:2:1: note: instantiated into assembly here pldw.w [r0] ^ 1 error generated. Drop the macro to make sure non-wide variants of pld and pldw are emitted in all cases. Signed-off-by: Stefan Agner <stefan@agner.ch> --- arch/arm/include/asm/processor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)