]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2044. [port] add support for atomic operations for Itanium.
authorMark Andrews <marka@isc.org>
Wed, 21 Jun 2006 03:40:34 +0000 (03:40 +0000)
committerMark Andrews <marka@isc.org>
Wed, 21 Jun 2006 03:40:34 +0000 (03:40 +0000)
                        [RT #16179]

CHANGES
configure
configure.in
lib/isc/ia64/include/isc/atomic.h [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index 8f4a18d8fa87f04ff9057a3e921e467a429d8046..ed07314fce75adf0c3bbdafdf660d87eb7fdef53 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,5 @@
-2044.  [placeholder]   rt16179
+2044.  [port]          add support for atomic operations for Itanium.
+                       [RT #16179]
 
 2043.  [port]          nsupdate/nslookup: Force the flushing of the prompt
                        for interactive sessions. [RT#16148]
index b7702d22d9861e36b872f2877f415cf477c18ba9..857c96c3e684363a226f998779742ffb32ae8672 100755 (executable)
--- a/configure
+++ b/configure
@@ -14,7 +14,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 #
-# $Id: configure,v 1.395 2006/06/20 06:56:42 marka Exp $
+# $Id: configure,v 1.396 2006/06/21 03:40:34 marka Exp $
 #
 # Portions Copyright (C) 1996-2001  Nominum, Inc.
 #
@@ -29,7 +29,7 @@
 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-# From configure.in Revision: 1.407 .
+# From configure.in Revision: 1.408 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.59.
 #
@@ -27930,6 +27930,9 @@ fi
        mips-*)
                arch=mips
        ;;
+       ia64-*)
+               arch=ia64
+       ;;
        *)
                have_atomic=no
                arch=noatomic
index aeaa135af0e8a9400a6c9393d32decd657ea04a5..aa7ccb12cd5178e31ab7765468ffa3351d1c7ffe 100644 (file)
@@ -18,7 +18,7 @@ AC_DIVERT_PUSH(1)dnl
 esyscmd([sed "s/^/# /" COPYRIGHT])dnl
 AC_DIVERT_POP()dnl
 
-AC_REVISION($Revision: 1.407 $)
+AC_REVISION($Revision: 1.408 $)
 
 AC_INIT(lib/dns/name.c)
 AC_PREREQ(2.59)
@@ -1943,6 +1943,9 @@ main() {
        mips-*)
                arch=mips
        ;;
+       ia64-*)
+               arch=ia64
+       ;;
        *)
                have_atomic=no
                arch=noatomic
diff --git a/lib/isc/ia64/include/isc/atomic.h b/lib/isc/ia64/include/isc/atomic.h
new file mode 100644 (file)
index 0000000..94b0f7b
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2006  Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: atomic.h,v 1.2 2006/06/21 03:36:54 marka Exp $ */
+
+#ifndef ISC_ATOMIC_H
+#define ISC_ATOMIC_H 1
+
+#include <isc/platform.h>
+#include <isc/types.h>
+
+#ifdef ISC_PLATFORM_USEGCCASM
+/*
+ * This routine atomically increments the value stored in 'p' by 'val', and
+ * returns the previous value.
+ *
+ * Open issue: can 'fetchadd' make the code faster for some particular values
+ * (e.g., 1 and -1)?
+ */
+static inline isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+       isc_int32_t prev, swapped;
+
+       for (prev = *(volatile isc_int32_t *)p; ; prev = swapped) {
+               swapped = prev + val;
+               __asm__ volatile(
+                       "mov ar.ccv=%2;"
+                       "cmpxchg4.acq %0=%4,%3,ar.ccv"
+                       : "=r" (swapped), "=m" (*p)
+                       : "r" (prev), "r" (swapped), "m" (*p)
+                       : "memory");
+               if (swapped == prev)
+                       break;
+       }
+
+       return (prev);
+}
+
+/*
+ * This routine atomically stores the value 'val' in 'p'.
+ */
+static inline void
+isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
+       __asm__ volatile(
+               "st4.rel %0=%1"
+               : "=m" (*p)
+               : "r" (val)
+               : "memory"
+               );
+}
+
+/*
+ * This routine atomically replaces the value in 'p' with 'val', if the
+ * original value is equal to 'cmpval'.  The original value is returned in any
+ * case.
+ */
+static inline isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
+       isc_int32_t ret;
+
+       __asm__ volatile(
+               "mov ar.ccv=%2;"
+               "cmpxchg4.acq %0=%4,%3,ar.ccv"
+               : "=r" (ret), "=m" (*p)
+               : "r" (cmpval), "r" (val), "m" (*p)
+               : "memory");
+
+       return (ret);
+}
+#else /* !ISC_PLATFORM_USEGCCASM */
+
+#error "unsupported compiler.  disable atomic ops by --disable-atomic"
+
+#endif
+#endif /* ISC_ATOMIC_H */