the various compareAndExchange intrinsics in aarch64.ad potentially clobber the address register:
;; cmpxchg {
0x0000007f88b5919c: ldxr w0, [x0]
0x0000007f88b591a0: cmp w0, w2
0x0000007f88b591a4: b.ne 0x0000007f88b591b0
0x0000007f88b591a8: stlxr w8, w3, [x0]
0x0000007f88b591ac: cbnz w8, 0x0000007f88b5919c
;; } cmpxchg
This is very bad because it's subsequently used (within the same instruction) for the store-exclusive. It results in occasional segfaults.
;; cmpxchg {
0x0000007f88b5919c: ldxr w0, [x0]
0x0000007f88b591a0: cmp w0, w2
0x0000007f88b591a4: b.ne 0x0000007f88b591b0
0x0000007f88b591a8: stlxr w8, w3, [x0]
0x0000007f88b591ac: cbnz w8, 0x0000007f88b5919c
;; } cmpxchg
This is very bad because it's subsequently used (within the same instruction) for the store-exclusive. It results in occasional segfaults.