aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQBos07 <qubos@outlook.de>2025-04-13 17:59:41 +0000
committerChris Packham <judge.packham@gmail.com>2025-05-07 16:33:28 +1200
commitcabc7a3578284c92457e1ad8d09fed3a7b70535b (patch)
tree5c395d2e1408d5d000f356c0a8acd050980ce75a
parent027213fb5d2c782621cacd1909eeb42dd5462f69 (diff)
downloadcrosstool-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.in41
-rw-r--r--config/target.in126
-rw-r--r--scripts/build/arch/sh.sh38
-rwxr-xr-xscripts/config.sub6
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* \