[# atomic exchange: values swap in one indivisible step, and a spinlock
built from exchange orders two workers around a shared counter #]
make int64 counter
make int64 lock
make int64 probe
make string "\n" nl
define worker
make int64 k
set 0
move k
write
mark w
move k
read
compare 100
jump done when greater-or-equal
mark again
set 1
move lock
exchange
compare 0
jump again when different
move counter
read
add 1
move counter
write
set 0
move lock
exchange
set 0
move k
read
add 1
move k
write
set 0
jump w
mark done
return
end
define main
set 5
move probe
write
set 9
move probe
exchange
output
address nl
output text
move probe
read
output
address nl
output text
spawn worker
spawn worker
wait
move counter
read
output
address nl
output text
return
end