I just tried to use __addl() on a volatile long, and had to call it like this: "__addl((long *)mypointer)" in order to cast away the volatileness.
Shouldn't the atomic intrinsics be declared with volatile parameters, since they're intended to be atomic operations?
This would apply to __add(), __addl(), __and(), __dec(), __inc(), __or(), __sub(), __subl(), __subr(), __subrl() and __xor().
Also, IMHO the bitwise intrinsics __or(), __xor(), and __and() should operate on unsigned int arguments rather than int arguments.