$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Tomas Puverle (Tomas.Puverle_at_[hidden])
Date: 2006-07-03 09:05:36
> inline long compare_exchange(long* v, const long c, const long n) {
>
> long r;
>
> #ifdef __arch64__
>
> // UltraSparc 64-bit variant
>
> __asm__ __volatile__("casx [%2], %3, %0 \t\n" \
> " \t\n"
> : "=&r"(r), "=m"(*v)
> : "r"(v), "r"(c), "0"(n), "m"(*v)
> :);
> #else
>
> // Legacy 32-bit variant
>
> __asm__ __volatile__("cas [%2], %3, %0 \t\n" \
> " \t\n"
> : "=&r"(r), "=m"(*v)
> : "r"(v), "r"(c), "0"(n), "m"(*v)
> :);
Here's my version:
inline uint32_t compareAndSwap(uint32_t * dest_, uint32_t compare_, uint32_t
swap_)
{
__asm__ __volatile__("cas %0, %1, %2 \n\t"
: "+m" (*dest_), "+r" (compare_)
: "r" (swap_)
: );
return compare_;
}
inline uint64_t compareAndSwap(uint64_t * dest_, uint64_t compare_, uint64_t
swap_)
{
__asm__ __volatile__("casx %0, %1, %2 \n\t"
: "+m" (*dest_), "+r" (compare_)
: "r" (swap_)
: );
return compare_;
}
I also have these intrinsics for the Sunpro compiler. The only problem is
that with Sunpro, these have to come in a separate .il file, which has to be
included on the compile line at the same time as the .cpp being compiled.
Tom