392 |
#ifdef __i386__ |
#ifdef __i386__ |
393 |
static inline int testandset (int *p) |
static inline int testandset (int *p) |
394 |
{ |
{ |
395 |
char ret; |
long int readval = 0; |
|
long int readval; |
|
396 |
|
|
397 |
__asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0" |
__asm__ __volatile__ ("lock; cmpxchgl %2, %0" |
398 |
: "=q" (ret), "=m" (*p), "=a" (readval) |
: "+m" (*p), "+a" (readval) |
399 |
: "r" (1), "m" (*p), "a" (0) |
: "r" (1) |
400 |
: "memory"); |
: "cc"); |
401 |
return ret; |
return readval; |
402 |
} |
} |
403 |
#endif |
#endif |
404 |
|
|
405 |
#ifdef __x86_64__ |
#ifdef __x86_64__ |
406 |
static inline int testandset (int *p) |
static inline int testandset (int *p) |
407 |
{ |
{ |
408 |
char ret; |
long int readval = 0; |
|
int readval; |
|
409 |
|
|
410 |
__asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0" |
__asm__ __volatile__ ("lock; cmpxchgl %2, %0" |
411 |
: "=q" (ret), "=m" (*p), "=a" (readval) |
: "+m" (*p), "+a" (readval) |
412 |
: "r" (1), "m" (*p), "a" (0) |
: "r" (1) |
413 |
: "memory"); |
: "cc"); |
414 |
return ret; |
return readval; |
415 |
} |
} |
416 |
#endif |
#endif |
417 |
|
|
482 |
: "=r" (ret) |
: "=r" (ret) |
483 |
: "m" (p) |
: "m" (p) |
484 |
: "cc","memory"); |
: "cc","memory"); |
485 |
return ret == 0; |
return ret; |
486 |
} |
} |
487 |
#endif |
#endif |
488 |
|
|