Christoph Lameter wrote on Thursday, June 15, 2006 1:36 PM > I just looked at at the asm generated by some of the use of atomic for > statistics and saw that there were complicated compxchg constructs where I > would have expected a simple fetchadd. Why is this? > > F.e. > > static __inline__ int > ia64_atomic_add (int i, atomic_t *v) > { > __s32 old, new; > CMPXCHG_BUGCHECK_DECL > > do { > CMPXCHG_BUGCHECK(v); > old = atomic_read(v); > new = old + i; > } while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic_t)) != old); > return new; > } > > Why not > > #define ia64_atomic_add(__i, __v) ia64_fetchadd(__i, &v->counter, acq) The immediate operand of fetchadd only takes limited value, so it would have to be a combination of fetchadd and cmpxchg. If the constant is known at compile time, it can be optimized for those constants that fetchadd can operate on. Back to your original question, I guess whoever implements ia64_atomic_add didn't bother to optimize it like it's close cousin of atomic_add(). - Ken - : send the line "unsubscribe linux-ia64" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |