OSDN Git Service

* include/private/gcconfig: Add machine type S390. Add s390x support.
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Sep 2002 20:40:06 +0000 (20:40 +0000)
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Sep 2002 20:40:06 +0000 (20:40 +0000)
* include/private/gc_locks.h (GC_test_and_set): Implement for s390.
(GC_compare_and_exchange): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@57592 138bc75d-0d04-0410-961f-82ee72b054a4

boehm-gc/ChangeLog
boehm-gc/include/private/gc_locks.h
boehm-gc/include/private/gcconfig.h

index 2ab4af7..1e39307 100644 (file)
@@ -1,3 +1,9 @@
+2002-09-27  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * 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  <thorpej@wasabisystems.com>
 
        * include/private/gcconfig.h: Fix NetBSD/mips parameters.
index 04d3af9..33101f8 100644 (file)
         }
 #       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)
         }
 #      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,
index 0f618fe..432250c 100644 (file)
 #   define mach_type_known
 # endif
 # if defined(__s390__) && defined(LINUX)
-#    define S370
+#    define S390
 #    define mach_type_known
 # endif
 # if defined(__GNU__)
                    /*                  (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)        */
 #      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