//---------------------------------------------------------------------------
IMPLEMENTATION:
-template< typename Type > inline
+template< typename Type > inline
bool
-cas (Type *ptr, Type oldval, Type newval)
+cas(Type *ptr, Type oldval, Type newval)
{
MACRO_CAS_ASSERT(sizeof(Type),sizeof(Mword));
- return cas_unsafe (reinterpret_cast<Mword*>(ptr),
- (Mword)oldval, (Mword)newval);
+ return cas_unsafe(reinterpret_cast<Mword*>(ptr),
+ (Mword)oldval, (Mword)newval);
}
-template< typename Type > inline
+template< typename Type > inline
bool
-cas2 (Type *ptr, Type *oldval, Type *newval)
+cas2(Type *ptr, Type *oldval, Type *newval)
{
MACRO_CAS_ASSERT(sizeof(Type),(sizeof(Mword)*2));
- return cas2_unsafe (reinterpret_cast<Mword*>(ptr),
- reinterpret_cast<Mword*>(oldval),
- reinterpret_cast<Mword*>(newval));
+ return cas2_unsafe(reinterpret_cast<Mword*>(ptr),
+ reinterpret_cast<Mword*>(oldval),
+ reinterpret_cast<Mword*>(newval));
}
template <typename T> inline
{
old = *ptr;
}
- while (! cas (ptr, old, (old & mask) | bits));
+ while (!cas(ptr, old, (old & mask) | bits));
return old;
}
inline
void
-atomic_mp_add (Mword *l, Mword value)
+atomic_mp_add(Mword *l, Mword value)
{
asm volatile ("lock; addl %1, %2" : "=m"(*l) : "ir"(value), "m"(*l));
}
inline
void
-atomic_add (Mword *l, Mword value)
+atomic_add(Mword *l, Mword value)
{
asm volatile ("addl %1, %2" : "=m"(*l) : "ir"(value), "m"(*l));
}
inline
void
-atomic_and (Mword *l, Mword mask)
+atomic_and(Mword *l, Mword mask)
{
asm volatile ("andl %1, %2" : "=m"(*l) : "ir"(mask), "m"(*l));
}
inline
void
-atomic_or (Mword *l, Mword bits)
+atomic_or(Mword *l, Mword bits)
{
asm volatile ("orl %1, %2" : "=m"(*l) : "ir"(bits), "m"(*l));
}
inline
bool
-cas_unsafe (Mword *ptr, Mword oldval, Mword newval)
+cas_unsafe(Mword *ptr, Mword oldval, Mword newval)
{
Mword tmp;
inline
bool
-cas2_unsafe (Mword *ptr, Mword *oldval, Mword *newval)
+cas2_unsafe(Mword *ptr, Mword *oldval, Mword *newval)
{
char ret;
asm volatile
inline
bool
-mp_cas2_arch (char *m, Mword o1, Mword o2, Mword n1, Mword n2)
+mp_cas2_arch(char *m, Mword o1, Mword o2, Mword n1, Mword n2)
{
char ret;
asm volatile
}
inline
bool
-tas (Mword *l)
+tas(Mword *l)
{
Mword tmp;
asm volatile ("xchg %0, %1" : "=r"(tmp) : "m"(*l), "0"(1) : "memory");
inline NEEDS["processor.h"]
void
-atomic_mp_add (Mword *l, Mword value)
+atomic_mp_add(Mword *l, Mword value)
{
Proc::Status s = Proc::cli_save();
*l += value;
inline
void
-atomic_mp_add (Mword *l, Mword value)
+atomic_mp_add(Mword *l, Mword value)
{
Mword tmp, ret;
Mword tmp, res;
asm volatile
- ("ldrex %[tmp], [%[m]] \n"
- "mov %[res], #1 \n"
+ ("mov %[res], #1 \n"
+ "1: \n"
+ "ldr %[tmp], [%[m]] \n"
+ "teq %[tmp], %[o] \n"
+ "bne 2f \n"
+ "ldrex %[tmp], [%[m]] \n"
"teq %[tmp], %[o] \n"
"strexeq %[res], %[n], [%[m]] \n"
+ "teq %[res], #1 \n"
+ "beq 1b \n"
+ "2: \n"
: [tmp] "=&r" (tmp), [res] "=&r" (res), "+m" (*m)
: [n] "r" (n), [m] "r" (m), [o] "r" (o)
: "cc");
inline
bool
-mp_cas2_arch (char *m, Mword o1, Mword o2, Mword n1, Mword n2)
+mp_cas2_arch(char *m, Mword o1, Mword o2, Mword n1, Mword n2)
{
register Mword _n1 asm("r6") = n1;
register Mword _n2 asm("r7") = n2;
Mword res;
asm volatile
- ("ldrexd %[tmp1], [%[m]] \n"
+ ("mov %[res], #1 \n"
+ "1: \n"
+ "ldrd %[tmp1], [%[m]] \n"
+ "teq %[tmp1], %[o1] \n"
+ "teqeq %[tmp2], %[o2] \n"
+ "bne 2f \n"
+ "ldrexd %[tmp1], [%[m]] \n"
"mov %[res], #1 \n"
"teq %[tmp1], %[o1] \n"
"teqeq %[tmp2], %[o2] \n"
"strexdeq %[res], %[n1], [%[m]] \n"
+ "teq %[res], #1 \n"
+ "beq 1b \n"
+ "2: \n"
: [tmp1] "=r" (tmp1), [tmp2] "=r" (tmp2),
[res] "=&r" (res), "+m" (*m), "+m" (*(m + 1))
: "0" (tmp1), "1" (tmp2),
template< typename T > inline
bool
-mp_cas (T *m, T o, T n)
+mp_cas(T *m, T o, T n)
{
MACRO_CAS_ASSERT(sizeof(T),sizeof(Mword));
return mp_cas_arch(reinterpret_cast<Mword*>(m),
template< typename T, typename T2 > inline
bool
-mp_cas2 (Pair<T,T2> *m, T o1, T2 o2, T n1, T2 n2)
+mp_cas2(Pair<T,T2> *m, T o1, T2 o2, T n1, T2 n2)
{
MACRO_CAS_ASSERT(sizeof(T),sizeof(Mword));
MACRO_CAS_ASSERT(sizeof(T2),sizeof(Mword));
template< typename T > inline
bool
-mp_cas (T *m, T o, T n)
+mp_cas(T *m, T o, T n)
{ return cas(m,o,n); }