| ; 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=+rcpc -O0 | FileCheck %s --check-prefixes=CHECK,-O0 |
| ; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+rcpc -O1 | FileCheck %s --check-prefixes=CHECK,-O1 |
| |
| define dso_local i8 @atomicrmw_xchg_i8_aligned_monotonic(ptr %ptr, i8 %value) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_aligned_monotonic: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_aligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: stxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_aligned_acquire: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_aligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: stxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_aligned_release: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_aligned_release: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: stlxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_aligned_acq_rel: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_aligned_acq_rel: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: stlxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_aligned_seq_cst: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_aligned_seq_cst: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: stlxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i16_aligned_monotonic: |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i16_aligned_monotonic: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: stxrh w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i16_aligned_acquire: |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i16_aligned_acquire: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: stxrh w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i16_aligned_release: |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i16_aligned_release: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: stlxrh w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i16_aligned_acq_rel: |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i16_aligned_acq_rel: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: stlxrh w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i16_aligned_seq_cst: |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i16_aligned_seq_cst: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: stlxrh w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i32_aligned_monotonic: |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i32_aligned_monotonic: |
| ; -O1: ldxr w0, [x8] |
| ; -O1: stxr w9, w1, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_xchg_i32_aligned_acquire: |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i32_aligned_acquire: |
| ; -O1: ldaxr w0, [x8] |
| ; -O1: stxr w9, w1, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_xchg_i32_aligned_release: |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i32_aligned_release: |
| ; -O1: ldxr w0, [x8] |
| ; -O1: stlxr w9, w1, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_xchg_i32_aligned_acq_rel: |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i32_aligned_acq_rel: |
| ; -O1: ldaxr w0, [x8] |
| ; -O1: stlxr w9, w1, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_xchg_i32_aligned_seq_cst: |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i32_aligned_seq_cst: |
| ; -O1: ldaxr w0, [x8] |
| ; -O1: stlxr w9, w1, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_xchg_i64_aligned_monotonic: |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i64_aligned_monotonic: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: stxr w9, x1, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_xchg_i64_aligned_acquire: |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i64_aligned_acquire: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: stxr w9, x1, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_xchg_i64_aligned_release: |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i64_aligned_release: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: stlxr w9, x1, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_xchg_i64_aligned_acq_rel: |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i64_aligned_acq_rel: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: stlxr w9, x1, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_xchg_i64_aligned_seq_cst: |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i64_aligned_seq_cst: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: stlxr w9, x1, [x8] |
| %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: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i128_aligned_monotonic: |
| ; -O1: ldxp x1, x8, [x0] |
| ; -O1: stxp w9, x3, x2, [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: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i128_aligned_acquire: |
| ; -O1: ldaxp x1, x8, [x0] |
| ; -O1: stxp w9, x3, x2, [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: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i128_aligned_release: |
| ; -O1: ldxp x1, x8, [x0] |
| ; -O1: stlxp w9, x3, x2, [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: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i128_aligned_acq_rel: |
| ; -O1: ldaxp x1, x8, [x0] |
| ; -O1: stlxp w9, x3, x2, [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: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i128_aligned_seq_cst: |
| ; -O1: ldaxp x1, x8, [x0] |
| ; -O1: stlxp w9, x3, x2, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_monotonic: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: stxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_acquire: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: stxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_release: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_release: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: stlxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_acq_rel: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_acq_rel: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: stlxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_xchg_i8_unaligned_seq_cst: |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_xchg_i8_unaligned_seq_cst: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: stlxrb w9, w1, [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) { |
| ; -O0-LABEL: atomicrmw_add_i8_aligned_monotonic: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_aligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i8_aligned_acquire: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_aligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i8_aligned_release: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_aligned_release: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i8_aligned_acq_rel: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_aligned_acq_rel: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i8_aligned_seq_cst: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_aligned_seq_cst: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i16_aligned_monotonic: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i16_aligned_monotonic: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i16_aligned_acquire: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i16_aligned_acquire: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i16_aligned_release: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i16_aligned_release: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i16_aligned_acq_rel: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i16_aligned_acq_rel: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i16_aligned_seq_cst: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i16_aligned_seq_cst: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i32_aligned_monotonic: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i32_aligned_monotonic: |
| ; -O1: ldxr w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i32_aligned_acquire: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i32_aligned_acquire: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i32_aligned_release: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i32_aligned_release: |
| ; -O1: ldxr w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i32_aligned_acq_rel: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i32_aligned_acq_rel: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i32_aligned_seq_cst: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i32_aligned_seq_cst: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i64_aligned_monotonic: |
| ; -O0: add x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i64_aligned_monotonic: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: add x9, x0, x1 |
| ; -O1: stxr w10, x9, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_add_i64_aligned_acquire: |
| ; -O0: add x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i64_aligned_acquire: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: add x9, x0, x1 |
| ; -O1: stxr w10, x9, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_add_i64_aligned_release: |
| ; -O0: add x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i64_aligned_release: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: add x9, x0, x1 |
| ; -O1: stlxr w10, x9, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_add_i64_aligned_acq_rel: |
| ; -O0: add x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i64_aligned_acq_rel: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: add x9, x0, x1 |
| ; -O1: stlxr w10, x9, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_add_i64_aligned_seq_cst: |
| ; -O0: add x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i64_aligned_seq_cst: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: add x9, x0, x1 |
| ; -O1: stlxr w10, x9, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_add_i128_aligned_monotonic: |
| ; -O1: ldxp x1, x0, [x8] |
| ; -O1: adds x9, x1, x3 |
| ; -O1: stxp w11, x9, x10, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_add_i128_aligned_acquire: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: adds x9, x1, x3 |
| ; -O1: stxp w11, x9, x10, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_add_i128_aligned_release: |
| ; -O1: ldxp x1, x0, [x8] |
| ; -O1: adds x9, x1, x3 |
| ; -O1: stlxp w11, x9, x10, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_add_i128_aligned_acq_rel: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: adds x9, x1, x3 |
| ; -O1: stlxp w11, x9, x10, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_add_i128_aligned_seq_cst: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: adds x9, x1, x3 |
| ; -O1: stlxp w11, x9, x10, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_add_i8_unaligned_monotonic: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_unaligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i8_unaligned_acquire: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_unaligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i8_unaligned_release: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_unaligned_release: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i8_unaligned_acq_rel: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_unaligned_acq_rel: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_add_i8_unaligned_seq_cst: |
| ; -O0: add w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_add_i8_unaligned_seq_cst: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: add w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_aligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_aligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_aligned_release: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_aligned_acq_rel: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_aligned_seq_cst: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i16_aligned_monotonic: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stxrh w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i16_aligned_acquire: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stxrh w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i16_aligned_release: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxrh w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i16_aligned_acq_rel: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxrh w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i16_aligned_seq_cst: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxrh w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i32_aligned_monotonic: |
| ; -O1: ldxr w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stxr w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i32_aligned_acquire: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stxr w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i32_aligned_release: |
| ; -O1: ldxr w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxr w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i32_aligned_acq_rel: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxr w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i32_aligned_seq_cst: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxr w10, w9, [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 x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i64_aligned_monotonic: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: sub x9, x0, x1 |
| ; -O1: stxr w10, x9, [x8] |
| %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 x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i64_aligned_acquire: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: sub x9, x0, x1 |
| ; -O1: stxr w10, x9, [x8] |
| %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 x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i64_aligned_release: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: sub x9, x0, x1 |
| ; -O1: stlxr w10, x9, [x8] |
| %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 x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i64_aligned_acq_rel: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: sub x9, x0, x1 |
| ; -O1: stlxr w10, x9, [x8] |
| %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 x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i64_aligned_seq_cst: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: sub x9, x0, x1 |
| ; -O1: stlxr w10, x9, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i128_aligned_monotonic: |
| ; -O1: ldxp x1, x0, [x8] |
| ; -O1: subs x9, x1, x3 |
| ; -O1: stxp w11, x9, x10, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i128_aligned_acquire: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: subs x9, x1, x3 |
| ; -O1: stxp w11, x9, x10, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i128_aligned_release: |
| ; -O1: ldxp x1, x0, [x8] |
| ; -O1: subs x9, x1, x3 |
| ; -O1: stlxp w11, x9, x10, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i128_aligned_acq_rel: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: subs x9, x1, x3 |
| ; -O1: stlxp w11, x9, x10, [x8] |
| %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 x14, x11, x10 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i128_aligned_seq_cst: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: subs x9, x1, x3 |
| ; -O1: stlxp w11, x9, x10, [x8] |
| %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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_unaligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_unaligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_unaligned_release: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_unaligned_acq_rel: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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 w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_sub_i8_unaligned_seq_cst: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: sub w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i8_aligned_monotonic: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_aligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i8_aligned_acquire: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_aligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i8_aligned_release: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_aligned_release: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i8_aligned_acq_rel: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_aligned_acq_rel: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i8_aligned_seq_cst: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_aligned_seq_cst: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i16_aligned_monotonic: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i16_aligned_monotonic: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i16_aligned_acquire: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i16_aligned_acquire: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i16_aligned_release: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i16_aligned_release: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i16_aligned_acq_rel: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i16_aligned_acq_rel: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i16_aligned_seq_cst: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i16_aligned_seq_cst: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxrh w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i32_aligned_monotonic: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i32_aligned_monotonic: |
| ; -O1: ldxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i32_aligned_acquire: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i32_aligned_acquire: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i32_aligned_release: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i32_aligned_release: |
| ; -O1: ldxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i32_aligned_acq_rel: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i32_aligned_acq_rel: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i32_aligned_seq_cst: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i32_aligned_seq_cst: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxr w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i64_aligned_monotonic: |
| ; -O0: and x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i64_aligned_monotonic: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: stxr w10, x9, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_and_i64_aligned_acquire: |
| ; -O0: and x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i64_aligned_acquire: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: stxr w10, x9, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_and_i64_aligned_release: |
| ; -O0: and x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i64_aligned_release: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: stlxr w10, x9, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_and_i64_aligned_acq_rel: |
| ; -O0: and x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i64_aligned_acq_rel: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: stlxr w10, x9, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_and_i64_aligned_seq_cst: |
| ; -O0: and x12, x9, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i64_aligned_seq_cst: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: stlxr w10, x9, [x8] |
| %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: and x15, x13, x10 |
| ; -O0: and x14, x11, x8 |
| ; -O0: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_and_i128_aligned_monotonic: |
| ; -O1: ldxp x1, x0, [x8] |
| ; -O1: and x9, x0, x2 |
| ; -O1: and x10, x1, x3 |
| ; -O1: stxp w11, x10, x9, [x8] |
| %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: and x15, x13, x10 |
| ; -O0: and x14, x11, x8 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_and_i128_aligned_acquire: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: and x9, x0, x2 |
| ; -O1: and x10, x1, x3 |
| ; -O1: stxp w11, x10, x9, [x8] |
| %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: and x15, x13, x10 |
| ; -O0: and x14, x11, x8 |
| ; -O0: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_and_i128_aligned_release: |
| ; -O1: ldxp x1, x0, [x8] |
| ; -O1: and x9, x0, x2 |
| ; -O1: and x10, x1, x3 |
| ; -O1: stlxp w11, x10, x9, [x8] |
| %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: and x15, x13, x10 |
| ; -O0: and x14, x11, x8 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_and_i128_aligned_acq_rel: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: and x9, x0, x2 |
| ; -O1: and x10, x1, x3 |
| ; -O1: stlxp w11, x10, x9, [x8] |
| %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: and x15, x13, x10 |
| ; -O0: and x14, x11, x8 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_and_i128_aligned_seq_cst: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: and x9, x0, x2 |
| ; -O1: and x10, x1, x3 |
| ; -O1: stlxp w11, x10, x9, [x8] |
| %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) { |
| ; -O0-LABEL: atomicrmw_and_i8_unaligned_monotonic: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_unaligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i8_unaligned_acquire: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_unaligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i8_unaligned_release: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_unaligned_release: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i8_unaligned_acq_rel: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_unaligned_acq_rel: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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) { |
| ; -O0-LABEL: atomicrmw_and_i8_unaligned_seq_cst: |
| ; -O0: and w12, w9, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_and_i8_unaligned_seq_cst: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: stlxrb w10, w9, [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 w12, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i8_aligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stxrb w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i8_aligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stxrb w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i8_aligned_release: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stlxrb w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i8_aligned_acq_rel: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stlxrb w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i8_aligned_seq_cst: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stlxrb w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i16_aligned_monotonic: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stxrh w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i16_aligned_acquire: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stxrh w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i16_aligned_release: |
| ; -O1: ldxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stlxrh w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i16_aligned_acq_rel: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stlxrh w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrh w8, [x11] |
| ; -O0: cmp w8, w9, uxth |
| ; -O0: stlxrh w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxth |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i16_aligned_seq_cst: |
| ; -O1: ldaxrh w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stlxrh w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i32_aligned_monotonic: |
| ; -O1: ldxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stxr w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i32_aligned_acquire: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stxr w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i32_aligned_release: |
| ; -O1: ldxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stlxr w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i32_aligned_acq_rel: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stlxr w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxr w8, [x11] |
| ; -O0: cmp w8, w9 |
| ; -O0: stlxr w10, w12, [x11] |
| ; -O0: subs w9, w8, w9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i32_aligned_seq_cst: |
| ; -O1: ldaxr w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stlxr w10, w9, [x0] |
| %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 x12, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i64_aligned_monotonic: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: mvn x9, x9 |
| ; -O1: stxr w10, 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 x12, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i64_aligned_acquire: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: mvn x9, x9 |
| ; -O1: stxr w10, 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 x12, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i64_aligned_release: |
| ; -O1: ldxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: mvn x9, x9 |
| ; -O1: stlxr w10, 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 x12, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i64_aligned_acq_rel: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: mvn x9, x9 |
| ; -O1: stlxr w10, 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 x12, x8 |
| ; -O0: ldaxr x8, [x11] |
| ; -O0: cmp x8, x9 |
| ; -O0: stlxr w10, x12, [x11] |
| ; -O0: subs x9, x8, x9 |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i64_aligned_seq_cst: |
| ; -O1: ldaxr x0, [x8] |
| ; -O1: and x9, x0, x1 |
| ; -O1: mvn x9, x9 |
| ; -O1: stlxr w10, 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 x8, x11, x8 |
| ; -O0: and x10, x13, x10 |
| ; -O0: mvn x15, x10 |
| ; -O0: mvn x14, x8 |
| ; -O0: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i128_aligned_monotonic: |
| ; -O1: ldxp x1, x0, [x8] |
| ; -O1: and x9, x1, x3 |
| ; -O1: and x10, x0, x2 |
| ; -O1: mvn x10, x10 |
| ; -O1: mvn x9, x9 |
| ; -O1: stxp w11, x9, x10, [x8] |
| %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 x8, x11, x8 |
| ; -O0: and x10, x13, x10 |
| ; -O0: mvn x15, x10 |
| ; -O0: mvn x14, x8 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stxp w8, x14, x15, [x9] |
| ; -O0: stxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i128_aligned_acquire: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: and x9, x1, x3 |
| ; -O1: and x10, x0, x2 |
| ; -O1: mvn x10, x10 |
| ; -O1: mvn x9, x9 |
| ; -O1: stxp w11, x9, x10, [x8] |
| %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 x8, x11, x8 |
| ; -O0: and x10, x13, x10 |
| ; -O0: mvn x15, x10 |
| ; -O0: mvn x14, x8 |
| ; -O0: ldxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i128_aligned_release: |
| ; -O1: ldxp x1, x0, [x8] |
| ; -O1: and x9, x1, x3 |
| ; -O1: and x10, x0, x2 |
| ; -O1: mvn x10, x10 |
| ; -O1: mvn x9, x9 |
| ; -O1: stlxp w11, x9, x10, [x8] |
| %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 x8, x11, x8 |
| ; -O0: and x10, x13, x10 |
| ; -O0: mvn x15, x10 |
| ; -O0: mvn x14, x8 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i128_aligned_acq_rel: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: and x9, x1, x3 |
| ; -O1: and x10, x0, x2 |
| ; -O1: mvn x10, x10 |
| ; -O1: mvn x9, x9 |
| ; -O1: stlxp w11, x9, x10, [x8] |
| %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 x8, x11, x8 |
| ; -O0: and x10, x13, x10 |
| ; -O0: mvn x15, x10 |
| ; -O0: mvn x14, x8 |
| ; -O0: ldaxp x10, x12, [x9] |
| ; -O0: cmp x10, x11 |
| ; -O0: cmp x12, x13 |
| ; -O0: stlxp w8, x14, x15, [x9] |
| ; -O0: stlxp w8, x10, x12, [x9] |
| ; -O0: subs x12, x12, x13 |
| ; -O0: ccmp x10, x11, #0, eq |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i128_aligned_seq_cst: |
| ; -O1: ldaxp x1, x0, [x8] |
| ; -O1: and x9, x1, x3 |
| ; -O1: and x10, x0, x2 |
| ; -O1: mvn x10, x10 |
| ; -O1: mvn x9, x9 |
| ; -O1: stlxp w11, x9, x10, [x8] |
| %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 w12, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i8_unaligned_monotonic: |
| ; -O1: ldxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stxrb w10, w9, [x0] |
| %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 w12, w8 |
| ; -O0: ldaxrb w8, [x11] |
| ; -O0: cmp w8, w9, uxtb |
| ; -O0: stlxrb w10, w12, [x11] |
| ; -O0: subs w9, w8, w9, uxtb |
| ; -O0: subs w9, w9, #1 |
| ; |
| ; -O1-LABEL: atomicrmw_nand_i8_unaligned_acquire: |
| ; -O1: ldaxrb w8, [x0] |
| ; -O1: and w9, w8, w1 |
| ; -O1: mvn w9, w9 |
| ; -O1: stxrb w10, w9, [x0] |
| %r = atomicrmw nand ptr %ptr, i8 %value acquire, align 1 |
| ret i8 |