23 #ifndef _BENCH_UTILS_INCLUDED 24 #define _BENCH_UTILS_INCLUDED 29 #if defined(__APPLE__) 30 #define PTCMPXCH " cmpxchgl %2,%1\n" 32 #define PTCMPXCH " cmpxchgq %2,%1\n" 38 static int __ii = mallopt(M_MMAP_MAX,0);
39 static int __jj = mallopt(M_TRIM_THRESHOLD,-1);
42 #define newA(__E,__n) (__E*) malloc((__n)*sizeof(__E)) 47 static inline void myAssert(
int cond, std::string s) {
49 std::cout << s << std::endl;
56 static int log2Up(T i) {
59 while (b > 0) {b = b >> 1; a++;}
64 static inline int logUp(
unsigned int i) {
67 while (b > 0) {b = b >> 1; a++;}
72 static inline int logUpLong(
unsigned long i) {
75 while (b > 0) {b = b >> 1; a++;}
79 inline unsigned int hash(
unsigned int a)
81 a = (a+0x7ed55d16) + (a<<12);
82 a = (a^0xc761c23c) ^ (a>>19);
83 a = (a+0x165667b1) + (a<<5);
84 a = (a+0xd3a2646c) ^ (a<<9);
85 a = (a+0xfd7046c5) + (a<<3);
86 a = (a^0xb55a4f09) ^ (a>>16);
91 return hash(a) & (((unsigned) 1 << 31) - 1);
94 inline unsigned int hash2(
unsigned int a)
96 return (((
unsigned int) 1103515245 * a) + (
unsigned int) 12345) %
97 (
unsigned int) 0xFFFFFFFF;
101 inline bool LCAS(
long *ptr,
long oldv,
long newv) {
104 __asm__ __volatile__ (
108 :
"=q" (ret),
"=m" (*ptr)
109 :
"r" (newv),
"m" (*ptr),
"a" (oldv)
115 inline bool SCAS(
int *ptr,
int oldv,
int newv) {
118 __asm__ __volatile__ (
122 :
"=q" (ret),
"=m" (*ptr)
123 :
"r" (newv),
"m" (*ptr),
"a" (oldv)
131 inline bool CAS(ET *ptr, ET oldv, ET newv) {
132 if (
sizeof(ET) == 8) {
133 return utils::LCAS((
long*) ptr, *((
long*) &oldv), *((
long*) &newv));
134 }
else if (
sizeof(ET) == 4) {
135 return utils::SCAS((
int *) ptr, *((
int *) &oldv), *((
int *) &newv));
137 std::cout <<
"CAS bad length" << std::endl;
143 inline bool CAS_GCC(ET *ptr, ET oldv, ET newv) {
144 return __sync_bool_compare_and_swap(ptr, oldv, newv);
149 volatile ET newV, oldV;
151 do {oldV = *a; newV = oldV + b;}
152 while (!
CAS(a, oldV, newV));
158 volatile ET newV, oldV;
159 do {oldV = *a; newV = oldV + b;}
160 while (!
CAS(a, oldV, newV));
167 while (c < b && !(r=
CAS(a,c,b)));
175 while (c > b && !(r=
CAS(a,c,b)));
184 while (c > b && !(r=
CAS(a,c,b)));
201 struct maxF { E
operator() (
const E& a,
const E& b)
const {
return (a>b) ? a : b;}};
204 struct minF { E
operator() (
const E& a,
const E& b)
const {
return (a<b) ? a : b;}};
206 template <
class E1,
class E2>
209 template <
class E1,
class E2>
214 #endif // _BENCH_UTILS_INCLUDED
bool LCAS(long *ptr, long oldv, long newv)
bool writeMin(ET *a, ET b)
int hashInt(unsigned int a)
unsigned int hash2(unsigned int a)
bool SCAS(int *ptr, int oldv, int newv)
bool writeMax(ET *a, ET b)
bool CAS_GCC(ET *ptr, ET oldv, ET newv)
void writeAdd(ET *a, ET b)
bool CAS(ET *ptr, ET oldv, ET newv)
unsigned int hash(unsigned int a)
ET fetchAndAdd(ET *a, ET b)