atomic_arch.h raw

   1  #define a_cas a_cas
   2  static inline int a_cas(volatile int *p, int t, int s)
   3  {
   4  	register int old, tmp;
   5  	__asm__ __volatile__ (
   6  		"	addi %0, r0, 0\n"
   7  		"1:	lwx %0, %2, r0\n"
   8  		"	rsubk %1, %0, %3\n"
   9  		"	bnei %1, 1f\n"
  10  		"	swx %4, %2, r0\n"
  11  		"	addic %1, r0, 0\n"
  12  		"	bnei %1, 1b\n"
  13  		"1:	"
  14  		: "=&r"(old), "=&r"(tmp)
  15  		: "r"(p), "r"(t), "r"(s)
  16  		: "cc", "memory" );
  17  	return old;
  18  }
  19  
  20  #define a_swap a_swap
  21  static inline int a_swap(volatile int *x, int v)
  22  {
  23  	register int old, tmp;
  24  	__asm__ __volatile__ (
  25  		"	addi %0, r0, 0\n"
  26  		"1:	lwx %0, %2, r0\n"
  27  		"	swx %3, %2, r0\n"
  28  		"	addic %1, r0, 0\n"
  29  		"	bnei %1, 1b\n"
  30  		"1:	"
  31  		: "=&r"(old), "=&r"(tmp)
  32  		: "r"(x), "r"(v)
  33  		: "cc", "memory" );
  34  	return old;
  35  }
  36  
  37  #define a_fetch_add a_fetch_add
  38  static inline int a_fetch_add(volatile int *x, int v)
  39  {
  40  	register int new, tmp;
  41  	__asm__ __volatile__ (
  42  		"	addi %0, r0, 0\n"
  43  		"1:	lwx %0, %2, r0\n"
  44  		"	addk %0, %0, %3\n"
  45  		"	swx %0, %2, r0\n"
  46  		"	addic %1, r0, 0\n"
  47  		"	bnei %1, 1b\n"
  48  		"1:	"
  49  		: "=&r"(new), "=&r"(tmp)
  50  		: "r"(x), "r"(v)
  51  		: "cc", "memory" );
  52  	return new-v;
  53  }
  54