cosmopolitan/libc/intrin/aarch64/atomics.S
Justine Tunney 11d9fb521d
Make atomics faster on aarch64
This change implements the compiler runtime for ARM v8.1 ISE atomics and
gets rid of the mandatory -mno-outline-atomics flag. It can dramatically
speed things up, on newer ARM CPUs, as indicated by the changed lines in
test/libc/thread/footek_test.c. In llamafile dispatching on hwcap atomic
also shaved microseconds off synchronization barriers.
2024-08-16 11:14:46 -07:00

1919 lines
29 KiB
ArmAsm

// Copyright 2024 Justine Alexandra Roberts Tunney
//
// Permission to use, copy, modify, and/or distribute this software for
// any purpose with or without fee is hereby granted, provided that the
// above copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
// AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
// DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
// PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#include "libc/macros.h"
// aarch64 atomics compiler runtime
//
// armv8.1 introduced atomic instructions that go considerably faster.
// you can pass the -mno-outline-atomics flag to the compiler to avoid
// this runtime, however that'll go slower.
.arch armv8-a+lse
.macro .prvfn name
.privileged
.balign 16
\name:
.endm
.macro .begfn name
.section .text.\name,"ax",%progbits
.balign 16
.ftrace1
\name:
.ftrace2
.endm
.macro jnatom label
adrp x16,__aarch64_have_lse_atomics
ldrb w16,[x16,:lo12:__aarch64_have_lse_atomics]
cbz w16,\label
.endm
.begfn __aarch64_swp1_relax
jnatom 1f
swpb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
stxrb w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp1_relax,globl
.begfn __aarch64_swp1_acq
jnatom 1f
swpab w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
stxrb w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp1_acq,globl
.begfn __aarch64_swp1_rel
jnatom 1f
swplb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
stlxrb w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp1_rel,globl
.begfn __aarch64_swp1_acq_rel
jnatom 1f
swpalb w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
stlxrb w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp1_acq_rel,globl
.begfn __aarch64_swp1_sync
jnatom 1f
swpab w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
stxrb w17,w16,[x1]
cbnz w17,0b
dmb ish
ret
.endfn __aarch64_swp1_sync,globl
.begfn __aarch64_cas1_relax
jnatom 1f
casb w0,w1,[x2]
ret
1: uxtb w16,w0
0: ldxrb w0,[x2]
cmp w0,w16
bne 1f
stxrb w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas1_relax,globl
.begfn __aarch64_cas1_acq
jnatom 1f
casab w0,w1,[x2]
ret
1: uxtb w16,w0
0: ldaxrb w0,[x2]
cmp w0,w16
bne 1f
stxrb w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas1_acq,globl
.begfn __aarch64_cas1_rel
jnatom 1f
caslb w0,w1,[x2]
ret
1: uxtb w16,w0
0: ldxrb w0,[x2]
cmp w0,w16
bne 1f
stlxrb w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas1_rel,globl
.begfn __aarch64_cas1_acq_rel
jnatom 1f
casalb w0,w1,[x2]
ret
1: uxtb w16,w0
0: ldaxrb w0,[x2]
cmp w0,w16
bne 1f
stlxrb w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas1_acq_rel,globl
.begfn __aarch64_cas1_sync
jnatom 1f
casalb w0,w1,[x2]
ret
1: uxtb w16,w0
0: ldxrb w0,[x2]
cmp w0,w16
bne 1f
stlxrb w17,w1,[x2]
cbnz w17,0b
1: dmb ish
ret
.endfn __aarch64_cas1_sync,globl
.begfn __aarch64_ldadd1_relax
jnatom 1f
ldaddb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
add w17,w0,w16
stxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd1_relax,globl
.begfn __aarch64_ldadd1_acq
jnatom 1f
ldaddab w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
add w17,w0,w16
stxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd1_acq,globl
.begfn __aarch64_ldadd1_rel
jnatom 1f
ldaddlb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
add w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd1_rel,globl
.begfn __aarch64_ldadd1_acq_rel
jnatom 1f
ldaddalb w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
add w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd1_acq_rel,globl
.begfn __aarch64_ldadd1_sync
jnatom 1f
ldaddalb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
add w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldadd1_sync,globl
.begfn __aarch64_ldset1_relax
jnatom 1f
ldsetb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
orr w17,w0,w16
stxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset1_relax,globl
.begfn __aarch64_ldset1_acq
jnatom 1f
ldsetab w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
orr w17,w0,w16
stxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset1_acq,globl
.begfn __aarch64_ldset1_rel
jnatom 1f
ldsetlb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
orr w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset1_rel,globl
.begfn __aarch64_ldset1_acq_rel
jnatom 1f
ldsetalb w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
orr w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset1_acq_rel,globl
.begfn __aarch64_ldset1_sync
jnatom 1f
ldsetalb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
orr w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldset1_sync,globl
.begfn __aarch64_ldclr1_relax
jnatom 1f
ldclrb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
bic w17,w0,w16
stxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr1_relax,globl
.begfn __aarch64_ldclr1_acq
jnatom 1f
ldclrab w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
bic w17,w0,w16
stxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr1_acq,globl
.begfn __aarch64_ldclr1_rel
jnatom 1f
ldclrlb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
bic w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr1_rel,globl
.begfn __aarch64_ldclr1_acq_rel
jnatom 1f
ldclralb w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
bic w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr1_acq_rel,globl
.begfn __aarch64_ldclr1_sync
jnatom 1f
ldclralb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
bic w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldclr1_sync,globl
.begfn __aarch64_ldeor1_relax
jnatom 1f
ldeorb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
eor w17,w0,w16
stxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor1_relax,globl
.begfn __aarch64_ldeor1_acq
jnatom 1f
ldeorab w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
eor w17,w0,w16
stxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor1_acq,globl
.begfn __aarch64_ldeor1_rel
jnatom 1f
ldeorlb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
eor w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor1_rel,globl
.begfn __aarch64_ldeor1_acq_rel
jnatom 1f
ldeoralb w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrb w0,[x1]
eor w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor1_acq_rel,globl
.begfn __aarch64_ldeor1_sync
jnatom 1f
ldeoralb w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrb w0,[x1]
eor w17,w0,w16
stlxrb w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldeor1_sync,globl
.begfn __aarch64_swp2_relax
jnatom 1f
swph w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
stxrh w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp2_relax,globl
.begfn __aarch64_swp2_acq
jnatom 1f
swpah w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
stxrh w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp2_acq,globl
.begfn __aarch64_swp2_rel
jnatom 1f
swplh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
stlxrh w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp2_rel,globl
.begfn __aarch64_swp2_acq_rel
jnatom 1f
swpalh w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
stlxrh w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp2_acq_rel,globl
.begfn __aarch64_swp2_sync
jnatom 1f
swpah w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
stxrh w17,w16,[x1]
cbnz w17,0b
dmb ish
ret
.endfn __aarch64_swp2_sync,globl
.begfn __aarch64_cas2_relax
jnatom 1f
cash w0,w1,[x2]
ret
1: uxth w16,w0
0: ldxrh w0,[x2]
cmp w0,w16
bne 1f
stxrh w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas2_relax,globl
.begfn __aarch64_cas2_acq
jnatom 1f
casah w0,w1,[x2]
ret
1: uxth w16,w0
0: ldaxrh w0,[x2]
cmp w0,w16
bne 1f
stxrh w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas2_acq,globl
.begfn __aarch64_cas2_rel
jnatom 1f
caslh w0,w1,[x2]
ret
1: uxth w16,w0
0: ldxrh w0,[x2]
cmp w0,w16
bne 1f
stlxrh w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas2_rel,globl
.begfn __aarch64_cas2_acq_rel
jnatom 1f
casalh w0,w1,[x2]
ret
1: uxth w16,w0
0: ldaxrh w0,[x2]
cmp w0,w16
bne 1f
stlxrh w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas2_acq_rel,globl
.begfn __aarch64_cas2_sync
jnatom 1f
casalh w0,w1,[x2]
ret
1: uxth w16,w0
0: ldxrh w0,[x2]
cmp w0,w16
bne 1f
stlxrh w17,w1,[x2]
cbnz w17,0b
1: dmb ish
ret
.endfn __aarch64_cas2_sync,globl
.begfn __aarch64_ldadd2_relax
jnatom 1f
ldaddh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
add w17,w0,w16
stxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd2_relax,globl
.begfn __aarch64_ldadd2_acq
jnatom 1f
ldaddah w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
add w17,w0,w16
stxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd2_acq,globl
.begfn __aarch64_ldadd2_rel
jnatom 1f
ldaddlh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
add w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd2_rel,globl
.begfn __aarch64_ldadd2_acq_rel
jnatom 1f
ldaddalh w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
add w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd2_acq_rel,globl
.begfn __aarch64_ldadd2_sync
jnatom 1f
ldaddalh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
add w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldadd2_sync,globl
.begfn __aarch64_ldset2_relax
jnatom 1f
ldseth w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
orr w17,w0,w16
stxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset2_relax,globl
.begfn __aarch64_ldset2_acq
jnatom 1f
ldsetah w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
orr w17,w0,w16
stxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset2_acq,globl
.begfn __aarch64_ldset2_rel
jnatom 1f
ldsetlh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
orr w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset2_rel,globl
.begfn __aarch64_ldset2_acq_rel
jnatom 1f
ldsetalh w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
orr w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset2_acq_rel,globl
.begfn __aarch64_ldset2_sync
jnatom 1f
ldsetalh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
orr w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldset2_sync,globl
.begfn __aarch64_ldclr2_relax
jnatom 1f
ldclrh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
bic w17,w0,w16
stxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr2_relax,globl
.begfn __aarch64_ldclr2_acq
jnatom 1f
ldclrah w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
bic w17,w0,w16
stxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr2_acq,globl
.begfn __aarch64_ldclr2_rel
jnatom 1f
ldclrlh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
bic w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr2_rel,globl
.begfn __aarch64_ldclr2_acq_rel
jnatom 1f
ldclralh w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
bic w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr2_acq_rel,globl
.begfn __aarch64_ldclr2_sync
jnatom 1f
ldclralh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
bic w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldclr2_sync,globl
.begfn __aarch64_ldeor2_relax
jnatom 1f
ldeorh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
eor w17,w0,w16
stxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor2_relax,globl
.begfn __aarch64_ldeor2_acq
jnatom 1f
ldeorah w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
eor w17,w0,w16
stxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor2_acq,globl
.begfn __aarch64_ldeor2_rel
jnatom 1f
ldeorlh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
eor w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor2_rel,globl
.begfn __aarch64_ldeor2_acq_rel
jnatom 1f
ldeoralh w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxrh w0,[x1]
eor w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor2_acq_rel,globl
.begfn __aarch64_ldeor2_sync
jnatom 1f
ldeoralh w0,w0,[x1]
ret
1: mov w16,w0
0: ldxrh w0,[x1]
eor w17,w0,w16
stlxrh w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldeor2_sync,globl
.begfn __aarch64_swp4_relax
jnatom 1f
swp w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
stxr w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp4_relax,globl
.begfn __aarch64_swp4_acq
jnatom 1f
swpa w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
stxr w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp4_acq,globl
.begfn __aarch64_swp4_rel
jnatom 1f
swpl w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
stlxr w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp4_rel,globl
.begfn __aarch64_swp4_acq_rel
jnatom 1f
swpal w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
stlxr w17,w16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp4_acq_rel,globl
.begfn __aarch64_swp4_sync
jnatom 1f
swpa w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
stxr w17,w16,[x1]
cbnz w17,0b
dmb ish
ret
.endfn __aarch64_swp4_sync,globl
.begfn __aarch64_cas4_relax
jnatom 1f
cas w0,w1,[x2]
ret
1: mov w16,w0
0: ldxr w0,[x2]
cmp w0,w16
bne 1f
stxr w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas4_relax,globl
.begfn __aarch64_cas4_acq
jnatom 1f
casa w0,w1,[x2]
ret
1: mov w16,w0
0: ldaxr w0,[x2]
cmp w0,w16
bne 1f
stxr w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas4_acq,globl
.begfn __aarch64_cas4_rel
jnatom 1f
casl w0,w1,[x2]
ret
1: mov w16,w0
0: ldxr w0,[x2]
cmp w0,w16
bne 1f
stlxr w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas4_rel,globl
.begfn __aarch64_cas4_acq_rel
jnatom 1f
casal w0,w1,[x2]
ret
1: mov w16,w0
0: ldaxr w0,[x2]
cmp w0,w16
bne 1f
stlxr w17,w1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas4_acq_rel,globl
.begfn __aarch64_cas4_sync
jnatom 1f
casal w0,w1,[x2]
ret
1: mov w16,w0
0: ldxr w0,[x2]
cmp w0,w16
bne 1f
stlxr w17,w1,[x2]
cbnz w17,0b
1: dmb ish
ret
.endfn __aarch64_cas4_sync,globl
.begfn __aarch64_ldadd4_relax
jnatom 1f
ldadd w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
add w17,w0,w16
stxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd4_relax,globl
.begfn __aarch64_ldadd4_acq
jnatom 1f
ldadda w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
add w17,w0,w16
stxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd4_acq,globl
.begfn __aarch64_ldadd4_rel
jnatom 1f
ldaddl w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
add w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd4_rel,globl
.begfn __aarch64_ldadd4_acq_rel
jnatom 1f
ldaddal w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
add w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd4_acq_rel,globl
.begfn __aarch64_ldadd4_sync
jnatom 1f
ldaddal w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
add w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldadd4_sync,globl
.begfn __aarch64_ldset4_relax
jnatom 1f
ldset w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
orr w17,w0,w16
stxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset4_relax,globl
.begfn __aarch64_ldset4_acq
jnatom 1f
ldseta w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
orr w17,w0,w16
stxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset4_acq,globl
.begfn __aarch64_ldset4_rel
jnatom 1f
ldsetl w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
orr w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset4_rel,globl
.begfn __aarch64_ldset4_acq_rel
jnatom 1f
ldsetal w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
orr w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset4_acq_rel,globl
.begfn __aarch64_ldset4_sync
jnatom 1f
ldsetal w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
orr w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldset4_sync,globl
.begfn __aarch64_ldclr4_relax
jnatom 1f
ldclr w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
bic w17,w0,w16
stxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr4_relax,globl
.begfn __aarch64_ldclr4_acq
jnatom 1f
ldclra w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
bic w17,w0,w16
stxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr4_acq,globl
.begfn __aarch64_ldclr4_rel
jnatom 1f
ldclrl w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
bic w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr4_rel,globl
.begfn __aarch64_ldclr4_acq_rel
jnatom 1f
ldclral w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
bic w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr4_acq_rel,globl
.begfn __aarch64_ldclr4_sync
jnatom 1f
ldclral w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
bic w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldclr4_sync,globl
.begfn __aarch64_ldeor4_relax
jnatom 1f
ldeor w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
eor w17,w0,w16
stxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor4_relax,globl
.begfn __aarch64_ldeor4_acq
jnatom 1f
ldeora w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
eor w17,w0,w16
stxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor4_acq,globl
.begfn __aarch64_ldeor4_rel
jnatom 1f
ldeorl w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
eor w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor4_rel,globl
.begfn __aarch64_ldeor4_acq_rel
jnatom 1f
ldeoral w0,w0,[x1]
ret
1: mov w16,w0
0: ldaxr w0,[x1]
eor w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor4_acq_rel,globl
.begfn __aarch64_ldeor4_sync
jnatom 1f
ldeoral w0,w0,[x1]
ret
1: mov w16,w0
0: ldxr w0,[x1]
eor w17,w0,w16
stlxr w15,w17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldeor4_sync,globl
.begfn __aarch64_swp8_relax
jnatom 1f
swp x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
stxr w17,x16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp8_relax,globl
.begfn __aarch64_swp8_acq
jnatom 1f
swpa x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
stxr w17,x16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp8_acq,globl
.begfn __aarch64_swp8_rel
jnatom 1f
swpl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
stlxr w17,x16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp8_rel,globl
.begfn __aarch64_swp8_acq_rel
jnatom 1f
swpal x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
stlxr w17,x16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp8_acq_rel,globl
.begfn __aarch64_swp8_sync
jnatom 1f
swpa x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
stxr w17,x16,[x1]
cbnz w17,0b
dmb ish
ret
.endfn __aarch64_swp8_sync,globl
.prvfn __aarch64_cas8_relax
jnatom 1f
cas x0,x1,[x2]
ret
1: mov x16,x0
0: ldxr x0,[x2]
cmp x0,x16
bne 1f
stxr w17,x1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas8_relax,globl
.prvfn __aarch64_cas8_acq
jnatom 1f
casa x0,x1,[x2]
ret
1: mov x16,x0
0: ldaxr x0,[x2]
cmp x0,x16
bne 1f
stxr w17,x1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas8_acq,globl
.prvfn __aarch64_cas8_rel
jnatom 1f
casl x0,x1,[x2]
ret
1: mov x16,x0
0: ldxr x0,[x2]
cmp x0,x16
bne 1f
stlxr w17,x1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas8_rel,globl
.begfn __aarch64_cas8_acq_rel
jnatom 1f
casal x0,x1,[x2]
ret
1: mov x16,x0
0: ldaxr x0,[x2]
cmp x0,x16
bne 1f
stlxr w17,x1,[x2]
cbnz w17,0b
1: ret
.endfn __aarch64_cas8_acq_rel,globl
.begfn __aarch64_cas8_sync
jnatom 1f
casal x0,x1,[x2]
ret
1: mov x16,x0
0: ldxr x0,[x2]
cmp x0,x16
bne 1f
stlxr w17,x1,[x2]
cbnz w17,0b
1: dmb ish
ret
.endfn __aarch64_cas8_sync,globl
.begfn __aarch64_ldadd8_relax
jnatom 1f
ldadd x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
add x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd8_relax,globl
.begfn __aarch64_ldadd8_acq
jnatom 1f
ldadda x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
add x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd8_acq,globl
.begfn __aarch64_ldadd8_rel
jnatom 1f
ldaddl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
add x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd8_rel,globl
.begfn __aarch64_ldadd8_acq_rel
jnatom 1f
ldaddal x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
add x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd8_acq_rel,globl
.begfn __aarch64_ldadd8_sync
jnatom 1f
ldaddal x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
add x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldadd8_sync,globl
.begfn __aarch64_ldset8_relax
jnatom 1f
ldset x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
orr x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset8_relax,globl
.begfn __aarch64_ldset8_acq
jnatom 1f
ldseta x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
orr x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset8_acq,globl
.begfn __aarch64_ldset8_rel
jnatom 1f
ldsetl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
orr x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset8_rel,globl
.begfn __aarch64_ldset8_acq_rel
jnatom 1f
ldsetal x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
orr x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset8_acq_rel,globl
.begfn __aarch64_ldset8_sync
jnatom 1f
ldsetal x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
orr x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldset8_sync,globl
.begfn __aarch64_ldclr8_relax
jnatom 1f
ldclr x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
bic x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr8_relax,globl
.begfn __aarch64_ldclr8_acq
jnatom 1f
ldclra x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
bic x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr8_acq,globl
.begfn __aarch64_ldclr8_rel
jnatom 1f
ldclrl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
bic x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr8_rel,globl
.begfn __aarch64_ldclr8_acq_rel
jnatom 1f
ldclral x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
bic x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr8_acq_rel,globl
.begfn __aarch64_ldclr8_sync
jnatom 1f
ldclral x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
bic x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldclr8_sync,globl
.begfn __aarch64_ldeor8_relax
jnatom 1f
ldeor x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
eor x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor8_relax,globl
.begfn __aarch64_ldeor8_acq
jnatom 1f
ldeora x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
eor x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor8_acq,globl
.begfn __aarch64_ldeor8_rel
jnatom 1f
ldeorl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
eor x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor8_rel,globl
.begfn __aarch64_ldeor8_acq_rel
jnatom 1f
ldeoral x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
eor x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor8_acq_rel,globl
.begfn __aarch64_ldeor8_sync
jnatom 1f
ldeoral x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
eor x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldeor8_sync,globl
.begfn __aarch64_swp16_relax
jnatom 1f
swp x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
stxr w17,x16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp16_relax,globl
.begfn __aarch64_swp16_acq
jnatom 1f
swpa x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
stxr w17,x16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp16_acq,globl
.begfn __aarch64_swp16_rel
jnatom 1f
swpl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
stlxr w17,x16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp16_rel,globl
.begfn __aarch64_swp16_acq_rel
jnatom 1f
swpal x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
stlxr w17,x16,[x1]
cbnz w17,0b
ret
.endfn __aarch64_swp16_acq_rel,globl
.begfn __aarch64_swp16_sync
jnatom 1f
swpa x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
stxr w17,x16,[x1]
cbnz w17,0b
dmb ish
ret
.endfn __aarch64_swp16_sync,globl
.begfn __aarch64_cas16_relax
jnatom 1f
casp x0,x1,x2,x3,[x4]
ret
1: mov x16,x0
mov x17,x1
0: ldxp x0,x1,[x4]
cmp x0,x16
ccmp x1,x17,#0,eq
csel x15,x2,x0,eq
csel x14,x3,x1,eq
stxp w13,x15,x14,[x4]
cbnz w13,0b
ret
.endfn __aarch64_cas16_relax,globl
.begfn __aarch64_cas16_acq
jnatom 1f
caspa x0,x1,x2,x3,[x4]
ret
1: mov x16,x0
mov x17,x1
0: ldaxp x0,x1,[x4]
cmp x0,x16
ccmp x1,x17,#0,eq
csel x15,x2,x0,eq
csel x14,x3,x1,eq
stxp w13,x15,x14,[x4]
cbnz w13,0b
ret
.endfn __aarch64_cas16_acq,globl
.begfn __aarch64_cas16_rel
jnatom 1f
caspl x0,x1,x2,x3,[x4]
ret
1: mov x16,x0
mov x17,x1
0: ldxp x0,x1,[x4]
cmp x0,x16
ccmp x1,x17,#0,eq
csel x15,x2,x0,eq
csel x14,x3,x1,eq
stlxp w13,x15,x14,[x4]
cbnz w13,0b
ret
.endfn __aarch64_cas16_rel,globl
.begfn __aarch64_cas16_acq_rel
jnatom 1f
caspal x0,x1,x2,x3,[x4]
ret
1: mov x16,x0
mov x17,x1
0: ldaxp x0,x1,[x4]
cmp x0,x16
ccmp x1,x17,#0,eq
csel x15,x2,x0,eq
csel x14,x3,x1,eq
stlxp w13,x15,x14,[x4]
cbnz w13,0b
ret
.endfn __aarch64_cas16_acq_rel,globl
.begfn __aarch64_cas16_sync
jnatom 1f
caspal x0,x1,x2,x3,[x4]
ret
1: mov x16,x0
mov x17,x1
0: ldxp x0,x1,[x4]
cmp x0,x16
ccmp x1,x17,#0,eq
csel x15,x2,x0,eq
csel x14,x3,x1,eq
stlxp w13,x15,x14,[x4]
cbnz w13,0b
dmb ish
ret
.endfn __aarch64_cas16_sync,globl
.begfn __aarch64_ldadd16_relax
jnatom 1f
ldadd x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
add x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd16_relax,globl
.begfn __aarch64_ldadd16_acq
jnatom 1f
ldadda x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
add x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd16_acq,globl
.begfn __aarch64_ldadd16_rel
jnatom 1f
ldaddl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
add x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd16_rel,globl
.begfn __aarch64_ldadd16_acq_rel
jnatom 1f
ldaddal x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
add x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldadd16_acq_rel,globl
.begfn __aarch64_ldadd16_sync
jnatom 1f
ldaddal x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
add x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldadd16_sync,globl
.begfn __aarch64_ldset16_relax
jnatom 1f
ldset x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
orr x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset16_relax,globl
.begfn __aarch64_ldset16_acq
jnatom 1f
ldseta x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
orr x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset16_acq,globl
.begfn __aarch64_ldset16_rel
jnatom 1f
ldsetl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
orr x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset16_rel,globl
.begfn __aarch64_ldset16_acq_rel
jnatom 1f
ldsetal x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
orr x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldset16_acq_rel,globl
.begfn __aarch64_ldset16_sync
jnatom 1f
ldsetal x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
orr x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldset16_sync,globl
.begfn __aarch64_ldclr16_relax
jnatom 1f
ldclr x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
bic x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr16_relax,globl
.begfn __aarch64_ldclr16_acq
jnatom 1f
ldclra x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
bic x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr16_acq,globl
.begfn __aarch64_ldclr16_rel
jnatom 1f
ldclrl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
bic x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr16_rel,globl
.begfn __aarch64_ldclr16_acq_rel
jnatom 1f
ldclral x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
bic x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldclr16_acq_rel,globl
.begfn __aarch64_ldclr16_sync
jnatom 1f
ldclral x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
bic x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldclr16_sync,globl
.begfn __aarch64_ldeor16_relax
jnatom 1f
ldeor x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
eor x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor16_relax,globl
.begfn __aarch64_ldeor16_acq
jnatom 1f
ldeora x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
eor x17,x0,x16
stxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor16_acq,globl
.begfn __aarch64_ldeor16_rel
jnatom 1f
ldeorl x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
eor x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor16_rel,globl
.begfn __aarch64_ldeor16_acq_rel
jnatom 1f
ldeoral x0,x0,[x1]
ret
1: mov x16,x0
0: ldaxr x0,[x1]
eor x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
ret
.endfn __aarch64_ldeor16_acq_rel,globl
.begfn __aarch64_ldeor16_sync
jnatom 1f
ldeoral x0,x0,[x1]
ret
1: mov x16,x0
0: ldxr x0,[x1]
eor x17,x0,x16
stlxr w15,x17,[x1]
cbnz w15,0b
dmb ish
ret
.endfn __aarch64_ldeor16_sync,globl