ARC: Add support for ARC HS38 with Hardware Floating Point

Message ID 20170710133650.8692-1-abrodkin@synopsys.com
State New
Headers show

Commit Message

Alexey Brodkin July 10, 2017, 1:36 p.m.
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
---
 arch/Config.in.arc       | 10 +++++++---
 package/uclibc/Config.in |  1 +
 2 files changed, 8 insertions(+), 3 deletions(-)

Comments

Thomas Petazzoni July 10, 2017, 1:46 p.m. | #1
Hello,

On Mon, 10 Jul 2017 16:36:50 +0300, Alexey Brodkin wrote:
> Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
> ---
>  arch/Config.in.arc       | 10 +++++++---
>  package/uclibc/Config.in |  1 +
>  2 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/Config.in.arc b/arch/Config.in.arc
> index 7d341f3136..d0e2286557 100644
> --- a/arch/Config.in.arc
> +++ b/arch/Config.in.arc
> @@ -14,12 +14,15 @@ config BR2_arc770d
>  config BR2_archs38
>  	bool "ARC HS38"
>  
> +config BR2_archs38_hf
> +	bool "ARC HS38 with hard floating-point"

Does it need to be a separate CPU type, or an option when HS38 is
selected ?

>  config BR2_ARCH
>  	default "arc"	if BR2_arcle
> @@ -37,6 +40,7 @@ config BR2_GCC_TARGET_CPU
>  	default "arc700" if BR2_arc750d
>  	default "arc700" if BR2_arc770d
>  	default "archs"	 if BR2_archs38
> +	default "hs38_linux"	 if BR2_archs38_hf

gcc really understands -mcpu=hs38_linux ?

It seems odd to have the operating system name encoded in the CPU name.

Thomas
Alexey Brodkin July 10, 2017, 2:05 p.m. | #2
Hi Thomas,

On Mon, 2017-07-10 at 15:46 +0200, Thomas Petazzoni wrote:
> Hello,

> 

> On Mon, 10 Jul 2017 16:36:50 +0300, Alexey Brodkin wrote:

> > 

> > Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>

> > ---

> >  arch/Config.in.arc       | 10 +++++++---

> >  package/uclibc/Config.in |  1 +

> >  2 files changed, 8 insertions(+), 3 deletions(-)

> > 

> > diff --git a/arch/Config.in.arc b/arch/Config.in.arc

> > index 7d341f3136..d0e2286557 100644

> > --- a/arch/Config.in.arc

> > +++ b/arch/Config.in.arc

> > @@ -14,12 +14,15 @@ config BR2_arc770d

> >  config BR2_archs38

> >  	bool "ARC HS38"

> >  

> > +config BR2_archs38_hf

> > +	bool "ARC HS38 with hard floating-point"

> 

> Does it need to be a separate CPU type, or an option when HS38 is

> selected ?


Well this is a real "-mcpu" value understood by GCC for ARC
------------------------------>8-------------------------------
arc-linux-gcc --target-help
...
ARC-specific assembler options:
  -mcpu=<cpu name>	  (default: hs38), assemble for CPU <cpu name>, one of:
                          arc700, nps400, arcem, em, em4, em4_dmips, em4_fpus, 
                          em4_fpuda, quarkse_em, archs, hs, hs34, hs38, 
                          hs38_linux, arc600, arc600_norm, arc600_mul64, 
                          arc600_mul32x16, arc601, arc601_norm, arc601_mul64, 
                          arc601_mul32x16
------------------------------>8-------------------------------

And in itself this is pretty much an alias to a set of HW features
selected by default in the same ARC HS38 "template" in CPU configuration
utility. In fact it is "-mcpu=hs38 -mfpu=fpud_all". But when we configure GCC
with "-mcpu" option it then is used by default, i.e. even if we later build
a random application with a simple "arc-linux-gcc test.c" it implicitly gets
optimized for that same "-mcpu"... i.e. there's no need in adding stuff in
TARGET_ABI variable in Buildroot etc.

For example in OpenEmbedded we went via separate options instead of those
"templates" as the same toolchain is reused between different builds which
differs from Buildroot where we build everything for just one HW configuration.
So IMHO templates approach in Buildroot is more convenient.

>  config BR2_ARCH

> >  	default "arc"	if BR2_arcle

> > @@ -37,6 +40,7 @@ config BR2_GCC_TARGET_CPU

> >  	default "arc700" if BR2_arc750d

> >  	default "arc700" if BR2_arc770d

> >  	default "archs"	 if BR2_archs38

> > +	default "hs38_linux"	 if BR2_archs38_hf

> 

> gcc really understands -mcpu=hs38_linux ?

> 

> It seems odd to have the operating system name encoded in the CPU name.


The rationale behind that naming was to highlight a template which is
the best option for Linux use-case. I.e. if you want to build a system that
runs
Linux on top of ARC HS38 core please consider usage of that "template"
which has HW features that [may significantly] improve performance of the
system.

Still not sure if now you feel more comfortable with that stuff :))

-Alexey

Patch

diff --git a/arch/Config.in.arc b/arch/Config.in.arc
index 7d341f3136..d0e2286557 100644
--- a/arch/Config.in.arc
+++ b/arch/Config.in.arc
@@ -14,12 +14,15 @@  config BR2_arc770d
 config BR2_archs38
 	bool "ARC HS38"
 
+config BR2_archs38_hf
+	bool "ARC HS38 with hard floating-point"
+
 endchoice
 
 # Choice of atomic instructions presence
 config BR2_ARC_ATOMIC_EXT
 	bool "Atomic extension (LLOCK/SCOND instructions)"
-	default y if BR2_arc770d || BR2_archs38
+	default y if BR2_arc770d || BR2_archs38 || BR2_archs38_hf
 
 config BR2_ARCH
 	default "arc"	if BR2_arcle
@@ -37,6 +40,7 @@  config BR2_GCC_TARGET_CPU
 	default "arc700" if BR2_arc750d
 	default "arc700" if BR2_arc770d
 	default "archs"	 if BR2_archs38
+	default "hs38_linux"	 if BR2_archs38_hf
 
 choice
 	prompt "MMU Page Size"
@@ -56,7 +60,7 @@  choice
 
 config BR2_ARC_PAGE_SIZE_4K
 	bool "4KB"
-	depends on BR2_arc770d || BR2_archs38
+	depends on BR2_arc770d || BR2_archs38 || BR2_archs38_hf
 
 config BR2_ARC_PAGE_SIZE_8K
 	bool "8KB"
@@ -66,7 +70,7 @@  config BR2_ARC_PAGE_SIZE_8K
 
 config BR2_ARC_PAGE_SIZE_16K
 	bool "16KB"
-	depends on BR2_arc770d || BR2_archs38
+	depends on BR2_arc770d || BR2_archs38 || BR2_archs38_hf
 
 endchoice
 
diff --git a/package/uclibc/Config.in b/package/uclibc/Config.in
index fdf007e601..646ae3e0db 100644
--- a/package/uclibc/Config.in
+++ b/package/uclibc/Config.in
@@ -134,6 +134,7 @@  config BR2_UCLIBC_ARC_TYPE
 	default "ARC_CPU_700"	if BR2_arc750d
 	default "ARC_CPU_700"	if BR2_arc770d
 	default "ARC_CPU_HS"	if BR2_archs38
+	default "ARC_CPU_HS"	if BR2_archs38_hf
 
 config BR2_UCLIBC_MIPS_ABI
 	string