github.com/afumu/libc@v0.0.6/musl/arch/mips64/atomic_arch.h (about)

     1  #if __mips_isa_rev < 6
     2  #define LLSC_M "m"
     3  #else
     4  #define LLSC_M "ZC"
     5  #endif
     6  
     7  #define a_ll a_ll
     8  static inline int a_ll(volatile int *p)
     9  {
    10  	int v;
    11  	__asm__ __volatile__ (
    12  		"ll %0, %1"
    13  		: "=r"(v) : LLSC_M(*p));
    14  	return v;
    15  }
    16  
    17  #define a_sc a_sc
    18  static inline int a_sc(volatile int *p, int v)
    19  {
    20  	int r;
    21  	__asm__ __volatile__ (
    22  		"sc %0, %1"
    23  		: "=r"(r), "="LLSC_M(*p) : "0"(v) : "memory");
    24  	return r;
    25  }
    26  
    27  #define a_ll_p a_ll_p
    28  static inline void *a_ll_p(volatile void *p)
    29  {
    30  	void *v;
    31  	__asm__ __volatile__ (
    32  		"lld %0, %1"
    33  		: "=r"(v) : LLSC_M(*(void *volatile *)p));
    34  	return v;
    35  }
    36  
    37  #define a_sc_p a_sc_p
    38  static inline int a_sc_p(volatile void *p, void *v)
    39  {
    40  	long r;
    41  	__asm__ __volatile__ (
    42  		"scd %0, %1"
    43  		: "=r"(r), "="LLSC_M(*(void *volatile *)p) : "0"(v) : "memory");
    44  	return r;
    45  }
    46  
    47  #define a_barrier a_barrier
    48  static inline void a_barrier()
    49  {
    50  	__asm__ __volatile__ ("sync" : : : "memory");
    51  }
    52  
    53  #define a_pre_llsc a_barrier
    54  #define a_post_llsc a_barrier
    55  
    56  #undef LLSC_M