root/opal/mca/pmix/pmix4x/pmix/src/atomics/sys/sync_builtin/atomic.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. pmix_atomic_mb
  2. pmix_atomic_rmb
  3. pmix_atomic_wmb
  4. pmix_atomic_compare_exchange_strong_32
  5. pmix_atomic_fetch_add_32
  6. pmix_atomic_fetch_and_32
  7. pmix_atomic_fetch_or_32
  8. pmix_atomic_fetch_xor_32
  9. pmix_atomic_fetch_sub_32
  10. pmix_atomic_compare_exchange_strong_64
  11. pmix_atomic_fetch_add_64
  12. pmix_atomic_fetch_and_64
  13. pmix_atomic_fetch_or_64
  14. pmix_atomic_fetch_xor_64
  15. pmix_atomic_fetch_sub_64
  16. pmix_atomic_compare_exchange_strong_128

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   4  *                         University Research and Technology
   5  *                         Corporation.  All rights reserved.
   6  * Copyright (c) 2004-2013 The University of Tennessee and The University
   7  *                         of Tennessee Research Foundation.  All rights
   8  *                         reserved.
   9  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
  10  *                         University of Stuttgart.  All rights reserved.
  11  * Copyright (c) 2004-2005 The Regents of the University of California.
  12  *                         All rights reserved.
  13  * Copyright (c) 2011      Sandia National Laboratories. All rights reserved.
  14  * Copyright (c) 2014-2018 Los Alamos National Security, LLC. All rights
  15  *                         reserved.
  16  * Copyright (c) 2017      Research Organization for Information Science
  17  *                         and Technology (RIST). All rights reserved.
  18  * Copyright (c) 2018      Intel, Inc.  All rights reserved.
  19  * $COPYRIGHT$
  20  *
  21  * Additional copyrights may follow
  22  *
  23  * $HEADER$
  24  */
  25 
  26 #ifndef PMIX_SYS_ARCH_ATOMIC_H
  27 #define PMIX_SYS_ARCH_ATOMIC_H 1
  28 
  29 /**********************************************************************
  30  *
  31  * Memory Barriers
  32  *
  33  *********************************************************************/
  34 #define PMIX_HAVE_ATOMIC_MEM_BARRIER 1
  35 
  36 static inline void pmix_atomic_mb(void)
  37 {
  38     __sync_synchronize();
  39 }
  40 
  41 static inline void pmix_atomic_rmb(void)
  42 {
  43     __sync_synchronize();
  44 }
  45 
  46 static inline void pmix_atomic_wmb(void)
  47 {
  48     __sync_synchronize();
  49 }
  50 
  51 #define PMIXMB() pmix_atomic_mb()
  52 
  53 /**********************************************************************
  54  *
  55  * Atomic math operations
  56  *
  57  *********************************************************************/
  58 
  59 #define PMIX_HAVE_ATOMIC_COMPARE_EXCHANGE_32 1
  60 
  61 static inline bool pmix_atomic_compare_exchange_strong_32 (pmix_atomic_int32_t *addr, int32_t *oldval, int32_t newval)
  62 {
  63     int32_t prev = __sync_val_compare_and_swap (addr, *oldval, newval);
  64     bool ret = prev == *oldval;
  65     *oldval = prev;
  66     return ret;
  67 }
  68 
  69 #define pmix_atomic_compare_exchange_strong_acq_32 pmix_atomic_compare_exchange_strong_32
  70 #define pmix_atomic_compare_exchange_strong_rel_32 pmix_atomic_compare_exchange_strong_32
  71 
  72 #define PMIX_HAVE_ATOMIC_MATH_32 1
  73 
  74 #define PMIX_HAVE_ATOMIC_ADD_32 1
  75 static inline int32_t pmix_atomic_fetch_add_32(pmix_atomic_int32_t *addr, int32_t delta)
  76 {
  77     return __sync_fetch_and_add(addr, delta);
  78 }
  79 
  80 #define PMIX_HAVE_ATOMIC_AND_32 1
  81 static inline int32_t pmix_atomic_fetch_and_32(pmix_atomic_int32_t *addr, int32_t value)
  82 {
  83     return __sync_fetch_and_and(addr, value);
  84 }
  85 
  86 #define PMIX_HAVE_ATOMIC_OR_32 1
  87 static inline int32_t pmix_atomic_fetch_or_32(pmix_atomic_int32_t *addr, int32_t value)
  88 {
  89     return __sync_fetch_and_or(addr, value);
  90 }
  91 
  92 #define PMIX_HAVE_ATOMIC_XOR_32 1
  93 static inline int32_t pmix_atomic_fetch_xor_32(pmix_atomic_int32_t *addr, int32_t value)
  94 {
  95     return __sync_fetch_and_xor(addr, value);
  96 }
  97 
  98 #define PMIX_HAVE_ATOMIC_SUB_32 1
  99 static inline int32_t pmix_atomic_fetch_sub_32(pmix_atomic_int32_t *addr, int32_t delta)
 100 {
 101     return __sync_fetch_and_sub(addr, delta);
 102 }
 103 
 104 #if PMIX_ASM_SYNC_HAVE_64BIT
 105 
 106 #define PMIX_HAVE_ATOMIC_COMPARE_EXCHANGE_64 1
 107 
 108 static inline bool pmix_atomic_compare_exchange_strong_64 (pmix_atomic_int64_t *addr, int64_t *oldval, int64_t newval)
 109 {
 110     int64_t prev = __sync_val_compare_and_swap (addr, *oldval, newval);
 111     bool ret = prev == *oldval;
 112     *oldval = prev;
 113     return ret;
 114 }
 115 
 116 #define pmix_atomic_compare_exchange_strong_acq_64 pmix_atomic_compare_exchange_strong_64
 117 #define pmix_atomic_compare_exchange_strong_rel_64 pmix_atomic_compare_exchange_strong_64
 118 
 119 #define PMIX_HAVE_ATOMIC_MATH_64 1
 120 #define PMIX_HAVE_ATOMIC_ADD_64 1
 121 static inline int64_t pmix_atomic_fetch_add_64(pmix_atomic_int64_t *addr, int64_t delta)
 122 {
 123     return __sync_fetch_and_add(addr, delta);
 124 }
 125 
 126 #define PMIX_HAVE_ATOMIC_AND_64 1
 127 static inline int64_t pmix_atomic_fetch_and_64(pmix_atomic_int64_t *addr, int64_t value)
 128 {
 129     return __sync_fetch_and_and(addr, value);
 130 }
 131 
 132 #define PMIX_HAVE_ATOMIC_OR_64 1
 133 static inline int64_t pmix_atomic_fetch_or_64(pmix_atomic_int64_t *addr, int64_t value)
 134 {
 135     return __sync_fetch_and_or(addr, value);
 136 }
 137 
 138 #define PMIX_HAVE_ATOMIC_XOR_64 1
 139 static inline int64_t pmix_atomic_fetch_xor_64(pmix_atomic_int64_t *addr, int64_t value)
 140 {
 141     return __sync_fetch_and_xor(addr, value);
 142 }
 143 
 144 #define PMIX_HAVE_ATOMIC_SUB_64 1
 145 static inline int64_t pmix_atomic_fetch_sub_64(pmix_atomic_int64_t *addr, int64_t delta)
 146 {
 147     return __sync_fetch_and_sub(addr, delta);
 148 }
 149 
 150 #endif
 151 
 152 #if PMIX_HAVE_SYNC_BUILTIN_CSWAP_INT128
 153 static inline bool pmix_atomic_compare_exchange_strong_128 (pmix_atomic_int128_t *addr,
 154                                                             pmix_int128_t *oldval, pmix_int128_t newval)
 155 {
 156     pmix_int128_t prev = __sync_val_compare_and_swap (addr, *oldval, newval);
 157     bool ret = prev == *oldval;
 158     *oldval = prev;
 159     return ret;
 160 }
 161 
 162 #define PMIX_HAVE_ATOMIC_COMPARE_EXCHANGE_128 1
 163 
 164 #endif
 165 
 166 #endif /* ! PMIX_SYS_ARCH_ATOMIC_H */

/* [<][>][^][v][top][bottom][index][help] */