|
|
|
@ -35,6 +35,7 @@ inline int atom_write(atom_t *atom, int val)
|
|
|
|
|
" mov (%2), %0 \n" /* eax = atom->_value */
|
|
|
|
|
"1: lock \n"
|
|
|
|
|
" cmpxchgl %1, (%2) \n" /* if (atom->_value == eax) atom->_value = val */
|
|
|
|
|
" pause \n" /* intel says you're supposed to do this in spin loops */
|
|
|
|
|
" jne 1b \n" /* else goto 1 (eax updated to new atom->_value) */
|
|
|
|
|
: "=a"(eax)
|
|
|
|
|
: "r"(val), "r"(&atom->_value)
|
|
|
|
@ -112,7 +113,7 @@ inline bool atom_dec(atom_t *atom)
|
|
|
|
|
" lock \n"
|
|
|
|
|
" decl (%1) \n"
|
|
|
|
|
" setne %0 \n"
|
|
|
|
|
: "+r"(nonzero) /* read+write to ensure the initial value isn't optimized out */
|
|
|
|
|
: "+r"(nonzero) /* read+write to ensure the initializer isn't optimized out */
|
|
|
|
|
: "r"(&atom->_value)
|
|
|
|
|
: "cc", "memory"
|
|
|
|
|
);
|
|
|
|
@ -136,6 +137,7 @@ inline int atom_and(atom_t *atom, int val)
|
|
|
|
|
"1: andl %0, %1 \n" /* val &= eax */
|
|
|
|
|
" lock \n"
|
|
|
|
|
" cmpxchgl %1, (%2) \n" /* if (atom->_value == eax) atom->_value = val */
|
|
|
|
|
" pause \n" /* intel says you're supposed to do this in spin loops */
|
|
|
|
|
" jne 1b \n" /* else goto 1 (eax updated to new atom->_value) */
|
|
|
|
|
: "=a"(eax), "+r"(val)
|
|
|
|
|
: "r"(&atom->_value)
|
|
|
|
@ -161,6 +163,7 @@ inline int atom_or(atom_t *atom, int val)
|
|
|
|
|
"1: orl %0, %1 \n" /* val |= eax */
|
|
|
|
|
" lock \n"
|
|
|
|
|
" cmpxchgl %1, (%2) \n" /* if (atom->_value == eax) atom->_value = eax */
|
|
|
|
|
" pause \n" /* intel says you're supposed to do this in spin loops */
|
|
|
|
|
" jne 1b \n" /* else goto 1 (eax updated to new atom->_value) */
|
|
|
|
|
: "=a"(eax), "+r"(val)
|
|
|
|
|
: "r"(&atom->_value)
|
|
|
|
@ -186,6 +189,7 @@ inline int atom_xor(atom_t *atom, int val)
|
|
|
|
|
"1: xorl %0, %1 \n" /* val ^= eax */
|
|
|
|
|
" lock \n"
|
|
|
|
|
" cmpxchgl %1, (%2) \n" /* if (atom->_value == eax) atom->_value = eax */
|
|
|
|
|
" pause \n" /* intel says you're supposed to do this in spin loops */
|
|
|
|
|
" jne 1b \n" /* else goto 1 (eax updated to new atom->_value) */
|
|
|
|
|
: "=a"(eax), "+r"(val)
|
|
|
|
|
: "r"(&atom->_value)
|
|
|
|
|