diff --git a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake index 25e7823716fc2f47b8d415d8f22c4d98a8479606..df7d76cbdff422be2e75365a040cb1a3217c4af4 100644 --- a/compiler-rt/cmake/Modules/CompilerRTUtils.cmake +++ b/compiler-rt/cmake/Modules/CompilerRTUtils.cmake @@ -161,6 +161,7 @@ macro(detect_target_arch) check_symbol_exists(__s390x__ "" __S390X) check_symbol_exists(__sparc "" __SPARC) check_symbol_exists(__sparcv9 "" __SPARCV9) + check_symbol_exists(__sw_64__ "" __SW64) check_symbol_exists(__wasm32__ "" __WEBASSEMBLY32) check_symbol_exists(__wasm64__ "" __WEBASSEMBLY64) check_symbol_exists(__ve__ "" __VE) @@ -212,6 +213,8 @@ macro(detect_target_arch) add_default_target_arch(sparcv9) elseif(__SPARC) add_default_target_arch(sparc) + elseif(__SW64) + add_default_target_arch(sw_64) elseif(__WEBASSEMBLY32) add_default_target_arch(wasm32) elseif(__WEBASSEMBLY64) diff --git a/compiler-rt/cmake/base-config-ix.cmake b/compiler-rt/cmake/base-config-ix.cmake index e4ea03ccbbc77bc1137c1ff7afc2cdc51c2d024c..0a59d49e46c7e257be0064dd24c6baec5d16cfdc 100644 --- a/compiler-rt/cmake/base-config-ix.cmake +++ b/compiler-rt/cmake/base-config-ix.cmake @@ -259,6 +259,8 @@ macro(test_targets) test_target_arch(riscv32 "" "") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "riscv64") test_target_arch(riscv64 "" "") + elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "sw_64") + test_target_arch(sw_64 "" "") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm32") test_target_arch(wasm32 "" "--target=wasm32-unknown-unknown") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm64") diff --git a/compiler-rt/cmake/builtin-config-ix.cmake b/compiler-rt/cmake/builtin-config-ix.cmake index e91e3923a756c5352996f7055cceeb6cd2cacbcd..1c3e0dc4a42a345a3c8133d9a2f58cc7fcae0031 100644 --- a/compiler-rt/cmake/builtin-config-ix.cmake +++ b/compiler-rt/cmake/builtin-config-ix.cmake @@ -60,6 +60,7 @@ set(RISCV32 riscv32) set(RISCV64 riscv64) set(SPARC sparc) set(SPARCV9 sparcv9) +set(SW64 sw_64) set(WASM32 wasm32) set(WASM64 wasm64) set(VE ve) @@ -71,7 +72,7 @@ if(APPLE) endif() set(ALL_BUILTIN_SUPPORTED_ARCH - ${X86} ${X86_64} ${ARM32} ${ARM64} ${AVR} + ${X86} ${X86_64} ${ARM32} ${ARM64} ${AVR} ${SW64} ${HEXAGON} ${MIPS32} ${MIPS64} ${PPC32} ${PPC64} ${RISCV32} ${RISCV64} ${SPARC} ${SPARCV9} ${WASM32} ${WASM64} ${VE} ${LOONGARCH64}) diff --git a/compiler-rt/cmake/crt-config-ix.cmake b/compiler-rt/cmake/crt-config-ix.cmake index dc3265e60984c0f290838a003fda52fcd4c73bec..81c18111e6b53403d3a63c0c24c587acebbdbb01 100644 --- a/compiler-rt/cmake/crt-config-ix.cmake +++ b/compiler-rt/cmake/crt-config-ix.cmake @@ -31,9 +31,9 @@ set(PPC64 powerpc64 powerpc64le) set(RISCV32 riscv32) set(RISCV64 riscv64) set(VE ve) - +set(SW64 sw_64) set(ALL_CRT_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${PPC32} - ${PPC64} ${RISCV32} ${RISCV64} ${VE} ${HEXAGON} ${LOONGARCH64} + ${PPC64} ${RISCV32} ${RISCV64} ${VE} ${HEXAGON} ${LOONGARCH64} ${SW64} ${MIPS32} ${MIPS64} ${SPARC} ${SPARCV9}) include(CompilerRTUtils) diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt index cf376b4a021c319fe46db2c2b252b739cd32c99d..81e5586a926a865802fdd902f34d12c6f2426454 100644 --- a/compiler-rt/lib/builtins/CMakeLists.txt +++ b/compiler-rt/lib/builtins/CMakeLists.txt @@ -720,6 +720,9 @@ set(riscv64_SOURCES ${riscv_SOURCES} ) +# GUYC20211111_BUILTINS +set(sw_64_SOURCES ${GENERIC_SOURCES}) + set(sparc_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES}) set(sparcv9_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES}) diff --git a/compiler-rt/lib/builtins/clear_cache.c b/compiler-rt/lib/builtins/clear_cache.c index 2ac99b25c243f0e1a9580742f63203c812d13283..af1f4a212d85b223278854c31ebf5880496b8ad8 100644 --- a/compiler-rt/lib/builtins/clear_cache.c +++ b/compiler-rt/lib/builtins/clear_cache.c @@ -48,6 +48,14 @@ uintptr_t GetCurrentProcess(void); #include #endif +#if defined(__linux__) && defined(__sw_64__) +#include +#include +//FIXME +#define __PNR_cacheflush -10104 +#define __NR_cacheflush __PNR_cacheflush +#endif + #if defined(__linux__) && defined(__riscv) // to get platform-specific syscall definitions #include @@ -93,6 +101,10 @@ void __clear_cache(void *start, void *end) { #endif #elif defined(__linux__) && defined(__loongarch__) __asm__ volatile("ibar 0"); +#elif defined(__linux__) && defined(__sw_64__) + const uintptr_t start_int = (uintptr_t)start; + const uintptr_t end_int = (uintptr_t)end; + syscall(__NR_cacheflush, start, (end_int - start_int)); #elif defined(__mips__) const uintptr_t start_int = (uintptr_t)start; const uintptr_t end_int = (uintptr_t)end; diff --git a/compiler-rt/lib/builtins/clzdi2.c b/compiler-rt/lib/builtins/clzdi2.c index 12c17982a5cb1261b419cae4c549ec57188f8a8d..ee006cdd4dce17a93dac72bf9b93810222db93e4 100644 --- a/compiler-rt/lib/builtins/clzdi2.c +++ b/compiler-rt/lib/builtins/clzdi2.c @@ -16,6 +16,7 @@ #if !defined(__clang__) && \ ((defined(__sparc__) && defined(__arch64__)) || defined(__mips64) || \ + defined(__sw_64__) || \ (defined(__riscv) && __SIZEOF_POINTER__ >= 8)) // On 64-bit architectures with neither a native clz instruction nor a native // ctz instruction, gcc resolves __builtin_clz to __clzdi2 rather than diff --git a/compiler-rt/lib/builtins/ctzdi2.c b/compiler-rt/lib/builtins/ctzdi2.c index 26c908d876ac4b5d25fef07926526ac76eef945c..5baea5b5e924bf3763856ddcea216dc0064a178c 100644 --- a/compiler-rt/lib/builtins/ctzdi2.c +++ b/compiler-rt/lib/builtins/ctzdi2.c @@ -16,6 +16,7 @@ #if !defined(__clang__) && \ ((defined(__sparc__) && defined(__arch64__)) || defined(__mips64) || \ + defined(__sw_64__) || \ (defined(__riscv) && __SIZEOF_POINTER__ >= 8)) // On 64-bit architectures with neither a native clz instruction nor a native // ctz instruction, gcc resolves __builtin_ctz to __ctzdi2 rather than diff --git a/compiler-rt/lib/builtins/fp_lib.h b/compiler-rt/lib/builtins/fp_lib.h index 58eb45fcc72929648439a53165bdd15e091a79bd..84556e361f2a75341f739c5961a57ee5d19863d9 100644 --- a/compiler-rt/lib/builtins/fp_lib.h +++ b/compiler-rt/lib/builtins/fp_lib.h @@ -105,7 +105,7 @@ static __inline void wideMultiply(rep_t a, rep_t b, rep_t *hi, rep_t *lo) { COMPILER_RT_ABI fp_t __adddf3(fp_t a, fp_t b); #elif defined QUAD_PRECISION -#if __LDBL_MANT_DIG__ == 113 && defined(__SIZEOF_INT128__) +#if __LDBL_MANT_DIG__ == 113 && defined(__SIZEOF_INT128__) || defined(__sw_64__) // TODO: Availability of the *tf functions should not depend on long double // being IEEE 128, but instead on being able to use a 128-bit floating-point // type, which includes __float128. @@ -366,8 +366,8 @@ static __inline fp_t __compiler_rt_scalbnf(fp_t x, int y) { return __compiler_rt_scalbnX(x, y); } static __inline fp_t __compiler_rt_fmaxf(fp_t x, fp_t y) { -#if defined(__aarch64__) - // Use __builtin_fmaxf which turns into an fmaxnm instruction on AArch64. +#if defined(__aarch64__) || defined(__sw_64__) + // Use __builtin_fmaxf which turns into an fmaxnm instruction on AArch64 or Sw64. return __builtin_fmaxf(x, y); #else // __builtin_fmaxf frequently turns into a libm call, so inline the function.