[PATCH] scripts: add softfp support

Michael Hope michael.hope@linaro.org
Fri Oct 21 02:17:00 GMT 2011


On 20/10/11 10:02, Yann E. MORIN wrote:
> Michael, All,
>
> On Wednesday 19 October 2011 04:29:20 Michael Hope wrote:
>> # HG changeset patch
>> # User Michael Hope<michael.hope@linaro.org>
>> # Date 1318991252 -46800
>> # Node ID a31d097e28cd73d07a5484129929a500b4d58efa
>> # Parent  a32156bd31c0d395e8d346431b123a7d2caa14cd
>> scripts: add softfp support
>>
>> ARM compilers can be built for soft float (software only, floats in
>> core registers), hard float (uses floating point instructions, floats
>> in FPU registers), or the half-way house softfp (uses floating point
>> instructions, floats in core registers).
>
> Feature definitely a nice addition, but too close to the release to
> add it now (which reminds me I should document the release plan on
> the website...). FYI, it's a release every three months, with about
> a 15-day slack before, used to stabilise the stuff. Next release is
> due by October the 31st, so we just entered the 15-day delay...
>
> I was thinking about cutting the release branch ahead of time, but
> handling both the relase and the devel at the same time is a bit
> complicated in my head, and does colide a bit on the schedule...
> I'd like to try, but this release is special: it also colides with
> the Prague events. Probably I'll do it for the next release (Feb`12)...
>
>> Add support for softfp cross compilers to the GCC and GLIBC
>> configuration.  Needed for Ubuntu and other distros that are softfp.
>
> What about uClibc? How will it cope with softfp?
>
>> Signed-off-by: Michael Hope<michael.hope@linaro.org>
>>
>> diff -r a32156bd31c0 -r a31d097e28cd config/target.in
>> --- a/config/target.in	Sun Oct 16 17:51:42 2011 +0200
>> +++ b/config/target.in	Wed Oct 19 15:27:32 2011 +1300
>> @@ -271,6 +271,22 @@
>>         If your processor has no FPU, then you most probably want this, as it
>>         is faster than emulating the FPU in the kernel.
>>
>> +config ARCH_FLOAT_SOFTFP
>
> I'm a bit reluctant at adding an architecture-specific option to this
> generic file. Currently, all arch options are in the related arch file.
>
> However, I agreee that there is no easy way to nicely handle that with
> the current infrastructure... :-/
>
> *But* I recall a similar approach a few months back... It seemed that ARM
> is not the only architecture that support softfp. Seems PPC also uses it.
> So:
>
>> +    bool
>> +    prompt "softfp"
>> +    depends on ARCH_arm
>
>   - this arch-specific "depends on" should go away
>   - and either we keep the option un-protected, or we hide it behind
>     ARCH_SUPPORT_SOFTFP (or the like) which is set by archs that
>     support it.
>
>> +    help
>> +      Emit hardware floating point opcodes but use the software
>> +      floating point calling convention.
>> +
>> +      Architectures such as ARM use different registers for passing
>> +      floating point values depending on if they're in software mode
>> +      or hardware mode.  softfp emits FPU instructions but uses the
>> +      software FP calling convention allowing softfp code to
>> +      interoperate with legacy software only code.
>> +
>> +      If in doubt, use 'software' or 'hardware' mode instead.
>> +
>>   endchoice
>>
>>   config TARGET_CFLAGS
>> diff -r a32156bd31c0 -r a31d097e28cd scripts/build/libc/glibc-eglibc.sh-common
>> --- a/scripts/build/libc/glibc-eglibc.sh-common	Sun Oct 16 17:51:42 2011 +0200
>> +++ b/scripts/build/libc/glibc-eglibc.sh-common	Wed Oct 19 15:27:32 2011 +1300
>> @@ -132,9 +132,10 @@
>>           *) extra_config+=("--disable-shared");;
>>       esac
>>
>> -    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
>> -        y,) extra_config+=("--with-fp");;
>> -        ,y) extra_config+=("--without-fp");;
>> +    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW},${CT_ARCH_FLOAT_SOFTFP}" in
>> +        y,,) extra_config+=("--with-fp");;
>> +        ,y,) extra_config+=("--without-fp");;
>> +        ,,y) extra_config+=("--with-fp");;
>>       esac
>
> Argh!... This is starting to be unreadable... :-/
>
> config ARCH_FLOAT
>      string
>      default "hard"   if ARCH_FLOAT_HW
>      default "soft"   if ARCH_FLOAT_SW
>      default "softfp" if ARCH_FLOAT_SOFTFP
>
> Then:
>      case "${CT_ARCH_FLOAT}" in
>          hard)   ...;;
>          soft)   ...;;
>          softfp) ...;;
>      esac
>
> I'll do it.
>
>>       if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
>> diff -r a32156bd31c0 -r a31d097e28cd scripts/functions
>> --- a/scripts/functions	Sun Oct 16 17:51:42 2011 +0200
>> +++ b/scripts/functions	Wed Oct 19 15:27:32 2011 +1300
>> @@ -984,6 +984,7 @@
>>       [ "${CT_ARCH_TUNE}"     ]&&  { CT_ARCH_TUNE_CFLAG="-mtune=${CT_ARCH_TUNE}";  CT_ARCH_WITH_TUNE="--with-tune=${CT_ARCH_TUNE}"; }
>>       [ "${CT_ARCH_FPU}"      ]&&  { CT_ARCH_FPU_CFLAG="-mfpu=${CT_ARCH_FPU}";     CT_ARCH_WITH_FPU="--with-fpu=${CT_ARCH_FPU}";    }
>>       [ "${CT_ARCH_FLOAT_SW}" ]&&  { CT_ARCH_FLOAT_CFLAG="-msoft-float";           CT_ARCH_WITH_FLOAT="--with-float=soft";          }
>> +    [ "${CT_ARCH_FLOAT_SOFTFP}" ]&&  { CT_ARCH_FLOAT_CFLAG="-mfloat-abi=softfp"; CT_ARCH_WITH_FLOAT="--with-float=softfp";        }
>
> And the last time this came up, it was pointed that CT_ARCH_FLOAT_HW did
> force neither -hard-float not --with-float=hard
>
> I'll look at it...
>
>>       # Build the default kernel tuple part
>>       CT_TARGET_KERNEL="${CT_KERNEL}"
>
> Can we sit on this for now, and revisit after the release?

I'll keep it locally.  I'll stop sending new features until after the release.

Here's an updated version.  Still no uClibc support though...


diff --git a/config/arch/arm.in b/config/arch/arm.in
index 4b96335..12016fd 100644
--- a/config/arch/arm.in
+++ b/config/arch/arm.in
@@ -10,6 +10,7 @@
  ## select ARCH_SUPPORT_CPU
  ## select ARCH_SUPPORT_TUNE
  ## select ARCH_SUPPORT_FPU
+## select ARCH_SUPPORT_SOFTFP
  ##
  ## help The ARM architecture, as defined by:
  ## help     http://www.arm.com/
diff --git a/config/target.in b/config/target.in
index 8282a9d..6514e3e 100644
--- a/config/target.in
+++ b/config/target.in
@@ -15,6 +15,7 @@
  config ARCH_SUPPORT_CPU
  config ARCH_SUPPORT_TUNE
  config ARCH_SUPPORT_FPU
+config ARCH_SUPPORT_SOFTFP

  config ARCH_DEFAULT_HAS_MMU
  config ARCH_DEFAULT_BE
@@ -144,6 +145,9 @@
  config ARCH_SUPPORT_FPU
      bool

+config ARCH_SUPPORT_SOFTFP
+    bool
+
  config ARCH_ARCH
      string
      prompt "Architecture level"
@@ -271,6 +275,22 @@
        If your processor has no FPU, then you most probably want this, as it
        is faster than emulating the FPU in the kernel.

+config ARCH_FLOAT_SOFTFP
+    bool
+    prompt "softfp"
+    depends on ARCH_SUPPORT_SOFTFP
+    help
+      Emit hardware floating point opcodes but use the software
+      floating point calling convention.
+
+      Architectures such as ARM use different registers for passing
+      floating point values depending on if they're in software mode
+      or hardware mode.  softfp emits FPU instructions but uses the
+      software FP calling convention allowing softfp code to
+      interoperate with legacy software only code.
+
+      If in doubt, use 'software' or 'hardware' mode instead.
+
  endchoice

  config TARGET_CFLAGS
@@ -296,6 +316,12 @@

        Leave blank if you don't know better.

+config ARCH_FLOAT
+    string
+    default "hard"   if ARCH_FLOAT_HW
+    default "soft"   if ARCH_FLOAT_SW
+    default "softfp" if ARCH_FLOAT_SOFTFP
+
  source "config.gen/arch.in.2"

  endmenu
diff --git a/scripts/functions b/scripts/functions
index a8696fe..2f81073 100644
--- a/scripts/functions
+++ b/scripts/functions
@@ -983,7 +983,12 @@
      [ "${CT_ARCH_CPU}"      ] && { CT_ARCH_CPU_CFLAG="-mcpu=${CT_ARCH_CPU}";     CT_ARCH_WITH_CPU="--with-cpu=${CT_ARCH_CPU}";    }
      [ "${CT_ARCH_TUNE}"     ] && { CT_ARCH_TUNE_CFLAG="-mtune=${CT_ARCH_TUNE}";  CT_ARCH_WITH_TUNE="--with-tune=${CT_ARCH_TUNE}"; }
      [ "${CT_ARCH_FPU}"      ] && { CT_ARCH_FPU_CFLAG="-mfpu=${CT_ARCH_FPU}";     CT_ARCH_WITH_FPU="--with-fpu=${CT_ARCH_FPU}";    }
-    [ "${CT_ARCH_FLOAT_SW}" ] && { CT_ARCH_FLOAT_CFLAG="-msoft-float";           CT_ARCH_WITH_FLOAT="--with-float=soft";          }
+
+    case "${CT_ARCH_FLOAT}" in
+        hard)   CT_ARCH_FLOAT_CFLAG="-mhard-float";       CT_ARCH_WITH_FLOAT="--with-float=hard";;
+        soft)   CT_ARCH_FLOAT_CFLAG="-msoft-float";       CT_ARCH_WITH_FLOAT="--with-float=soft";;
+        softfp) CT_ARCH_FLOAT_CFLAG="-mfloat-abi=softfp"; CT_ARCH_WITH_FLOAT="--with-float=softfp";;
+    esac

      # Build the default kernel tuple part
      CT_TARGET_KERNEL="${CT_KERNEL}"
diff --git a/scripts/build/libc/glibc-eglibc.sh-common b/scripts/build/libc/glibc-eglibc.sh-common
index 66b26f6..ea0e9b3 100644
--- a/scripts/build/libc/glibc-eglibc.sh-common
+++ b/scripts/build/libc/glibc-eglibc.sh-common
@@ -132,9 +132,10 @@
          *) extra_config+=("--disable-shared");;
      esac

-    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
-        y,) extra_config+=("--with-fp");;
-        ,y) extra_config+=("--without-fp");;
+    case "${CT_ARCH_FLOAT}" in
+        hard)   extra_config+=("--with-fp");;
+        soft)   extra_config+=("--without-fp");;
+        softfp) extra_config+=("--with-fp");;
      esac

      if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then



--
For unsubscribe information see http://sourceware.org/lists.html#faq



More information about the crossgcc mailing list