diff options
author | QBos07 <qubos@outlook.de> | 2025-04-13 17:59:41 +0000 |
---|---|---|
committer | Chris Packham <judge.packham@gmail.com> | 2025-05-07 16:33:28 +1200 |
commit | cabc7a3578284c92457e1ad8d09fed3a7b70535b (patch) | |
tree | 5c395d2e1408d5d000f356c0a8acd050980ce75a | |
parent | 027213fb5d2c782621cacd1909eeb42dd5462f69 (diff) | |
download | crosstool-ng-cabc7a3578284c92457e1ad8d09fed3a7b70535b.tar.gz crosstool-ng-cabc7a3578284c92457e1ad8d09fed3a7b70535b.tar.bz2 crosstool-ng-cabc7a3578284c92457e1ad8d09fed3a7b70535b.zip |
Add the FPU options for SuperH
A lot of the old code didn't even work
Signed-off-by: QBos07 <qubos@outlook.de>
-rw-r--r-- | config/arch/sh.in | 41 | ||||
-rw-r--r-- | config/target.in | 126 | ||||
-rw-r--r-- | scripts/build/arch/sh.sh | 38 | ||||
-rwxr-xr-x | scripts/config.sub | 6 |
4 files changed, 180 insertions, 31 deletions
diff --git a/config/arch/sh.in b/config/arch/sh.in index ff2ec142..8ebdd744 100644 --- a/config/arch/sh.in +++ b/config/arch/sh.in @@ -3,8 +3,6 @@ ## no-package ## select ARCH_SUPPORTS_32 ## select ARCH_DEFAULT_32 -## select ARCH_SUPPORTS_BOTH_MMU -## select ARCH_DEFAULT_HAS_MMU ## select ARCH_SUPPORTS_FLAT_FORMAT ## select ARCH_SUPPORTS_EITHER_ENDIAN ## select ARCH_DEFAULT_LE @@ -21,6 +19,8 @@ choice # GCC supports both endiannesses even if a specific CPU is selected (so long # as that CPU can be both BE/LE), but the binutils (or specifically, ld) # configures for both endiannesses only if sh-*-linux target is selected. +# --with-cpu can be used to set the mmu and precision options, +# so dont include the options aswell config ARCH_SH_SH bool prompt "unspecified" @@ -62,16 +62,45 @@ config ARCH_SH_SH4A bool prompt "sh4a" +config ARCH_SH_SH4AL + bool + prompt "sh4al" + endchoice config ARCH_SH_VARIANT string - default "sh" if ARCH_SH_SH + default "sh" if ARCH_SH_SH default "sh1" if ARCH_SH_SH1 default "sh2" if ARCH_SH_SH2 - default "sh2e" if ARCH_SH_SH2E - default "sh2a" if ARCH_SH_SH2A + default "sh2e" if ARCH_SH_SH2E + default "sh2a" if ARCH_SH_SH2A default "sh3" if ARCH_SH_SH3 - default "sh3e" if ARCH_SH_SH3E + default "sh3e" if ARCH_SH_SH3E default "sh4" if ARCH_SH_SH4 default "sh4a" if ARCH_SH_SH4A + default "sh4al" if ARCH_SH_SH4AL + +config ARCH_SH_ENABLE_FPU_OPTIONS + bool + default y if ARCH_SH_SH2A + default y if ARCH_SH_SH4 + default y if ARCH_SH_SH4A + select ARCH_SUPPORTS_BOTH_MMU + select ARCH_DEFAULT_HAS_MMU + +config ARCH_SH_ENABLE_PRECISION_OPTIONS + bool + default y if ARCH_USE_MMU + select ARCH_SUPPORTS_WITH_FLOATING_PRECISION + select ARCH_SUPPORTS_PRECISION_UNSPECIFIED + select ARCH_SUPPORTS_PRECISION_SINGLE_ONLY + select ARCH_SUPPORTS_PRECISION_SINGLE_WITH_DOUBLE + select ARCH_DEFAULT_PRECISION_UNSPECIFIED + +config ARCH_SH_FLOAT_SUFFIX + string + default "" if !ARCH_SH_ENABLE_FPU_OPTIONS + default "_nofpu" if !ARCH_USE_MMU + default "_single" if ARCH_FLOATING_PRECISION_SINGLE_WITH_DOUBLE + default "_single_only" if ARCH_FLOATING_PRECISION_SINGLE_ONLY diff --git a/config/target.in b/config/target.in index 21302622..ed415394 100644 --- a/config/target.in +++ b/config/target.in @@ -434,6 +434,132 @@ config ARCH_FLOAT_SW endchoice +#-------------------------------------- + +config ARCH_SUPPORTS_WITH_FLOATING_PRECISION + bool + +config ARCH_SUPPORTS_PRECISION_AUTO + bool + +config ARCH_SUPPORTS_PRECISION_SINGLE_ONLY + bool + +config ARCH_SUPPORTS_PRECISION_DOUBLE_ONLY + bool + +config ARCH_SUPPORTS_PRECISION_BOTH + bool + +config ARCH_SUPPORTS_PRECISION_SINGLE_WITH_DOUBLE + bool + +config ARCH_SUPPORTS_PRECISION_DOUBLE_WITH_SINGLE + bool + +config ARCH_SUPPORTS_PRECISION_UNSPECIFIED + bool + +config ARCH_DEFAULT_PRECISION_AUTO + bool + +config ARCH_DEFAULT_PRECISION_SINGLE_ONLY + bool + +config ARCH_DEFAULT_PRECISION_DOUBLE_ONLY + bool + +config ARCH_DEFAULT_PRECISION_BOTH + bool + +config ARCH_DEFAULT_PRECISION_SINGLE_WITH_DOUBLE + bool + +config ARCH_DEFAULT_PRECISION_DOUBLE_WITH_SINGLE + bool + +config ARCH_DEFAULT_PRECISION_UNSPECIFIED + bool + +choice + bool + prompt "Floating point precision:" + depends on ARCH_SUPPORTS_WITH_FLOATING_PRECISION + default ARCH_FLOATING_PRECISION_AUTO if ARCH_DEFAULT_PRECISION_AUTO + default ARCH_FLOATING_PRECISION_SINGLE_ONLY if ARCH_DEFAULT_PRECISION_SINGLE_ONLY + default ARCH_FLOATING_PRECISION_DOUBLE_ONLY if ARCH_DEFAULT_PRECISION_DOUBLE_ONLY + default ARCH_FLOATING_PRECISION_BOTH if ARCH_DEFAULT_PRECISION_BOTH + default ARCH_FLOATING_PRECISION_SINGLE_WITH_DOUBLE if ARCH_DEFAULT_PRECISION_SINGLE_WITH_DOUBLE + default ARCH_FLOATING_PRECISION_DOUBLE_WITH_SINGLE if ARCH_DEFAULT_PRECISION_DOUBLE_WITH_SINGLE + default ARCH_FLOATING_PRECISION_UNSPECIFIED if ARCH_DEFAULT_PRECISION_UNSPECIFIED + +config ARCH_FLOATING_PRECISION_AUTO + bool + prompt "auto (let gcc decide)" + depends on ARCH_SUPPORTS_PRECISION_AUTO + help + Instead of explicitly passing a float precision option, don't + pass any float precision options and let gcc figure it out. + +config ARCH_FLOATING_PRECISION_SINGLE_ONLY + bool + prompt "single (32-bit)" + depends on ARCH_SUPPORTS_PRECISION_SINGLE_ONLY + help + Use single precision floating point operations. + +config ARCH_FLOATING_PRECISION_DOUBLE_ONLY + bool + prompt "double (64-bit)" + depends on ARCH_SUPPORTS_PRECISION_DOUBLE_ONLY + help + Use double precision floating point operations. + +config ARCH_FLOATING_PRECISION_BOTH + bool + prompt "single and double (32-bit and 64-bit)" + depends on ARCH_SUPPORTS_PRECISION_BOTH + help + Use both single and double precision floating point operations. + +config ARCH_FLOATING_PRECISION_SINGLE_WITH_DOUBLE + bool + prompt "single with double (32-bit with 64-bit)" + depends on ARCH_SUPPORTS_PRECISION_SINGLE_WITH_DOUBLE + help + Use single precision floating point operations, but allow double + precision floating point operations when needed. + +config ARCH_FLOATING_PRECISION_DOUBLE_WITH_SINGLE + bool + prompt "double with single (64-bit with 32-bit)" + depends on ARCH_SUPPORTS_PRECISION_DOUBLE_WITH_SINGLE + help + Use double precision floating point operations, but allow single + precision floating point operations when needed. + +config ARCH_FLOATING_PRECISION_UNSPECIFIED + bool + prompt "default (leave unspecified)" + depends on ARCH_SUPPORTS_PRECISION_UNSPECIFIED + help + Use the default floating point precision for the architecture. + +endchoice + +config ARCH_FLOATING_PRECISION + string + depends on ARCH_SUPPORTS_WITH_FLOATING_PRECISION + default "auto" if ARCH_FLOATING_PRECISION_AUTO + default "single" if ARCH_FLOATING_PRECISION_SINGLE_ONLY + default "double" if ARCH_FLOATING_PRECISION_DOUBLE_ONLY + default "both" if ARCH_FLOATING_PRECISION_BOTH + default "single,double" if ARCH_FLOATING_PRECISION_SINGLE_WITH_DOUBLE + default "double,single" if ARCH_FLOATING_PRECISION_DOUBLE_WITH_SINGLE + default "" if ARCH_FLOATING_PRECISION_UNSPECIFIED + +#-------------------------------------- + config TARGET_CFLAGS string prompt "Target CFLAGS" diff --git a/scripts/build/arch/sh.sh b/scripts/build/arch/sh.sh index 8339b940..6fe2e9e5 100644 --- a/scripts/build/arch/sh.sh +++ b/scripts/build/arch/sh.sh @@ -5,7 +5,7 @@ CT_DoArchTupleValues () { # like 'sheb-unknown-elf' even though GCC does. So keep the tuple just sh-*-elf # unless user wants something specific (either CPU or explicit suffix). if [ "${CT_ARCH_SH_VARIANT}" != "sh" -o -n "${CT_ARCH_SUFFIX}" ]; then - CT_TARGET_ARCH="${CT_ARCH_SH_VARIANT}${CT_ARCH_SUFFIX:-${target_endian_eb}}" + CT_TARGET_ARCH="${CT_ARCH_SH_VARIANT}${CT_ARCH_SUFFIX:-${CT_ARCH_SH_FLOAT_SUFFIX}${target_endian_eb}}" fi # Endianness stuff (uses non-standard CFLAGS). If both are compiled, let the @@ -17,20 +17,9 @@ CT_DoArchTupleValues () { # Instead of -m{soft,hard}-float, uses CPU type CT_ARCH_FLOAT_CFLAG= - case "${CT_ARCH_SH_VARIANT}" in - sh3) CT_ARCH_ARCH_CFLAG=-m3;; - sh4*|sh2*) - # softfp is not possible for SuperH, no need to test for it. - case "${CT_ARCH_FLOAT}" in - hard) - CT_ARCH_ARCH_CFLAG="-m${CT_ARCH_SH_VARIANT##sh}" - ;; - soft) - CT_ARCH_ARCH_CFLAG="-m${CT_ARCH_SH_VARIANT##sh}-nofpu" - ;; - esac - ;; - esac + if [ "${CT_ARCH_SH_VARIANT}" != "sh" ]; then + CT_ARCH_ARCH_CFLAG=-m${CT_ARCH_SH_VARIANT#sh}-${CT_ARCH_SH_FLOAT_SUFFIX#_} + fi } CT_DoArchMultilibList() { @@ -47,11 +36,11 @@ CT_DoArchMultilibList() { # the default CPU configured with --with-cpu (CT_ARCH_CPU). IFS=, for x in ${CT_CC_GCC_MULTILIB_LIST}; do - if [ "${x}" = "${CT_ARCH_SH_VARIANT}" -o "sh${x#m}" = "${CT_ARCH_SH_VARIANT}" ]; then + if [ "${x}" = "${CT_ARCH_ARCH_CFLAG#-}" -o "sh${x#m}" = "${CT_ARCH_ARCH_CFLAG#-}" ]; then CT_DoLog WARN "Ignoring '${x}' in multilib list: it is the default multilib" continue fi - if [ "${x}" = "${CT_ARCH_CPU}" -o "sh${x#m}" = "${CT_ARCH_CPU}" ]; then + if [ "${x}" = "${CT_ARCH_CPU}" -o "sh${x#m}" = "${CT_ARCH_CPU}" -o "m${x#sh}" = "${CT_ARCH_CPU}" ]; then CT_DoLog WARN "Ignoring '${x}' in multilib list: it is the default multilib" continue fi @@ -74,10 +63,7 @@ CT_DoArchMultilibTarget () for m in "${multi_flags[@]}"; do case "${m}" in - -m4*) newcpu=sh4;; - -m3*) newcpu=sh3;; - -m2*) newcpu=sh2;; - -m1*) newcpu=sh1;; + -m[12345]*) newcpu=sh${m#-m}; newcpu=${newcpu/_/-}; newcpu=${newcpu/_/-};; esac done @@ -96,6 +82,7 @@ CT_DoArchMultilibTarget () CT_DoArchGlibcAdjustTuple() { local target_var="${1}" local target_ + local newtarget eval target_=\"\${${target_var}}\" @@ -106,7 +93,10 @@ CT_DoArchGlibcAdjustTuple() { # specified, so the only source of default is CT_ARCH_CPU. # GCC defaults to sh1, but this Glibc cannot compile for it. if [ -n "${CT_ARCH_CPU}" ]; then - target_=${target_/#sh-/${CT_ARCH_CPU}-} + newtarget=${CT_ARCH_CPU/#m/sh} + newtarget=${newtarget/-/_} + newtarget=${newtarget/-/_} + target_="${newtarget}-${target_#*-}" CT_DoLog DEBUG "Adjusted target tuple ${target_}" else CT_Abort "GNU C library cannot build for sh1 (GCC default). " \ @@ -142,10 +132,10 @@ CT_DoArchGlibcAdjustConfigure() { # and it would've been handled above. Our last resort: CT_ARCH_CPU if [ "${#add_args[@]}" = 0 ]; then case "${CT_ARCH_CPU}" in - sh[34]*-nofpu) + sh[24]a-nofpu | m[24]a-nofpu | sh4-nofpu | m4-nofpu) add_args+=( "--without-fp" ) ;; - sh[34]*) + *) add_args+=( "--with-fp" ) ;; esac diff --git a/scripts/config.sub b/scripts/config.sub index 3a5a6bb8..128e065c 100755 --- a/scripts/config.sub +++ b/scripts/config.sub @@ -1240,9 +1240,13 @@ case $cpu-$vendor in | rl78 | romp | rs6000 | rx \ | s390 | s390x \ | score \ - | sh | shl \ + | sh | shl | sh4al \ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sh[42]a_nofpu | sh4_nofpu | sh[42]a_single | sh4_single \ + | sh[42]a_single_only | sh4_single_only \ + | sh[42]a_nofpue[lb] | sh4_nofpue[lb] | sh[42]a_singlee[lb] | sh4_singlee[lb] \ + | sh[42]a_single_onlye[lb] | sh4_single_onlye[lb] \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ |