diff -Naur gc-8.0.6.org/config.guess gc-8.0.6.sw/config.guess
--- gc-8.0.6.org/config.guess	2022-02-14 09:01:19.450000000 +0000
+++ gc-8.0.6.sw/config.guess	2022-02-15 02:27:24.780000000 +0000
@@ -891,6 +891,14 @@
 	UNAME_MACHINE=aarch64_be
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
+    sw_64:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  sw)   UNAME_MACHINE=sw_64 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	echo ${UNAME_MACHINE}-sunway-linux-${LIBC}
+	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
diff -Naur gc-8.0.6.org/config.sub gc-8.0.6.sw/config.sub
--- gc-8.0.6.org/config.sub	2022-02-14 09:01:19.450000000 +0000
+++ gc-8.0.6.sw/config.sub	2022-02-15 02:25:05.350000000 +0000
@@ -248,6 +248,7 @@
 	# Some are omitted here because they have special meanings below.
 	1750a | 580 \
 	| a29k \
+	| sw_64 \
 	| aarch64 | aarch64_be \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
@@ -370,6 +371,7 @@
 	# Recognize the basic CPU types with company name.
 	580-* \
 	| a29k-* \
+	| sw_64-* \
 	| aarch64-* | aarch64_be-* \
 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
diff -Naur gc-8.0.6.org/extra/msvc_dbg.c gc-8.0.6.sw/extra/msvc_dbg.c
--- gc-8.0.6.org/extra/msvc_dbg.c	2022-02-14 09:01:19.470000000 +0000
+++ gc-8.0.6.sw/extra/msvc_dbg.c	2022-02-15 02:32:56.220000000 +0000
@@ -149,6 +149,9 @@
 #elif defined(_M_MRX000)
   machineType                 = IMAGE_FILE_MACHINE_R4000;
   stackFrame.AddrPC.Offset    = context->Fir;
+#elif defined(_M_SW_64)
+  machineType                 = IMAGE_FILE_MACHINE_SW_64;
+  stackFrame.AddrPC.Offset    = (unsigned long)context->Fir;
 #elif defined(_M_ALPHA)
   machineType                 = IMAGE_FILE_MACHINE_ALPHA;
   stackFrame.AddrPC.Offset    = (unsigned long)context->Fir;
@@ -158,6 +161,9 @@
 #elif defined(_M_IA64)
   machineType                 = IMAGE_FILE_MACHINE_IA64;
   stackFrame.AddrPC.Offset    = context->StIIP;
+#elif defined(_M_SW_6464)
+  machineType                 = IMAGE_FILE_MACHINE_SW_6464;
+  stackFrame.AddrPC.Offset    = context->Fir;
 #elif defined(_M_ALPHA64)
   machineType                 = IMAGE_FILE_MACHINE_ALPHA64;
   stackFrame.AddrPC.Offset    = context->Fir;
diff -Naur gc-8.0.6.org/include/gc_config_macros.h gc-8.0.6.sw/include/gc_config_macros.h
--- gc-8.0.6.org/include/gc_config_macros.h	2022-02-14 09:01:19.450000000 +0000
+++ gc-8.0.6.sw/include/gc_config_macros.h	2022-02-15 02:37:26.990000000 +0000
@@ -95,7 +95,7 @@
 #   define GC_FREEBSD_THREADS
 # elif defined(__NetBSD__)
 #   define GC_NETBSD_THREADS
-# elif defined(__alpha) || defined(__alpha__) /* && !Linux && !xBSD */
+# elif defined(__alpha) || defined(__alpha__) || defined(__sw_64) || defined(__sw_64__) /* && !Linux && !xBSD */
 #   define GC_OSF1_THREADS
 # elif (defined(mips) || defined(__mips) || defined(_mips)) \
         && !(defined(nec_ews) || defined(_nec_ews) \
diff -Naur gc-8.0.6.org/include/gc_tiny_fl.h gc-8.0.6.sw/include/gc_tiny_fl.h
--- gc-8.0.6.org/include/gc_tiny_fl.h	2022-02-14 09:01:19.440000000 +0000
+++ gc-8.0.6.sw/include/gc_tiny_fl.h	2022-02-15 02:38:20.270000000 +0000
@@ -49,7 +49,7 @@
 # if defined(__LP64__) || defined (_LP64) || defined(_WIN64) \
         || defined(__s390x__) \
         || (defined(__x86_64__) && !defined(__ILP32__)) \
-        || defined(__alpha__) || defined(__powerpc64__) \
+        || defined(__alpha__) || defined(__sw_64__) || defined(__powerpc64__) \
         || defined(__arch64__)
 #  define GC_GRANULE_BYTES 16
 #  define GC_GRANULE_WORDS 2
diff -Naur gc-8.0.6.org/include/private/gc_priv.h gc-8.0.6.sw/include/private/gc_priv.h
--- gc-8.0.6.org/include/private/gc_priv.h	2022-02-14 09:01:19.440000000 +0000
+++ gc-8.0.6.sw/include/private/gc_priv.h	2022-02-15 02:40:15.270000000 +0000
@@ -851,7 +851,7 @@
 /*   SMALL_CONFIG: Want less block-level fragmentation.         */
 #ifndef HBLKSIZE
 # if defined(LARGE_CONFIG) || !defined(SMALL_CONFIG)
-#   ifdef ALPHA
+#   if defined ALPHA ||  defined SW_64
 #     define CPP_LOG_HBLKSIZE 13
 #   elif defined(SN_TARGET_ORBIS) || defined(SN_TARGET_PSP2)
 #     define CPP_LOG_HBLKSIZE 16    /* page size is set to 64K  */
diff -Naur gc-8.0.6.org/include/private/gcconfig.h gc-8.0.6.sw/include/private/gcconfig.h
--- gc-8.0.6.org/include/private/gcconfig.h	2022-02-14 09:01:19.440000000 +0000
+++ gc-8.0.6.sw/include/private/gcconfig.h	2022-02-15 02:45:28.230000000 +0000
@@ -411,6 +411,14 @@
 #    define M32R
 #    define mach_type_known
 # endif
+# if defined(__sw_64) || defined(__sw_64__)
+#   define SW_64
+#   if !defined(LINUX) && !defined(NETBSD) && !defined(OPENBSD) \
+       && !defined(FREEBSD)
+#     define OSF1       /* a.k.a Digital Unix */
+#   endif
+#   define mach_type_known
+# endif
 # if defined(__alpha) || defined(__alpha__)
 #   define ALPHA
 #   if !defined(LINUX) && !defined(NETBSD) && !defined(OPENBSD) \
@@ -1994,6 +2002,100 @@
 #  endif
 # endif /* HP_PA */
 
+# ifdef SW_64
+#   define MACH_TYPE "SW_64"
+#   define ALIGNMENT 8
+#   define CPP_WORDSZ 64
+#   ifdef NETBSD
+#       define OS_TYPE "NETBSD"
+#       define HEURISTIC2
+        extern ptr_t GC_data_start;
+#       define DATASTART GC_data_start
+#       define ELFCLASS32 32
+#       define ELFCLASS64 64
+#       define ELF_CLASS ELFCLASS64
+#       define DYNAMIC_LOADING
+#   endif
+#   ifdef OPENBSD
+#       define OS_TYPE "OPENBSD"
+#       define ELF_CLASS ELFCLASS64
+#       ifndef GC_OPENBSD_THREADS
+#           define HEURISTIC2
+#       endif
+        extern int __data_start[];
+#       define DATASTART ((ptr_t)__data_start)
+        extern int _end[];
+#       define DATAEND ((ptr_t)(&_end))
+#       define DYNAMIC_LOADING
+#   endif
+#   ifdef FREEBSD
+#       define OS_TYPE "FREEBSD"
+/* MPROTECT_VDB is not yet supported at all on FreeBSD/sw_64. */
+#       define SIG_SUSPEND SIGUSR1
+#       define SIG_THR_RESTART SIGUSR2
+                /* SIGTSTP and SIGCONT could be used alternatively.     */
+#       define FREEBSD_STACKBOTTOM
+#       ifdef __ELF__
+#           define DYNAMIC_LOADING
+#       endif
+/* Handle unmapped hole sw_64*-*-freebsd[45]* puts between etext and edata. */
+        extern char etext[];
+        extern char edata[];
+#       if !defined(CPPCHECK)
+          extern char end[];
+#       endif
+#       define NEED_FIND_LIMIT
+#       define DATASTART ((ptr_t)(&etext))
+        void * GC_find_limit(void *, int);
+#       define DATAEND (ptr_t)GC_find_limit(DATASTART, TRUE)
+#       define DATAEND_IS_FUNC
+#       define GC_HAVE_DATAREGION2
+#       define DATASTART2 ((ptr_t)(&edata))
+#       define DATAEND2 ((ptr_t)(&end))
+#   endif
+#   ifdef OSF1
+#       define OS_TYPE "OSF1"
+#       define DATASTART ((ptr_t)0x140000000)
+        extern int _end[];
+#       define DATAEND ((ptr_t)(&_end))
+        extern char ** environ;
+        /* round up from the value of environ to the nearest page boundary */
+        /* Probably breaks if putenv is called before collector            */
+        /* initialization.                                                 */
+#       define STACKBOTTOM ((ptr_t)(((word)(environ) | (getpagesize()-1))+1))
+/* #    define HEURISTIC2 */
+        /* Normally HEURISTIC2 is too conservative, since               */
+        /* the text segment immediately follows the stack.              */
+        /* Hence we give an upper pound.                                */
+        /* This is currently unused, since we disabled HEURISTIC2       */
+        extern int __start[];
+#       define HEURISTIC2_LIMIT ((ptr_t)((word)(__start) & ~(getpagesize()-1)))
+#       ifndef GC_OSF1_THREADS
+          /* Unresolved signal issues with threads.     */
+#         define MPROTECT_VDB
+#       endif
+#       define DYNAMIC_LOADING
+#   endif
+#   ifdef LINUX
+#       define OS_TYPE "LINUX"
+#       define LINUX_STACKBOTTOM
+#       define COUNT_UNMAPPED_REGIONS
+#       ifdef __ELF__
+#         define SEARCH_FOR_DATA_START
+#         define DYNAMIC_LOADING
+#       else
+#           define DATASTART ((ptr_t)0x140000000)
+#       endif
+        extern int _end[];
+#       define DATAEND ((ptr_t)(_end))
+#       if !defined(REDIRECT_MALLOC)
+#           define MPROTECT_VDB
+                /* Has only been superficially tested.  May not */
+                /* work on all versions.                        */
+#       endif
+#   endif
+# endif
+
 # ifdef ALPHA
 #   define MACH_TYPE "ALPHA"
 #   define ALIGNMENT 8
