Атомарные операции на PowerPC

PowerPC является RISC процессором, поэтому он не можем напрямую модифицировать переменные в памяти. Хотя CISC процессоры и предоставляют такие инструкции (например incl some_variable), не факт что они являются атомарными.

Типичный цикл изменения переменной для RISC процессоров выглядит примерно так (опустим кэши CPU):
load general_register, variable
add general_register, $1
store general_register, variable

В такой ситуации очень легко проявляются так называемые race conditions, т.е. состояния гонок. Собственно результат операции _может зависеть_ от того кто был последним в случае одновременного доступа.
PowerPC не предоставляет таких штук как сигнал LOCK у x86. lwarx/stwcx - две инструкции с помощью которых можно выполнить атомарные операции.

(Это такое соглашение (ABI) использовать регистры, начиная с регистра r3)
loop:
lwarx r3,0,(r4) ;; загрузить в регистр r3 то что находится по адресу в r4 + отслеживать доступ к адресу в r4
addi r3,r3,1 ;; увеличить значение на 1
stwcx r3,0,(r4) ;; _попробовать_ загрузить модифицированное значение обратно в память
bne- loop ;; если кто-то еще пытался модифицировать переменную, то пробуем опять.

Я написал попробовать загрузить значение обратн не просто так. С помощью инструкции lwarx (Load Word and Reserve Index) мы помечаем память особым образом (который называется Reservation). Если после интсрукции lwarx кто-то еще пытался модифицировать значение переменной (это могли быть и мы сами, мы были реентерантны например :) ), мы фиксируем этот факт установкой нулевого бита в регистре статуса {CR0[EQ]} (это делает интсрукция stwcx.) bne тестирует этот бит и в случае мофификации памяти еще кем-то прыгает назад на метку loop.