blob: 83e383f335637cdf86ca77ae6323216a3d7c8b2d [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"
; The base test file was generated by ./llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lse2,+lse128 -O0 | FileCheck %s --check-prefixes=CHECK,-O0
; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lse2,+lse128 -O1 | FileCheck %s --check-prefixes=CHECK,-O1
define dso_local i8 @atomicrmw_xchg_i8_aligned_monotonic(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_aligned_monotonic:
; CHECK: swpb w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_xchg_i8_aligned_acquire(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_aligned_acquire:
; CHECK: swpab w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_xchg_i8_aligned_release(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_aligned_release:
; CHECK: swplb w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_xchg_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_aligned_acq_rel:
; CHECK: swpalb w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_xchg_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_aligned_seq_cst:
; CHECK: swpalb w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_xchg_i16_aligned_monotonic(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_aligned_monotonic:
; CHECK: swph w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i16 %value monotonic, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_xchg_i16_aligned_acquire(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_aligned_acquire:
; CHECK: swpah w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i16 %value acquire, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_xchg_i16_aligned_release(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_aligned_release:
; CHECK: swplh w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i16 %value release, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_xchg_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_aligned_acq_rel:
; CHECK: swpalh w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i16 %value acq_rel, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_xchg_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_aligned_seq_cst:
; CHECK: swpalh w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i16 %value seq_cst, align 2
ret i16 %r
}
define dso_local i32 @atomicrmw_xchg_i32_aligned_monotonic(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_aligned_monotonic:
; CHECK: swp w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i32 %value monotonic, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_xchg_i32_aligned_acquire(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_aligned_acquire:
; CHECK: swpa w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i32 %value acquire, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_xchg_i32_aligned_release(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_aligned_release:
; CHECK: swpl w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i32 %value release, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_xchg_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_aligned_acq_rel:
; CHECK: swpal w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i32 %value acq_rel, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_xchg_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_aligned_seq_cst:
; CHECK: swpal w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i32 %value seq_cst, align 4
ret i32 %r
}
define dso_local i64 @atomicrmw_xchg_i64_aligned_monotonic(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_aligned_monotonic:
; CHECK: swp x1, x0, [x0]
%r = atomicrmw xchg ptr %ptr, i64 %value monotonic, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_xchg_i64_aligned_acquire(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_aligned_acquire:
; CHECK: swpa x1, x0, [x0]
%r = atomicrmw xchg ptr %ptr, i64 %value acquire, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_xchg_i64_aligned_release(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_aligned_release:
; CHECK: swpl x1, x0, [x0]
%r = atomicrmw xchg ptr %ptr, i64 %value release, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_xchg_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_aligned_acq_rel:
; CHECK: swpal x1, x0, [x0]
%r = atomicrmw xchg ptr %ptr, i64 %value acq_rel, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_xchg_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_aligned_seq_cst:
; CHECK: swpal x1, x0, [x0]
%r = atomicrmw xchg ptr %ptr, i64 %value seq_cst, align 8
ret i64 %r
}
define dso_local i128 @atomicrmw_xchg_i128_aligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_xchg_i128_aligned_monotonic:
; -O0: swpp x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_xchg_i128_aligned_monotonic:
; -O1: swpp x2, x1, [x0]
%r = atomicrmw xchg ptr %ptr, i128 %value monotonic, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_xchg_i128_aligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_xchg_i128_aligned_acquire:
; -O0: swppa x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_xchg_i128_aligned_acquire:
; -O1: swppa x2, x1, [x0]
%r = atomicrmw xchg ptr %ptr, i128 %value acquire, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_xchg_i128_aligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_xchg_i128_aligned_release:
; -O0: swppl x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_xchg_i128_aligned_release:
; -O1: swppl x2, x1, [x0]
%r = atomicrmw xchg ptr %ptr, i128 %value release, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_xchg_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_xchg_i128_aligned_acq_rel:
; -O0: swppal x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_xchg_i128_aligned_acq_rel:
; -O1: swppal x2, x1, [x0]
%r = atomicrmw xchg ptr %ptr, i128 %value acq_rel, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_xchg_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_xchg_i128_aligned_seq_cst:
; -O0: swppal x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_xchg_i128_aligned_seq_cst:
; -O1: swppal x2, x1, [x0]
%r = atomicrmw xchg ptr %ptr, i128 %value seq_cst, align 16
ret i128 %r
}
define dso_local i8 @atomicrmw_xchg_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_monotonic:
; CHECK: swpb w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_xchg_i8_unaligned_acquire(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_acquire:
; CHECK: swpab w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_xchg_i8_unaligned_release(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_release:
; CHECK: swplb w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_xchg_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_acq_rel:
; CHECK: swpalb w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_xchg_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_xchg_i8_unaligned_seq_cst:
; CHECK: swpalb w1, w0, [x0]
%r = atomicrmw xchg ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_xchg_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_monotonic:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i16 %value monotonic, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_xchg_i16_unaligned_acquire(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_acquire:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i16 %value acquire, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_xchg_i16_unaligned_release(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_release:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i16 %value release, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_xchg_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_acq_rel:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i16 %value acq_rel, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_xchg_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_xchg_i16_unaligned_seq_cst:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i16 %value seq_cst, align 1
ret i16 %r
}
define dso_local i32 @atomicrmw_xchg_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_monotonic:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i32 %value monotonic, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_xchg_i32_unaligned_acquire(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_acquire:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i32 %value acquire, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_xchg_i32_unaligned_release(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_release:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i32 %value release, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_xchg_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_acq_rel:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i32 %value acq_rel, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_xchg_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_xchg_i32_unaligned_seq_cst:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i32 %value seq_cst, align 1
ret i32 %r
}
define dso_local i64 @atomicrmw_xchg_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_monotonic:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i64 %value monotonic, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_xchg_i64_unaligned_acquire(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_acquire:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i64 %value acquire, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_xchg_i64_unaligned_release(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_release:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i64 %value release, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_xchg_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_acq_rel:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i64 %value acq_rel, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_xchg_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_xchg_i64_unaligned_seq_cst:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i64 %value seq_cst, align 1
ret i64 %r
}
define dso_local i128 @atomicrmw_xchg_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_monotonic:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i128 %value monotonic, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_xchg_i128_unaligned_acquire(ptr %ptr, i128 %value) {
; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_acquire:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i128 %value acquire, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_xchg_i128_unaligned_release(ptr %ptr, i128 %value) {
; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_release:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i128 %value release, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_xchg_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_acq_rel:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i128 %value acq_rel, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_xchg_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
; CHECK-LABEL: atomicrmw_xchg_i128_unaligned_seq_cst:
; CHECK: bl __atomic_exchange
%r = atomicrmw xchg ptr %ptr, i128 %value seq_cst, align 1
ret i128 %r
}
define dso_local i8 @atomicrmw_add_i8_aligned_monotonic(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_aligned_monotonic:
; CHECK: ldaddb w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_add_i8_aligned_acquire(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_aligned_acquire:
; CHECK: ldaddab w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_add_i8_aligned_release(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_aligned_release:
; CHECK: ldaddlb w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_add_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_aligned_acq_rel:
; CHECK: ldaddalb w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_add_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_aligned_seq_cst:
; CHECK: ldaddalb w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_add_i16_aligned_monotonic(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_add_i16_aligned_monotonic:
; CHECK: ldaddh w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i16 %value monotonic, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_add_i16_aligned_acquire(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_add_i16_aligned_acquire:
; CHECK: ldaddah w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i16 %value acquire, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_add_i16_aligned_release(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_add_i16_aligned_release:
; CHECK: ldaddlh w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i16 %value release, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_add_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_add_i16_aligned_acq_rel:
; CHECK: ldaddalh w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i16 %value acq_rel, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_add_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_add_i16_aligned_seq_cst:
; CHECK: ldaddalh w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i16 %value seq_cst, align 2
ret i16 %r
}
define dso_local i32 @atomicrmw_add_i32_aligned_monotonic(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_add_i32_aligned_monotonic:
; CHECK: ldadd w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i32 %value monotonic, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_add_i32_aligned_acquire(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_add_i32_aligned_acquire:
; CHECK: ldadda w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i32 %value acquire, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_add_i32_aligned_release(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_add_i32_aligned_release:
; CHECK: ldaddl w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i32 %value release, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_add_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_add_i32_aligned_acq_rel:
; CHECK: ldaddal w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i32 %value acq_rel, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_add_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_add_i32_aligned_seq_cst:
; CHECK: ldaddal w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i32 %value seq_cst, align 4
ret i32 %r
}
define dso_local i64 @atomicrmw_add_i64_aligned_monotonic(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_add_i64_aligned_monotonic:
; CHECK: ldadd x1, x0, [x0]
%r = atomicrmw add ptr %ptr, i64 %value monotonic, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_add_i64_aligned_acquire(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_add_i64_aligned_acquire:
; CHECK: ldadda x1, x0, [x0]
%r = atomicrmw add ptr %ptr, i64 %value acquire, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_add_i64_aligned_release(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_add_i64_aligned_release:
; CHECK: ldaddl x1, x0, [x0]
%r = atomicrmw add ptr %ptr, i64 %value release, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_add_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_add_i64_aligned_acq_rel:
; CHECK: ldaddal x1, x0, [x0]
%r = atomicrmw add ptr %ptr, i64 %value acq_rel, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_add_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_add_i64_aligned_seq_cst:
; CHECK: ldaddal x1, x0, [x0]
%r = atomicrmw add ptr %ptr, i64 %value seq_cst, align 8
ret i64 %r
}
define dso_local i128 @atomicrmw_add_i128_aligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_aligned_monotonic:
; -O0: adds x9, x10, x9
; -O0: casp x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_add_i128_aligned_monotonic:
; -O1: ldp x4, x5, [x0]
; -O1: adds x9, x7, x3
; -O1: casp x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw add ptr %ptr, i128 %value monotonic, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_add_i128_aligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_aligned_acquire:
; -O0: adds x9, x10, x9
; -O0: caspa x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_add_i128_aligned_acquire:
; -O1: ldp x4, x5, [x0]
; -O1: adds x9, x7, x3
; -O1: caspa x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw add ptr %ptr, i128 %value acquire, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_add_i128_aligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_aligned_release:
; -O0: adds x9, x10, x9
; -O0: caspl x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_add_i128_aligned_release:
; -O1: ldp x4, x5, [x0]
; -O1: adds x9, x7, x3
; -O1: caspl x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw add ptr %ptr, i128 %value release, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_add_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_aligned_acq_rel:
; -O0: adds x9, x10, x9
; -O0: caspal x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_add_i128_aligned_acq_rel:
; -O1: ldp x4, x5, [x0]
; -O1: adds x9, x7, x3
; -O1: caspal x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw add ptr %ptr, i128 %value acq_rel, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_add_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_aligned_seq_cst:
; -O0: adds x9, x10, x9
; -O0: caspal x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_add_i128_aligned_seq_cst:
; -O1: ldp x4, x5, [x0]
; -O1: adds x9, x7, x3
; -O1: caspal x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw add ptr %ptr, i128 %value seq_cst, align 16
ret i128 %r
}
define dso_local i8 @atomicrmw_add_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_unaligned_monotonic:
; CHECK: ldaddb w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_add_i8_unaligned_acquire(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_unaligned_acquire:
; CHECK: ldaddab w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_add_i8_unaligned_release(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_unaligned_release:
; CHECK: ldaddlb w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_add_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_unaligned_acq_rel:
; CHECK: ldaddalb w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_add_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_add_i8_unaligned_seq_cst:
; CHECK: ldaddalb w1, w0, [x0]
%r = atomicrmw add ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_add_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_add_i16_unaligned_monotonic:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i16_unaligned_monotonic:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i16 %value monotonic, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_add_i16_unaligned_acquire(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_add_i16_unaligned_acquire:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i16_unaligned_acquire:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i16 %value acquire, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_add_i16_unaligned_release(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_add_i16_unaligned_release:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i16_unaligned_release:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i16 %value release, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_add_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_add_i16_unaligned_acq_rel:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i16_unaligned_acq_rel:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i16 %value acq_rel, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_add_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_add_i16_unaligned_seq_cst:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i16_unaligned_seq_cst:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i16 %value seq_cst, align 1
ret i16 %r
}
define dso_local i32 @atomicrmw_add_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_add_i32_unaligned_monotonic:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i32_unaligned_monotonic:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i32 %value monotonic, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_add_i32_unaligned_acquire(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_add_i32_unaligned_acquire:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i32_unaligned_acquire:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i32 %value acquire, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_add_i32_unaligned_release(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_add_i32_unaligned_release:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i32_unaligned_release:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i32 %value release, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_add_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_add_i32_unaligned_acq_rel:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i32_unaligned_acq_rel:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i32 %value acq_rel, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_add_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_add_i32_unaligned_seq_cst:
; -O0: add w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i32_unaligned_seq_cst:
; -O1: add w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i32 %value seq_cst, align 1
ret i32 %r
}
define dso_local i64 @atomicrmw_add_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_add_i64_unaligned_monotonic:
; -O0: add x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i64_unaligned_monotonic:
; -O1: add x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i64 %value monotonic, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_add_i64_unaligned_acquire(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_add_i64_unaligned_acquire:
; -O0: add x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i64_unaligned_acquire:
; -O1: add x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i64 %value acquire, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_add_i64_unaligned_release(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_add_i64_unaligned_release:
; -O0: add x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i64_unaligned_release:
; -O1: add x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i64 %value release, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_add_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_add_i64_unaligned_acq_rel:
; -O0: add x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i64_unaligned_acq_rel:
; -O1: add x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i64 %value acq_rel, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_add_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_add_i64_unaligned_seq_cst:
; -O0: add x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i64_unaligned_seq_cst:
; -O1: add x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i64 %value seq_cst, align 1
ret i64 %r
}
define dso_local i128 @atomicrmw_add_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_unaligned_monotonic:
; -O0: adds x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i128_unaligned_monotonic:
; -O1: ldp x0, x1, [x0]
; -O1: adds x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i128 %value monotonic, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_add_i128_unaligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_unaligned_acquire:
; -O0: adds x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i128_unaligned_acquire:
; -O1: ldp x0, x1, [x0]
; -O1: adds x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i128 %value acquire, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_add_i128_unaligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_unaligned_release:
; -O0: adds x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i128_unaligned_release:
; -O1: ldp x0, x1, [x0]
; -O1: adds x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i128 %value release, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_add_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_unaligned_acq_rel:
; -O0: adds x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i128_unaligned_acq_rel:
; -O1: ldp x0, x1, [x0]
; -O1: adds x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i128 %value acq_rel, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_add_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_add_i128_unaligned_seq_cst:
; -O0: adds x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_add_i128_unaligned_seq_cst:
; -O1: ldp x0, x1, [x0]
; -O1: adds x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw add ptr %ptr, i128 %value seq_cst, align 1
ret i128 %r
}
define dso_local i8 @atomicrmw_sub_i8_aligned_monotonic(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_aligned_monotonic:
; -O0: subs w8, w8, w1
; -O0: ldaddb w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_aligned_monotonic:
; -O1: ldaddb w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_sub_i8_aligned_acquire(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_aligned_acquire:
; -O0: subs w8, w8, w1
; -O0: ldaddab w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_aligned_acquire:
; -O1: ldaddab w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_sub_i8_aligned_release(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_aligned_release:
; -O0: subs w8, w8, w1
; -O0: ldaddlb w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_aligned_release:
; -O1: ldaddlb w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_sub_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_aligned_acq_rel:
; -O0: subs w8, w8, w1
; -O0: ldaddalb w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_aligned_acq_rel:
; -O1: ldaddalb w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_sub_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_aligned_seq_cst:
; -O0: subs w8, w8, w1
; -O0: ldaddalb w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_aligned_seq_cst:
; -O1: ldaddalb w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_sub_i16_aligned_monotonic(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_aligned_monotonic:
; -O0: subs w8, w8, w1
; -O0: ldaddh w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i16_aligned_monotonic:
; -O1: ldaddh w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i16 %value monotonic, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_sub_i16_aligned_acquire(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_aligned_acquire:
; -O0: subs w8, w8, w1
; -O0: ldaddah w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i16_aligned_acquire:
; -O1: ldaddah w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i16 %value acquire, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_sub_i16_aligned_release(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_aligned_release:
; -O0: subs w8, w8, w1
; -O0: ldaddlh w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i16_aligned_release:
; -O1: ldaddlh w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i16 %value release, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_sub_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_aligned_acq_rel:
; -O0: subs w8, w8, w1
; -O0: ldaddalh w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i16_aligned_acq_rel:
; -O1: ldaddalh w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i16 %value acq_rel, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_sub_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_aligned_seq_cst:
; -O0: subs w8, w8, w1
; -O0: ldaddalh w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i16_aligned_seq_cst:
; -O1: ldaddalh w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i16 %value seq_cst, align 2
ret i16 %r
}
define dso_local i32 @atomicrmw_sub_i32_aligned_monotonic(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_aligned_monotonic:
; -O0: subs w8, w8, w1
; -O0: ldadd w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i32_aligned_monotonic:
; -O1: ldadd w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i32 %value monotonic, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_sub_i32_aligned_acquire(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_aligned_acquire:
; -O0: subs w8, w8, w1
; -O0: ldadda w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i32_aligned_acquire:
; -O1: ldadda w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i32 %value acquire, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_sub_i32_aligned_release(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_aligned_release:
; -O0: subs w8, w8, w1
; -O0: ldaddl w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i32_aligned_release:
; -O1: ldaddl w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i32 %value release, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_sub_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_aligned_acq_rel:
; -O0: subs w8, w8, w1
; -O0: ldaddal w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i32_aligned_acq_rel:
; -O1: ldaddal w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i32 %value acq_rel, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_sub_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_aligned_seq_cst:
; -O0: subs w8, w8, w1
; -O0: ldaddal w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i32_aligned_seq_cst:
; -O1: ldaddal w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i32 %value seq_cst, align 4
ret i32 %r
}
define dso_local i64 @atomicrmw_sub_i64_aligned_monotonic(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_aligned_monotonic:
; -O0: subs x8, x8, x1
; -O0: ldadd x8, x0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i64_aligned_monotonic:
; -O1: ldadd x8, x0, [x0]
%r = atomicrmw sub ptr %ptr, i64 %value monotonic, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_sub_i64_aligned_acquire(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_aligned_acquire:
; -O0: subs x8, x8, x1
; -O0: ldadda x8, x0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i64_aligned_acquire:
; -O1: ldadda x8, x0, [x0]
%r = atomicrmw sub ptr %ptr, i64 %value acquire, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_sub_i64_aligned_release(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_aligned_release:
; -O0: subs x8, x8, x1
; -O0: ldaddl x8, x0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i64_aligned_release:
; -O1: ldaddl x8, x0, [x0]
%r = atomicrmw sub ptr %ptr, i64 %value release, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_sub_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_aligned_acq_rel:
; -O0: subs x8, x8, x1
; -O0: ldaddal x8, x0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i64_aligned_acq_rel:
; -O1: ldaddal x8, x0, [x0]
%r = atomicrmw sub ptr %ptr, i64 %value acq_rel, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_sub_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_aligned_seq_cst:
; -O0: subs x8, x8, x1
; -O0: ldaddal x8, x0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i64_aligned_seq_cst:
; -O1: ldaddal x8, x0, [x0]
%r = atomicrmw sub ptr %ptr, i64 %value seq_cst, align 8
ret i64 %r
}
define dso_local i128 @atomicrmw_sub_i128_aligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_aligned_monotonic:
; -O0: subs x9, x10, x9
; -O0: casp x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_sub_i128_aligned_monotonic:
; -O1: ldp x4, x5, [x0]
; -O1: subs x9, x7, x3
; -O1: casp x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw sub ptr %ptr, i128 %value monotonic, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_sub_i128_aligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_aligned_acquire:
; -O0: subs x9, x10, x9
; -O0: caspa x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_sub_i128_aligned_acquire:
; -O1: ldp x4, x5, [x0]
; -O1: subs x9, x7, x3
; -O1: caspa x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw sub ptr %ptr, i128 %value acquire, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_sub_i128_aligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_aligned_release:
; -O0: subs x9, x10, x9
; -O0: caspl x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_sub_i128_aligned_release:
; -O1: ldp x4, x5, [x0]
; -O1: subs x9, x7, x3
; -O1: caspl x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw sub ptr %ptr, i128 %value release, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_sub_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_aligned_acq_rel:
; -O0: subs x9, x10, x9
; -O0: caspal x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_sub_i128_aligned_acq_rel:
; -O1: ldp x4, x5, [x0]
; -O1: subs x9, x7, x3
; -O1: caspal x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw sub ptr %ptr, i128 %value acq_rel, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_sub_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_aligned_seq_cst:
; -O0: subs x9, x10, x9
; -O0: caspal x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_sub_i128_aligned_seq_cst:
; -O1: ldp x4, x5, [x0]
; -O1: subs x9, x7, x3
; -O1: caspal x4, x5, x8, x9, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw sub ptr %ptr, i128 %value seq_cst, align 16
ret i128 %r
}
define dso_local i8 @atomicrmw_sub_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_unaligned_monotonic:
; -O0: subs w8, w8, w1
; -O0: ldaddb w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_unaligned_monotonic:
; -O1: ldaddb w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_sub_i8_unaligned_acquire(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_unaligned_acquire:
; -O0: subs w8, w8, w1
; -O0: ldaddab w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_unaligned_acquire:
; -O1: ldaddab w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_sub_i8_unaligned_release(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_unaligned_release:
; -O0: subs w8, w8, w1
; -O0: ldaddlb w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_unaligned_release:
; -O1: ldaddlb w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_sub_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_unaligned_acq_rel:
; -O0: subs w8, w8, w1
; -O0: ldaddalb w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_unaligned_acq_rel:
; -O1: ldaddalb w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_sub_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_sub_i8_unaligned_seq_cst:
; -O0: subs w8, w8, w1
; -O0: ldaddalb w8, w0, [x0]
;
; -O1-LABEL: atomicrmw_sub_i8_unaligned_seq_cst:
; -O1: ldaddalb w8, w0, [x0]
%r = atomicrmw sub ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_sub_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_unaligned_monotonic:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i16_unaligned_monotonic:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i16 %value monotonic, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_sub_i16_unaligned_acquire(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_unaligned_acquire:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i16_unaligned_acquire:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i16 %value acquire, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_sub_i16_unaligned_release(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_unaligned_release:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i16_unaligned_release:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i16 %value release, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_sub_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_unaligned_acq_rel:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i16_unaligned_acq_rel:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i16 %value acq_rel, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_sub_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_sub_i16_unaligned_seq_cst:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i16_unaligned_seq_cst:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i16 %value seq_cst, align 1
ret i16 %r
}
define dso_local i32 @atomicrmw_sub_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_unaligned_monotonic:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i32_unaligned_monotonic:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i32 %value monotonic, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_sub_i32_unaligned_acquire(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_unaligned_acquire:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i32_unaligned_acquire:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i32 %value acquire, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_sub_i32_unaligned_release(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_unaligned_release:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i32_unaligned_release:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i32 %value release, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_sub_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_unaligned_acq_rel:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i32_unaligned_acq_rel:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i32 %value acq_rel, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_sub_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_sub_i32_unaligned_seq_cst:
; -O0: subs w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i32_unaligned_seq_cst:
; -O1: sub w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i32 %value seq_cst, align 1
ret i32 %r
}
define dso_local i64 @atomicrmw_sub_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_unaligned_monotonic:
; -O0: subs x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i64_unaligned_monotonic:
; -O1: sub x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i64 %value monotonic, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_sub_i64_unaligned_acquire(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_unaligned_acquire:
; -O0: subs x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i64_unaligned_acquire:
; -O1: sub x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i64 %value acquire, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_sub_i64_unaligned_release(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_unaligned_release:
; -O0: subs x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i64_unaligned_release:
; -O1: sub x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i64 %value release, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_sub_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_unaligned_acq_rel:
; -O0: subs x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i64_unaligned_acq_rel:
; -O1: sub x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i64 %value acq_rel, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_sub_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_sub_i64_unaligned_seq_cst:
; -O0: subs x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i64_unaligned_seq_cst:
; -O1: sub x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i64 %value seq_cst, align 1
ret i64 %r
}
define dso_local i128 @atomicrmw_sub_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_unaligned_monotonic:
; -O0: subs x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i128_unaligned_monotonic:
; -O1: ldp x0, x1, [x0]
; -O1: subs x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i128 %value monotonic, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_sub_i128_unaligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_unaligned_acquire:
; -O0: subs x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i128_unaligned_acquire:
; -O1: ldp x0, x1, [x0]
; -O1: subs x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i128 %value acquire, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_sub_i128_unaligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_unaligned_release:
; -O0: subs x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i128_unaligned_release:
; -O1: ldp x0, x1, [x0]
; -O1: subs x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i128 %value release, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_sub_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_unaligned_acq_rel:
; -O0: subs x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i128_unaligned_acq_rel:
; -O1: ldp x0, x1, [x0]
; -O1: subs x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i128 %value acq_rel, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_sub_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_sub_i128_unaligned_seq_cst:
; -O0: subs x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_sub_i128_unaligned_seq_cst:
; -O1: ldp x0, x1, [x0]
; -O1: subs x8, x1, x19
; -O1: bl __atomic_compare_exchange
%r = atomicrmw sub ptr %ptr, i128 %value seq_cst, align 1
ret i128 %r
}
define dso_local i8 @atomicrmw_and_i8_aligned_monotonic(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_aligned_monotonic:
; CHECK: mvn w8, w1
; CHECK: ldclrb w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_and_i8_aligned_acquire(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_aligned_acquire:
; CHECK: mvn w8, w1
; CHECK: ldclrab w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_and_i8_aligned_release(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_aligned_release:
; CHECK: mvn w8, w1
; CHECK: ldclrlb w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_and_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_aligned_acq_rel:
; CHECK: mvn w8, w1
; CHECK: ldclralb w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_and_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_aligned_seq_cst:
; CHECK: mvn w8, w1
; CHECK: ldclralb w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_and_i16_aligned_monotonic(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_and_i16_aligned_monotonic:
; CHECK: mvn w8, w1
; CHECK: ldclrh w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i16 %value monotonic, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_and_i16_aligned_acquire(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_and_i16_aligned_acquire:
; CHECK: mvn w8, w1
; CHECK: ldclrah w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i16 %value acquire, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_and_i16_aligned_release(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_and_i16_aligned_release:
; CHECK: mvn w8, w1
; CHECK: ldclrlh w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i16 %value release, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_and_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_and_i16_aligned_acq_rel:
; CHECK: mvn w8, w1
; CHECK: ldclralh w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i16 %value acq_rel, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_and_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_and_i16_aligned_seq_cst:
; CHECK: mvn w8, w1
; CHECK: ldclralh w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i16 %value seq_cst, align 2
ret i16 %r
}
define dso_local i32 @atomicrmw_and_i32_aligned_monotonic(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_and_i32_aligned_monotonic:
; CHECK: mvn w8, w1
; CHECK: ldclr w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i32 %value monotonic, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_and_i32_aligned_acquire(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_and_i32_aligned_acquire:
; CHECK: mvn w8, w1
; CHECK: ldclra w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i32 %value acquire, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_and_i32_aligned_release(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_and_i32_aligned_release:
; CHECK: mvn w8, w1
; CHECK: ldclrl w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i32 %value release, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_and_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_and_i32_aligned_acq_rel:
; CHECK: mvn w8, w1
; CHECK: ldclral w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i32 %value acq_rel, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_and_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_and_i32_aligned_seq_cst:
; CHECK: mvn w8, w1
; CHECK: ldclral w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i32 %value seq_cst, align 4
ret i32 %r
}
define dso_local i64 @atomicrmw_and_i64_aligned_monotonic(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_and_i64_aligned_monotonic:
; CHECK: mvn x8, x1
; CHECK: ldclr x8, x0, [x0]
%r = atomicrmw and ptr %ptr, i64 %value monotonic, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_and_i64_aligned_acquire(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_and_i64_aligned_acquire:
; CHECK: mvn x8, x1
; CHECK: ldclra x8, x0, [x0]
%r = atomicrmw and ptr %ptr, i64 %value acquire, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_and_i64_aligned_release(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_and_i64_aligned_release:
; CHECK: mvn x8, x1
; CHECK: ldclrl x8, x0, [x0]
%r = atomicrmw and ptr %ptr, i64 %value release, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_and_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_and_i64_aligned_acq_rel:
; CHECK: mvn x8, x1
; CHECK: ldclral x8, x0, [x0]
%r = atomicrmw and ptr %ptr, i64 %value acq_rel, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_and_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_and_i64_aligned_seq_cst:
; CHECK: mvn x8, x1
; CHECK: ldclral x8, x0, [x0]
%r = atomicrmw and ptr %ptr, i64 %value seq_cst, align 8
ret i64 %r
}
define dso_local i128 @atomicrmw_and_i128_aligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_aligned_monotonic:
; -O0: mvn x1, x3
; -O0: mvn x0, x2
; -O0: ldclrp x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_and_i128_aligned_monotonic:
; -O1: mvn x1, x3
; -O1: mvn x8, x2
; -O1: ldclrp x8, x1, [x0]
%r = atomicrmw and ptr %ptr, i128 %value monotonic, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_and_i128_aligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_aligned_acquire:
; -O0: mvn x1, x3
; -O0: mvn x0, x2
; -O0: ldclrpa x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_and_i128_aligned_acquire:
; -O1: mvn x1, x3
; -O1: mvn x8, x2
; -O1: ldclrpa x8, x1, [x0]
%r = atomicrmw and ptr %ptr, i128 %value acquire, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_and_i128_aligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_aligned_release:
; -O0: mvn x1, x3
; -O0: mvn x0, x2
; -O0: ldclrpl x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_and_i128_aligned_release:
; -O1: mvn x1, x3
; -O1: mvn x8, x2
; -O1: ldclrpl x8, x1, [x0]
%r = atomicrmw and ptr %ptr, i128 %value release, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_and_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_aligned_acq_rel:
; -O0: mvn x1, x3
; -O0: mvn x0, x2
; -O0: ldclrpal x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_and_i128_aligned_acq_rel:
; -O1: mvn x1, x3
; -O1: mvn x8, x2
; -O1: ldclrpal x8, x1, [x0]
%r = atomicrmw and ptr %ptr, i128 %value acq_rel, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_and_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_aligned_seq_cst:
; -O0: mvn x1, x3
; -O0: mvn x0, x2
; -O0: ldclrpal x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_and_i128_aligned_seq_cst:
; -O1: mvn x1, x3
; -O1: mvn x8, x2
; -O1: ldclrpal x8, x1, [x0]
%r = atomicrmw and ptr %ptr, i128 %value seq_cst, align 16
ret i128 %r
}
define dso_local i8 @atomicrmw_and_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_unaligned_monotonic:
; CHECK: mvn w8, w1
; CHECK: ldclrb w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_and_i8_unaligned_acquire(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_unaligned_acquire:
; CHECK: mvn w8, w1
; CHECK: ldclrab w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_and_i8_unaligned_release(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_unaligned_release:
; CHECK: mvn w8, w1
; CHECK: ldclrlb w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_and_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_unaligned_acq_rel:
; CHECK: mvn w8, w1
; CHECK: ldclralb w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_and_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_and_i8_unaligned_seq_cst:
; CHECK: mvn w8, w1
; CHECK: ldclralb w8, w0, [x0]
%r = atomicrmw and ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_and_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_and_i16_unaligned_monotonic:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i16_unaligned_monotonic:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i16 %value monotonic, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_and_i16_unaligned_acquire(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_and_i16_unaligned_acquire:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i16_unaligned_acquire:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i16 %value acquire, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_and_i16_unaligned_release(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_and_i16_unaligned_release:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i16_unaligned_release:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i16 %value release, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_and_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_and_i16_unaligned_acq_rel:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i16_unaligned_acq_rel:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i16 %value acq_rel, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_and_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_and_i16_unaligned_seq_cst:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i16_unaligned_seq_cst:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i16 %value seq_cst, align 1
ret i16 %r
}
define dso_local i32 @atomicrmw_and_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_and_i32_unaligned_monotonic:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i32_unaligned_monotonic:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i32 %value monotonic, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_and_i32_unaligned_acquire(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_and_i32_unaligned_acquire:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i32_unaligned_acquire:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i32 %value acquire, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_and_i32_unaligned_release(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_and_i32_unaligned_release:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i32_unaligned_release:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i32 %value release, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_and_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_and_i32_unaligned_acq_rel:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i32_unaligned_acq_rel:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i32 %value acq_rel, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_and_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_and_i32_unaligned_seq_cst:
; -O0: and w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i32_unaligned_seq_cst:
; -O1: and w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i32 %value seq_cst, align 1
ret i32 %r
}
define dso_local i64 @atomicrmw_and_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_and_i64_unaligned_monotonic:
; -O0: and x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i64_unaligned_monotonic:
; -O1: and x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i64 %value monotonic, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_and_i64_unaligned_acquire(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_and_i64_unaligned_acquire:
; -O0: and x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i64_unaligned_acquire:
; -O1: and x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i64 %value acquire, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_and_i64_unaligned_release(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_and_i64_unaligned_release:
; -O0: and x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i64_unaligned_release:
; -O1: and x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i64 %value release, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_and_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_and_i64_unaligned_acq_rel:
; -O0: and x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i64_unaligned_acq_rel:
; -O1: and x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i64 %value acq_rel, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_and_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_and_i64_unaligned_seq_cst:
; -O0: and x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i64_unaligned_seq_cst:
; -O1: and x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i64 %value seq_cst, align 1
ret i64 %r
}
define dso_local i128 @atomicrmw_and_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_unaligned_monotonic:
; -O0: and x8, x11, x8
; -O0: and x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i128_unaligned_monotonic:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i128 %value monotonic, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_and_i128_unaligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_unaligned_acquire:
; -O0: and x8, x11, x8
; -O0: and x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i128_unaligned_acquire:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i128 %value acquire, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_and_i128_unaligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_unaligned_release:
; -O0: and x8, x11, x8
; -O0: and x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i128_unaligned_release:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i128 %value release, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_and_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_unaligned_acq_rel:
; -O0: and x8, x11, x8
; -O0: and x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i128_unaligned_acq_rel:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i128 %value acq_rel, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_and_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_and_i128_unaligned_seq_cst:
; -O0: and x8, x11, x8
; -O0: and x9, x10, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_and_i128_unaligned_seq_cst:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: bl __atomic_compare_exchange
%r = atomicrmw and ptr %ptr, i128 %value seq_cst, align 1
ret i128 %r
}
define dso_local i8 @atomicrmw_nand_i8_aligned_monotonic(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_aligned_monotonic:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casb w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_aligned_monotonic:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casb w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_nand_i8_aligned_acquire(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_aligned_acquire:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casab w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_aligned_acquire:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casab w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_nand_i8_aligned_release(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_aligned_release:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: caslb w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_aligned_release:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: caslb w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_nand_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_aligned_acq_rel:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casalb w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_aligned_acq_rel:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casalb w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_nand_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_aligned_seq_cst:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casalb w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_aligned_seq_cst:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casalb w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_nand_i16_aligned_monotonic(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_aligned_monotonic:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: cash w8, w10, [x11]
; -O0: subs w9, w8, w9, uxth
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i16_aligned_monotonic:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: cash w9, w10, [x0]
; -O1: cmp w9, w8, uxth
%r = atomicrmw nand ptr %ptr, i16 %value monotonic, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_nand_i16_aligned_acquire(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_aligned_acquire:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casah w8, w10, [x11]
; -O0: subs w9, w8, w9, uxth
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i16_aligned_acquire:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casah w9, w10, [x0]
; -O1: cmp w9, w8, uxth
%r = atomicrmw nand ptr %ptr, i16 %value acquire, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_nand_i16_aligned_release(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_aligned_release:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: caslh w8, w10, [x11]
; -O0: subs w9, w8, w9, uxth
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i16_aligned_release:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: caslh w9, w10, [x0]
; -O1: cmp w9, w8, uxth
%r = atomicrmw nand ptr %ptr, i16 %value release, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_nand_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_aligned_acq_rel:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casalh w8, w10, [x11]
; -O0: subs w9, w8, w9, uxth
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i16_aligned_acq_rel:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casalh w9, w10, [x0]
; -O1: cmp w9, w8, uxth
%r = atomicrmw nand ptr %ptr, i16 %value acq_rel, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_nand_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_aligned_seq_cst:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casalh w8, w10, [x11]
; -O0: subs w9, w8, w9, uxth
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i16_aligned_seq_cst:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casalh w9, w10, [x0]
; -O1: cmp w9, w8, uxth
%r = atomicrmw nand ptr %ptr, i16 %value seq_cst, align 2
ret i16 %r
}
define dso_local i32 @atomicrmw_nand_i32_aligned_monotonic(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_aligned_monotonic:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: cas w8, w10, [x11]
; -O0: subs w9, w8, w9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i32_aligned_monotonic:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: cas w9, w10, [x0]
; -O1: cmp w9, w8
%r = atomicrmw nand ptr %ptr, i32 %value monotonic, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_nand_i32_aligned_acquire(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_aligned_acquire:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casa w8, w10, [x11]
; -O0: subs w9, w8, w9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i32_aligned_acquire:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casa w9, w10, [x0]
; -O1: cmp w9, w8
%r = atomicrmw nand ptr %ptr, i32 %value acquire, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_nand_i32_aligned_release(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_aligned_release:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casl w8, w10, [x11]
; -O0: subs w9, w8, w9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i32_aligned_release:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casl w9, w10, [x0]
; -O1: cmp w9, w8
%r = atomicrmw nand ptr %ptr, i32 %value release, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_nand_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_aligned_acq_rel:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casal w8, w10, [x11]
; -O0: subs w9, w8, w9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i32_aligned_acq_rel:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casal w9, w10, [x0]
; -O1: cmp w9, w8
%r = atomicrmw nand ptr %ptr, i32 %value acq_rel, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_nand_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_aligned_seq_cst:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casal w8, w10, [x11]
; -O0: subs w9, w8, w9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i32_aligned_seq_cst:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casal w9, w10, [x0]
; -O1: cmp w9, w8
%r = atomicrmw nand ptr %ptr, i32 %value seq_cst, align 4
ret i32 %r
}
define dso_local i64 @atomicrmw_nand_i64_aligned_monotonic(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_aligned_monotonic:
; -O0: and x8, x9, x8
; -O0: mvn x10, x8
; -O0: cas x8, x10, [x11]
; -O0: subs x9, x8, x9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i64_aligned_monotonic:
; -O1: and x10, x8, x1
; -O1: mvn x10, x10
; -O1: cas x9, x10, [x0]
; -O1: cmp x9, x8
%r = atomicrmw nand ptr %ptr, i64 %value monotonic, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_nand_i64_aligned_acquire(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_aligned_acquire:
; -O0: and x8, x9, x8
; -O0: mvn x10, x8
; -O0: casa x8, x10, [x11]
; -O0: subs x9, x8, x9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i64_aligned_acquire:
; -O1: and x10, x8, x1
; -O1: mvn x10, x10
; -O1: casa x9, x10, [x0]
; -O1: cmp x9, x8
%r = atomicrmw nand ptr %ptr, i64 %value acquire, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_nand_i64_aligned_release(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_aligned_release:
; -O0: and x8, x9, x8
; -O0: mvn x10, x8
; -O0: casl x8, x10, [x11]
; -O0: subs x9, x8, x9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i64_aligned_release:
; -O1: and x10, x8, x1
; -O1: mvn x10, x10
; -O1: casl x9, x10, [x0]
; -O1: cmp x9, x8
%r = atomicrmw nand ptr %ptr, i64 %value release, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_nand_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_aligned_acq_rel:
; -O0: and x8, x9, x8
; -O0: mvn x10, x8
; -O0: casal x8, x10, [x11]
; -O0: subs x9, x8, x9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i64_aligned_acq_rel:
; -O1: and x10, x8, x1
; -O1: mvn x10, x10
; -O1: casal x9, x10, [x0]
; -O1: cmp x9, x8
%r = atomicrmw nand ptr %ptr, i64 %value acq_rel, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_nand_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_aligned_seq_cst:
; -O0: and x8, x9, x8
; -O0: mvn x10, x8
; -O0: casal x8, x10, [x11]
; -O0: subs x9, x8, x9
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i64_aligned_seq_cst:
; -O1: and x10, x8, x1
; -O1: mvn x10, x10
; -O1: casal x9, x10, [x0]
; -O1: cmp x9, x8
%r = atomicrmw nand ptr %ptr, i64 %value seq_cst, align 8
ret i64 %r
}
define dso_local i128 @atomicrmw_nand_i128_aligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_aligned_monotonic:
; -O0: and x9, x10, x9
; -O0: and x12, x11, x12
; -O0: mvn x2, x12
; -O0: mvn x9, x9
; -O0: casp x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_nand_i128_aligned_monotonic:
; -O1: ldp x4, x5, [x0]
; -O1: and x8, x4, x2
; -O1: and x9, x7, x3
; -O1: mvn x10, x8
; -O1: mvn x11, x9
; -O1: casp x4, x5, x10, x11, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw nand ptr %ptr, i128 %value monotonic, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_nand_i128_aligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_aligned_acquire:
; -O0: and x9, x10, x9
; -O0: and x12, x11, x12
; -O0: mvn x2, x12
; -O0: mvn x9, x9
; -O0: caspa x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_nand_i128_aligned_acquire:
; -O1: ldp x4, x5, [x0]
; -O1: and x8, x4, x2
; -O1: and x9, x7, x3
; -O1: mvn x10, x8
; -O1: mvn x11, x9
; -O1: caspa x4, x5, x10, x11, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw nand ptr %ptr, i128 %value acquire, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_nand_i128_aligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_aligned_release:
; -O0: and x9, x10, x9
; -O0: and x12, x11, x12
; -O0: mvn x2, x12
; -O0: mvn x9, x9
; -O0: caspl x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_nand_i128_aligned_release:
; -O1: ldp x4, x5, [x0]
; -O1: and x8, x4, x2
; -O1: and x9, x7, x3
; -O1: mvn x10, x8
; -O1: mvn x11, x9
; -O1: caspl x4, x5, x10, x11, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw nand ptr %ptr, i128 %value release, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_nand_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_aligned_acq_rel:
; -O0: and x9, x10, x9
; -O0: and x12, x11, x12
; -O0: mvn x2, x12
; -O0: mvn x9, x9
; -O0: caspal x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_nand_i128_aligned_acq_rel:
; -O1: ldp x4, x5, [x0]
; -O1: and x8, x4, x2
; -O1: and x9, x7, x3
; -O1: mvn x10, x8
; -O1: mvn x11, x9
; -O1: caspal x4, x5, x10, x11, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw nand ptr %ptr, i128 %value acq_rel, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_nand_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_aligned_seq_cst:
; -O0: and x9, x10, x9
; -O0: and x12, x11, x12
; -O0: mvn x2, x12
; -O0: mvn x9, x9
; -O0: caspal x0, x1, x2, x3, [x8]
; -O0: subs x11, x9, x11
; -O0: ccmp x8, x10, #0, eq
;
; -O1-LABEL: atomicrmw_nand_i128_aligned_seq_cst:
; -O1: ldp x4, x5, [x0]
; -O1: and x8, x4, x2
; -O1: and x9, x7, x3
; -O1: mvn x10, x8
; -O1: mvn x11, x9
; -O1: caspal x4, x5, x10, x11, [x0]
; -O1: cmp x4, x6
; -O1: ccmp x5, x7, #0, eq
%r = atomicrmw nand ptr %ptr, i128 %value seq_cst, align 16
ret i128 %r
}
define dso_local i8 @atomicrmw_nand_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_unaligned_monotonic:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casb w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_unaligned_monotonic:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casb w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_nand_i8_unaligned_acquire(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_unaligned_acquire:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casab w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_unaligned_acquire:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casab w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_nand_i8_unaligned_release(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_unaligned_release:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: caslb w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_unaligned_release:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: caslb w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_nand_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_unaligned_acq_rel:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casalb w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_unaligned_acq_rel:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casalb w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_nand_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
; -O0-LABEL: atomicrmw_nand_i8_unaligned_seq_cst:
; -O0: and w8, w9, w8
; -O0: mvn w10, w8
; -O0: casalb w8, w10, [x11]
; -O0: subs w9, w8, w9, uxtb
; -O0: subs w9, w9, #1
;
; -O1-LABEL: atomicrmw_nand_i8_unaligned_seq_cst:
; -O1: and w10, w8, w1
; -O1: mvn w10, w10
; -O1: casalb w9, w10, [x0]
; -O1: cmp w9, w8, uxtb
%r = atomicrmw nand ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_nand_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_unaligned_monotonic:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i16_unaligned_monotonic:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i16 %value monotonic, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_nand_i16_unaligned_acquire(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_unaligned_acquire:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i16_unaligned_acquire:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i16 %value acquire, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_nand_i16_unaligned_release(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_unaligned_release:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i16_unaligned_release:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i16 %value release, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_nand_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_unaligned_acq_rel:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i16_unaligned_acq_rel:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i16 %value acq_rel, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_nand_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_nand_i16_unaligned_seq_cst:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i16_unaligned_seq_cst:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i16 %value seq_cst, align 1
ret i16 %r
}
define dso_local i32 @atomicrmw_nand_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_unaligned_monotonic:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i32_unaligned_monotonic:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i32 %value monotonic, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_nand_i32_unaligned_acquire(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_unaligned_acquire:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i32_unaligned_acquire:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i32 %value acquire, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_nand_i32_unaligned_release(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_unaligned_release:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i32_unaligned_release:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i32 %value release, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_nand_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_unaligned_acq_rel:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i32_unaligned_acq_rel:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i32 %value acq_rel, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_nand_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_nand_i32_unaligned_seq_cst:
; -O0: and w8, w9, w8
; -O0: mvn w8, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i32_unaligned_seq_cst:
; -O1: and w8, w0, w20
; -O1: mvn w8, w8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i32 %value seq_cst, align 1
ret i32 %r
}
define dso_local i64 @atomicrmw_nand_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_unaligned_monotonic:
; -O0: and x8, x9, x8
; -O0: mvn x8, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i64_unaligned_monotonic:
; -O1: and x8, x0, x20
; -O1: mvn x8, x8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i64 %value monotonic, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_nand_i64_unaligned_acquire(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_unaligned_acquire:
; -O0: and x8, x9, x8
; -O0: mvn x8, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i64_unaligned_acquire:
; -O1: and x8, x0, x20
; -O1: mvn x8, x8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i64 %value acquire, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_nand_i64_unaligned_release(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_unaligned_release:
; -O0: and x8, x9, x8
; -O0: mvn x8, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i64_unaligned_release:
; -O1: and x8, x0, x20
; -O1: mvn x8, x8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i64 %value release, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_nand_i64_unaligned_acq_rel(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_unaligned_acq_rel:
; -O0: and x8, x9, x8
; -O0: mvn x8, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i64_unaligned_acq_rel:
; -O1: and x8, x0, x20
; -O1: mvn x8, x8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i64 %value acq_rel, align 1
ret i64 %r
}
define dso_local i64 @atomicrmw_nand_i64_unaligned_seq_cst(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_nand_i64_unaligned_seq_cst:
; -O0: and x8, x9, x8
; -O0: mvn x8, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i64_unaligned_seq_cst:
; -O1: and x8, x0, x20
; -O1: mvn x8, x8
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i64 %value seq_cst, align 1
ret i64 %r
}
define dso_local i128 @atomicrmw_nand_i128_unaligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_unaligned_monotonic:
; -O0: and x9, x11, x9
; -O0: and x8, x10, x8
; -O0: mvn x8, x8
; -O0: mvn x9, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i128_unaligned_monotonic:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: mvn x8, x8
; -O1: mvn x9, x9
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i128 %value monotonic, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_nand_i128_unaligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_unaligned_acquire:
; -O0: and x9, x11, x9
; -O0: and x8, x10, x8
; -O0: mvn x8, x8
; -O0: mvn x9, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i128_unaligned_acquire:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: mvn x8, x8
; -O1: mvn x9, x9
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i128 %value acquire, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_nand_i128_unaligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_unaligned_release:
; -O0: and x9, x11, x9
; -O0: and x8, x10, x8
; -O0: mvn x8, x8
; -O0: mvn x9, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i128_unaligned_release:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: mvn x8, x8
; -O1: mvn x9, x9
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i128 %value release, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_nand_i128_unaligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_unaligned_acq_rel:
; -O0: and x9, x11, x9
; -O0: and x8, x10, x8
; -O0: mvn x8, x8
; -O0: mvn x9, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i128_unaligned_acq_rel:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: mvn x8, x8
; -O1: mvn x9, x9
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i128 %value acq_rel, align 1
ret i128 %r
}
define dso_local i128 @atomicrmw_nand_i128_unaligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_nand_i128_unaligned_seq_cst:
; -O0: and x9, x11, x9
; -O0: and x8, x10, x8
; -O0: mvn x8, x8
; -O0: mvn x9, x9
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_nand_i128_unaligned_seq_cst:
; -O1: ldp x0, x1, [x0]
; -O1: and x8, x1, x19
; -O1: and x9, x0, x21
; -O1: mvn x8, x8
; -O1: mvn x9, x9
; -O1: bl __atomic_compare_exchange
%r = atomicrmw nand ptr %ptr, i128 %value seq_cst, align 1
ret i128 %r
}
define dso_local i8 @atomicrmw_or_i8_aligned_monotonic(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_aligned_monotonic:
; CHECK: ldsetb w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_or_i8_aligned_acquire(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_aligned_acquire:
; CHECK: ldsetab w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_or_i8_aligned_release(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_aligned_release:
; CHECK: ldsetlb w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_or_i8_aligned_acq_rel(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_aligned_acq_rel:
; CHECK: ldsetalb w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_or_i8_aligned_seq_cst(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_aligned_seq_cst:
; CHECK: ldsetalb w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_or_i16_aligned_monotonic(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_or_i16_aligned_monotonic:
; CHECK: ldseth w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i16 %value monotonic, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_or_i16_aligned_acquire(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_or_i16_aligned_acquire:
; CHECK: ldsetah w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i16 %value acquire, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_or_i16_aligned_release(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_or_i16_aligned_release:
; CHECK: ldsetlh w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i16 %value release, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_or_i16_aligned_acq_rel(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_or_i16_aligned_acq_rel:
; CHECK: ldsetalh w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i16 %value acq_rel, align 2
ret i16 %r
}
define dso_local i16 @atomicrmw_or_i16_aligned_seq_cst(ptr %ptr, i16 %value) {
; CHECK-LABEL: atomicrmw_or_i16_aligned_seq_cst:
; CHECK: ldsetalh w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i16 %value seq_cst, align 2
ret i16 %r
}
define dso_local i32 @atomicrmw_or_i32_aligned_monotonic(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_or_i32_aligned_monotonic:
; CHECK: ldset w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i32 %value monotonic, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_or_i32_aligned_acquire(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_or_i32_aligned_acquire:
; CHECK: ldseta w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i32 %value acquire, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_or_i32_aligned_release(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_or_i32_aligned_release:
; CHECK: ldsetl w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i32 %value release, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_or_i32_aligned_acq_rel(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_or_i32_aligned_acq_rel:
; CHECK: ldsetal w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i32 %value acq_rel, align 4
ret i32 %r
}
define dso_local i32 @atomicrmw_or_i32_aligned_seq_cst(ptr %ptr, i32 %value) {
; CHECK-LABEL: atomicrmw_or_i32_aligned_seq_cst:
; CHECK: ldsetal w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i32 %value seq_cst, align 4
ret i32 %r
}
define dso_local i64 @atomicrmw_or_i64_aligned_monotonic(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_or_i64_aligned_monotonic:
; CHECK: ldset x1, x0, [x0]
%r = atomicrmw or ptr %ptr, i64 %value monotonic, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_or_i64_aligned_acquire(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_or_i64_aligned_acquire:
; CHECK: ldseta x1, x0, [x0]
%r = atomicrmw or ptr %ptr, i64 %value acquire, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_or_i64_aligned_release(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_or_i64_aligned_release:
; CHECK: ldsetl x1, x0, [x0]
%r = atomicrmw or ptr %ptr, i64 %value release, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_or_i64_aligned_acq_rel(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_or_i64_aligned_acq_rel:
; CHECK: ldsetal x1, x0, [x0]
%r = atomicrmw or ptr %ptr, i64 %value acq_rel, align 8
ret i64 %r
}
define dso_local i64 @atomicrmw_or_i64_aligned_seq_cst(ptr %ptr, i64 %value) {
; CHECK-LABEL: atomicrmw_or_i64_aligned_seq_cst:
; CHECK: ldsetal x1, x0, [x0]
%r = atomicrmw or ptr %ptr, i64 %value seq_cst, align 8
ret i64 %r
}
define dso_local i128 @atomicrmw_or_i128_aligned_monotonic(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_or_i128_aligned_monotonic:
; -O0: ldsetp x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_or_i128_aligned_monotonic:
; -O1: ldsetp x2, x1, [x0]
%r = atomicrmw or ptr %ptr, i128 %value monotonic, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_or_i128_aligned_acquire(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_or_i128_aligned_acquire:
; -O0: ldsetpa x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_or_i128_aligned_acquire:
; -O1: ldsetpa x2, x1, [x0]
%r = atomicrmw or ptr %ptr, i128 %value acquire, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_or_i128_aligned_release(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_or_i128_aligned_release:
; -O0: ldsetpl x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_or_i128_aligned_release:
; -O1: ldsetpl x2, x1, [x0]
%r = atomicrmw or ptr %ptr, i128 %value release, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_or_i128_aligned_acq_rel(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_or_i128_aligned_acq_rel:
; -O0: ldsetpal x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_or_i128_aligned_acq_rel:
; -O1: ldsetpal x2, x1, [x0]
%r = atomicrmw or ptr %ptr, i128 %value acq_rel, align 16
ret i128 %r
}
define dso_local i128 @atomicrmw_or_i128_aligned_seq_cst(ptr %ptr, i128 %value) {
; -O0-LABEL: atomicrmw_or_i128_aligned_seq_cst:
; -O0: ldsetpal x0, x1, [x8]
;
; -O1-LABEL: atomicrmw_or_i128_aligned_seq_cst:
; -O1: ldsetpal x2, x1, [x0]
%r = atomicrmw or ptr %ptr, i128 %value seq_cst, align 16
ret i128 %r
}
define dso_local i8 @atomicrmw_or_i8_unaligned_monotonic(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_unaligned_monotonic:
; CHECK: ldsetb w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value monotonic, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_or_i8_unaligned_acquire(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_unaligned_acquire:
; CHECK: ldsetab w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value acquire, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_or_i8_unaligned_release(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_unaligned_release:
; CHECK: ldsetlb w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value release, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_or_i8_unaligned_acq_rel(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_unaligned_acq_rel:
; CHECK: ldsetalb w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value acq_rel, align 1
ret i8 %r
}
define dso_local i8 @atomicrmw_or_i8_unaligned_seq_cst(ptr %ptr, i8 %value) {
; CHECK-LABEL: atomicrmw_or_i8_unaligned_seq_cst:
; CHECK: ldsetalb w1, w0, [x0]
%r = atomicrmw or ptr %ptr, i8 %value seq_cst, align 1
ret i8 %r
}
define dso_local i16 @atomicrmw_or_i16_unaligned_monotonic(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_or_i16_unaligned_monotonic:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i16_unaligned_monotonic:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i16 %value monotonic, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_or_i16_unaligned_acquire(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_or_i16_unaligned_acquire:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i16_unaligned_acquire:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i16 %value acquire, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_or_i16_unaligned_release(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_or_i16_unaligned_release:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i16_unaligned_release:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i16 %value release, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_or_i16_unaligned_acq_rel(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_or_i16_unaligned_acq_rel:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i16_unaligned_acq_rel:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i16 %value acq_rel, align 1
ret i16 %r
}
define dso_local i16 @atomicrmw_or_i16_unaligned_seq_cst(ptr %ptr, i16 %value) {
; -O0-LABEL: atomicrmw_or_i16_unaligned_seq_cst:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i16_unaligned_seq_cst:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i16 %value seq_cst, align 1
ret i16 %r
}
define dso_local i32 @atomicrmw_or_i32_unaligned_monotonic(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_or_i32_unaligned_monotonic:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i32_unaligned_monotonic:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i32 %value monotonic, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_or_i32_unaligned_acquire(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_or_i32_unaligned_acquire:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i32_unaligned_acquire:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i32 %value acquire, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_or_i32_unaligned_release(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_or_i32_unaligned_release:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i32_unaligned_release:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i32 %value release, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_or_i32_unaligned_acq_rel(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_or_i32_unaligned_acq_rel:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i32_unaligned_acq_rel:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i32 %value acq_rel, align 1
ret i32 %r
}
define dso_local i32 @atomicrmw_or_i32_unaligned_seq_cst(ptr %ptr, i32 %value) {
; -O0-LABEL: atomicrmw_or_i32_unaligned_seq_cst:
; -O0: orr w8, w9, w8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i32_unaligned_seq_cst:
; -O1: orr w8, w0, w20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i32 %value seq_cst, align 1
ret i32 %r
}
define dso_local i64 @atomicrmw_or_i64_unaligned_monotonic(ptr %ptr, i64 %value) {
; -O0-LABEL: atomicrmw_or_i64_unaligned_monotonic:
; -O0: orr x8, x9, x8
; -O0: bl __atomic_compare_exchange
;
; -O1-LABEL: atomicrmw_or_i64_unaligned_monotonic:
; -O1: orr x8, x0, x20
; -O1: bl __atomic_compare_exchange
%r = atomicrmw or ptr %ptr, i64 %value monotonic, align 1
ret i64 %r