github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/go/runtime/internal/atomic/atomic.c (about)

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include <stdint.h>
     6  
     7  #include "runtime.h"
     8  
     9  uint32_t Load (uint32_t *ptr)
    10    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Load")
    11    __attribute__ ((no_split_stack));
    12  
    13  uint32_t
    14  Load (uint32_t *ptr)
    15  {
    16    return __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
    17  }
    18  
    19  void *Loadp (void *ptr)
    20    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Loadp")
    21    __attribute__ ((no_split_stack));
    22  
    23  void *
    24  Loadp (void *ptr)
    25  {
    26    return __atomic_load_n ((void **) ptr, __ATOMIC_SEQ_CST);
    27  }
    28  
    29  uint8_t Load8 (uint8_t *ptr)
    30    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Load8")
    31    __attribute__ ((no_split_stack));
    32  
    33  uint8_t
    34  Load8 (uint8_t *ptr)
    35  {
    36    return __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
    37  }
    38  
    39  uint64_t Load64 (uint64_t *ptr)
    40    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Load64")
    41    __attribute__ ((no_split_stack));
    42  
    43  uint64_t
    44  Load64 (uint64_t *ptr)
    45  {
    46    if (((uintptr_t) ptr & 7) != 0)
    47      panicmem ();
    48    return __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
    49  }
    50  
    51  uint32_t LoadAcq (uint32_t *ptr)
    52    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.LoadAcq")
    53    __attribute__ ((no_split_stack));
    54  
    55  uint32_t
    56  LoadAcq (uint32_t *ptr)
    57  {
    58    return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
    59  }
    60  
    61  uintptr_t Loaduintptr (uintptr_t *ptr)
    62    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Loaduintptr")
    63    __attribute__ ((no_split_stack));
    64  
    65  uintptr_t
    66  Loaduintptr (uintptr_t *ptr)
    67  {
    68    return __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
    69  }
    70  
    71  uintgo Loaduint (uintgo *ptr)
    72    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Loaduint")
    73    __attribute__ ((no_split_stack));
    74  
    75  uintgo
    76  Loaduint (uintgo *ptr)
    77  {
    78    return __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
    79  }
    80  
    81  int64_t Loadint64 (int64_t *ptr)
    82    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Loadint64")
    83    __attribute__ ((no_split_stack));
    84  
    85  int64_t
    86  Loadint64 (int64_t *ptr)
    87  {
    88    if (((uintptr_t) ptr & 7) != 0)
    89      panicmem ();
    90    return __atomic_load_n (ptr, __ATOMIC_SEQ_CST);
    91  }
    92  
    93  uint32_t Xadd (uint32_t *ptr, int32_t delta)
    94    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xadd")
    95    __attribute__ ((no_split_stack));
    96  
    97  uint32_t
    98  Xadd (uint32_t *ptr, int32_t delta)
    99  {
   100    return __atomic_add_fetch (ptr, (uint32_t) delta, __ATOMIC_SEQ_CST);
   101  }
   102  
   103  uint64_t Xadd64 (uint64_t *ptr, int64_t delta)
   104    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xadd64")
   105    __attribute__ ((no_split_stack));
   106  
   107  uint64_t
   108  Xadd64 (uint64_t *ptr, int64_t delta)
   109  {
   110    if (((uintptr_t) ptr & 7) != 0)
   111      panicmem ();
   112    return __atomic_add_fetch (ptr, (uint64_t) delta, __ATOMIC_SEQ_CST);
   113  }
   114  
   115  uintptr_t Xadduintptr (uintptr_t *ptr, uintptr_t delta)
   116    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xadduintptr")
   117    __attribute__ ((no_split_stack));
   118  
   119  uintptr_t
   120  Xadduintptr (uintptr_t *ptr, uintptr_t delta)
   121  {
   122    return __atomic_add_fetch (ptr, delta, __ATOMIC_SEQ_CST);
   123  }
   124  
   125  int64_t Xaddint64 (int64_t *ptr, int64_t delta)
   126    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xaddint64")
   127    __attribute__ ((no_split_stack));
   128  
   129  int64_t
   130  Xaddint64 (int64_t *ptr, int64_t delta)
   131  {
   132    if (((uintptr_t) ptr & 7) != 0)
   133      panicmem ();
   134    return __atomic_add_fetch (ptr, delta, __ATOMIC_SEQ_CST);
   135  }
   136  
   137  uint32_t Xchg (uint32_t *ptr, uint32_t new)
   138    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xchg")
   139    __attribute__ ((no_split_stack));
   140  
   141  uint32_t
   142  Xchg (uint32_t *ptr, uint32_t new)
   143  {
   144    return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST);
   145  }
   146  
   147  uint64_t Xchg64 (uint64_t *ptr, uint64_t new)
   148    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xchg64")
   149    __attribute__ ((no_split_stack));
   150  
   151  uint64_t
   152  Xchg64 (uint64_t *ptr, uint64_t new)
   153  {
   154    if (((uintptr_t) ptr & 7) != 0)
   155      panicmem ();
   156    return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST);
   157  }
   158  
   159  uintptr_t Xchguintptr (uintptr_t *ptr, uintptr_t new)
   160    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xchguintptr")
   161    __attribute__ ((no_split_stack));
   162  
   163  uintptr_t
   164  Xchguintptr (uintptr_t *ptr, uintptr_t new)
   165  {
   166    return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST);
   167  }
   168  
   169  void And8 (uint8_t *ptr, uint8_t val)
   170    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.And8")
   171    __attribute__ ((no_split_stack));
   172  
   173  void
   174  And8 (uint8_t *ptr, uint8_t val)
   175  {
   176    __atomic_and_fetch (ptr, val, __ATOMIC_SEQ_CST);
   177  }
   178  
   179  void Or8 (uint8_t *ptr, uint8_t val)
   180    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Or8")
   181    __attribute__ ((no_split_stack));
   182  
   183  void
   184  Or8 (uint8_t *ptr, uint8_t val)
   185  {
   186    __atomic_or_fetch (ptr, val, __ATOMIC_SEQ_CST);
   187  }
   188  
   189  _Bool Cas (uint32_t *ptr, uint32_t old, uint32_t new)
   190    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Cas")
   191    __attribute__ ((no_split_stack));
   192  
   193  _Bool
   194  Cas (uint32_t *ptr, uint32_t old, uint32_t new)
   195  {
   196    return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);
   197  }
   198  
   199  _Bool Cas64 (uint64_t *ptr, uint64_t old, uint64_t new)
   200    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Cas64")
   201    __attribute__ ((no_split_stack));
   202  
   203  _Bool
   204  Cas64 (uint64_t *ptr, uint64_t old, uint64_t new)
   205  {
   206    if (((uintptr_t) ptr & 7) != 0)
   207      panicmem ();
   208    return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);
   209  }
   210  
   211  _Bool CasRel (uint32_t *ptr, uint32_t old, uint32_t new)
   212    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.CasRel")
   213    __attribute__ ((no_split_stack));
   214  
   215  _Bool
   216  CasRel (uint32_t *ptr, uint32_t old, uint32_t new)
   217  {
   218    return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_RELEASE, __ATOMIC_RELAXED);
   219  }
   220  
   221  _Bool Casp1 (void **ptr, void *old, void *new)
   222    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Casp1")
   223    __attribute__ ((no_split_stack));
   224  
   225  _Bool
   226  Casp1 (void **ptr, void *old, void *new)
   227  {
   228    return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);
   229  }
   230  
   231  _Bool Casuintptr (uintptr_t *ptr, uintptr_t old, uintptr_t new)
   232    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Casuintptr")
   233    __attribute__ ((no_split_stack));
   234  
   235  _Bool
   236  Casuintptr (uintptr_t *ptr, uintptr_t old, uintptr_t new)
   237  {
   238    return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);
   239  }
   240  
   241  void Store (uint32_t *ptr, uint32_t val)
   242    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Store")
   243    __attribute__ ((no_split_stack));
   244  
   245  void
   246  Store (uint32_t *ptr, uint32_t val)
   247  {
   248    __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST);
   249  }
   250  
   251  void Store8 (uint8_t *ptr, uint8_t val)
   252    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Store8")
   253    __attribute__ ((no_split_stack));
   254  
   255  void
   256  Store8 (uint8_t *ptr, uint8_t val)
   257  {
   258    __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST);
   259  }
   260  
   261  void Store64 (uint64_t *ptr, uint64_t val)
   262    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Store64")
   263    __attribute__ ((no_split_stack));
   264  
   265  void
   266  Store64 (uint64_t *ptr, uint64_t val)
   267  {
   268    if (((uintptr_t) ptr & 7) != 0)
   269      panicmem ();
   270    __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST);
   271  }
   272  
   273  void StoreRel (uint32_t *ptr, uint32_t val)
   274    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.StoreRel")
   275    __attribute__ ((no_split_stack));
   276  
   277  void
   278  StoreRel (uint32_t *ptr, uint32_t val)
   279  {
   280    __atomic_store_n (ptr, val, __ATOMIC_RELEASE);
   281  }
   282  
   283  void Storeuintptr (uintptr_t *ptr, uintptr_t val)
   284    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Storeuintptr")
   285    __attribute__ ((no_split_stack));
   286  
   287  void
   288  Storeuintptr (uintptr_t *ptr, uintptr_t val)
   289  {
   290    __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST);
   291  }
   292  
   293  void StorepNoWB (void *ptr, void *val)
   294    __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.StorepNoWB")
   295    __attribute__ ((no_split_stack));
   296  
   297  void
   298  StorepNoWB (void *ptr, void *val)
   299  {
   300    __atomic_store_n ((void**) ptr, val, __ATOMIC_SEQ_CST);
   301  }