From 10a197ee7c4b5546cc5cc16a24f5b1bd6ecb7297 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Fri, 27 Sep 2002 20:40:06 +0000 Subject: [PATCH] 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 --- boehm-gc/ChangeLog | 6 +++++ boehm-gc/include/private/gc_locks.h | 34 +++++++++++++++++++++++++++++ boehm-gc/include/private/gcconfig.h | 24 +++++++++++++++++--- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog index 2ab4af7f24eb..1e39307bfa7d 100644 --- a/boehm-gc/ChangeLog +++ b/boehm-gc/ChangeLog @@ -1,3 +1,9 @@ +2002-09-27 Ulrich Weigand + + * 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. + 2002-09-24 Jason Thorpe * include/private/gcconfig.h: Fix NetBSD/mips parameters. diff --git a/boehm-gc/include/private/gc_locks.h b/boehm-gc/include/private/gc_locks.h index 04d3af986c03..33101f8c2d02 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 0f618fecf229..432250cf4f69 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 -- 2.43.5