aboutsummaryrefslogtreecommitdiff
path: root/boehm-gc/include
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2002-09-27 20:40:06 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2002-09-27 20:40:06 +0000
commit10a197ee7c4b5546cc5cc16a24f5b1bd6ecb7297 (patch)
tree02c4e6e5e8bfd70e19bb4ca3880e717a5a0d6490 /boehm-gc/include
parentfc5295fa6af5d1f71b476500988c0739846ce348 (diff)
downloadgcc-10a197ee7c4b5546cc5cc16a24f5b1bd6ecb7297.zip
gcc-10a197ee7c4b5546cc5cc16a24f5b1bd6ecb7297.tar.gz
gcc-10a197ee7c4b5546cc5cc16a24f5b1bd6ecb7297.tar.bz2
gcconfig: Add machine type S390.
* include/private/gcconfig: Add machine type S390. Add s390x support. * include/private/gc_locks.h (GC_test_and_set): Implement for s390. (GC_compare_and_exchange): Likewise. From-SVN: r57592
Diffstat (limited to 'boehm-gc/include')
-rw-r--r--boehm-gc/include/private/gc_locks.h34
-rw-r--r--boehm-gc/include/private/gcconfig.h24
2 files changed, 55 insertions, 3 deletions
diff --git a/boehm-gc/include/private/gc_locks.h b/boehm-gc/include/private/gc_locks.h
index 04d3af9..33101f8 100644
--- a/boehm-gc/include/private/gc_locks.h
+++ b/boehm-gc/include/private/gc_locks.h
@@ -209,6 +209,19 @@
}
# define GC_TEST_AND_SET_DEFINED
# endif /* ARM32 */
+# ifdef S390
+ inline static int GC_test_and_set(volatile unsigned int *addr) {
+ int ret;
+ __asm__ __volatile__ (
+ " l %0,0(%2)\n"
+ "0: cs %0,%1,0(%2)\n"
+ " jl 0b"
+ : "=&d" (ret)
+ : "d" (1), "a" (addr)
+ : "cc", "memory");
+ return ret;
+ }
+# endif
# endif /* __GNUC__ */
# if (defined(ALPHA) && !defined(__GNUC__))
# define GC_test_and_set(addr) __cxx_test_and_set_atomic(addr, 1)
@@ -330,6 +343,27 @@
}
# endif /* 0 */
# endif /* IA64 */
+# if defined(S390)
+# if !defined(GENERIC_COMPARE_AND_SWAP)
+ inline static GC_bool GC_compare_and_exchange(volatile C_word *addr,
+ GC_word old, GC_word new_val)
+ {
+ int retval;
+ __asm__ __volatile__ (
+# ifndef __s390x__
+ " cs %1,%2,0(%3)\n"
+# else
+ " csg %1,%2,0(%3)\n"
+# endif
+ " ipm %0\n"
+ " srl %0,28\n"
+ : "=&d" (retval), "+d" (old)
+ : "d" (new_val), "a" (addr)
+ : "cc", "memory");
+ return retval == 0;
+ }
+# endif
+# endif
# if !defined(GENERIC_COMPARE_AND_SWAP)
/* Returns the original value of *addr. */
inline static GC_word GC_atomic_add(volatile GC_word *addr,
diff --git a/boehm-gc/include/private/gcconfig.h b/boehm-gc/include/private/gcconfig.h
index 0f618fe..432250c 100644
--- a/boehm-gc/include/private/gcconfig.h
+++ b/boehm-gc/include/private/gcconfig.h
@@ -370,7 +370,7 @@
# define mach_type_known
# endif
# if defined(__s390__) && defined(LINUX)
-# define S370
+# define S390
# define mach_type_known
# endif
# if defined(__GNU__)
@@ -419,7 +419,8 @@
/* (CX_UX and DGUX) */
/* S370 ==> 370-like machine */
/* running Amdahl UTS4 */
- /* or a 390 running LINUX */
+ /* S390 ==> 390-like machine */
+ /* running LINUX */
/* ARM32 ==> Intel StrongARM */
/* IA64 ==> Intel IPF */
/* (e.g. Itanium) */
@@ -1523,12 +1524,29 @@
# define DATAEND (_end)
# define HEURISTIC2
# endif
+# endif
+
+# ifdef S390
+# define MACH_TYPE "S390"
+# define USE_GENERIC_PUSH_REGS
+# ifndef __s390x__
+# define ALIGNMENT 4
+# define CPP_WORDSZ 32
+# else
+# define ALIGNMENT 8
+# define CPP_WORDSZ 64
+# define HBLKSIZE 4096
+# endif
# ifdef LINUX
# define OS_TYPE "LINUX"
-# define HEURISTIC1
+# define LINUX_STACKBOTTOM
# define DYNAMIC_LOADING
extern int __data_start[];
# define DATASTART ((ptr_t)(__data_start))
+ extern int _end[];
+# define DATAEND (_end)
+# define CACHE_LINE_SIZE 256
+# define GETPAGESIZE() 4096
# endif
# endif