[1/2] ARM: drop unnecessary WASM
diff mbox series

Message ID 13835555f8ef44b21d1b7ddfe1c4203d0981f77e.1551824161.git.stefan@agner.ch
State New
Headers show
Series
  • [1/2] ARM: drop unnecessary WASM
Related show

Commit Message

Stefan Agner March 5, 2019, 10:18 p.m. UTC
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(-)

Comments

Robin Murphy March 5, 2019, 11:39 p.m. UTC | #1
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));
>   }
>
Nick Desaulniers March 6, 2019, 12:47 a.m. UTC | #2
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.
Stefan Agner March 6, 2019, 7:58 a.m. UTC | #3
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));
>>   }
>>
Stefan Agner March 17, 2019, 3:44 p.m. UTC | #4
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

Patch
diff mbox series

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));
 }