Experimental: Add support for the Texas Instruments C6X (TMS320C6000 series) DSPs

-- c6x: Add support for c6x product families to pass on to uClibC-ng
  -- c6x: Fix multilib support
  -- c6x: Add patch fix internal instruction error (GCC 57295)

Signed-off-by: Dan Tejada <dan.tejada@cantada.com>
This commit is contained in:
Dan Tejada 2020-04-22 23:25:04 -04:00
parent 75d7525aa1
commit d532f02542
4 changed files with 167 additions and 1 deletions

37
config/arch/c6x.in Normal file
View File

@ -0,0 +1,37 @@
# c6x specific configuration file
## no-package
## select ARCH_SUPPORTS_32
## select ARCH_DEFAULT_32
## select ARCH_SUPPORTS_EITHER_ENDIAN
## select ARCH_DEFAULT_LE
## select ARCH_SUPPORTS_FLAT_FORMAT
## select ARCH_SUPPORTS_WITH_CPU
## select TARGET_SKIP_CONFIG_SUB
## select ARCH_REQUIRES_MULTILIB
## depends on EXPERIMENTAL
##
## help The TI C6x (TMS320C6000) architecture
## help https://www.ti.com/processors/digital-signal-processors
#choice
# prompt "Target Processor Type"
# default GENERIC_C6X
#
#config GENERIC_C6X
# bool
# prompt "Generic C6X DSP"
#
#config TMS320C64X
# bool
# prompt "TMS320C64X"
#
#config TMS320C64XPLUS
# bool
# prompt "TMS320C64X+"
#
#config TMS320C674X
# bool
# prompt "TMS320C674X or TMS320C66XX"
#
#endchoice

View File

@ -0,0 +1,48 @@
Internal compiler error and multilib fixes
Reported upstream:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57295
Fix c6x mulitibs build for uclinux
Reported by: Dan Tejada <dan.tejada@cantada.com>
--- a/gcc/config/c6x/c6x.md
+++ b/gcc/config/c6x/c6x.md
@@ -775,7 +775,7 @@
UNSPEC_MISALIGNED_ACCESS))]
"TARGET_INSNS_64"
{
- if (memory_operand (operands[0], <MODE>mode))
+ if (memory_operand (operands[0], <MODE>mode) || volatile_mem_operand (operands[0], <MODE>mode))
{
emit_insn (gen_movmisalign<mode>_store (operands[0], operands[1]));
DONE;
--- a/gcc/config/c6x/predicates.md
+++ b/gcc/config/c6x/predicates.md
@@ -224,3 +224,16 @@
gcc_unreachable ();
}
})
+
+;; Return 1 if the operand is in volatile memory. Note that during the
+;; RTL generation phase, memory_operand does not return TRUE for volatile
+;; memory references. So this function allows us to recognize volatile
+;; references where it's safe.
+(define_predicate "volatile_mem_operand"
+ (and (and (match_code "mem")
+ (match_test "MEM_VOLATILE_P (op)"))
+ (if_then_else (match_test "reload_completed")
+ (match_operand 0 "memory_operand")
+ (if_then_else (match_test "reload_in_progress")
+ (match_test "strict_memory_address_p (mode, XEXP (op, 0))")
+ (match_test "memory_address_p (mode, XEXP (op, 0))")))))
--- a/gcc/config/c6x/t-c6x-uclinux
+++ b/gcc/config/c6x/t-c6x-uclinux
@@ -1,3 +1,5 @@
+MULTILIB_OPTIONS = march=c674x mbig-endian
+
MULTILIB_OSDIRNAMES = march.c674x=!c674x
MULTILIB_OSDIRNAMES += mbig-endian=!be
-MULTILIB_OSDIRNAMES += mbig-endian/march.c674x=!be/c674x
+MULTILIB_OSDIRNAMES += march.c674x/mbig-endian=!be/c674x

81
scripts/build/arch/c6x.sh Normal file
View File

@ -0,0 +1,81 @@
# Compute c6x-specific values
CT_DoArchUClibcConfig() {
local cfg="${1}"
CT_DoArchUClibcSelectArch "${cfg}" "c6x"
}
CT_DoArchTupleValues() {
CT_TARGET_ARCH="tic6x"
#binutils does not like uclibc in the tuple
if [ "${CT_TARGET_SYS}" = "uclibc" ]; then
CT_TARGET_SYS=
fi
}
CT_DoArchUClibcHeaderDir() {
local dir_var="${1}"
local cflags="${2}"
# If it is non-default multilib, add a suffix with architecture (reported by gcc)
# to the headers installation path.
if [ -n "${cflags}" ]; then
eval "${dir_var}="$( ${CT_TARGET}-${CT_CC} -print-multiarch ${cflags} )
fi
}
CT_DoArchUClibcCflags() {
local cfg="${1}"
local cflags="${2}"
local f
# Set default little endian options
CT_KconfigDisableOption "ARCH_BIG_ENDIAN" "${cfg}"
CT_KconfigDisableOption "ARCH_WANTS_BIG_ENDIAN" "${cfg}"
CT_KconfigEnableOption "ARCH_LITTLE_ENDIAN" "${cfg}"
CT_KconfigEnableOption "ARCH_WANTS_LITTLE_ENDIAN" "${cfg}"
# Set arch options based on march switch
CT_KconfigDisableOption "CONFIG_TMS320C674X" "${cfg}"
CT_KconfigDisableOption "CONFIG_TMS320C64XPLUS" "${cfg}"
CT_KconfigDisableOption "CONFIG_TMS320C64X" "${cfg}"
CT_KconfigDisableOption "UCLIBC_HAS_FPU" "${cfg}"
CT_KconfigEnableOption "CONFIG_GENERIC_C6X" "${cfg}"
for f in ${cflags}; do
case "${f}" in
-march=*)
case "${f#-march=}" in
c674x)
CT_KconfigEnableOption "CONFIG_TMS320C674X" "${cfg}"
CT_KconfigEnableOption "UCLIBC_HAS_FPU" "${cfg}"
CT_KconfigDisableOption "CONFIG_GENERIC_C6X" "${cfg}"
;;
c64x+)
CT_KconfigEnableOption "CONFIG_TMS320C64XPLUS" "${cfg}"
CT_KconfigDisableOption "CONFIG_GENERIC_C6X" "${cfg}"
;;
c64x)
CT_KconfigEnableOption "CONFIG_TMS320C64X" "${cfg}"
CT_KconfigDisableOption "CONFIG_GENERIC_C6X" "${cfg}"
;;
c67x)
CT_KconfigEnableOption "UCLIBC_HAS_FPU" "${cfg}"
;;
c62x)
;;
*) CT_Abort "Unsupported architecture: ${f#-march=}";;
esac
;;
-mlittle-endian)
;;
-mbig-endian)
CT_KconfigEnableOption "ARCH_BIG_ENDIAN" "${cfg}"
CT_KconfigEnableOption "ARCH_WANTS_BIG_ENDIAN" "${cfg}"
CT_KconfigDisableOption "ARCH_LITTLE_ENDIAN" "${cfg}"
CT_KconfigDisableOption "ARCH_WANTS_LITTLE_ENDIAN" "${cfg}"
;;
esac
done
}

View File

@ -10,7 +10,7 @@ CT_DoKernelTupleValues()
# should be added here when someone starts to care about them.
case "${CT_ARCH}" in
arm*) CT_TARGET_KERNEL="linux" ;;
m68k|xtensa*) CT_TARGET_KERNEL="uclinux" ;;
c6x|m68k|xtensa*) CT_TARGET_KERNEL="uclinux" ;;
*) CT_Abort "Unsupported no-mmu arch '${CT_ARCH}'"
esac
fi