troca atômica com CAS (usando os gins sync builtins)

A função compare-and-swap pode ser usada para trocar variáveis atomicamente? Estou usando C / C ++ via gcc no x86_64 RedHat Linux, especificamente os componentes __sync. Exemplo:

   int x = 0, y = 1; 
   y = __sync_val_compare_and_swap(&x, x, y);

Eu acho que isso se resume a saber se x pode mudar entre & x e x; por exemplo, se & x constitui uma operação, pode ser possível x mudar entre & x e x nos argumentos. Eu quero assumir que a comparação implícita acima sempre será verdadeira; minha pergunta é se eu posso. Obviamente, existe a versão bool do CAS, mas não consigo escrever o x antigo para y.

Um exemplo mais útil pode ser inserir ou remover do cabeçalho de uma lista vinculada (o gcc alega suporte a tipos de ponteiro, portanto, assuma que elem e head são):

   elem->next = __sync_val_compare_and_swap(&head, head, elem); //always inserts?
   elem = __sync_val_compare_and_swap(&head, head, elem->next); //always removes?

Referência:http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html